diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..fd9566d76a8 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +valent.andyholmes.ca \ No newline at end of file diff --git a/coverage/amber.png b/coverage/amber.png new file mode 100644 index 00000000000..2cab170d835 Binary files /dev/null and b/coverage/amber.png differ diff --git a/coverage/badge.svg b/coverage/badge.svg new file mode 100644 index 00000000000..d8873538149 --- /dev/null +++ b/coverage/badge.svg @@ -0,0 +1 @@ +coverage: 78%coverage78% \ No newline at end of file diff --git a/coverage/cmd_line b/coverage/cmd_line new file mode 100644 index 00000000000..b318a5f1e1c --- /dev/null +++ b/coverage/cmd_line @@ -0,0 +1 @@ +genhtml --prefix /__w/valent/valent --output-directory /__w/valent/valent/_build/meson-logs/coverage-html --title 'Code Coverage' --legend --show-details --branch-coverage /__w/valent/valent/_build/meson-logs/coverage.info diff --git a/coverage/emerald.png b/coverage/emerald.png new file mode 100644 index 00000000000..38ad4f4068b Binary files /dev/null and b/coverage/emerald.png differ diff --git a/coverage/gcov.css b/coverage/gcov.css new file mode 100644 index 00000000000..f3290428f8b --- /dev/null +++ b/coverage/gcov.css @@ -0,0 +1,1073 @@ +/* All views: initial background and text color */ +body +{ + color: #000000; + background-color: #ffffff; +} + +/* All views: standard link format*/ +a:link +{ + color: #284fa8; + text-decoration: underline; +} + +/* All views: standard link - visited format */ +a:visited +{ + color: #00cb40; + text-decoration: underline; +} + +/* All views: standard link - activated format */ +a:active +{ + color: #ff0040; + text-decoration: underline; +} + +/* All views: main title format */ +td.title +{ + text-align: center; + padding-bottom: 10px; + font-family: sans-serif; + font-size: 20pt; + font-style: italic; + font-weight: bold; +} +/* "Line coverage date bins" leader */ +td.subTableHeader +{ + text-align: center; + padding-bottom: 6px; + font-family: sans-serif; + font-weight: bold; + vertical-align: center; +} + +/* All views: header item format */ +td.headerItem +{ + text-align: right; + padding-right: 6px; + font-family: sans-serif; + font-weight: bold; + vertical-align: top; + white-space: nowrap; +} + +/* All views: header item value format */ +td.headerValue +{ + text-align: left; + color: #284fa8; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; +} + +/* All views: header item coverage table heading */ +td.headerCovTableHead +{ + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; +} + +/* All views: header item coverage table entry */ +td.headerCovTableEntry +{ + text-align: right; + color: #284fa8; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #dae7fe; +} + +/* All views: header item coverage table entry for high coverage rate */ +td.headerCovTableEntryHi +{ + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #a7fc9d; +} + +/* All views: header item coverage table entry for medium coverage rate */ +td.headerCovTableEntryMed +{ + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #ffea20; +} + +/* All views: header item coverage table entry for ow coverage rate */ +td.headerCovTableEntryLo +{ + text-align: right; + color: #000000; + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + padding-left: 12px; + padding-right: 4px; + background-color: #ff0000; +} + +/* All views: header legend value for legend entry */ +td.headerValueLeg +{ + text-align: left; + color: #000000; + font-family: sans-serif; + font-size: 80%; + white-space: nowrap; + padding-top: 4px; +} + +/* All views: color of horizontal ruler */ +td.ruler +{ + background-color: #6688d4; +} + +/* All views: version string format */ +td.versionInfo +{ + text-align: center; + padding-top: 2px; + font-family: sans-serif; + font-style: italic; +} + +/* Directory view/File view (all)/Test case descriptions: + table headline format */ +td.tableHead +{ + text-align: center; + color: #ffffff; + background-color: #6688d4; + font-family: sans-serif; + font-size: 120%; + font-weight: bold; + white-space: nowrap; + padding-left: 4px; + padding-right: 4px; +} + +span.tableHeadSort +{ + padding-right: 4px; +} + +/* Directory view/File view (all): filename entry format */ +td.coverFile +{ + text-align: left; + padding-left: 10px; + padding-right: 20px; + color: #284fa8; + background-color: #dae7fe; + font-family: monospace; +} + +/* Directory view/File view (all): filename entry format */ +td.overallOwner +{ + text-align: center; + font-weight: bold; + font-family: sans-serif; + background-color: #dae7fe; + padding-right: 10px; + padding-left: 10px; +} + +/* Directory view/File view (all): filename entry format */ +td.ownerName +{ + text-align: right; + font-style: italic; + font-family: sans-serif; + background-color: #E5DBDB; + padding-right: 10px; + padding-left: 20px; +} + +/* Directory view/File view (all): bar-graph entry format*/ +td.coverBar +{ + padding-left: 10px; + padding-right: 10px; + background-color: #dae7fe; +} + +/* Directory view/File view (all): bar-graph entry format*/ +td.owner_coverBar +{ + padding-left: 10px; + padding-right: 10px; + background-color: #E5DBDB; +} + +/* Directory view/File view (all): bar-graph outline color */ +td.coverBarOutline +{ + background-color: #000000; +} + +/* Directory view/File view (all): percentage entry for files with + high coverage rate */ +td.coverPerHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #a7fc9d; + font-weight: bold; + font-family: sans-serif; +} + +/* 'owner' entry: slightly lighter color than 'coverPerHi' */ +td.owner_coverPerHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #82E0AA; + font-weight: bold; + font-family: sans-serif; +} + +/* Directory view/File view (all): line count entry */ +td.coverNumDflt +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #dae7fe; + white-space: nowrap; + font-family: sans-serif; +} + +/* td background color and font for the 'owner' section of the table */ +td.ownerTla +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #E5DBDB; + white-space: nowrap; + font-family: sans-serif; + font-style: italic; +} + +/* Directory view/File view (all): line count entry for files with + high coverage rate */ +td.coverNumHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #a7fc9d; + white-space: nowrap; + font-family: sans-serif; +} + +td.owner_coverNumHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #82E0AA; + white-space: nowrap; + font-family: sans-serif; +} + +/* Directory view/File view (all): percentage entry for files with + medium coverage rate */ +td.coverPerMed +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #ffea20; + font-weight: bold; + font-family: sans-serif; +} + +td.owner_coverPerMed +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #F9E79F; + font-weight: bold; + font-family: sans-serif; +} + +/* Directory view/File view (all): line count entry for files with + medium coverage rate */ +td.coverNumMed +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #ffea20; + white-space: nowrap; + font-family: sans-serif; +} + +td.owner_coverNumMed +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #F9E79F; + white-space: nowrap; + font-family: sans-serif; +} + +/* Directory view/File view (all): percentage entry for files with + low coverage rate */ +td.coverPerLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #ff0000; + font-weight: bold; + font-family: sans-serif; +} + +td.owner_coverPerLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #EC7063; + font-weight: bold; + font-family: sans-serif; +} + +/* Directory view/File view (all): line count entry for files with + low coverage rate */ +td.coverNumLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #ff0000; + white-space: nowrap; + font-family: sans-serif; +} + +td.owner_coverNumLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #EC7063; + white-space: nowrap; + font-family: sans-serif; +} + +/* File view (all): "show/hide details" link format */ +a.detail:link +{ + color: #b8d0ff; + font-size:80%; +} + +/* File view (all): "show/hide details" link - visited format */ +a.detail:visited +{ + color: #b8d0ff; + font-size:80%; +} + +/* File view (all): "show/hide details" link - activated format */ +a.detail:active +{ + color: #ffffff; + font-size:80%; +} + +/* File view (detail): test name entry */ +td.testName +{ + text-align: right; + padding-right: 10px; + background-color: #dae7fe; + font-family: sans-serif; +} + +/* File view (detail): test percentage entry */ +td.testPer +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #dae7fe; + font-family: sans-serif; +} + +/* File view (detail): test lines count entry */ +td.testNum +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #dae7fe; + font-family: sans-serif; +} + +/* Test case descriptions: test name format*/ +dt +{ + font-family: sans-serif; + font-weight: bold; +} + +/* Test case descriptions: description table body */ +td.testDescription +{ + padding-top: 10px; + padding-left: 30px; + padding-bottom: 10px; + padding-right: 30px; + background-color: #dae7fe; +} + +/* Source code view: function entry */ +td.coverFn +{ + text-align: left; + padding-left: 10px; + padding-right: 20px; + color: #284fa8; + background-color: #dae7fe; + font-family: monospace; +} + +/* Source code view: function entry zero count*/ +td.coverFnLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #ff0000; + font-weight: bold; + font-family: sans-serif; +} + +/* Source code view: function entry nonzero count*/ +td.coverFnHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #dae7fe; + font-weight: bold; + font-family: sans-serif; +} + +td.coverFnAlias +{ + text-align: right; + padding-left: 10px; + padding-right: 20px; + color: #284fa8; + /* make this a slightly different color than the leader - otherwise, + otherwise the alias is hard to distinguish in the table */ + background-color: #E5DBDB; /* very light pale grey/blue */ + font-family: monospace; +} + +/* Source code view: function entry zero count*/ +td.coverFnAliasLo +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #EC7063; /* lighter red */ + font-family: sans-serif; +} + +/* Source code view: function entry nonzero count*/ +td.coverFnAliasHi +{ + text-align: right; + padding-left: 10px; + padding-right: 10px; + background-color: #dae7fe; + font-weight: bold; + font-family: sans-serif; +} + +/* Source code view: source code format */ +pre.source +{ + font-family: monospace; + white-space: pre; + margin-top: 2px; +} + +/* Source code view: line number format */ +span.lineNum +{ + background-color: #efe383; +} + +/* Source code view: format for Cov legend */ +span.coverLegendCov +{ + padding-left: 10px; + padding-right: 10px; + padding-bottom: 2px; + background-color: #cad7fe; +} + +/* Source code view: format for NoCov legend */ +span.coverLegendNoCov +{ + padding-left: 10px; + padding-right: 10px; + padding-bottom: 2px; + background-color: #ff6230; +} + +/* Source code view: format for the source code heading line */ +pre.sourceHeading +{ + white-space: pre; + font-family: monospace; + font-weight: bold; + margin: 0px; +} + +/* All views: header legend value for low rate */ +td.headerValueLegL +{ + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 4px; + padding-right: 2px; + background-color: #ff0000; + font-size: 80%; +} + +/* All views: header legend value for med rate */ +td.headerValueLegM +{ + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 2px; + padding-right: 2px; + background-color: #ffea20; + font-size: 80%; +} + +/* All views: header legend value for hi rate */ +td.headerValueLegH +{ + font-family: sans-serif; + text-align: center; + white-space: nowrap; + padding-left: 2px; + padding-right: 4px; + background-color: #a7fc9d; + font-size: 80%; +} + +/* All views except source code view: legend format for low coverage */ +span.coverLegendCovLo +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #ff0000; +} + +/* All views except source code view: legend format for med coverage */ +span.coverLegendCovMed +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #ffea20; +} + +/* All views except source code view: legend format for hi coverage */ +span.coverLegendCovHi +{ + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; + background-color: #a7fc9d; +} + +a.branchTla:link +{ + color: #000000; +} + +a.branchTla:visited +{ + color: #000000; +} + +/* Source code view/table entry backround: format for lines classified as "Uncovered New Code (+ => 0): +Newly added code is not tested" */ +td.tlaUNC +{ + text-align: right; + background-color: #FF6230; +} +td.tlaBgUNC { + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Uncovered New Code (+ => 0): +Newly added code is not tested" */ +span.tlaUNC +{ + text-align: left; + background-color: #FF6230; +} +span.tlaBgUNC { + background-color: #FF6230; +} +a.tlaBgUNC { + background-color: #FF6230; + color: #000000; +} + +td.headerCovTableHeadUNC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Lost Baseline Coverage (1 => 0): +Unchanged code is no longer tested" */ +td.tlaLBC +{ + text-align: right; + background-color: #FF6230; +} +td.tlaBgLBC { + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Lost Baseline Coverage (1 => 0): +Unchanged code is no longer tested" */ +span.tlaLBC +{ + text-align: left; + background-color: #FF6230; +} +span.tlaBgLBC { + background-color: #FF6230; +} +a.tlaBgLBC { + background-color: #FF6230; + color: #000000; +} + +td.headerCovTableHeadLBC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Uncovered Included Code (# => 0): +Previously unused code is untested" */ +td.tlaUIC +{ + text-align: right; + background-color: #FF6230; +} +td.tlaBgUIC { + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Uncovered Included Code (# => 0): +Previously unused code is untested" */ +span.tlaUIC +{ + text-align: left; + background-color: #FF6230; +} +span.tlaBgUIC { + background-color: #FF6230; +} +a.tlaBgUIC { + background-color: #FF6230; + color: #000000; +} + +td.headerCovTableHeadUIC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Uncovered Baseline Code (0 => 0): +Unchanged code was untested before, is untested now" */ +td.tlaUBC +{ + text-align: right; + background-color: #FF6230; +} +td.tlaBgUBC { + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Uncovered Baseline Code (0 => 0): +Unchanged code was untested before, is untested now" */ +span.tlaUBC +{ + text-align: left; + background-color: #FF6230; +} +span.tlaBgUBC { + background-color: #FF6230; +} +a.tlaBgUBC { + background-color: #FF6230; + color: #000000; +} + +td.headerCovTableHeadUBC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FF6230; +} + +/* Source code view/table entry backround: format for lines classified as "Gained Baseline Coverage (0 => 1): +Unchanged code is tested now" */ +td.tlaGBC +{ + text-align: right; + background-color: #CAD7FE; +} +td.tlaBgGBC { + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Gained Baseline Coverage (0 => 1): +Unchanged code is tested now" */ +span.tlaGBC +{ + text-align: left; + background-color: #CAD7FE; +} +span.tlaBgGBC { + background-color: #CAD7FE; +} +a.tlaBgGBC { + background-color: #CAD7FE; + color: #000000; +} + +td.headerCovTableHeadGBC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Gained Included Coverage (# => 1): +Previously unused code is tested now" */ +td.tlaGIC +{ + text-align: right; + background-color: #CAD7FE; +} +td.tlaBgGIC { + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Gained Included Coverage (# => 1): +Previously unused code is tested now" */ +span.tlaGIC +{ + text-align: left; + background-color: #CAD7FE; +} +span.tlaBgGIC { + background-color: #CAD7FE; +} +a.tlaBgGIC { + background-color: #CAD7FE; + color: #000000; +} + +td.headerCovTableHeadGIC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Gained New Coverage (+ => 1): +Newly added code is tested" */ +td.tlaGNC +{ + text-align: right; + background-color: #CAD7FE; +} +td.tlaBgGNC { + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Gained New Coverage (+ => 1): +Newly added code is tested" */ +span.tlaGNC +{ + text-align: left; + background-color: #CAD7FE; +} +span.tlaBgGNC { + background-color: #CAD7FE; +} +a.tlaBgGNC { + background-color: #CAD7FE; + color: #000000; +} + +td.headerCovTableHeadGNC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Covered Baseline Code (1 => 1): +Unchanged code was tested before and is still tested" */ +td.tlaCBC +{ + text-align: right; + background-color: #CAD7FE; +} +td.tlaBgCBC { + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Covered Baseline Code (1 => 1): +Unchanged code was tested before and is still tested" */ +span.tlaCBC +{ + text-align: left; + background-color: #CAD7FE; +} +span.tlaBgCBC { + background-color: #CAD7FE; +} +a.tlaBgCBC { + background-color: #CAD7FE; + color: #000000; +} + +td.headerCovTableHeadCBC { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #CAD7FE; +} + +/* Source code view/table entry backround: format for lines classified as "Excluded Uncovered Baseline (0 => #): +Previously untested code is unused now" */ +td.tlaEUB +{ + text-align: right; + background-color: #FFFFFF; +} +td.tlaBgEUB { + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Excluded Uncovered Baseline (0 => #): +Previously untested code is unused now" */ +span.tlaEUB +{ + text-align: left; + background-color: #FFFFFF; +} +span.tlaBgEUB { + background-color: #FFFFFF; +} +a.tlaBgEUB { + background-color: #FFFFFF; + color: #000000; +} + +td.headerCovTableHeadEUB { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Excluded Covered Baseline (1 => #): +Previously tested code is unused now" */ +td.tlaECB +{ + text-align: right; + background-color: #FFFFFF; +} +td.tlaBgECB { + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Excluded Covered Baseline (1 => #): +Previously tested code is unused now" */ +span.tlaECB +{ + text-align: left; + background-color: #FFFFFF; +} +span.tlaBgECB { + background-color: #FFFFFF; +} +a.tlaBgECB { + background-color: #FFFFFF; + color: #000000; +} + +td.headerCovTableHeadECB { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Deleted Uncovered Baseline (0 => -): +Previously untested code has been deleted" */ +td.tlaDUB +{ + text-align: right; + background-color: #FFFFFF; +} +td.tlaBgDUB { + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Deleted Uncovered Baseline (0 => -): +Previously untested code has been deleted" */ +span.tlaDUB +{ + text-align: left; + background-color: #FFFFFF; +} +span.tlaBgDUB { + background-color: #FFFFFF; +} +a.tlaBgDUB { + background-color: #FFFFFF; + color: #000000; +} + +td.headerCovTableHeadDUB { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Deleted Covered Baseline (1 => -): +Previously tested code has been deleted" */ +td.tlaDCB +{ + text-align: right; + background-color: #FFFFFF; +} +td.tlaBgDCB { + background-color: #FFFFFF; +} + +/* Source code view/table entry backround: format for lines classified as "Deleted Covered Baseline (1 => -): +Previously tested code has been deleted" */ +span.tlaDCB +{ + text-align: left; + background-color: #FFFFFF; +} +span.tlaBgDCB { + background-color: #FFFFFF; +} +a.tlaBgDCB { + background-color: #FFFFFF; + color: #000000; +} + +td.headerCovTableHeadDCB { + text-align: center; + padding-right: 6px; + padding-left: 6px; + padding-bottom: 0px; + font-family: sans-serif; + white-space: nowrap; + background-color: #FFFFFF; +} + +/* Source code view: format for date/owner bin that is not hit */ +span.missBins +{ + background-color: #ff0000 /* red */ +} diff --git a/coverage/glass.png b/coverage/glass.png new file mode 100644 index 00000000000..e1abc00680a Binary files /dev/null and b/coverage/glass.png differ diff --git a/coverage/index-sort-b.html b/coverage/index-sort-b.html new file mode 100644 index 00000000000..a9dbe5dc814 --- /dev/null +++ b/coverage/index-sort-b.html @@ -0,0 +1,638 @@ + + + + + + + LCOV - Code Coverage + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelCoverageTotalHit
Test:Code CoverageLines:77.7 %2173116891
Test Date:2024-03-31 18:46:36Functions:84.6 %23962026
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:47.5 %137246521
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by file nameLine Coverage Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
src/plugins/gnome +
15.2%15.2%
+
15.2 %468715.1 %4282231.4 %5116
src +
0.0%
+
0.0 %26-0.0 %2
src/plugins/eds +
0.0%
+
0.0 %260-0.0 %38
src/plugins/pulseaudio +
0.0%
+
0.0 %272-0.0 %38
src/plugins/xdp +
0.0%
+
0.0 %306-0.0 %46
src/plugins/sftp +
49.7%49.7%
+
49.7 %34417119.2 %2404663.2 %3824
src/plugins/findmyphone +
45.9%45.9%
+
45.9 %1597323.4 %942260.0 %2515
src/plugins/gtk +
75.6%75.6%
+
75.6 %26620135.3 %2388490.6 %3229
src/plugins/mousepad +
50.7%50.7%
+
50.7 %58829835.9 %35712871.1 %4532
src/plugins/presenter +
73.4%73.4%
+
73.4 %19214137.0 %1084085.7 %2824
src/plugins/share +
76.5%76.5%
+
76.5 %1308100139.8 %84033482.4 %136112
src/plugins/fdo +
86.4%86.4%
+
86.4 %30826639.9 %2289197.1 %3534
src/plugins/notification +
72.7%72.7%
+
72.7 %98771841.8 %68428681.1 %9073
src/plugins/lan +
80.4%80.4%
+
80.4 %1248100443.8 %101644592.5 %9386
src/libvalent/clipboard +
93.6%93.6%
+
93.6 %23421945.8 %260119100.0 %3535
src/libvalent/ui +
72.6%72.6%
+
72.6 %1907138545.9 %96844480.1 %211169
src/plugins/runcommand +
76.8%76.8%
+
76.8 %56043046.4 %30814385.2 %6152
src/plugins/sms +
81.3%81.3%
+
81.3 %2481201648.0 %152473290.4 %270244
src/libvalent/input +
90.8%90.8%
+
90.8 %15313948.3 %1165689.7 %2926
src/plugins/contacts +
86.4%86.4%
+
86.4 %33929349.0 %20810293.8 %3230
src/libvalent/contacts +
95.0%95.0%
+
95.0 %56253449.6 %40520197.4 %7674
src/libvalent/core +
84.5%84.5%
+
84.5 %1319111551.9 %83543393.9 %163153
src/plugins/clipboard +
90.3%90.3%
+
90.3 %23621352.9 %17492100.0 %3030
src/plugins/telephony +
85.3%85.3%
+
85.3 %26622754.7 %1508290.3 %3128
src/libvalent/notifications +
90.0%90.0%
+
90.0 %46041454.9 %33918695.2 %6360
src/plugins/mpris +
89.4%89.4%
+
89.4 %1676149855.2 %108059697.5 %157153
src/libvalent/media +
95.4%95.4%
+
95.4 %41039157.0 %20011496.6 %5957
src/libvalent/device +
90.8%90.8%
+
90.8 %2571233457.3 %1911109596.7 %241233
src/plugins/ping +
100.0%
+
100.0 %747459.5 %4225100.0 %1313
src/libvalent/mixer +
94.0%94.0%
+
94.0 %36534359.9 %1629796.5 %5755
src/plugins/lock +
99.2%99.2%
+
99.2 %12812760.3 %6841100.0 %2222
src/plugins/connectivity_report +
93.8%93.8%
+
93.8 %45242460.6 %28717498.1 %5251
src/libvalent/session +
94.4%94.4%
+
94.4 %14213460.9 %6439100.0 %2626
src/plugins/systemvolume +
95.1%95.1%
+
95.1 %20619663.3 %12881100.0 %2020
src/plugins/battery +
96.3%96.3%
+
96.3 %45844165.3 %26217198.0 %5150
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/index-sort-f.html b/coverage/index-sort-f.html new file mode 100644 index 00000000000..48312c2205e --- /dev/null +++ b/coverage/index-sort-f.html @@ -0,0 +1,638 @@ + + + + + + + LCOV - Code Coverage + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelCoverageTotalHit
Test:Code CoverageLines:77.7 %2173116891
Test Date:2024-03-31 18:46:36Functions:84.6 %23962026
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:47.5 %137246521
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by file nameLine Coverage Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
src +
0.0%
+
0.0 %26-0.0 %2
src/plugins/eds +
0.0%
+
0.0 %260-0.0 %38
src/plugins/pulseaudio +
0.0%
+
0.0 %272-0.0 %38
src/plugins/xdp +
0.0%
+
0.0 %306-0.0 %46
src/plugins/gnome +
15.2%15.2%
+
15.2 %468715.1 %4282231.4 %5116
src/plugins/findmyphone +
45.9%45.9%
+
45.9 %1597323.4 %942260.0 %2515
src/plugins/sftp +
49.7%49.7%
+
49.7 %34417119.2 %2404663.2 %3824
src/plugins/mousepad +
50.7%50.7%
+
50.7 %58829835.9 %35712871.1 %4532
src/libvalent/ui +
72.6%72.6%
+
72.6 %1907138545.9 %96844480.1 %211169
src/plugins/notification +
72.7%72.7%
+
72.7 %98771841.8 %68428681.1 %9073
src/plugins/share +
76.5%76.5%
+
76.5 %1308100139.8 %84033482.4 %136112
src/plugins/runcommand +
76.8%76.8%
+
76.8 %56043046.4 %30814385.2 %6152
src/plugins/presenter +
73.4%73.4%
+
73.4 %19214137.0 %1084085.7 %2824
src/libvalent/input +
90.8%90.8%
+
90.8 %15313948.3 %1165689.7 %2926
src/plugins/telephony +
85.3%85.3%
+
85.3 %26622754.7 %1508290.3 %3128
src/plugins/sms +
81.3%81.3%
+
81.3 %2481201648.0 %152473290.4 %270244
src/plugins/gtk +
75.6%75.6%
+
75.6 %26620135.3 %2388490.6 %3229
src/plugins/lan +
80.4%80.4%
+
80.4 %1248100443.8 %101644592.5 %9386
src/plugins/contacts +
86.4%86.4%
+
86.4 %33929349.0 %20810293.8 %3230
src/libvalent/core +
84.5%84.5%
+
84.5 %1319111551.9 %83543393.9 %163153
src/libvalent/notifications +
90.0%90.0%
+
90.0 %46041454.9 %33918695.2 %6360
src/libvalent/mixer +
94.0%94.0%
+
94.0 %36534359.9 %1629796.5 %5755
src/libvalent/media +
95.4%95.4%
+
95.4 %41039157.0 %20011496.6 %5957
src/libvalent/device +
90.8%90.8%
+
90.8 %2571233457.3 %1911109596.7 %241233
src/plugins/fdo +
86.4%86.4%
+
86.4 %30826639.9 %2289197.1 %3534
src/libvalent/contacts +
95.0%95.0%
+
95.0 %56253449.6 %40520197.4 %7674
src/plugins/mpris +
89.4%89.4%
+
89.4 %1676149855.2 %108059697.5 %157153
src/plugins/battery +
96.3%96.3%
+
96.3 %45844165.3 %26217198.0 %5150
src/plugins/connectivity_report +
93.8%93.8%
+
93.8 %45242460.6 %28717498.1 %5251
src/plugins/ping +
100.0%
+
100.0 %747459.5 %4225100.0 %1313
src/plugins/systemvolume +
95.1%95.1%
+
95.1 %20619663.3 %12881100.0 %2020
src/plugins/lock +
99.2%99.2%
+
99.2 %12812760.3 %6841100.0 %2222
src/libvalent/session +
94.4%94.4%
+
94.4 %14213460.9 %6439100.0 %2626
src/plugins/clipboard +
90.3%90.3%
+
90.3 %23621352.9 %17492100.0 %3030
src/libvalent/clipboard +
93.6%93.6%
+
93.6 %23421945.8 %260119100.0 %3535
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/index-sort-l.html b/coverage/index-sort-l.html new file mode 100644 index 00000000000..96618397873 --- /dev/null +++ b/coverage/index-sort-l.html @@ -0,0 +1,638 @@ + + + + + + + LCOV - Code Coverage + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelCoverageTotalHit
Test:Code CoverageLines:77.7 %2173116891
Test Date:2024-03-31 18:46:36Functions:84.6 %23962026
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:47.5 %137246521
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by file nameLine Coverage Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
src +
0.0%
+
0.0 %26-0.0 %2
src/plugins/eds +
0.0%
+
0.0 %260-0.0 %38
src/plugins/pulseaudio +
0.0%
+
0.0 %272-0.0 %38
src/plugins/xdp +
0.0%
+
0.0 %306-0.0 %46
src/plugins/gnome +
15.2%15.2%
+
15.2 %468715.1 %4282231.4 %5116
src/plugins/findmyphone +
45.9%45.9%
+
45.9 %1597323.4 %942260.0 %2515
src/plugins/sftp +
49.7%49.7%
+
49.7 %34417119.2 %2404663.2 %3824
src/plugins/mousepad +
50.7%50.7%
+
50.7 %58829835.9 %35712871.1 %4532
src/libvalent/ui +
72.6%72.6%
+
72.6 %1907138545.9 %96844480.1 %211169
src/plugins/notification +
72.7%72.7%
+
72.7 %98771841.8 %68428681.1 %9073
src/plugins/presenter +
73.4%73.4%
+
73.4 %19214137.0 %1084085.7 %2824
src/plugins/gtk +
75.6%75.6%
+
75.6 %26620135.3 %2388490.6 %3229
src/plugins/share +
76.5%76.5%
+
76.5 %1308100139.8 %84033482.4 %136112
src/plugins/runcommand +
76.8%76.8%
+
76.8 %56043046.4 %30814385.2 %6152
src/plugins/lan +
80.4%80.4%
+
80.4 %1248100443.8 %101644592.5 %9386
src/plugins/sms +
81.3%81.3%
+
81.3 %2481201648.0 %152473290.4 %270244
src/libvalent/core +
84.5%84.5%
+
84.5 %1319111551.9 %83543393.9 %163153
src/plugins/telephony +
85.3%85.3%
+
85.3 %26622754.7 %1508290.3 %3128
src/plugins/fdo +
86.4%86.4%
+
86.4 %30826639.9 %2289197.1 %3534
src/plugins/contacts +
86.4%86.4%
+
86.4 %33929349.0 %20810293.8 %3230
src/plugins/mpris +
89.4%89.4%
+
89.4 %1676149855.2 %108059697.5 %157153
src/libvalent/notifications +
90.0%90.0%
+
90.0 %46041454.9 %33918695.2 %6360
src/plugins/clipboard +
90.3%90.3%
+
90.3 %23621352.9 %17492100.0 %3030
src/libvalent/device +
90.8%90.8%
+
90.8 %2571233457.3 %1911109596.7 %241233
src/libvalent/input +
90.8%90.8%
+
90.8 %15313948.3 %1165689.7 %2926
src/libvalent/clipboard +
93.6%93.6%
+
93.6 %23421945.8 %260119100.0 %3535
src/plugins/connectivity_report +
93.8%93.8%
+
93.8 %45242460.6 %28717498.1 %5251
src/libvalent/mixer +
94.0%94.0%
+
94.0 %36534359.9 %1629796.5 %5755
src/libvalent/session +
94.4%94.4%
+
94.4 %14213460.9 %6439100.0 %2626
src/libvalent/contacts +
95.0%95.0%
+
95.0 %56253449.6 %40520197.4 %7674
src/plugins/systemvolume +
95.1%95.1%
+
95.1 %20619663.3 %12881100.0 %2020
src/libvalent/media +
95.4%95.4%
+
95.4 %41039157.0 %20011496.6 %5957
src/plugins/battery +
96.3%96.3%
+
96.3 %45844165.3 %26217198.0 %5150
src/plugins/lock +
99.2%99.2%
+
99.2 %12812760.3 %6841100.0 %2222
src/plugins/ping +
100.0%
+
100.0 %747459.5 %4225100.0 %1313
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/index.html b/coverage/index.html new file mode 100644 index 00000000000..96a3ed02396 --- /dev/null +++ b/coverage/index.html @@ -0,0 +1,638 @@ + + + + + + + LCOV - Code Coverage + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top levelCoverageTotalHit
Test:Code CoverageLines:77.7 %2173116891
Test Date:2024-03-31 18:46:36Functions:84.6 %23962026
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:47.5 %137246521
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directory Sort by file nameLine Coverage Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
src +
0.0%
+
0.0 %26-0.0 %2
src/libvalent/clipboard +
93.6%93.6%
+
93.6 %23421945.8 %260119100.0 %3535
src/libvalent/contacts +
95.0%95.0%
+
95.0 %56253449.6 %40520197.4 %7674
src/libvalent/core +
84.5%84.5%
+
84.5 %1319111551.9 %83543393.9 %163153
src/libvalent/device +
90.8%90.8%
+
90.8 %2571233457.3 %1911109596.7 %241233
src/libvalent/input +
90.8%90.8%
+
90.8 %15313948.3 %1165689.7 %2926
src/libvalent/media +
95.4%95.4%
+
95.4 %41039157.0 %20011496.6 %5957
src/libvalent/mixer +
94.0%94.0%
+
94.0 %36534359.9 %1629796.5 %5755
src/libvalent/notifications +
90.0%90.0%
+
90.0 %46041454.9 %33918695.2 %6360
src/libvalent/session +
94.4%94.4%
+
94.4 %14213460.9 %6439100.0 %2626
src/libvalent/ui +
72.6%72.6%
+
72.6 %1907138545.9 %96844480.1 %211169
src/plugins/battery +
96.3%96.3%
+
96.3 %45844165.3 %26217198.0 %5150
src/plugins/clipboard +
90.3%90.3%
+
90.3 %23621352.9 %17492100.0 %3030
src/plugins/connectivity_report +
93.8%93.8%
+
93.8 %45242460.6 %28717498.1 %5251
src/plugins/contacts +
86.4%86.4%
+
86.4 %33929349.0 %20810293.8 %3230
src/plugins/eds +
0.0%
+
0.0 %260-0.0 %38
src/plugins/fdo +
86.4%86.4%
+
86.4 %30826639.9 %2289197.1 %3534
src/plugins/findmyphone +
45.9%45.9%
+
45.9 %1597323.4 %942260.0 %2515
src/plugins/gnome +
15.2%15.2%
+
15.2 %468715.1 %4282231.4 %5116
src/plugins/gtk +
75.6%75.6%
+
75.6 %26620135.3 %2388490.6 %3229
src/plugins/lan +
80.4%80.4%
+
80.4 %1248100443.8 %101644592.5 %9386
src/plugins/lock +
99.2%99.2%
+
99.2 %12812760.3 %6841100.0 %2222
src/plugins/mousepad +
50.7%50.7%
+
50.7 %58829835.9 %35712871.1 %4532
src/plugins/mpris +
89.4%89.4%
+
89.4 %1676149855.2 %108059697.5 %157153
src/plugins/notification +
72.7%72.7%
+
72.7 %98771841.8 %68428681.1 %9073
src/plugins/ping +
100.0%
+
100.0 %747459.5 %4225100.0 %1313
src/plugins/presenter +
73.4%73.4%
+
73.4 %19214137.0 %1084085.7 %2824
src/plugins/pulseaudio +
0.0%
+
0.0 %272-0.0 %38
src/plugins/runcommand +
76.8%76.8%
+
76.8 %56043046.4 %30814385.2 %6152
src/plugins/sftp +
49.7%49.7%
+
49.7 %34417119.2 %2404663.2 %3824
src/plugins/share +
76.5%76.5%
+
76.5 %1308100139.8 %84033482.4 %136112
src/plugins/sms +
81.3%81.3%
+
81.3 %2481201648.0 %152473290.4 %270244
src/plugins/systemvolume +
95.1%95.1%
+
95.1 %20619663.3 %12881100.0 %2020
src/plugins/telephony +
85.3%85.3%
+
85.3 %26622754.7 %1508290.3 %3128
src/plugins/xdp +
0.0%
+
0.0 %306-0.0 %46
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/ruby.png b/coverage/ruby.png new file mode 100644 index 00000000000..991b6d4ec9e Binary files /dev/null and b/coverage/ruby.png differ diff --git a/coverage/snow.png b/coverage/snow.png new file mode 100644 index 00000000000..2cdae107fce Binary files /dev/null and b/coverage/snow.png differ diff --git a/coverage/src/index-detail-sort-b.html b/coverage/src/index-detail-sort-b.html new file mode 100644 index 00000000000..16400f7ff0e --- /dev/null +++ b/coverage/src/index-detail-sort-b.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index-detail-sort-f.html b/coverage/src/index-detail-sort-f.html new file mode 100644 index 00000000000..85ac312dc85 --- /dev/null +++ b/coverage/src/index-detail-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index-detail-sort-l.html b/coverage/src/index-detail-sort-l.html new file mode 100644 index 00000000000..f8ed3f4b66d --- /dev/null +++ b/coverage/src/index-detail-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index-detail.html b/coverage/src/index-detail.html new file mode 100644 index 00000000000..63c482a03b3 --- /dev/null +++ b/coverage/src/index-detail.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index-sort-b.html b/coverage/src/index-sort-b.html new file mode 100644 index 00000000000..16400f7ff0e --- /dev/null +++ b/coverage/src/index-sort-b.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index-sort-f.html b/coverage/src/index-sort-f.html new file mode 100644 index 00000000000..85ac312dc85 --- /dev/null +++ b/coverage/src/index-sort-f.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index-sort-l.html b/coverage/src/index-sort-l.html new file mode 100644 index 00000000000..f8ed3f4b66d --- /dev/null +++ b/coverage/src/index-sort-l.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/index.html b/coverage/src/index.html new file mode 100644 index 00000000000..63c482a03b3 --- /dev/null +++ b/coverage/src/index.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - srcCoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
main.c +
0.0%
+
0.0 %26-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-detail-sort-b.html b/coverage/src/libvalent/clipboard/index-detail-sort-b.html new file mode 100644 index 00000000000..3658e89c5a3 --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-detail-sort-f.html b/coverage/src/libvalent/clipboard/index-detail-sort-f.html new file mode 100644 index 00000000000..f21c9ade1f7 --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-detail-sort-l.html b/coverage/src/libvalent/clipboard/index-detail-sort-l.html new file mode 100644 index 00000000000..59fbf25cc3e --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-detail.html b/coverage/src/libvalent/clipboard/index-detail.html new file mode 100644 index 00000000000..a0dce0e06b6 --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-sort-b.html b/coverage/src/libvalent/clipboard/index-sort-b.html new file mode 100644 index 00000000000..3658e89c5a3 --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-sort-f.html b/coverage/src/libvalent/clipboard/index-sort-f.html new file mode 100644 index 00000000000..f21c9ade1f7 --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index-sort-l.html b/coverage/src/libvalent/clipboard/index-sort-l.html new file mode 100644 index 00000000000..59fbf25cc3e --- /dev/null +++ b/coverage/src/libvalent/clipboard/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/index.html b/coverage/src/libvalent/clipboard/index.html new file mode 100644 index 00000000000..a0dce0e06b6 --- /dev/null +++ b/coverage/src/libvalent/clipboard/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboardCoverageTotalHit
Test:Code CoverageLines:93.6 %234219
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.8 %260119
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard-adapter.c +
100.0%
+
100.0 %595951.8 %5629100.0 %1212
valent-clipboard-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard.c +
91.3%91.3%
+
91.3 %17315843.8 %19284100.0 %2121
valent-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.func-c.html b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.func-c.html new file mode 100644 index 00000000000..e64591cd8bb --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.func-c.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %5959
Test Date:2024-03-31 18:46:36Functions:100.0 %1212
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.8 %5629
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_adapter_init4
valent_clipboard_adapter_write_bytes11
valent_clipboard_adapter_write_bytes_finish11
valent_clipboard_adapter_changed14
valent_clipboard_adapter_get_timestamp16
valent_clipboard_adapter_read_bytes18
valent_clipboard_adapter_read_bytes_finish18
valent_clipboard_adapter_get_mimetypes21
valent_clipboard_adapter_class_init66
valent_clipboard_adapter_get_type570
valent_clipboard_adapter_class_intern_init66
valent_clipboard_adapter_get_type_once86
valent_clipboard_adapter_get_type418
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.func.html b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.func.html new file mode 100644 index 00000000000..60e80288d33 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.func.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %5959
Test Date:2024-03-31 18:46:36Functions:100.0 %1212
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.8 %5629
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_adapter_changed14
valent_clipboard_adapter_class_init66
valent_clipboard_adapter_get_mimetypes21
valent_clipboard_adapter_get_timestamp16
valent_clipboard_adapter_get_type570
valent_clipboard_adapter_class_intern_init66
valent_clipboard_adapter_get_type418
valent_clipboard_adapter_get_type_once86
valent_clipboard_adapter_init4
valent_clipboard_adapter_read_bytes18
valent_clipboard_adapter_read_bytes_finish18
valent_clipboard_adapter_write_bytes11
valent_clipboard_adapter_write_bytes_finish11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.gcov.html b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.gcov.html new file mode 100644 index 00000000000..19d9136a433 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.c.gcov.html @@ -0,0 +1,500 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %5959
Test Date:2024-03-31 18:46:36Functions:100.0 %1212
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.8 %5629
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-clipboard-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-clipboard-adapter.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentClipboardAdapter:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for clipboard selections.
+      18                 :             :  *
+      19                 :             :  * `ValentClipboardAdapter` is a base class for plugins that provide an interface
+      20                 :             :  * to the desktop clipboard. This usually means reading and writing content,
+      21                 :             :  * including notification of content changes.
+      22                 :             :  *
+      23                 :             :  * ## `.plugin` File
+      24                 :             :  *
+      25                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      26                 :             :  *
+      27                 :             :  * - `X-ClipboardAdapterPriority`
+      28                 :             :  *
+      29                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      30                 :             :  *     lowest value will be used as the primary adapter.
+      31                 :             :  *
+      32                 :             :  * Since: 1.0
+      33                 :             :  */
+      34                 :             : 
+      35                 :             : typedef struct
+      36                 :             : {
+      37                 :             :   int64_t  timestamp;
+      38                 :             : } ValentClipboardAdapterPrivate;
+      39                 :             : 
+      40   [ +  +  +  - ]:         584 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentClipboardAdapter, valent_clipboard_adapter, VALENT_TYPE_EXTENSION)
+      41                 :             : 
+      42                 :             : /**
+      43                 :             :  * ValentClipboardAdapterClass:
+      44                 :             :  * @changed: class closure for `ValentClipboardAdapter`::changed signal
+      45                 :             :  * @get_mimetypes: the virtual function pointer for valent_clipboard_adapter_get_mimetypes()
+      46                 :             :  * @get_timestamp: the virtual function pointer for valent_clipboard_adapter_get_timestamp()
+      47                 :             :  * @read_bytes: the virtual function pointer for valent_clipboard_adapter_read_bytes()
+      48                 :             :  * @read_bytes_finish: the virtual function pointer for valent_clipboard_adapter_read_bytes_finish()
+      49                 :             :  * @write_bytes: the virtual function pointer for valent_clipboard_adapter_write_bytes()
+      50                 :             :  * @write_bytes_finish: the virtual function pointer for valent_clipboard_adapter_write_bytes_finish()
+      51                 :             :  *
+      52                 :             :  * The virtual function table for `ValentClipboardAdapter`.
+      53                 :             :  */
+      54                 :             : 
+      55                 :             : enum {
+      56                 :             :   CHANGED,
+      57                 :             :   N_SIGNALS
+      58                 :             : };
+      59                 :             : 
+      60                 :             : static guint signals[N_SIGNALS] = { 0, };
+      61                 :             : 
+      62                 :             : 
+      63                 :             : /* LCOV_EXCL_START */
+      64                 :             : static GStrv
+      65                 :             : valent_clipboard_adapter_real_get_mimetypes (ValentClipboardAdapter *adapter)
+      66                 :             : {
+      67                 :             :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+      68                 :             : 
+      69                 :             :   g_warning ("%s does not implement get_mimetypes",
+      70                 :             :              G_OBJECT_TYPE_NAME (adapter));
+      71                 :             : 
+      72                 :             :   return NULL;
+      73                 :             : }
+      74                 :             : 
+      75                 :             : static int64_t
+      76                 :             : valent_clipboard_adapter_real_get_timestamp (ValentClipboardAdapter *adapter)
+      77                 :             : {
+      78                 :             :   ValentClipboardAdapterPrivate *priv = valent_clipboard_adapter_get_instance_private (adapter);
+      79                 :             : 
+      80                 :             :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+      81                 :             : 
+      82                 :             :   return priv->timestamp;
+      83                 :             : }
+      84                 :             : 
+      85                 :             : static void
+      86                 :             : valent_clipboard_adapter_real_read_bytes (ValentClipboardAdapter *adapter,
+      87                 :             :                                           const char             *mimetype,
+      88                 :             :                                           GCancellable           *cancellable,
+      89                 :             :                                           GAsyncReadyCallback     callback,
+      90                 :             :                                           gpointer                user_data)
+      91                 :             : {
+      92                 :             :   g_task_report_new_error (adapter, callback, user_data,
+      93                 :             :                            valent_clipboard_adapter_real_read_bytes,
+      94                 :             :                            G_IO_ERROR,
+      95                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+      96                 :             :                            "%s does not implement read_bytes",
+      97                 :             :                            G_OBJECT_TYPE_NAME (adapter));
+      98                 :             : }
+      99                 :             : 
+     100                 :             : GBytes *
+     101                 :             : valent_clipboard_adapter_real_read_bytes_finish (ValentClipboardAdapter  *adapter,
+     102                 :             :                                                  GAsyncResult            *result,
+     103                 :             :                                                  GError                 **error)
+     104                 :             : {
+     105                 :             :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     106                 :             :   g_assert (g_task_is_valid (result, adapter));
+     107                 :             :   g_assert (error == NULL || *error == NULL);
+     108                 :             : 
+     109                 :             :   return g_task_propagate_pointer (G_TASK (result), error);
+     110                 :             : }
+     111                 :             : 
+     112                 :             : static void
+     113                 :             : valent_clipboard_adapter_real_write_bytes (ValentClipboardAdapter *adapter,
+     114                 :             :                                            const char             *mimetype,
+     115                 :             :                                            GBytes                 *bytes,
+     116                 :             :                                            GCancellable           *cancellable,
+     117                 :             :                                            GAsyncReadyCallback     callback,
+     118                 :             :                                            gpointer                user_data)
+     119                 :             : {
+     120                 :             :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     121                 :             :   g_assert (bytes == NULL || (mimetype != NULL && *mimetype != '\0'));
+     122                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     123                 :             : 
+     124                 :             :   g_task_report_new_error (adapter, callback, user_data,
+     125                 :             :                            valent_clipboard_adapter_real_write_bytes,
+     126                 :             :                            G_IO_ERROR,
+     127                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+     128                 :             :                            "%s does not implement write_bytes",
+     129                 :             :                            G_OBJECT_TYPE_NAME (adapter));
+     130                 :             : }
+     131                 :             : 
+     132                 :             : static gboolean
+     133                 :             : valent_clipboard_adapter_real_write_bytes_finish (ValentClipboardAdapter  *adapter,
+     134                 :             :                                                   GAsyncResult            *result,
+     135                 :             :                                                   GError                 **error)
+     136                 :             : {
+     137                 :             :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     138                 :             :   g_assert (g_task_is_valid (result, adapter));
+     139                 :             :   g_assert (error == NULL || *error == NULL);
+     140                 :             : 
+     141                 :             :   return g_task_propagate_boolean (G_TASK (result), error);
+     142                 :             : }
+     143                 :             : 
+     144                 :             : static void
+     145                 :             : valent_clipboard_adapter_real_changed (ValentClipboardAdapter *adapter)
+     146                 :             : {
+     147                 :             :   ValentClipboardAdapterPrivate *priv = valent_clipboard_adapter_get_instance_private (adapter);
+     148                 :             : 
+     149                 :             :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     150                 :             : 
+     151                 :             :   priv->timestamp = valent_timestamp_ms ();
+     152                 :             : }
+     153                 :             : /* LCOV_EXCL_STOP */
+     154                 :             : 
+     155                 :             : /*
+     156                 :             :  * GObject
+     157                 :             :  */
+     158                 :             : static void
+     159                 :          66 : valent_clipboard_adapter_class_init (ValentClipboardAdapterClass *klass)
+     160                 :             : {
+     161                 :          66 :   klass->changed = valent_clipboard_adapter_real_changed;
+     162                 :          66 :   klass->get_mimetypes = valent_clipboard_adapter_real_get_mimetypes;
+     163                 :          66 :   klass->get_timestamp = valent_clipboard_adapter_real_get_timestamp;
+     164                 :          66 :   klass->read_bytes = valent_clipboard_adapter_real_read_bytes;
+     165                 :          66 :   klass->read_bytes_finish = valent_clipboard_adapter_real_read_bytes_finish;
+     166                 :          66 :   klass->write_bytes = valent_clipboard_adapter_real_write_bytes;
+     167                 :          66 :   klass->write_bytes_finish = valent_clipboard_adapter_real_write_bytes_finish;
+     168                 :             : 
+     169                 :             :   /**
+     170                 :             :    * ValentClipboardAdapter::changed:
+     171                 :             :    * @adapter: a `ValentClipboardAdapter`
+     172                 :             :    *
+     173                 :             :    * Emitted when the content of @adapter changes.
+     174                 :             :    *
+     175                 :             :    * The default handler for this signal updates the value returned by the
+     176                 :             :    * default implementation of [vfunc@Valent.ClipboardAdapter.get_timestamp].
+     177                 :             :    *
+     178                 :             :    * Since: 1.0
+     179                 :             :    */
+     180                 :         132 :   signals [CHANGED] =
+     181                 :          66 :     g_signal_new ("changed",
+     182                 :             :                   G_TYPE_FROM_CLASS (klass),
+     183                 :             :                   G_SIGNAL_RUN_FIRST,
+     184                 :             :                   G_STRUCT_OFFSET (ValentClipboardAdapterClass, changed),
+     185                 :             :                   NULL, NULL, NULL,
+     186                 :             :                   G_TYPE_NONE, 0);
+     187                 :          66 : }
+     188                 :             : 
+     189                 :             : static void
+     190                 :           4 : valent_clipboard_adapter_init (ValentClipboardAdapter *adapter)
+     191                 :             : {
+     192                 :           4 : }
+     193                 :             : 
+     194                 :             : /**
+     195                 :             :  * valent_clipboard_adapter_changed: (virtual changed)
+     196                 :             :  * @adapter: a `ValentClipboardAdapter`
+     197                 :             :  *
+     198                 :             :  * Emits [signal@Valent.ClipboardAdapter::changed] signal on @adapter.
+     199                 :             :  *
+     200                 :             :  * The default handler for this signal updates the value returned by the default
+     201                 :             :  * implementation of [vfunc@Valent.ClipboardAdapter.get_timestamp].
+     202                 :             :  *
+     203                 :             :  * This method should only be called by implementations of
+     204                 :             :  * [class@Valent.ClipboardAdapter].
+     205                 :             :  *
+     206                 :             :  * Since: 1.0
+     207                 :             :  */
+     208                 :             : void
+     209                 :          14 : valent_clipboard_adapter_changed (ValentClipboardAdapter *adapter)
+     210                 :             : {
+     211         [ +  - ]:          14 :   g_return_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     212                 :             : 
+     213                 :          14 :   g_signal_emit (G_OBJECT (adapter), signals [CHANGED], 0);
+     214                 :             : }
+     215                 :             : 
+     216                 :             : /**
+     217                 :             :  * valent_clipboard_adapter_get_timestamp: (virtual get_timestamp)
+     218                 :             :  * @adapter: a `ValentClipboardAdapter`
+     219                 :             :  *
+     220                 :             :  * Get the timestamp of the current clipboard content.
+     221                 :             :  *
+     222                 :             :  * The default implementation of this method returns the last time
+     223                 :             :  * [signal@Valent.ClipboardAdapter::changed] was emitted
+     224                 :             :  *
+     225                 :             :  * Returns: a UNIX epoch timestamp (ms)
+     226                 :             :  *
+     227                 :             :  * Since: 1.0
+     228                 :             :  */
+     229                 :             : int64_t
+     230                 :          16 : valent_clipboard_adapter_get_timestamp (ValentClipboardAdapter *adapter)
+     231                 :             : {
+     232                 :          16 :   int64_t ret;
+     233                 :             : 
+     234                 :          16 :   VALENT_ENTRY;
+     235                 :             : 
+     236         [ +  - ]:          16 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter), 0);
+     237                 :             : 
+     238                 :          16 :   ret = VALENT_CLIPBOARD_ADAPTER_GET_CLASS (adapter)->get_timestamp (adapter);
+     239                 :             : 
+     240                 :          16 :   VALENT_RETURN (ret);
+     241                 :             : }
+     242                 :             : 
+     243                 :             : /**
+     244                 :             :  * valent_clipboard_adapter_get_mimetypes: (virtual get_mimetypes)
+     245                 :             :  * @adapter: a `ValentClipboardAdapter`
+     246                 :             :  *
+     247                 :             :  * Get the mime-types of the current clipboard content.
+     248                 :             :  *
+     249                 :             :  * Returns: (transfer full) (nullable) (array zero-terminated=1): a list of
+     250                 :             :  *   mime-types
+     251                 :             :  *
+     252                 :             :  * Since: 1.0
+     253                 :             :  */
+     254                 :             : GStrv
+     255                 :          21 : valent_clipboard_adapter_get_mimetypes (ValentClipboardAdapter *adapter)
+     256                 :             : {
+     257                 :          21 :   GStrv ret = NULL;
+     258                 :             : 
+     259                 :          21 :   VALENT_ENTRY;
+     260                 :             : 
+     261         [ +  - ]:          21 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter), NULL);
+     262                 :             : 
+     263                 :          21 :   ret = VALENT_CLIPBOARD_ADAPTER_GET_CLASS (adapter)->get_mimetypes (adapter);
+     264                 :             : 
+     265                 :          21 :   VALENT_RETURN (g_steal_pointer (&ret));
+     266                 :             : }
+     267                 :             : 
+     268                 :             : /**
+     269                 :             :  * valent_clipboard_adapter_read_bytes: (virtual read_bytes)
+     270                 :             :  * @adapter: a `ValentClipboardAdapter`
+     271                 :             :  * @mimetype: a mime-type
+     272                 :             :  * @cancellable: (nullable): a `GCancellable`
+     273                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     274                 :             :  * @user_data: (closure): user supplied data
+     275                 :             :  *
+     276                 :             :  * Get the content of @adapter.
+     277                 :             :  *
+     278                 :             :  * Call [method@Valent.ClipboardAdapter.read_bytes_finish] to get the result.
+     279                 :             :  *
+     280                 :             :  * Since: 1.0
+     281                 :             :  */
+     282                 :             : void
+     283                 :          18 : valent_clipboard_adapter_read_bytes (ValentClipboardAdapter *adapter,
+     284                 :             :                                      const char             *mimetype,
+     285                 :             :                                      GCancellable           *cancellable,
+     286                 :             :                                      GAsyncReadyCallback     callback,
+     287                 :             :                                      gpointer                user_data)
+     288                 :             : {
+     289                 :          18 :   VALENT_ENTRY;
+     290                 :             : 
+     291         [ +  - ]:          18 :   g_return_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     292   [ +  -  -  + ]:          18 :   g_return_if_fail (mimetype != NULL && *mimetype != '\0');
+     293   [ +  +  +  -  :          18 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     294                 :             : 
+     295                 :          18 :   VALENT_CLIPBOARD_ADAPTER_GET_CLASS (adapter)->read_bytes (adapter,
+     296                 :             :                                                             mimetype,
+     297                 :             :                                                             cancellable,
+     298                 :             :                                                             callback,
+     299                 :             :                                                             user_data);
+     300                 :          18 :   VALENT_EXIT;
+     301                 :             : }
+     302                 :             : 
+     303                 :             : /**
+     304                 :             :  * valent_clipboard_adapter_read_bytes_finish: (virtual read_bytes_finish)
+     305                 :             :  * @adapter: a `ValentClipboardAdapter`
+     306                 :             :  * @result: a `GAsyncResult`
+     307                 :             :  * @error: (nullable): a `GError`
+     308                 :             :  *
+     309                 :             :  * Finish an operation started by [method@Valent.ClipboardAdapter.read_bytes].
+     310                 :             :  *
+     311                 :             :  * Returns: (transfer full) (nullable): a `GBytes`, or %NULL with @error set
+     312                 :             :  *
+     313                 :             :  * Since: 1.0
+     314                 :             :  */
+     315                 :             : GBytes *
+     316                 :          18 : valent_clipboard_adapter_read_bytes_finish (ValentClipboardAdapter  *adapter,
+     317                 :             :                                             GAsyncResult            *result,
+     318                 :             :                                             GError                 **error)
+     319                 :             : {
+     320                 :          18 :   GBytes *ret;
+     321                 :             : 
+     322                 :          18 :   VALENT_ENTRY;
+     323                 :             : 
+     324         [ +  - ]:          18 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter), NULL);
+     325         [ -  + ]:          18 :   g_return_val_if_fail (g_task_is_valid (result, adapter), NULL);
+     326   [ +  -  -  + ]:          18 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     327                 :             : 
+     328                 :          18 :   ret = VALENT_CLIPBOARD_ADAPTER_GET_CLASS (adapter)->read_bytes_finish (adapter,
+     329                 :             :                                                                          result,
+     330                 :             :                                                                          error);
+     331                 :             : 
+     332                 :          18 :   VALENT_RETURN (g_steal_pointer (&ret));
+     333                 :             : }
+     334                 :             : 
+     335                 :             : /**
+     336                 :             :  * valent_clipboard_adapter_write_bytes: (virtual write_bytes)
+     337                 :             :  * @adapter: a `ValentClipboardAdapter`
+     338                 :             :  * @mimetype: (nullable): a mime-type, or %NULL if @bytes is %NULL
+     339                 :             :  * @bytes: (nullable): a `GBytes`, or %NULL if @mimetype is %NULL
+     340                 :             :  * @cancellable: (nullable): a `GCancellable`
+     341                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     342                 :             :  * @user_data: (closure): user supplied data
+     343                 :             :  *
+     344                 :             :  * Set the content of the clipboard.
+     345                 :             :  *
+     346                 :             :  * Call [method@Valent.ClipboardAdapter.write_bytes_finish] to get the result.
+     347                 :             :  *
+     348                 :             :  * Since: 1.0
+     349                 :             :  */
+     350                 :             : void
+     351                 :          11 : valent_clipboard_adapter_write_bytes (ValentClipboardAdapter *adapter,
+     352                 :             :                                       const char             *mimetype,
+     353                 :             :                                       GBytes                 *bytes,
+     354                 :             :                                       GCancellable           *cancellable,
+     355                 :             :                                       GAsyncReadyCallback     callback,
+     356                 :             :                                       gpointer                user_data)
+     357                 :             : {
+     358                 :          11 :   VALENT_ENTRY;
+     359                 :             : 
+     360         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     361   [ +  -  +  -  :          11 :   g_return_if_fail (bytes == NULL || (mimetype != NULL && *mimetype != '\0'));
+                   -  + ]
+     362   [ +  +  +  -  :          11 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     363                 :             : 
+     364                 :          11 :   VALENT_CLIPBOARD_ADAPTER_GET_CLASS (adapter)->write_bytes (adapter,
+     365                 :             :                                                              mimetype,
+     366                 :             :                                                              bytes,
+     367                 :             :                                                              cancellable,
+     368                 :             :                                                              callback,
+     369                 :             :                                                              user_data);
+     370                 :             : 
+     371                 :          11 :   VALENT_EXIT;
+     372                 :             : }
+     373                 :             : 
+     374                 :             : /**
+     375                 :             :  * valent_clipboard_adapter_write_bytes_finish: (virtual write_bytes_finish)
+     376                 :             :  * @adapter: a `ValentClipboardAdapter`
+     377                 :             :  * @result: a `GAsyncResult`
+     378                 :             :  * @error: (nullable): a `GError`
+     379                 :             :  *
+     380                 :             :  * Finish an operation started by [method@Valent.ClipboardAdapter.write_bytes].
+     381                 :             :  *
+     382                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     383                 :             :  *
+     384                 :             :  * Since: 1.0
+     385                 :             :  */
+     386                 :             : gboolean
+     387                 :          11 : valent_clipboard_adapter_write_bytes_finish (ValentClipboardAdapter  *adapter,
+     388                 :             :                                              GAsyncResult            *result,
+     389                 :             :                                              GError                 **error)
+     390                 :             : {
+     391                 :          11 :   gboolean ret;
+     392                 :             : 
+     393                 :          11 :   VALENT_ENTRY;
+     394                 :             : 
+     395         [ +  - ]:          11 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD_ADAPTER (adapter), FALSE);
+     396         [ -  + ]:          11 :   g_return_val_if_fail (g_task_is_valid (result, adapter), FALSE);
+     397   [ +  -  -  + ]:          11 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     398                 :             : 
+     399                 :          11 :   ret = VALENT_CLIPBOARD_ADAPTER_GET_CLASS (adapter)->write_bytes_finish (adapter,
+     400                 :             :                                                                           result,
+     401                 :             :                                                                           error);
+     402                 :             : 
+     403                 :          11 :   VALENT_RETURN (ret);
+     404                 :             : }
+     405                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.func-c.html b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.func-c.html new file mode 100644 index 00000000000..245e28be665 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CLIPBOARD_ADAPTER186
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.func.html b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.func.html new file mode 100644 index 00000000000..353813f02ea --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CLIPBOARD_ADAPTER186
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.gcov.html b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.gcov.html new file mode 100644 index 00000000000..09c9a8b9450 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard-adapter.h.gcov.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_CLIPBOARD_ADAPTER (valent_clipboard_adapter_get_type())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :         281 : G_DECLARE_DERIVABLE_TYPE (ValentClipboardAdapter, valent_clipboard_adapter, VALENT, CLIPBOARD_ADAPTER, ValentExtension)
+                   +  - ]
+      18                 :             : 
+      19                 :             : struct _ValentClipboardAdapterClass
+      20                 :             : {
+      21                 :             :   ValentExtensionClass   parent_class;
+      22                 :             : 
+      23                 :             :   /* virtual functions */
+      24                 :             :   GStrv                  (*get_mimetypes)      (ValentClipboardAdapter  *adapter);
+      25                 :             :   int64_t                (*get_timestamp)      (ValentClipboardAdapter  *adapter);
+      26                 :             :   void                   (*read_bytes)         (ValentClipboardAdapter  *adapter,
+      27                 :             :                                                 const char              *mimetype,
+      28                 :             :                                                 GCancellable            *cancellable,
+      29                 :             :                                                 GAsyncReadyCallback      callback,
+      30                 :             :                                                 gpointer                 user_data);
+      31                 :             :   GBytes               * (*read_bytes_finish)  (ValentClipboardAdapter  *adapter,
+      32                 :             :                                                 GAsyncResult            *result,
+      33                 :             :                                                 GError                 **error);
+      34                 :             :   void                   (*write_bytes)        (ValentClipboardAdapter  *adapter,
+      35                 :             :                                                 const char              *mimetype,
+      36                 :             :                                                 GBytes                  *bytes,
+      37                 :             :                                                 GCancellable            *cancellable,
+      38                 :             :                                                 GAsyncReadyCallback      callback,
+      39                 :             :                                                 gpointer                 user_data);
+      40                 :             :   gboolean               (*write_bytes_finish) (ValentClipboardAdapter  *adapter,
+      41                 :             :                                                 GAsyncResult            *result,
+      42                 :             :                                                 GError                 **error);
+      43                 :             : 
+      44                 :             :   /* signals */
+      45                 :             :   void                   (*changed)            (ValentClipboardAdapter  *adapter);
+      46                 :             : 
+      47                 :             :   /*< private >*/
+      48                 :             :   gpointer               padding[8];
+      49                 :             : };
+      50                 :             : 
+      51                 :             : VALENT_AVAILABLE_IN_1_0
+      52                 :             : void       valent_clipboard_adapter_changed            (ValentClipboardAdapter  *adapter);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : GStrv      valent_clipboard_adapter_get_mimetypes      (ValentClipboardAdapter  *adapter);
+      55                 :             : VALENT_AVAILABLE_IN_1_0
+      56                 :             : int64_t    valent_clipboard_adapter_get_timestamp      (ValentClipboardAdapter  *adapter);
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : void       valent_clipboard_adapter_read_bytes         (ValentClipboardAdapter  *adapter,
+      59                 :             :                                                         const char              *mimetype,
+      60                 :             :                                                         GCancellable            *cancellable,
+      61                 :             :                                                         GAsyncReadyCallback      callback,
+      62                 :             :                                                         gpointer                 user_data);
+      63                 :             : VALENT_AVAILABLE_IN_1_0
+      64                 :             : GBytes   * valent_clipboard_adapter_read_bytes_finish  (ValentClipboardAdapter  *adapter,
+      65                 :             :                                                         GAsyncResult            *result,
+      66                 :             :                                                         GError                 **error);
+      67                 :             : VALENT_AVAILABLE_IN_1_0
+      68                 :             : void       valent_clipboard_adapter_write_bytes        (ValentClipboardAdapter  *adapter,
+      69                 :             :                                                         const char              *mimetype,
+      70                 :             :                                                         GBytes                  *bytes,
+      71                 :             :                                                         GCancellable            *cancellable,
+      72                 :             :                                                         GAsyncReadyCallback      callback,
+      73                 :             :                                                         gpointer                 user_data);
+      74                 :             : VALENT_AVAILABLE_IN_1_0
+      75                 :             : gboolean   valent_clipboard_adapter_write_bytes_finish (ValentClipboardAdapter  *adapter,
+      76                 :             :                                                         GAsyncResult            *result,
+      77                 :             :                                                         GError                 **error);
+      78                 :             : 
+      79                 :             : G_END_DECLS
+      80                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard.c.func-c.html b/coverage/src/libvalent/clipboard/valent-clipboard.c.func-c.html new file mode 100644 index 00000000000..a21ca349ad0 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard.c.func-c.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.3 %173158
Test Date:2024-03-31 18:46:36Functions:100.0 %2121
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.8 %19284
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_adapter_read_bytes_cb2
valent_clipboard_read_bytes2
valent_clipboard_read_bytes_finish2
valent_clipboard_write_bytes2
valent_clipboard_write_bytes_finish2
valent_clipboard_bind_preferred4
valent_clipboard_class_init4
valent_clipboard_get_mimetypes4
valent_clipboard_init4
valent_clipboard_write_text_finish6
valent_clipboard_write_text8
valent_clipboard_adapter_write_bytes_cb10
on_clipboard_adapter_changed14
valent_clipboard_get_timestamp14
valent_clipboard_adapter_read_text_cb15
valent_clipboard_read_text15
valent_clipboard_read_text_finish15
valent_clipboard_get_default18
valent_clipboard_get_type269
valent_clipboard_class_intern_init4
valent_clipboard_get_type_once86
valent_clipboard_get_type179
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard.c.func.html b/coverage/src/libvalent/clipboard/valent-clipboard.c.func.html new file mode 100644 index 00000000000..32a89737f7f --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard.c.func.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.3 %173158
Test Date:2024-03-31 18:46:36Functions:100.0 %2121
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.8 %19284
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_clipboard_adapter_changed14
valent_clipboard_adapter_read_bytes_cb2
valent_clipboard_adapter_read_text_cb15
valent_clipboard_adapter_write_bytes_cb10
valent_clipboard_bind_preferred4
valent_clipboard_class_init4
valent_clipboard_get_default18
valent_clipboard_get_mimetypes4
valent_clipboard_get_timestamp14
valent_clipboard_get_type269
valent_clipboard_class_intern_init4
valent_clipboard_get_type179
valent_clipboard_get_type_once86
valent_clipboard_init4
valent_clipboard_read_bytes2
valent_clipboard_read_bytes_finish2
valent_clipboard_read_text15
valent_clipboard_read_text_finish15
valent_clipboard_write_bytes2
valent_clipboard_write_bytes_finish2
valent_clipboard_write_text8
valent_clipboard_write_text_finish6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard.c.gcov.html b/coverage/src/libvalent/clipboard/valent-clipboard.c.gcov.html new file mode 100644 index 00000000000..c5618660788 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard.c.gcov.html @@ -0,0 +1,727 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.3 %173158
Test Date:2024-03-31 18:46:36Functions:100.0 %2121
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.8 %19284
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-clipboard"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-clipboard.h"
+      13                 :             : #include "valent-clipboard-adapter.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : /**
+      17                 :             :  * ValentClipboard:
+      18                 :             :  *
+      19                 :             :  * A class for reading and writing the desktop clipboard.
+      20                 :             :  *
+      21                 :             :  * `ValentClipboard` is an abstraction of clipboard selections, intended for use
+      22                 :             :  * by [class@Valent.DevicePlugin] implementations.
+      23                 :             :  *
+      24                 :             :  * Plugins can implement [class@Valent.ClipboardAdapter] to provide an interface
+      25                 :             :  * to access a clipboard selection.
+      26                 :             :  *
+      27                 :             :  * Since: 1.0
+      28                 :             :  */
+      29                 :             : 
+      30                 :             : struct _ValentClipboard
+      31                 :             : {
+      32                 :             :   ValentComponent         parent_instance;
+      33                 :             : 
+      34                 :             :   ValentClipboardAdapter *default_adapter;
+      35                 :             : };
+      36                 :             : 
+      37   [ +  +  +  - ]:         269 : G_DEFINE_FINAL_TYPE (ValentClipboard, valent_clipboard, VALENT_TYPE_COMPONENT)
+      38                 :             : 
+      39                 :             : enum {
+      40                 :             :   CHANGED,
+      41                 :             :   N_SIGNALS
+      42                 :             : };
+      43                 :             : 
+      44                 :             : static guint signals[N_SIGNALS] = { 0, };
+      45                 :             : 
+      46                 :             : static ValentClipboard *default_clipboard = NULL;
+      47                 :             : 
+      48                 :             : static const char * const text_mimetypes[] = {
+      49                 :             :   "text/plain;charset=utf-8",
+      50                 :             :   "text/plain",
+      51                 :             :   "UTF8_STRING",
+      52                 :             :   "STRING",
+      53                 :             :   "TEXT",
+      54                 :             :   "COMPOUND_TEXT",
+      55                 :             : };
+      56                 :             : 
+      57                 :             : 
+      58                 :             : static void
+      59                 :           2 : valent_clipboard_adapter_read_bytes_cb (ValentClipboardAdapter *adapter,
+      60                 :             :                                         GAsyncResult           *result,
+      61                 :             :                                         gpointer                user_data)
+      62                 :             : {
+      63                 :           2 :   g_autoptr (GTask) task = G_TASK (user_data);
+      64   [ -  -  +  - ]:           2 :   g_autoptr (GBytes) bytes = NULL;
+      65   [ -  -  +  - ]:           2 :   g_autoptr (GError) error = NULL;
+      66                 :             : 
+      67         [ +  - ]:           2 :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+      68         [ -  + ]:           2 :   g_assert (g_task_is_valid (result, adapter));
+      69                 :             : 
+      70                 :           2 :   bytes = valent_clipboard_adapter_read_bytes_finish (adapter, result, &error);
+      71                 :             : 
+      72         [ -  + ]:           2 :   if (bytes == NULL)
+      73         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+      74                 :             : 
+      75         [ -  + ]:           2 :   g_task_return_pointer (task,
+      76                 :             :                          g_steal_pointer (&bytes),
+      77                 :             :                          (GDestroyNotify)g_bytes_unref);
+      78                 :             : }
+      79                 :             : 
+      80                 :             : static void
+      81                 :          10 : valent_clipboard_adapter_write_bytes_cb (ValentClipboardAdapter *adapter,
+      82                 :             :                                          GAsyncResult           *result,
+      83                 :             :                                          gpointer                user_data)
+      84                 :             : {
+      85                 :          10 :   g_autoptr (GTask) task = G_TASK (user_data);
+      86   [ -  -  +  - ]:          10 :   g_autoptr (GError) error = NULL;
+      87                 :             : 
+      88         [ +  - ]:          10 :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+      89         [ -  + ]:          10 :   g_assert (g_task_is_valid (result, adapter));
+      90                 :             : 
+      91         [ -  + ]:          10 :   if (!valent_clipboard_adapter_write_bytes_finish (adapter, result, &error))
+      92         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+      93                 :             : 
+      94         [ -  + ]:          10 :   g_task_return_boolean (task, TRUE);
+      95                 :             : }
+      96                 :             : 
+      97                 :             : static void
+      98                 :          15 : valent_clipboard_adapter_read_text_cb (ValentClipboardAdapter *adapter,
+      99                 :             :                                        GAsyncResult           *result,
+     100                 :             :                                        gpointer                user_data)
+     101                 :             : {
+     102                 :          15 :   g_autoptr (GTask) task = G_TASK (user_data);
+     103   [ -  -  +  - ]:          15 :   g_autoptr (GError) error = NULL;
+     104   [ -  -  -  + ]:          15 :   g_autoptr (GBytes) bytes = NULL;
+     105                 :          15 :   const char *data = NULL;
+     106                 :          15 :   size_t size;
+     107                 :             : 
+     108         [ +  - ]:          15 :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     109         [ -  + ]:          15 :   g_assert (g_task_is_valid (result, adapter));
+     110                 :             : 
+     111                 :          15 :   bytes = valent_clipboard_adapter_read_bytes_finish (adapter, result, &error);
+     112                 :             : 
+     113         [ -  + ]:          15 :   if (bytes == NULL)
+     114         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     115                 :             : 
+     116                 :          15 :   data = g_bytes_get_data (bytes, &size);
+     117                 :             : 
+     118   [ +  -  +  - ]:          15 :   if (size > 0 && data[size - 1] == '\0')
+     119         [ -  + ]:          30 :     g_task_return_pointer (task, g_strdup (data), g_free);
+     120                 :             :   else
+     121                 :           0 :     g_task_return_pointer (task, g_strndup (data, size), g_free);
+     122                 :             : }
+     123                 :             : 
+     124                 :             : static void
+     125                 :          14 : on_clipboard_adapter_changed (ValentClipboardAdapter *clipboard,
+     126                 :             :                               ValentClipboard        *self)
+     127                 :             : {
+     128                 :          14 :   VALENT_ENTRY;
+     129                 :             : 
+     130         [ +  - ]:          14 :   if (self->default_adapter == clipboard)
+     131                 :          14 :     g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     132                 :             : 
+     133                 :          14 :   VALENT_EXIT;
+     134                 :             : }
+     135                 :             : 
+     136                 :             : /*
+     137                 :             :  * ValentComponent
+     138                 :             :  */
+     139                 :             : static void
+     140                 :           4 : valent_clipboard_bind_preferred (ValentComponent *component,
+     141                 :             :                                  GObject         *extension)
+     142                 :             : {
+     143                 :           4 :   ValentClipboard *self = VALENT_CLIPBOARD (component);
+     144                 :           4 :   ValentClipboardAdapter *adapter = VALENT_CLIPBOARD_ADAPTER (extension);
+     145                 :             : 
+     146                 :           4 :   VALENT_ENTRY;
+     147                 :             : 
+     148         [ +  - ]:           4 :   g_assert (VALENT_IS_CLIPBOARD (self));
+     149   [ +  -  -  + ]:           4 :   g_assert (adapter == NULL || VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     150                 :             : 
+     151         [ -  + ]:           4 :   if (self->default_adapter != NULL)
+     152                 :             :     {
+     153                 :           0 :       g_signal_handlers_disconnect_by_func (self->default_adapter,
+     154                 :             :                                             self,
+     155                 :             :                                             on_clipboard_adapter_changed);
+     156                 :           0 :       self->default_adapter = NULL;
+     157                 :             :     }
+     158                 :             : 
+     159         [ +  - ]:           4 :   if (adapter != NULL)
+     160                 :             :     {
+     161                 :           4 :       self->default_adapter = adapter;
+     162                 :           4 :       g_signal_connect_object (self->default_adapter,
+     163                 :             :                                "changed",
+     164                 :             :                                G_CALLBACK (on_clipboard_adapter_changed),
+     165                 :             :                                self, 0);
+     166                 :             :     }
+     167                 :             : 
+     168                 :           4 :   VALENT_EXIT;
+     169                 :             : }
+     170                 :             : 
+     171                 :             : /*
+     172                 :             :  * GObject
+     173                 :             :  */
+     174                 :             : static void
+     175                 :           4 : valent_clipboard_class_init (ValentClipboardClass *klass)
+     176                 :             : {
+     177                 :           4 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     178                 :             : 
+     179                 :           4 :   component_class->bind_preferred = valent_clipboard_bind_preferred;
+     180                 :             : 
+     181                 :             :   /**
+     182                 :             :    * ValentClipboard::changed:
+     183                 :             :    * @clipboard: a `ValentClipboard`
+     184                 :             :    *
+     185                 :             :    * Emitted when the content of the primary [class@Valent.ClipboardAdapter]
+     186                 :             :    * changes.
+     187                 :             :    *
+     188                 :             :    * Since: 1.0
+     189                 :             :    */
+     190                 :           8 :   signals [CHANGED] =
+     191                 :           4 :     g_signal_new ("changed",
+     192                 :             :                   G_TYPE_FROM_CLASS (klass),
+     193                 :             :                   G_SIGNAL_RUN_FIRST,
+     194                 :             :                   0,
+     195                 :             :                   NULL, NULL, NULL,
+     196                 :             :                   G_TYPE_NONE, 0);
+     197                 :           4 : }
+     198                 :             : 
+     199                 :             : static void
+     200                 :           4 : valent_clipboard_init (ValentClipboard *self)
+     201                 :             : {
+     202                 :           4 : }
+     203                 :             : 
+     204                 :             : /**
+     205                 :             :  * valent_clipboard_get_default:
+     206                 :             :  *
+     207                 :             :  * Get the default [class@Valent.Clipboard].
+     208                 :             :  *
+     209                 :             :  * Returns: (transfer none) (not nullable): a `ValentClipboard`
+     210                 :             :  *
+     211                 :             :  * Since: 1.0
+     212                 :             :  */
+     213                 :             : ValentClipboard *
+     214                 :          18 : valent_clipboard_get_default (void)
+     215                 :             : {
+     216         [ +  + ]:          18 :   if (default_clipboard == NULL)
+     217                 :             :     {
+     218                 :           4 :       default_clipboard = g_object_new (VALENT_TYPE_CLIPBOARD,
+     219                 :             :                                         "plugin-domain", "clipboard",
+     220                 :             :                                         "plugin-type",   VALENT_TYPE_CLIPBOARD_ADAPTER,
+     221                 :             :                                         NULL);
+     222                 :             : 
+     223                 :           4 :       g_object_add_weak_pointer (G_OBJECT (default_clipboard),
+     224                 :             :                                  (gpointer)&default_clipboard);
+     225                 :             :     }
+     226                 :             : 
+     227                 :          18 :   return default_clipboard;
+     228                 :             : }
+     229                 :             : 
+     230                 :             : /**
+     231                 :             :  * valent_clipboard_get_mimetypes:
+     232                 :             :  * @clipboard: a `ValentClipboard`
+     233                 :             :  *
+     234                 :             :  * Get the mime-types of the primary clipboard content.
+     235                 :             :  *
+     236                 :             :  * Returns: (transfer full) (nullable) (array zero-terminated=1): a list of
+     237                 :             :  *   mime-types
+     238                 :             :  *
+     239                 :             :  * Since: 1.0
+     240                 :             :  */
+     241                 :             : GStrv
+     242                 :           4 : valent_clipboard_get_mimetypes (ValentClipboard *clipboard)
+     243                 :             : {
+     244                 :           4 :   GStrv ret = NULL;
+     245                 :             : 
+     246                 :           4 :   VALENT_ENTRY;
+     247                 :             : 
+     248         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD (clipboard), NULL);
+     249                 :             : 
+     250         [ -  + ]:           4 :   if G_LIKELY (clipboard->default_adapter != NULL)
+     251                 :           4 :     ret = valent_clipboard_adapter_get_mimetypes (clipboard->default_adapter);
+     252                 :             : 
+     253                 :           4 :   VALENT_RETURN (g_steal_pointer (&ret));
+     254                 :             : }
+     255                 :             : 
+     256                 :             : /**
+     257                 :             :  * valent_clipboard_get_timestamp:
+     258                 :             :  * @clipboard: a `ValentClipboard`
+     259                 :             :  *
+     260                 :             :  * Get the timestamp of the current clipboard content, in milliseconds since the
+     261                 :             :  * UNIX epoch.
+     262                 :             :  *
+     263                 :             :  * Returns: a UNIX epoch timestamp (ms)
+     264                 :             :  *
+     265                 :             :  * Since: 1.0
+     266                 :             :  */
+     267                 :             : int64_t
+     268                 :          14 : valent_clipboard_get_timestamp (ValentClipboard *clipboard)
+     269                 :             : {
+     270                 :          14 :   int64_t ret = 0;
+     271                 :             : 
+     272                 :          14 :   VALENT_ENTRY;
+     273                 :             : 
+     274         [ +  - ]:          14 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD (clipboard), 0);
+     275                 :             : 
+     276         [ -  + ]:          14 :   if G_LIKELY (clipboard->default_adapter != NULL)
+     277                 :          14 :     ret = valent_clipboard_adapter_get_timestamp (clipboard->default_adapter);
+     278                 :             : 
+     279                 :          14 :   VALENT_RETURN (ret);
+     280                 :             : }
+     281                 :             : 
+     282                 :             : /**
+     283                 :             :  * valent_clipboard_read_bytes:
+     284                 :             :  * @clipboard: a `ValentClipboard`
+     285                 :             :  * @mimetype: a mime-type
+     286                 :             :  * @cancellable: (nullable): a `GCancellable`
+     287                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     288                 :             :  * @user_data: (closure): user supplied data
+     289                 :             :  *
+     290                 :             :  * Get the content of the primary clipboard adapter.
+     291                 :             :  *
+     292                 :             :  * Call [method@Valent.Clipboard.read_bytes_finish] to get the result.
+     293                 :             :  *
+     294                 :             :  * Since: 1.0
+     295                 :             :  */
+     296                 :             : void
+     297                 :           2 : valent_clipboard_read_bytes (ValentClipboard     *clipboard,
+     298                 :             :                              const char          *mimetype,
+     299                 :             :                              GCancellable        *cancellable,
+     300                 :             :                              GAsyncReadyCallback  callback,
+     301                 :             :                              gpointer             user_data)
+     302                 :             : {
+     303                 :           4 :   g_autoptr (GTask) task = NULL;
+     304                 :             : 
+     305                 :           2 :   VALENT_ENTRY;
+     306                 :             : 
+     307         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_CLIPBOARD (clipboard));
+     308   [ +  -  -  + ]:           2 :   g_return_if_fail (mimetype != NULL && *mimetype != '\0');
+     309   [ -  +  -  -  :           2 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     310                 :             : 
+     311         [ +  - ]:           2 :   if G_UNLIKELY (clipboard->default_adapter == NULL)
+     312                 :             :     {
+     313                 :           0 :       g_task_report_new_error (clipboard, callback, user_data,
+     314                 :             :                                valent_clipboard_read_bytes,
+     315                 :             :                                G_IO_ERROR,
+     316                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     317                 :             :                                "No clipboard adapter available");
+     318                 :           0 :       return;
+     319                 :             :     }
+     320                 :             : 
+     321                 :           2 :   task = g_task_new (clipboard, cancellable, callback, user_data);
+     322         [ +  - ]:           2 :   g_task_set_source_tag (task, valent_clipboard_read_bytes);
+     323                 :           2 :   valent_clipboard_adapter_read_bytes (clipboard->default_adapter,
+     324                 :             :                                       mimetype,
+     325                 :             :                                       cancellable,
+     326                 :             :                                       (GAsyncReadyCallback)valent_clipboard_adapter_read_bytes_cb,
+     327                 :             :                                       g_steal_pointer (&task));
+     328                 :             : 
+     329                 :           2 :   VALENT_EXIT;
+     330                 :             : }
+     331                 :             : 
+     332                 :             : /**
+     333                 :             :  * valent_clipboard_read_bytes_finish:
+     334                 :             :  * @clipboard: a `ValentClipboard`
+     335                 :             :  * @result: a `GAsyncResult`
+     336                 :             :  * @error: (nullable): a `GError`
+     337                 :             :  *
+     338                 :             :  * Finish an operation started by [method@Valent.Clipboard.read_bytes].
+     339                 :             :  *
+     340                 :             :  * Returns: (transfer full) (nullable): the content
+     341                 :             :  *
+     342                 :             :  * Since: 1.0
+     343                 :             :  */
+     344                 :             : GBytes *
+     345                 :           2 : valent_clipboard_read_bytes_finish (ValentClipboard  *clipboard,
+     346                 :             :                                     GAsyncResult     *result,
+     347                 :             :                                     GError          **error)
+     348                 :             : {
+     349                 :           2 :   GBytes *ret;
+     350                 :             : 
+     351                 :           2 :   VALENT_ENTRY;
+     352                 :             : 
+     353         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD (clipboard), NULL);
+     354         [ -  + ]:           2 :   g_return_val_if_fail (g_task_is_valid (result, clipboard), NULL);
+     355   [ +  -  -  + ]:           2 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     356                 :             : 
+     357                 :           2 :   ret = g_task_propagate_pointer (G_TASK (result), error);
+     358                 :             : 
+     359                 :           2 :   VALENT_RETURN (g_steal_pointer (&ret));
+     360                 :             : }
+     361                 :             : 
+     362                 :             : /**
+     363                 :             :  * valent_clipboard_write_bytes:
+     364                 :             :  * @clipboard: a `ValentClipboard`
+     365                 :             :  * @mimetype: (nullable): a mime-type, or %NULL if @bytes is %NULL
+     366                 :             :  * @bytes: (nullable): a `GBytes`, or %NULL if @mimetype is %NULL
+     367                 :             :  * @cancellable: (nullable): a `GCancellable`
+     368                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     369                 :             :  * @user_data: (closure): user supplied data
+     370                 :             :  *
+     371                 :             :  * Set the content of the primary clipboard adapter.
+     372                 :             :  *
+     373                 :             :  * Call [method@Valent.Clipboard.write_bytes_finish] to get the result.
+     374                 :             :  *
+     375                 :             :  * Since: 1.0
+     376                 :             :  */
+     377                 :             : void
+     378                 :           2 : valent_clipboard_write_bytes (ValentClipboard     *clipboard,
+     379                 :             :                               const char          *mimetype,
+     380                 :             :                               GBytes              *bytes,
+     381                 :             :                               GCancellable        *cancellable,
+     382                 :             :                               GAsyncReadyCallback  callback,
+     383                 :             :                               gpointer             user_data)
+     384                 :             : {
+     385                 :           4 :   g_autoptr (GTask) task = NULL;
+     386                 :             : 
+     387                 :           2 :   VALENT_ENTRY;
+     388                 :             : 
+     389         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_CLIPBOARD (clipboard));
+     390   [ +  -  +  -  :           2 :   g_return_if_fail (bytes == NULL || (mimetype != NULL && *mimetype != '\0'));
+                   -  + ]
+     391   [ -  +  -  -  :           2 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     392                 :             : 
+     393         [ +  - ]:           2 :   if G_UNLIKELY (clipboard->default_adapter == NULL)
+     394                 :             :     {
+     395                 :           0 :       g_task_report_new_error (clipboard, callback, user_data,
+     396                 :             :                                valent_clipboard_write_bytes,
+     397                 :             :                                G_IO_ERROR,
+     398                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     399                 :             :                                "No clipboard adapter available");
+     400                 :           0 :       return;
+     401                 :             :     }
+     402                 :             : 
+     403                 :           2 :   task = g_task_new (clipboard, cancellable, callback, user_data);
+     404         [ +  - ]:           2 :   g_task_set_source_tag (task, valent_clipboard_write_bytes);
+     405                 :           2 :   valent_clipboard_adapter_write_bytes (clipboard->default_adapter,
+     406                 :             :                                         mimetype,
+     407                 :             :                                         bytes,
+     408                 :             :                                         cancellable,
+     409                 :             :                                         (GAsyncReadyCallback)valent_clipboard_adapter_write_bytes_cb,
+     410                 :             :                                         g_steal_pointer (&task));
+     411                 :             : 
+     412                 :           2 :   VALENT_EXIT;
+     413                 :             : }
+     414                 :             : 
+     415                 :             : /**
+     416                 :             :  * valent_clipboard_write_bytes_finish:
+     417                 :             :  * @clipboard: a `ValentClipboard`
+     418                 :             :  * @result: a `GAsyncResult`
+     419                 :             :  * @error: (nullable): a `GError`
+     420                 :             :  *
+     421                 :             :  * Finish an operation started by [method@Valent.Clipboard.write_bytes].
+     422                 :             :  *
+     423                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     424                 :             :  *
+     425                 :             :  * Since: 1.0
+     426                 :             :  */
+     427                 :             : gboolean
+     428                 :           2 : valent_clipboard_write_bytes_finish (ValentClipboard  *clipboard,
+     429                 :             :                                      GAsyncResult     *result,
+     430                 :             :                                      GError          **error)
+     431                 :             : {
+     432                 :           2 :   gboolean ret;
+     433                 :             : 
+     434                 :           2 :   VALENT_ENTRY;
+     435                 :             : 
+     436         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD (clipboard), FALSE);
+     437         [ -  + ]:           2 :   g_return_val_if_fail (g_task_is_valid (result, clipboard), FALSE);
+     438   [ +  -  -  + ]:           2 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     439                 :             : 
+     440                 :           2 :   ret = g_task_propagate_boolean (G_TASK (result), error);
+     441                 :             : 
+     442                 :           2 :   VALENT_RETURN (ret);
+     443                 :             : }
+     444                 :             : 
+     445                 :             : /**
+     446                 :             :  * valent_clipboard_read_text:
+     447                 :             :  * @clipboard: a `ValentClipboard`
+     448                 :             :  * @cancellable: (nullable): a `GCancellable`
+     449                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     450                 :             :  * @user_data: (closure): user supplied data
+     451                 :             :  *
+     452                 :             :  * Get the text content of the primary clipboard adapter.
+     453                 :             :  *
+     454                 :             :  * Call [method@Valent.Clipboard.read_text_finish] to get the result.
+     455                 :             :  *
+     456                 :             :  * Since: 1.0
+     457                 :             :  */
+     458                 :             : void
+     459                 :          15 : valent_clipboard_read_text (ValentClipboard     *clipboard,
+     460                 :             :                             GCancellable        *cancellable,
+     461                 :             :                             GAsyncReadyCallback  callback,
+     462                 :             :                             gpointer             user_data)
+     463                 :             : {
+     464                 :          30 :   g_autoptr (GTask) task = NULL;
+     465                 :          30 :   g_auto (GStrv) mimetypes = NULL;
+     466                 :          15 :   const char *mimetype = NULL;
+     467                 :             : 
+     468                 :          15 :   VALENT_ENTRY;
+     469                 :             : 
+     470         [ +  - ]:          15 :   g_return_if_fail (VALENT_IS_CLIPBOARD (clipboard));
+     471   [ +  +  +  -  :          15 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     472                 :             : 
+     473         [ +  - ]:          15 :   if G_UNLIKELY (clipboard->default_adapter == NULL)
+     474                 :             :     {
+     475                 :           0 :       g_task_report_new_error (clipboard, callback, user_data,
+     476                 :             :                                valent_clipboard_read_text,
+     477                 :             :                                G_IO_ERROR,
+     478                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     479                 :             :                                "No clipboard adapter available");
+     480                 :           0 :       return;
+     481                 :             :     }
+     482                 :             : 
+     483                 :          15 :   mimetypes = valent_clipboard_adapter_get_mimetypes (clipboard->default_adapter);
+     484                 :             : 
+     485         [ +  - ]:          15 :   if (mimetypes != NULL)
+     486                 :             :     {
+     487         [ +  - ]:          15 :       for (size_t i = 0; i < G_N_ELEMENTS (text_mimetypes); i++)
+     488                 :             :         {
+     489                 :          15 :           const char *text_mimetype = text_mimetypes[i];
+     490                 :             : 
+     491         [ -  + ]:          15 :           if (g_strv_contains ((const char * const *)mimetypes, text_mimetype))
+     492                 :             :             {
+     493                 :             :               mimetype = text_mimetypes[i];
+     494                 :             :               break;
+     495                 :             :             }
+     496                 :             :         }
+     497                 :             :     }
+     498                 :             : 
+     499         [ -  + ]:          15 :   if (mimetype == NULL)
+     500                 :           0 :     return g_task_report_new_error (clipboard, callback, user_data,
+     501                 :             :                                     valent_clipboard_read_text,
+     502                 :             :                                     G_IO_ERROR,
+     503                 :             :                                     G_IO_ERROR_NOT_SUPPORTED,
+     504                 :             :                                     "text not available");
+     505                 :             : 
+     506                 :          15 :   task = g_task_new (clipboard, cancellable, callback, user_data);
+     507         [ +  - ]:          15 :   g_task_set_source_tag (task, valent_clipboard_read_text);
+     508                 :          15 :   valent_clipboard_adapter_read_bytes (clipboard->default_adapter,
+     509                 :             :                                        mimetype,
+     510                 :             :                                        cancellable,
+     511                 :             :                                        (GAsyncReadyCallback)valent_clipboard_adapter_read_text_cb,
+     512                 :             :                                        g_steal_pointer (&task));
+     513                 :             : 
+     514         [ +  - ]:          30 :   VALENT_EXIT;
+     515                 :             : }
+     516                 :             : 
+     517                 :             : /**
+     518                 :             :  * valent_clipboard_read_text_finish:
+     519                 :             :  * @clipboard: a `ValentClipboard`
+     520                 :             :  * @result: a `GAsyncResult`
+     521                 :             :  * @error: (nullable): a `GError`
+     522                 :             :  *
+     523                 :             :  * Finish an operation started by [method@Valent.Clipboard.read_text].
+     524                 :             :  *
+     525                 :             :  * Returns: (transfer full) (nullable): the text content
+     526                 :             :  *
+     527                 :             :  * Since: 1.0
+     528                 :             :  */
+     529                 :             : char *
+     530                 :          15 : valent_clipboard_read_text_finish (ValentClipboard  *clipboard,
+     531                 :             :                                    GAsyncResult     *result,
+     532                 :             :                                    GError          **error)
+     533                 :             : {
+     534                 :          15 :   char *ret;
+     535                 :             : 
+     536                 :          15 :   VALENT_ENTRY;
+     537                 :             : 
+     538         [ +  - ]:          15 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD (clipboard), NULL);
+     539         [ -  + ]:          15 :   g_return_val_if_fail (g_task_is_valid (result, clipboard), NULL);
+     540   [ +  -  -  + ]:          15 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     541                 :             : 
+     542                 :          15 :   ret = g_task_propagate_pointer (G_TASK (result), error);
+     543                 :             : 
+     544                 :          15 :   VALENT_RETURN (g_steal_pointer (&ret));
+     545                 :             : }
+     546                 :             : 
+     547                 :             : /**
+     548                 :             :  * valent_clipboard_write_text:
+     549                 :             :  * @clipboard: a `ValentClipboard`
+     550                 :             :  * @text: text content
+     551                 :             :  * @cancellable: (nullable): a `GCancellable`
+     552                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     553                 :             :  * @user_data: (closure): user supplied data
+     554                 :             :  *
+     555                 :             :  * Set the text content of the primary clipboard adapter.
+     556                 :             :  *
+     557                 :             :  * Call [method@Valent.Clipboard.write_text_finish] to get the result.
+     558                 :             :  *
+     559                 :             :  * Since: 1.0
+     560                 :             :  */
+     561                 :             : void
+     562                 :           8 : valent_clipboard_write_text (ValentClipboard     *clipboard,
+     563                 :             :                              const char          *text,
+     564                 :             :                              GCancellable        *cancellable,
+     565                 :             :                              GAsyncReadyCallback  callback,
+     566                 :             :                              gpointer             user_data)
+     567                 :             : {
+     568                 :          16 :   g_autoptr (GTask) task = NULL;
+     569                 :          16 :   g_autoptr (GBytes) bytes = NULL;
+     570                 :             : 
+     571                 :           8 :   VALENT_ENTRY;
+     572                 :             : 
+     573         [ +  - ]:           8 :   g_return_if_fail (VALENT_IS_CLIPBOARD (clipboard));
+     574   [ +  +  +  -  :           8 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     575         [ -  + ]:           8 :   g_return_if_fail (text != NULL);
+     576                 :             : 
+     577         [ +  - ]:           8 :   if G_UNLIKELY (clipboard->default_adapter == NULL)
+     578                 :             :     {
+     579                 :           0 :       g_task_report_new_error (clipboard, callback, user_data,
+     580                 :             :                                valent_clipboard_write_text,
+     581                 :             :                                G_IO_ERROR,
+     582                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     583                 :             :                                "No clipboard adapter available");
+     584                 :           0 :       return;
+     585                 :             :     }
+     586                 :             : 
+     587                 :           8 :   task = g_task_new (clipboard, cancellable, callback, user_data);
+     588         [ +  - ]:           8 :   g_task_set_source_tag (task, valent_clipboard_write_text);
+     589                 :             : 
+     590                 :           8 :   bytes = g_bytes_new (text, strlen (text) + 1);
+     591                 :           8 :   valent_clipboard_adapter_write_bytes (clipboard->default_adapter,
+     592                 :             :                                         "text/plain;charset=utf-8",
+     593                 :             :                                         bytes,
+     594                 :             :                                         cancellable,
+     595                 :             :                                         (GAsyncReadyCallback)valent_clipboard_adapter_write_bytes_cb,
+     596                 :             :                                         g_steal_pointer (&task));
+     597                 :             : 
+     598         [ +  - ]:           8 :   VALENT_EXIT;
+     599                 :             : }
+     600                 :             : 
+     601                 :             : /**
+     602                 :             :  * valent_clipboard_write_text_finish:
+     603                 :             :  * @clipboard: a `ValentClipboard`
+     604                 :             :  * @result: a `GAsyncResult`
+     605                 :             :  * @error: (nullable): a `GError`
+     606                 :             :  *
+     607                 :             :  * Finish an operation started by [method@Valent.Clipboard.write_text].
+     608                 :             :  *
+     609                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     610                 :             :  *
+     611                 :             :  * Since: 1.0
+     612                 :             :  */
+     613                 :             : gboolean
+     614                 :           6 : valent_clipboard_write_text_finish (ValentClipboard  *clipboard,
+     615                 :             :                                     GAsyncResult     *result,
+     616                 :             :                                     GError          **error)
+     617                 :             : {
+     618                 :           6 :   gboolean ret;
+     619                 :             : 
+     620                 :           6 :   VALENT_ENTRY;
+     621                 :             : 
+     622         [ +  - ]:           6 :   g_return_val_if_fail (VALENT_IS_CLIPBOARD (clipboard), FALSE);
+     623         [ -  + ]:           6 :   g_return_val_if_fail (g_task_is_valid (result, clipboard), FALSE);
+     624   [ +  -  -  + ]:           6 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     625                 :             : 
+     626                 :           6 :   ret = g_task_propagate_boolean (G_TASK (result), error);
+     627                 :             : 
+     628                 :           6 :   VALENT_RETURN (ret);
+     629                 :             : }
+     630                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard.h.func-c.html b/coverage/src/libvalent/clipboard/valent-clipboard.h.func-c.html new file mode 100644 index 00000000000..b90e07baeec --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CLIPBOARD89
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard.h.func.html b/coverage/src/libvalent/clipboard/valent-clipboard.h.func.html new file mode 100644 index 00000000000..bd00a398872 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CLIPBOARD89
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/clipboard/valent-clipboard.h.gcov.html b/coverage/src/libvalent/clipboard/valent-clipboard.h.gcov.html new file mode 100644 index 00000000000..1d7e6cd7e94 --- /dev/null +++ b/coverage/src/libvalent/clipboard/valent-clipboard.h.gcov.html @@ -0,0 +1,160 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/clipboard/valent-clipboard.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/clipboard - valent-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_CLIPBOARD (valent_clipboard_get_type ())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :          89 : G_DECLARE_FINAL_TYPE (ValentClipboard, valent_clipboard, VALENT, CLIPBOARD, ValentComponent)
+                   -  + ]
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20                 :             : ValentClipboard * valent_clipboard_get_default        (void);
+      21                 :             : VALENT_AVAILABLE_IN_1_0
+      22                 :             : GStrv             valent_clipboard_get_mimetypes      (ValentClipboard      *clipboard);
+      23                 :             : VALENT_AVAILABLE_IN_1_0
+      24                 :             : int64_t           valent_clipboard_get_timestamp      (ValentClipboard      *clipboard);
+      25                 :             : VALENT_AVAILABLE_IN_1_0
+      26                 :             : void              valent_clipboard_read_bytes         (ValentClipboard      *clipboard,
+      27                 :             :                                                        const char           *mimetype,
+      28                 :             :                                                        GCancellable         *cancellable,
+      29                 :             :                                                        GAsyncReadyCallback   callback,
+      30                 :             :                                                        gpointer              user_data);
+      31                 :             : VALENT_AVAILABLE_IN_1_0
+      32                 :             : GBytes          * valent_clipboard_read_bytes_finish  (ValentClipboard      *clipboard,
+      33                 :             :                                                        GAsyncResult         *result,
+      34                 :             :                                                        GError              **error);
+      35                 :             : VALENT_AVAILABLE_IN_1_0
+      36                 :             : void              valent_clipboard_write_bytes        (ValentClipboard      *clipboard,
+      37                 :             :                                                        const char           *mimetype,
+      38                 :             :                                                        GBytes               *bytes,
+      39                 :             :                                                        GCancellable         *cancellable,
+      40                 :             :                                                        GAsyncReadyCallback   callback,
+      41                 :             :                                                        gpointer              user_data);
+      42                 :             : VALENT_AVAILABLE_IN_1_0
+      43                 :             : gboolean          valent_clipboard_write_bytes_finish (ValentClipboard      *clipboard,
+      44                 :             :                                                        GAsyncResult         *result,
+      45                 :             :                                                        GError              **error);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : void              valent_clipboard_read_text          (ValentClipboard      *clipboard,
+      48                 :             :                                                        GCancellable         *cancellable,
+      49                 :             :                                                        GAsyncReadyCallback   callback,
+      50                 :             :                                                        gpointer              user_data);
+      51                 :             : VALENT_AVAILABLE_IN_1_0
+      52                 :             : char            * valent_clipboard_read_text_finish   (ValentClipboard      *clipboard,
+      53                 :             :                                                        GAsyncResult         *result,
+      54                 :             :                                                        GError              **error);
+      55                 :             : VALENT_AVAILABLE_IN_1_0
+      56                 :             : void              valent_clipboard_write_text         (ValentClipboard      *clipboard,
+      57                 :             :                                                        const char           *text,
+      58                 :             :                                                        GCancellable         *cancellable,
+      59                 :             :                                                        GAsyncReadyCallback   callback,
+      60                 :             :                                                        gpointer              user_data);
+      61                 :             : VALENT_AVAILABLE_IN_1_0
+      62                 :             : gboolean          valent_clipboard_write_text_finish  (ValentClipboard      *clipboard,
+      63                 :             :                                                        GAsyncResult         *result,
+      64                 :             :                                                        GError              **error);
+      65                 :             : 
+      66                 :             : G_END_DECLS
+      67                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-detail-sort-b.html b/coverage/src/libvalent/contacts/index-detail-sort-b.html new file mode 100644 index 00000000000..aabf323eaf9 --- /dev/null +++ b/coverage/src/libvalent/contacts/index-detail-sort-b.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-detail-sort-f.html b/coverage/src/libvalent/contacts/index-detail-sort-f.html new file mode 100644 index 00000000000..bcfdcbc6877 --- /dev/null +++ b/coverage/src/libvalent/contacts/index-detail-sort-f.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-detail-sort-l.html b/coverage/src/libvalent/contacts/index-detail-sort-l.html new file mode 100644 index 00000000000..528f03ba6ea --- /dev/null +++ b/coverage/src/libvalent/contacts/index-detail-sort-l.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-detail.html b/coverage/src/libvalent/contacts/index-detail.html new file mode 100644 index 00000000000..11e2b807f1b --- /dev/null +++ b/coverage/src/libvalent/contacts/index-detail.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-sort-b.html b/coverage/src/libvalent/contacts/index-sort-b.html new file mode 100644 index 00000000000..aabf323eaf9 --- /dev/null +++ b/coverage/src/libvalent/contacts/index-sort-b.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-sort-f.html b/coverage/src/libvalent/contacts/index-sort-f.html new file mode 100644 index 00000000000..bcfdcbc6877 --- /dev/null +++ b/coverage/src/libvalent/contacts/index-sort-f.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index-sort-l.html b/coverage/src/libvalent/contacts/index-sort-l.html new file mode 100644 index 00000000000..528f03ba6ea --- /dev/null +++ b/coverage/src/libvalent/contacts/index-sort-l.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/index.html b/coverage/src/libvalent/contacts/index.html new file mode 100644 index 00000000000..11e2b807f1b --- /dev/null +++ b/coverage/src/libvalent/contacts/index.html @@ -0,0 +1,218 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contactsCoverageTotalHit
Test:Code CoverageLines:95.0 %562534
Test Date:2024-03-31 18:46:36Functions:97.4 %7674
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.6 %405201
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contact-cache.c +
93.8%93.8%
+
93.8 %17816750.8 %11860100.0 %1919
valent-contact-store.c +
96.4%96.4%
+
96.4 %22521744.8 %18181100.0 %2727
valent-contact-store.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-contacts-adapter.c +
92.2%92.2%
+
92.2 %514754.2 %241390.9 %1110
valent-contacts-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts.c +
95.2%95.2%
+
95.2 %10510060.0 %603693.8 %1615
valent-contacts.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-cache.c.func-c.html b/coverage/src/libvalent/contacts/valent-contact-cache.c.func-c.html new file mode 100644 index 00000000000..e0fdeaf96d0 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-cache.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-cache.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-cache.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %178167
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.8 %11860
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
string_slist_free1
valent_contact_cache_get_property1
valent_contact_cache_remove_contacts1
valent_contact_cache_remove_task1
valent_contact_cache_get_contact2
valent_contact_cache_get_contact_task2
valent_contact_cache_class_init7
valent_contact_cache_finalize8
valent_contact_cache_query12
valent_contact_cache_query_task12
object_slist_free14
valent_contact_cache_add_contacts14
valent_contact_cache_add_task14
valent_contact_cache_constructed17
valent_contact_cache_init17
valent_contact_cache_set_property17
valent_contact_cache_get_type194
valent_contact_cache_class_intern_init7
valent_contact_cache_get_type_once85
valent_contact_cache_get_type102
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-cache.c.func.html b/coverage/src/libvalent/contacts/valent-contact-cache.c.func.html new file mode 100644 index 00000000000..52d392a861a --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-cache.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-cache.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-cache.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %178167
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.8 %11860
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
object_slist_free14
string_slist_free1
valent_contact_cache_add_contacts14
valent_contact_cache_add_task14
valent_contact_cache_class_init7
valent_contact_cache_constructed17
valent_contact_cache_finalize8
valent_contact_cache_get_contact2
valent_contact_cache_get_contact_task2
valent_contact_cache_get_property1
valent_contact_cache_get_type194
valent_contact_cache_class_intern_init7
valent_contact_cache_get_type102
valent_contact_cache_get_type_once85
valent_contact_cache_init17
valent_contact_cache_query12
valent_contact_cache_query_task12
valent_contact_cache_remove_contacts1
valent_contact_cache_remove_task1
valent_contact_cache_set_property17
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-cache.c.gcov.html b/coverage/src/libvalent/contacts/valent-contact-cache.c.gcov.html new file mode 100644 index 00000000000..4348ad963a0 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-cache.c.gcov.html @@ -0,0 +1,499 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-cache.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-cache.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %178167
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.8 %11860
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contact-cache"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libvalent-core.h>
+       9                 :             : 
+      10                 :             : #include "valent-contact-cache-private.h"
+      11                 :             : #include "valent-contact-store.h"
+      12                 :             : #include "valent-eds.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentContactCache:
+      17                 :             :  *
+      18                 :             :  * An implementation of [class@Valent.ContactStore].
+      19                 :             :  *
+      20                 :             :  * `ValentContactCache` is a simple implementation of [class@Valent.ContactStore]
+      21                 :             :  * for local contact store, used as a fallback when Evolution Data Server is not
+      22                 :             :  * available.
+      23                 :             :  *
+      24                 :             :  * Since: 1.0
+      25                 :             :  */
+      26                 :             : 
+      27                 :             : struct _ValentContactCache
+      28                 :             : {
+      29                 :             :   ValentContactStore  parent_instance;
+      30                 :             : 
+      31                 :             :   EBookCache         *cache;
+      32                 :             :   char               *path;
+      33                 :             : };
+      34                 :             : 
+      35   [ +  +  +  - ]:         194 : G_DEFINE_FINAL_TYPE (ValentContactCache, valent_contact_cache, VALENT_TYPE_CONTACT_STORE)
+      36                 :             : 
+      37                 :             : 
+      38                 :             : enum {
+      39                 :             :   PROP_0,
+      40                 :             :   PROP_PATH,
+      41                 :             :   N_PROPERTIES
+      42                 :             : };
+      43                 :             : 
+      44                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      45                 :             : 
+      46                 :             : static inline void
+      47                 :          14 : object_slist_free (gpointer slist)
+      48                 :             : {
+      49                 :          14 :   g_slist_free_full (slist, g_object_unref);
+      50                 :          14 : }
+      51                 :             : 
+      52                 :             : static inline void
+      53                 :           1 : string_slist_free (gpointer slist)
+      54                 :             : {
+      55                 :           1 :   g_slist_free_full (slist, g_free);
+      56                 :           1 : }
+      57                 :             : 
+      58                 :             : /*
+      59                 :             :  * ValentContactStore
+      60                 :             :  */
+      61                 :             : static void
+      62                 :          14 : valent_contact_cache_add_task (GTask        *task,
+      63                 :             :                                gpointer      source_object,
+      64                 :             :                                gpointer      task_data,
+      65                 :             :                                GCancellable *cancellable)
+      66                 :             : {
+      67                 :          14 :   ValentContactCache *self = VALENT_CONTACT_CACHE (source_object);
+      68                 :          14 :   ValentContactStore *store = VALENT_CONTACT_STORE (source_object);
+      69                 :          14 :   GSList *contacts = task_data;
+      70                 :          14 :   GError *error = NULL;
+      71                 :             : 
+      72         [ +  - ]:          14 :   if (g_task_return_error_if_cancelled (task))
+      73                 :           0 :     return;
+      74                 :             : 
+      75                 :          14 :   valent_object_lock (VALENT_OBJECT (self));
+      76                 :          14 :   e_book_cache_put_contacts (self->cache,
+      77                 :             :                              contacts,
+      78                 :             :                              NULL,
+      79                 :             :                              NULL,
+      80                 :             :                              E_CACHE_IS_OFFLINE,
+      81                 :             :                              cancellable,
+      82                 :             :                              &error);
+      83                 :          14 :   valent_object_unlock (VALENT_OBJECT (self));
+      84                 :             : 
+      85         [ -  + ]:          14 :   if (error != NULL)
+      86                 :           0 :     return g_task_return_error (task, error);
+      87                 :             : 
+      88         [ +  + ]:          35 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+      89                 :          21 :     valent_contact_store_contact_added (store, E_CONTACT (iter->data));
+      90                 :             : 
+      91                 :          14 :   g_task_return_boolean (task, TRUE);
+      92                 :             : }
+      93                 :             : 
+      94                 :             : static void
+      95                 :          14 : valent_contact_cache_add_contacts (ValentContactStore  *store,
+      96                 :             :                                    GSList              *contacts,
+      97                 :             :                                    GCancellable        *cancellable,
+      98                 :             :                                    GAsyncReadyCallback  callback,
+      99                 :             :                                    gpointer             user_data)
+     100                 :             : {
+     101                 :          28 :   g_autoptr (GTask) task = NULL;
+     102                 :          14 :   GSList *additions = NULL;
+     103                 :             : 
+     104         [ +  - ]:          14 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     105         [ -  + ]:          14 :   g_assert (contacts != NULL);
+     106   [ +  +  +  -  :          14 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     107                 :             : 
+     108         [ +  + ]:          35 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+     109                 :          21 :     additions = g_slist_append (additions, g_object_ref (iter->data));
+     110                 :             : 
+     111                 :          14 :   task = g_task_new (store, cancellable, callback, user_data);
+     112         [ +  - ]:          14 :   g_task_set_source_tag (task, valent_contact_cache_add_contacts);
+     113                 :          14 :   g_task_set_task_data (task, additions, object_slist_free);
+     114         [ +  - ]:          14 :   g_task_run_in_thread (task, valent_contact_cache_add_task);
+     115                 :          14 : }
+     116                 :             : 
+     117                 :             : static void
+     118                 :           1 : valent_contact_cache_remove_task (GTask        *task,
+     119                 :             :                                   gpointer      source_object,
+     120                 :             :                                   gpointer      task_data,
+     121                 :             :                                   GCancellable *cancellable)
+     122                 :             : {
+     123                 :           1 :   ValentContactCache *self = VALENT_CONTACT_CACHE (source_object);
+     124                 :           1 :   ValentContactStore *store = VALENT_CONTACT_STORE (source_object);
+     125                 :           1 :   GSList *uids = task_data;
+     126                 :           1 :   GError *error = NULL;
+     127                 :             : 
+     128         [ +  - ]:           1 :   if (g_task_return_error_if_cancelled (task))
+     129                 :           0 :     return;
+     130                 :             : 
+     131                 :           1 :   valent_object_lock (VALENT_OBJECT (self));
+     132                 :           1 :   e_book_cache_remove_contacts (self->cache,
+     133                 :             :                                 uids,
+     134                 :             :                                 0,
+     135                 :             :                                 E_CACHE_IS_OFFLINE,
+     136                 :             :                                 cancellable,
+     137                 :             :                                 &error);
+     138                 :           1 :   valent_object_unlock (VALENT_OBJECT (self));
+     139                 :             : 
+     140         [ -  + ]:           1 :   if (error != NULL)
+     141                 :           0 :     return g_task_return_error (task, error);
+     142                 :             : 
+     143         [ +  + ]:           2 :   for (const GSList *iter = uids; iter; iter = iter->next)
+     144                 :           1 :     valent_contact_store_contact_removed (store, (char *)iter->data);
+     145                 :             : 
+     146                 :           1 :   g_task_return_boolean (task, TRUE);
+     147                 :             : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :           1 : valent_contact_cache_remove_contacts (ValentContactStore  *store,
+     151                 :             :                                       GSList              *uids,
+     152                 :             :                                       GCancellable        *cancellable,
+     153                 :             :                                       GAsyncReadyCallback  callback,
+     154                 :             :                                       gpointer             user_data)
+     155                 :             : {
+     156                 :           2 :   g_autoptr (GTask) task = NULL;
+     157                 :           1 :   GSList *removals = NULL;
+     158                 :             : 
+     159         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     160         [ -  + ]:           1 :   g_assert (uids != NULL);
+     161   [ -  +  -  -  :           1 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     162                 :             : 
+     163         [ +  + ]:           2 :   for (const GSList *iter = uids; iter; iter = iter->next)
+     164         [ -  + ]:           2 :     removals = g_slist_append (removals, g_strdup (iter->data));
+     165                 :             : 
+     166                 :           1 :   task = g_task_new (store, cancellable, callback, user_data);
+     167         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_contact_cache_remove_contacts);
+     168                 :           1 :   g_task_set_task_data (task, removals, string_slist_free);
+     169         [ +  - ]:           1 :   g_task_run_in_thread (task, valent_contact_cache_remove_task);
+     170                 :           1 : }
+     171                 :             : 
+     172                 :             : static void
+     173                 :           2 : valent_contact_cache_get_contact_task (GTask        *task,
+     174                 :             :                                        gpointer      source_object,
+     175                 :             :                                        gpointer      task_data,
+     176                 :             :                                        GCancellable *cancellable)
+     177                 :             : {
+     178                 :           2 :   ValentContactCache *self = VALENT_CONTACT_CACHE (source_object);
+     179                 :           2 :   const char *uid = task_data;
+     180                 :           2 :   EContact *contact = NULL;
+     181                 :           2 :   GError *error = NULL;
+     182                 :             : 
+     183         [ +  - ]:           2 :   if (g_task_return_error_if_cancelled (task))
+     184                 :           1 :     return;
+     185                 :             : 
+     186                 :           2 :   valent_object_lock (VALENT_OBJECT (self));
+     187                 :           2 :   e_book_cache_get_contact (self->cache,
+     188                 :             :                             uid,
+     189                 :             :                             FALSE,
+     190                 :             :                             &contact,
+     191                 :             :                             cancellable,
+     192                 :             :                             &error);
+     193                 :           2 :   valent_object_unlock (VALENT_OBJECT (self));
+     194                 :             : 
+     195         [ +  + ]:           2 :   if (error != NULL)
+     196                 :           1 :     return g_task_return_error (task, error);
+     197                 :             : 
+     198                 :           1 :   g_task_return_pointer (task, contact, g_object_unref);
+     199                 :             : }
+     200                 :             : 
+     201                 :             : static void
+     202                 :           2 : valent_contact_cache_get_contact (ValentContactStore  *store,
+     203                 :             :                                   const char          *uid,
+     204                 :             :                                   GCancellable        *cancellable,
+     205                 :             :                                   GAsyncReadyCallback  callback,
+     206                 :             :                                   gpointer             user_data)
+     207                 :             : {
+     208                 :           4 :   g_autoptr (GTask) task = NULL;
+     209                 :             : 
+     210         [ +  - ]:           2 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     211         [ -  + ]:           2 :   g_assert (uid != NULL);
+     212   [ -  +  -  -  :           2 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     213                 :             : 
+     214                 :           2 :   task = g_task_new (store, cancellable, callback, user_data);
+     215         [ +  - ]:           2 :   g_task_set_source_tag (task, valent_contact_cache_get_contact);
+     216         [ -  + ]:           4 :   g_task_set_task_data (task, g_strdup (uid), g_free);
+     217         [ +  - ]:           2 :   g_task_run_in_thread (task, valent_contact_cache_get_contact_task);
+     218                 :           2 : }
+     219                 :             : 
+     220                 :             : static void
+     221                 :          12 : valent_contact_cache_query_task (GTask        *task,
+     222                 :             :                                  gpointer      source_object,
+     223                 :             :                                  gpointer      task_data,
+     224                 :             :                                  GCancellable *cancellable)
+     225                 :             : {
+     226                 :          12 :   ValentContactCache *self = VALENT_CONTACT_CACHE (source_object);
+     227                 :          12 :   const char *query = task_data;
+     228                 :          12 :   GSList *results = NULL;
+     229                 :          12 :   GSList *contacts = NULL;
+     230                 :          12 :   GError *error = NULL;
+     231                 :             : 
+     232         [ +  - ]:          12 :   if (g_task_return_error_if_cancelled (task))
+     233                 :           0 :     return;
+     234                 :             : 
+     235                 :          12 :   valent_object_lock (VALENT_OBJECT (self));
+     236                 :          12 :   e_book_cache_search (self->cache,
+     237                 :             :                        query,
+     238                 :             :                        FALSE,
+     239                 :             :                        &results,
+     240                 :             :                        cancellable,
+     241                 :             :                        &error);
+     242                 :          12 :   valent_object_unlock (VALENT_OBJECT (self));
+     243                 :             : 
+     244         [ -  + ]:          12 :   if (error != NULL)
+     245                 :           0 :     return g_task_return_error (task, error);
+     246                 :             : 
+     247         [ +  + ]:          28 :   for (const GSList *iter = results; iter; iter = iter->next)
+     248                 :             :     {
+     249                 :          16 :       EBookCacheSearchData *result = iter->data;
+     250                 :          16 :       EContact *contact;
+     251                 :             : 
+     252                 :          16 :       contact = e_contact_new_from_vcard (result->vcard);
+     253                 :          16 :       contacts = g_slist_prepend (contacts, contact);
+     254                 :             :     }
+     255                 :          12 :   g_slist_free_full (results, e_book_cache_search_data_free);
+     256                 :             : 
+     257                 :          12 :   g_task_return_pointer (task, contacts, object_slist_free);
+     258                 :             : }
+     259                 :             : 
+     260                 :             : static void
+     261                 :          12 : valent_contact_cache_query (ValentContactStore  *store,
+     262                 :             :                             const char          *query,
+     263                 :             :                             GCancellable        *cancellable,
+     264                 :             :                             GAsyncReadyCallback  callback,
+     265                 :             :                             gpointer             user_data)
+     266                 :             : {
+     267                 :          24 :   g_autoptr (GTask) task = NULL;
+     268                 :             : 
+     269         [ +  - ]:          12 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     270         [ -  + ]:          12 :   g_assert (query != NULL);
+     271   [ +  +  +  -  :          12 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     272                 :             : 
+     273                 :          12 :   task = g_task_new (store, cancellable, callback, user_data);
+     274         [ +  - ]:          12 :   g_task_set_source_tag (task, valent_contact_cache_query);
+     275         [ -  + ]:          24 :   g_task_set_task_data (task, g_strdup (query), g_free);
+     276         [ +  - ]:          12 :   g_task_run_in_thread (task, valent_contact_cache_query_task);
+     277                 :          12 : }
+     278                 :             : 
+     279                 :             : /*
+     280                 :             :  * GObject
+     281                 :             :  */
+     282                 :             : static void
+     283                 :          17 : valent_contact_cache_constructed (GObject *object)
+     284                 :             : {
+     285                 :          17 :   ValentContactCache *self = VALENT_CONTACT_CACHE (object);
+     286                 :          17 :   ValentContactStore *store = VALENT_CONTACT_STORE (object);
+     287                 :          17 :   ESource *source;
+     288                 :          34 :   g_autoptr (GError) error = NULL;
+     289                 :             : 
+     290                 :          17 :   source = valent_contact_store_get_source (store);
+     291                 :             : 
+     292                 :             :   /* This will usually be the path for the contacts plugin, since the device ID
+     293                 :             :    * is used as the ESource UID. */
+     294         [ +  - ]:          17 :   if (self->path == NULL)
+     295                 :             :     {
+     296                 :          34 :       g_autoptr (ValentContext) context = NULL;
+     297         [ +  - ]:          17 :       g_autoptr (GFile) contacts_db = NULL;
+     298                 :             : 
+     299                 :          17 :       context = valent_context_new (NULL, "contacts", e_source_get_uid (source));
+     300                 :          17 :       contacts_db = valent_context_get_cache_file (context, "contacts.db");
+     301         [ +  - ]:          17 :       self->path = g_file_get_path (contacts_db);
+     302                 :             :     }
+     303                 :             : 
+     304                 :          17 :   valent_object_lock (VALENT_OBJECT (self));
+     305                 :          17 :   self->cache = e_book_cache_new (self->path, source, NULL, &error);
+     306                 :          17 :   valent_object_unlock (VALENT_OBJECT (self));
+     307                 :             : 
+     308         [ -  + ]:          17 :   if (error != NULL)
+     309                 :           0 :     g_critical ("%s(): %s", G_STRFUNC, error->message);
+     310                 :             : 
+     311         [ -  + ]:          17 :   G_OBJECT_CLASS (valent_contact_cache_parent_class)->constructed (object);
+     312                 :          17 : }
+     313                 :             : 
+     314                 :             : static void
+     315                 :           8 : valent_contact_cache_finalize (GObject *object)
+     316                 :             : {
+     317                 :           8 :   ValentContactCache *self = VALENT_CONTACT_CACHE (object);
+     318                 :             : 
+     319                 :           8 :   valent_object_lock (VALENT_OBJECT (self));
+     320         [ +  - ]:           8 :   g_clear_object (&self->cache);
+     321         [ +  - ]:           8 :   g_clear_pointer (&self->path, g_free);
+     322                 :           8 :   valent_object_unlock (VALENT_OBJECT (self));
+     323                 :             : 
+     324                 :           8 :   G_OBJECT_CLASS (valent_contact_cache_parent_class)->finalize (object);
+     325                 :           8 : }
+     326                 :             : 
+     327                 :             : static void
+     328                 :           1 : valent_contact_cache_get_property (GObject    *object,
+     329                 :             :                                    guint       prop_id,
+     330                 :             :                                    GValue     *value,
+     331                 :             :                                    GParamSpec *pspec)
+     332                 :             : {
+     333                 :           1 :   ValentContactCache *self = VALENT_CONTACT_CACHE (object);
+     334                 :             : 
+     335         [ +  - ]:           1 :   switch (prop_id)
+     336                 :             :     {
+     337                 :           1 :     case PROP_PATH:
+     338                 :           1 :       g_value_set_string (value, self->path);
+     339                 :           1 :       break;
+     340                 :             : 
+     341                 :           0 :     default:
+     342                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     343                 :             :     }
+     344                 :           1 : }
+     345                 :             : 
+     346                 :             : static void
+     347                 :          17 : valent_contact_cache_set_property (GObject      *object,
+     348                 :             :                                    guint         prop_id,
+     349                 :             :                                    const GValue *value,
+     350                 :             :                                    GParamSpec   *pspec)
+     351                 :             : {
+     352                 :          17 :   ValentContactCache *self = VALENT_CONTACT_CACHE (object);
+     353                 :             : 
+     354         [ +  - ]:          17 :   switch (prop_id)
+     355                 :             :     {
+     356                 :          17 :     case PROP_PATH:
+     357                 :          17 :       self->path = g_value_dup_string (value);
+     358                 :          17 :       break;
+     359                 :             : 
+     360                 :           0 :     default:
+     361                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     362                 :             :     }
+     363                 :          17 : }
+     364                 :             : 
+     365                 :             : static void
+     366                 :           7 : valent_contact_cache_class_init (ValentContactCacheClass *klass)
+     367                 :             : {
+     368                 :           7 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     369                 :           7 :   ValentContactStoreClass *store_class = VALENT_CONTACT_STORE_CLASS (klass);
+     370                 :             : 
+     371                 :           7 :   object_class->constructed = valent_contact_cache_constructed;
+     372                 :           7 :   object_class->finalize = valent_contact_cache_finalize;
+     373                 :           7 :   object_class->get_property = valent_contact_cache_get_property;
+     374                 :           7 :   object_class->set_property = valent_contact_cache_set_property;
+     375                 :             : 
+     376                 :           7 :   store_class->add_contacts = valent_contact_cache_add_contacts;
+     377                 :           7 :   store_class->remove_contacts = valent_contact_cache_remove_contacts;
+     378                 :           7 :   store_class->query = valent_contact_cache_query;
+     379                 :           7 :   store_class->get_contact = valent_contact_cache_get_contact;
+     380                 :             : 
+     381                 :             :   /**
+     382                 :             :    * ValentContactCache:path:
+     383                 :             :    *
+     384                 :             :    * The path to the database file.
+     385                 :             :    *
+     386                 :             :    * Since: 1.0
+     387                 :             :    */
+     388                 :          14 :   properties [PROP_PATH] =
+     389                 :           7 :     g_param_spec_string ("path", NULL, NULL,
+     390                 :             :                          NULL,
+     391                 :             :                          (G_PARAM_READWRITE |
+     392                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     393                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     394                 :             :                           G_PARAM_STATIC_STRINGS));
+     395                 :             : 
+     396                 :           7 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     397                 :           7 : }
+     398                 :             : 
+     399                 :             : static void
+     400                 :          17 : valent_contact_cache_init (ValentContactCache *self)
+     401                 :             : {
+     402                 :          17 : }
+     403                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-store.c.func-c.html b/coverage/src/libvalent/contacts/valent-contact-store.c.func-c.html new file mode 100644 index 00000000000..b95afbb6709 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-store.c.func-c.html @@ -0,0 +1,287 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-store.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.4 %225217
Test Date:2024-03-31 18:46:36Functions:100.0 %2727
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.8 %18181
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contact_store_contact_removed1
valent_contact_store_contact_removed_main1
valent_contact_store_get_contacts1
valent_contact_store_remove_contact1
valent_contact_store_remove_contacts1
valent_contact_store_remove_contacts_finish1
valent_contact_store_get_contact2
valent_contact_store_get_contact_finish2
valent_contact_store_get_name3
valent_contact_store_set_name3
valent_contact_store_get_property4
valent_contact_store_class_init8
valent_contact_store_finalize8
valent_contact_store_add_contact10
valent_contact_store_query_finish11
valent_contact_store_query12
valent_contact_store_add_contacts14
valent_contact_store_add_contacts_finish14
valent_contact_store_get_uid17
valent_contact_store_init17
valent_contact_store_get_source18
valent_contact_store_set_property20
valent_contact_store_contact_added21
valent_contact_store_contact_added_main21
valent_contact_store_get_type459
valent_contact_store_class_intern_init8
valent_contact_store_get_type_once86
valent_contact_store_get_type365
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-store.c.func.html b/coverage/src/libvalent/contacts/valent-contact-store.c.func.html new file mode 100644 index 00000000000..145a16dfafb --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-store.c.func.html @@ -0,0 +1,287 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-store.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.4 %225217
Test Date:2024-03-31 18:46:36Functions:100.0 %2727
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.8 %18181
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contact_store_add_contact10
valent_contact_store_add_contacts14
valent_contact_store_add_contacts_finish14
valent_contact_store_class_init8
valent_contact_store_contact_added21
valent_contact_store_contact_added_main21
valent_contact_store_contact_removed1
valent_contact_store_contact_removed_main1
valent_contact_store_finalize8
valent_contact_store_get_contact2
valent_contact_store_get_contact_finish2
valent_contact_store_get_contacts1
valent_contact_store_get_name3
valent_contact_store_get_property4
valent_contact_store_get_source18
valent_contact_store_get_type459
valent_contact_store_class_intern_init8
valent_contact_store_get_type365
valent_contact_store_get_type_once86
valent_contact_store_get_uid17
valent_contact_store_init17
valent_contact_store_query12
valent_contact_store_query_finish11
valent_contact_store_remove_contact1
valent_contact_store_remove_contacts1
valent_contact_store_remove_contacts_finish1
valent_contact_store_set_name3
valent_contact_store_set_property20
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-store.c.gcov.html b/coverage/src/libvalent/contacts/valent-contact-store.c.gcov.html new file mode 100644 index 00000000000..f32f3083d31 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-store.c.gcov.html @@ -0,0 +1,1025 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-store.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.4 %225217
Test Date:2024-03-31 18:46:36Functions:100.0 %2727
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.8 %18181
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contact-store"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libvalent-core.h>
+       9                 :             : 
+      10                 :             : #include "valent-contact-store.h"
+      11                 :             : #include "valent-eds.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentContactStore:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for address books.
+      18                 :             :  *
+      19                 :             :  * `ValentContactStore` is a base class to provide an interface to an address
+      20                 :             :  * book. This usually means adding, removing and querying contacts.
+      21                 :             :  *
+      22                 :             :  * Since: 1.0
+      23                 :             :  */
+      24                 :             : 
+      25                 :             : typedef struct
+      26                 :             : {
+      27                 :             :   ESource *source;
+      28                 :             : } ValentContactStorePrivate;
+      29                 :             : 
+      30   [ +  +  +  - ]:         532 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentContactStore, valent_contact_store, VALENT_TYPE_OBJECT)
+      31                 :             : 
+      32                 :             : /**
+      33                 :             :  * ValentContactStoreClass:
+      34                 :             :  * @add_contacts: the virtual function pointer for valent_contact_store_add_contacts()
+      35                 :             :  * @get_contact: the virtual function pointer for valent_contact_store_get_contact()
+      36                 :             :  * @remove_contact: the virtual function pointer for valent_contact_store_remove_contact()
+      37                 :             :  * @query: the virtual function pointer for valent_contact_store_query()
+      38                 :             :  * @contact_added: the class closure for `ValentContactStore`::contact-added
+      39                 :             :  * @contact_removed: the class closure for `ValentContactStore`::contact-removed
+      40                 :             :  *
+      41                 :             :  * The virtual function table for `ValentContactStore`.
+      42                 :             :  */
+      43                 :             : 
+      44                 :             : 
+      45                 :             : enum {
+      46                 :             :   PROP_0,
+      47                 :             :   PROP_NAME,
+      48                 :             :   PROP_SOURCE,
+      49                 :             :   PROP_UID,
+      50                 :             :   N_PROPERTIES
+      51                 :             : };
+      52                 :             : 
+      53                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      54                 :             : 
+      55                 :             : enum {
+      56                 :             :   CONTACT_ADDED,
+      57                 :             :   CONTACT_REMOVED,
+      58                 :             :   N_SIGNALS
+      59                 :             : };
+      60                 :             : 
+      61                 :             : static guint signals[N_SIGNALS] = { 0, };
+      62                 :             : 
+      63                 :             : 
+      64                 :             : /*
+      65                 :             :  * Signal Emission Helpers
+      66                 :             :  */
+      67                 :             : typedef struct
+      68                 :             : {
+      69                 :             :   GRecMutex  mutex;
+      70                 :             :   GWeakRef   store;
+      71                 :             :   char      *uid;
+      72                 :             :   EContact  *contact;
+      73                 :             : } SignalEmission;
+      74                 :             : 
+      75                 :             : static gboolean
+      76                 :          21 : valent_contact_store_contact_added_main (gpointer data)
+      77                 :             : {
+      78                 :          21 :   SignalEmission *emission = data;
+      79                 :          42 :   g_autoptr (ValentContactStore) store = NULL;
+      80                 :             : 
+      81         [ +  - ]:          21 :   g_assert (VALENT_IS_MAIN_THREAD ());
+      82                 :             : 
+      83                 :          21 :   g_rec_mutex_lock (&emission->mutex);
+      84         [ +  - ]:          21 :   if ((store = g_weak_ref_get (&emission->store)) != NULL)
+      85                 :          21 :     g_signal_emit (G_OBJECT (store),
+      86                 :             :                    signals [CONTACT_ADDED], 0,
+      87                 :             :                    emission->contact);
+      88                 :             : 
+      89                 :          21 :   g_weak_ref_clear (&emission->store);
+      90         [ +  - ]:          21 :   g_clear_object (&emission->contact);
+      91                 :          21 :   g_rec_mutex_unlock (&emission->mutex);
+      92                 :          21 :   g_rec_mutex_clear (&emission->mutex);
+      93                 :          21 :   g_clear_pointer (&emission, g_free);
+      94                 :             : 
+      95         [ +  - ]:          21 :   return G_SOURCE_REMOVE;
+      96                 :             : }
+      97                 :             : 
+      98                 :             : static gboolean
+      99                 :           1 : valent_contact_store_contact_removed_main (gpointer data)
+     100                 :             : {
+     101                 :           1 :   SignalEmission *emission = data;
+     102                 :           2 :   g_autoptr (ValentContactStore) store = NULL;
+     103                 :             : 
+     104         [ +  - ]:           1 :   g_assert (VALENT_IS_MAIN_THREAD ());
+     105                 :             : 
+     106                 :           1 :   g_rec_mutex_lock (&emission->mutex);
+     107         [ +  - ]:           1 :   if ((store = g_weak_ref_get (&emission->store)) != NULL)
+     108                 :           1 :     g_signal_emit (G_OBJECT (store),
+     109                 :             :                    signals [CONTACT_REMOVED], 0,
+     110                 :             :                    emission->uid);
+     111                 :             : 
+     112                 :           1 :   g_weak_ref_clear (&emission->store);
+     113         [ +  - ]:           1 :   g_clear_pointer (&emission->uid, g_free);
+     114                 :           1 :   g_rec_mutex_unlock (&emission->mutex);
+     115                 :           1 :   g_rec_mutex_clear (&emission->mutex);
+     116                 :           1 :   g_clear_pointer (&emission, g_free);
+     117                 :             : 
+     118         [ +  - ]:           1 :   return G_SOURCE_REMOVE;
+     119                 :             : }
+     120                 :             : 
+     121                 :             : /* LCOV_EXCL_START */
+     122                 :             : static void
+     123                 :             : valent_contact_store_real_add_contacts (ValentContactStore  *store,
+     124                 :             :                                         GSList              *contacts,
+     125                 :             :                                         GCancellable        *cancellable,
+     126                 :             :                                         GAsyncReadyCallback  callback,
+     127                 :             :                                         gpointer             user_data)
+     128                 :             : {
+     129                 :             :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     130                 :             :   g_assert (contacts != NULL);
+     131                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     132                 :             : 
+     133                 :             :   g_task_report_new_error (store, callback, user_data,
+     134                 :             :                            valent_contact_store_real_add_contacts,
+     135                 :             :                            G_IO_ERROR,
+     136                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+     137                 :             :                            "%s does not implement add_contacts()",
+     138                 :             :                            G_OBJECT_TYPE_NAME (store));
+     139                 :             : }
+     140                 :             : 
+     141                 :             : static void
+     142                 :             : valent_contact_store_real_remove_contacts (ValentContactStore  *store,
+     143                 :             :                                            GSList              *uids,
+     144                 :             :                                            GCancellable        *cancellable,
+     145                 :             :                                            GAsyncReadyCallback  callback,
+     146                 :             :                                            gpointer             user_data)
+     147                 :             : {
+     148                 :             :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     149                 :             :   g_assert (uids != NULL);
+     150                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     151                 :             : 
+     152                 :             :   g_task_report_new_error (store, callback, user_data,
+     153                 :             :                            valent_contact_store_real_remove_contacts,
+     154                 :             :                            G_IO_ERROR,
+     155                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+     156                 :             :                            "%s does not implement remove_contacts()",
+     157                 :             :                            G_OBJECT_TYPE_NAME (store));
+     158                 :             : }
+     159                 :             : 
+     160                 :             : static void
+     161                 :             : valent_contact_store_real_get_contact (ValentContactStore  *store,
+     162                 :             :                                        const char          *uid,
+     163                 :             :                                        GCancellable        *cancellable,
+     164                 :             :                                        GAsyncReadyCallback  callback,
+     165                 :             :                                        gpointer             user_data)
+     166                 :             : {
+     167                 :             :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     168                 :             :   g_assert (uid != NULL);
+     169                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     170                 :             : 
+     171                 :             :   g_task_report_new_error (store, callback, user_data,
+     172                 :             :                            valent_contact_store_real_get_contact,
+     173                 :             :                            G_IO_ERROR,
+     174                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+     175                 :             :                            "%s does not implement get_contact()",
+     176                 :             :                            G_OBJECT_TYPE_NAME (store));
+     177                 :             : }
+     178                 :             : 
+     179                 :             : static void
+     180                 :             : valent_contact_store_real_query (ValentContactStore  *store,
+     181                 :             :                                  const char          *query,
+     182                 :             :                                  GCancellable        *cancellable,
+     183                 :             :                                  GAsyncReadyCallback  callback,
+     184                 :             :                                  gpointer             user_data)
+     185                 :             : {
+     186                 :             :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     187                 :             :   g_assert (query != NULL);
+     188                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     189                 :             : 
+     190                 :             :   g_task_report_new_error (store, callback, user_data,
+     191                 :             :                            valent_contact_store_real_query,
+     192                 :             :                            G_IO_ERROR,
+     193                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+     194                 :             :                            "%s does not implement query()",
+     195                 :             :                            G_OBJECT_TYPE_NAME (store));
+     196                 :             : }
+     197                 :             : /* LCOV_EXCL_STOP */
+     198                 :             : 
+     199                 :             : /*
+     200                 :             :  * GObject
+     201                 :             :  */
+     202                 :             : static void
+     203                 :           8 : valent_contact_store_finalize (GObject *object)
+     204                 :             : {
+     205                 :           8 :   ValentContactStore *self = VALENT_CONTACT_STORE (object);
+     206                 :           8 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (self);
+     207                 :             : 
+     208         [ +  - ]:           8 :   g_clear_object (&priv->source);
+     209                 :             : 
+     210                 :           8 :   G_OBJECT_CLASS (valent_contact_store_parent_class)->finalize (object);
+     211                 :           8 : }
+     212                 :             : 
+     213                 :             : static void
+     214                 :           4 : valent_contact_store_get_property (GObject    *object,
+     215                 :             :                                    guint       prop_id,
+     216                 :             :                                    GValue     *value,
+     217                 :             :                                    GParamSpec *pspec)
+     218                 :             : {
+     219                 :           4 :   ValentContactStore *self = VALENT_CONTACT_STORE (object);
+     220                 :           4 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (self);
+     221                 :             : 
+     222   [ +  +  +  - ]:           4 :   switch (prop_id)
+     223                 :             :     {
+     224                 :           2 :     case PROP_NAME:
+     225                 :           2 :       g_value_set_string (value, valent_contact_store_get_name (self));
+     226                 :           2 :       break;
+     227                 :             : 
+     228                 :           1 :     case PROP_SOURCE:
+     229                 :           1 :       g_value_set_object (value, priv->source);
+     230                 :           1 :       break;
+     231                 :             : 
+     232                 :           1 :     case PROP_UID:
+     233                 :           1 :       g_value_set_string (value, valent_contact_store_get_uid (self));
+     234                 :           1 :       break;
+     235                 :             : 
+     236                 :           0 :     default:
+     237                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     238                 :             :     }
+     239                 :           4 : }
+     240                 :             : 
+     241                 :             : static void
+     242                 :          20 : valent_contact_store_set_property (GObject      *object,
+     243                 :             :                                    guint         prop_id,
+     244                 :             :                                    const GValue *value,
+     245                 :             :                                    GParamSpec   *pspec)
+     246                 :             : {
+     247                 :          20 :   ValentContactStore *self = VALENT_CONTACT_STORE (object);
+     248                 :          20 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (self);
+     249                 :             : 
+     250      [ +  +  - ]:          20 :   switch (prop_id)
+     251                 :             :     {
+     252                 :           3 :     case PROP_NAME:
+     253                 :           3 :       valent_contact_store_set_name (self, g_value_get_string (value));
+     254                 :           3 :       break;
+     255                 :             : 
+     256                 :          17 :     case PROP_SOURCE:
+     257                 :          17 :       priv->source = g_value_dup_object (value);
+     258                 :          17 :       break;
+     259                 :             : 
+     260                 :           0 :     default:
+     261                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     262                 :             :     }
+     263                 :          20 : }
+     264                 :             : 
+     265                 :             : static void
+     266                 :           8 : valent_contact_store_class_init (ValentContactStoreClass *klass)
+     267                 :             : {
+     268                 :           8 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     269                 :             : 
+     270                 :           8 :   object_class->finalize = valent_contact_store_finalize;
+     271                 :           8 :   object_class->get_property = valent_contact_store_get_property;
+     272                 :           8 :   object_class->set_property = valent_contact_store_set_property;
+     273                 :             : 
+     274                 :           8 :   klass->add_contacts = valent_contact_store_real_add_contacts;
+     275                 :           8 :   klass->remove_contacts = valent_contact_store_real_remove_contacts;
+     276                 :           8 :   klass->query = valent_contact_store_real_query;
+     277                 :           8 :   klass->get_contact = valent_contact_store_real_get_contact;
+     278                 :             : 
+     279                 :             :   /**
+     280                 :             :    * ValentContactStore:name: (getter get_name) (setter set_name)
+     281                 :             :    *
+     282                 :             :    * The display name.
+     283                 :             :    *
+     284                 :             :    * Since: 1.0
+     285                 :             :    */
+     286                 :          16 :   properties [PROP_NAME] =
+     287                 :           8 :     g_param_spec_string ("name", NULL, NULL,
+     288                 :             :                          NULL,
+     289                 :             :                          (G_PARAM_READWRITE |
+     290                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     291                 :             :                           G_PARAM_STATIC_STRINGS));
+     292                 :             : 
+     293                 :             :   /**
+     294                 :             :    * ValentContactStore:source: (getter get_source)
+     295                 :             :    *
+     296                 :             :    * The store [class@EDataServer.Source].
+     297                 :             :    *
+     298                 :             :    * Since: 1.0
+     299                 :             :    */
+     300                 :          16 :   properties [PROP_SOURCE] =
+     301                 :           8 :     g_param_spec_object ("source", NULL, NULL,
+     302                 :             :                          E_TYPE_SOURCE,
+     303                 :             :                          (G_PARAM_READWRITE |
+     304                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     305                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     306                 :             :                           G_PARAM_STATIC_STRINGS));
+     307                 :             : 
+     308                 :             :   /**
+     309                 :             :    * ValentContactStore:uid: (getter get_uid)
+     310                 :             :    *
+     311                 :             :    * The unique identifier.
+     312                 :             :    *
+     313                 :             :    * Since: 1.0
+     314                 :             :    */
+     315                 :          16 :   properties [PROP_UID] =
+     316                 :           8 :     g_param_spec_string ("uid", NULL, NULL,
+     317                 :             :                          NULL,
+     318                 :             :                          (G_PARAM_READABLE |
+     319                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     320                 :             :                           G_PARAM_STATIC_STRINGS));
+     321                 :             : 
+     322                 :           8 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     323                 :             : 
+     324                 :             :   /**
+     325                 :             :    * ValentContactStore::contact-added:
+     326                 :             :    * @store: a `ValentContactStore`
+     327                 :             :    * @contact: a `EContact`
+     328                 :             :    *
+     329                 :             :    * Emitted when an [class@EBookContacts.Contact] is added to @store.
+     330                 :             :    *
+     331                 :             :    * Since: 1.0
+     332                 :             :    */
+     333                 :          16 :   signals [CONTACT_ADDED] =
+     334                 :           8 :     g_signal_new ("contact-added",
+     335                 :             :                   G_TYPE_FROM_CLASS (klass),
+     336                 :             :                   G_SIGNAL_RUN_LAST,
+     337                 :             :                   G_STRUCT_OFFSET (ValentContactStoreClass, contact_added),
+     338                 :             :                   NULL, NULL,
+     339                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     340                 :             :                   G_TYPE_NONE,
+     341                 :             :                   1,
+     342                 :             :                   E_TYPE_CONTACT);
+     343                 :           8 :   g_signal_set_va_marshaller (signals [CONTACT_ADDED],
+     344                 :             :                               G_TYPE_FROM_CLASS (klass),
+     345                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     346                 :             : 
+     347                 :             :   /**
+     348                 :             :    * ValentContactStore::contact-removed:
+     349                 :             :    * @store: a `ValentContactStore`
+     350                 :             :    * @uid: the UID of the removed contact
+     351                 :             :    *
+     352                 :             :    * Emitted when an [class@EBookContacts.Contact] is removed from @store.
+     353                 :             :    *
+     354                 :             :    * Since: 1.0
+     355                 :             :    */
+     356                 :          16 :   signals [CONTACT_REMOVED] =
+     357                 :           8 :     g_signal_new ("contact-removed",
+     358                 :             :                   G_TYPE_FROM_CLASS (klass),
+     359                 :             :                   G_SIGNAL_RUN_LAST,
+     360                 :             :                   G_STRUCT_OFFSET (ValentContactStoreClass, contact_removed),
+     361                 :             :                   NULL, NULL,
+     362                 :             :                   g_cclosure_marshal_VOID__STRING,
+     363                 :             :                   G_TYPE_NONE,
+     364                 :             :                   1,
+     365                 :             :                   G_TYPE_STRING);
+     366                 :           8 :   g_signal_set_va_marshaller (signals [CONTACT_REMOVED],
+     367                 :             :                               G_TYPE_FROM_CLASS (klass),
+     368                 :             :                               g_cclosure_marshal_VOID__STRINGv);
+     369                 :           8 : }
+     370                 :             : 
+     371                 :             : static void
+     372                 :          17 : valent_contact_store_init (ValentContactStore *store)
+     373                 :             : {
+     374                 :          17 : }
+     375                 :             : 
+     376                 :             : /**
+     377                 :             :  * valent_contact_store_contact_added:
+     378                 :             :  * @store: a `ValentContactStore`
+     379                 :             :  * @contact: the `EContact`
+     380                 :             :  *
+     381                 :             :  * Emits [signal@Valent.ContactStore::contact-added] signal on @store.
+     382                 :             :  *
+     383                 :             :  * This method should only be called by implementations of
+     384                 :             :  * [class@Valent.ContactStore]. Signal handlers may query the state, so it must
+     385                 :             :  * emitted after the internal representation has been updated.
+     386                 :             :  *
+     387                 :             :  * Since: 1.0
+     388                 :             :  */
+     389                 :             : void
+     390                 :          21 : valent_contact_store_contact_added (ValentContactStore *store,
+     391                 :             :                                     EContact           *contact)
+     392                 :             : {
+     393                 :          21 :   SignalEmission *emission;
+     394                 :             : 
+     395         [ +  - ]:          21 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     396                 :             : 
+     397         [ +  - ]:          21 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+     398                 :             :     {
+     399                 :           0 :       g_signal_emit (G_OBJECT (store), signals [CONTACT_ADDED], 0, contact);
+     400                 :           0 :       return;
+     401                 :             :     }
+     402                 :             : 
+     403                 :          21 :   emission = g_new0 (SignalEmission, 1);
+     404                 :          21 :   g_rec_mutex_init (&emission->mutex);
+     405                 :          21 :   g_rec_mutex_lock (&emission->mutex);
+     406                 :          21 :   g_weak_ref_init (&emission->store, store);
+     407                 :          21 :   emission->contact = g_object_ref (contact);
+     408                 :          21 :   g_rec_mutex_unlock (&emission->mutex);
+     409                 :             : 
+     410                 :          21 :   g_timeout_add (0, valent_contact_store_contact_added_main, emission);
+     411                 :             : }
+     412                 :             : 
+     413                 :             : /**
+     414                 :             :  * valent_contact_store_contact_removed:
+     415                 :             :  * @store: a `ValentContactStore`
+     416                 :             :  * @uid: the UID of @contact
+     417                 :             :  *
+     418                 :             :  * Emits [signal@Valent.ContactStore::contact-removed] on @store.
+     419                 :             :  *
+     420                 :             :  * This method should only be called by implementations of
+     421                 :             :  * [class@Valent.ContactStore]. Signal handlers may query the state, so it must
+     422                 :             :  * emitted after the internal representation has been updated.
+     423                 :             :  *
+     424                 :             :  * Since: 1.0
+     425                 :             :  */
+     426                 :             : void
+     427                 :           1 : valent_contact_store_contact_removed (ValentContactStore *store,
+     428                 :             :                                       const char         *uid)
+     429                 :             : {
+     430                 :           1 :   SignalEmission *emission;
+     431                 :             : 
+     432         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     433                 :             : 
+     434         [ +  - ]:           1 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+     435                 :             :     {
+     436                 :           0 :       g_signal_emit (G_OBJECT (store), signals [CONTACT_REMOVED], 0, uid);
+     437                 :           0 :       return;
+     438                 :             :     }
+     439                 :             : 
+     440                 :           1 :   emission = g_new0 (SignalEmission, 1);
+     441                 :           1 :   g_rec_mutex_init (&emission->mutex);
+     442                 :           1 :   g_rec_mutex_lock (&emission->mutex);
+     443                 :           1 :   g_weak_ref_init (&emission->store, store);
+     444         [ -  + ]:           1 :   emission->uid = g_strdup (uid);
+     445                 :           1 :   g_rec_mutex_unlock (&emission->mutex);
+     446                 :             : 
+     447                 :           1 :   g_timeout_add (0, valent_contact_store_contact_removed_main, emission);
+     448                 :             : }
+     449                 :             : 
+     450                 :             : /**
+     451                 :             :  * valent_contact_store_get_name: (get-property name)
+     452                 :             :  * @store: a `ValentContactStore`
+     453                 :             :  *
+     454                 :             :  * Get the display name of @store.
+     455                 :             :  *
+     456                 :             :  * Returns: (transfer none): a display name
+     457                 :             :  *
+     458                 :             :  * Since: 1.0
+     459                 :             :  */
+     460                 :             : const char *
+     461                 :           3 : valent_contact_store_get_name (ValentContactStore *store)
+     462                 :             : {
+     463                 :           3 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (store);
+     464                 :             : 
+     465         [ +  - ]:           3 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), NULL);
+     466                 :             : 
+     467                 :           3 :   return e_source_get_display_name (priv->source);
+     468                 :             : }
+     469                 :             : 
+     470                 :             : /**
+     471                 :             :  * valent_contact_store_set_name: (set-property name)
+     472                 :             :  * @store: a `ValentContactStore`
+     473                 :             :  * @name: a display name
+     474                 :             :  *
+     475                 :             :  * Set the display name of @store to @name.
+     476                 :             :  *
+     477                 :             :  * Since: 1.0
+     478                 :             :  */
+     479                 :             : void
+     480                 :           3 : valent_contact_store_set_name (ValentContactStore *store,
+     481                 :             :                                const char         *name)
+     482                 :             : {
+     483                 :           3 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (store);
+     484                 :             : 
+     485         [ +  - ]:           3 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     486         [ -  + ]:           3 :   g_return_if_fail (name != NULL);
+     487                 :             : 
+     488         [ +  - ]:           3 :   if (priv->source != NULL)
+     489                 :           3 :     e_source_set_display_name (priv->source, name);
+     490                 :             : }
+     491                 :             : 
+     492                 :             : /**
+     493                 :             :  * valent_contact_store_get_source: (get-property source)
+     494                 :             :  * @store: a `ValentContactStore`
+     495                 :             :  *
+     496                 :             :  * Get the `ESource` backing @store.
+     497                 :             :  *
+     498                 :             :  * Returns: (transfer none) (not nullable): an `ESource`
+     499                 :             :  *
+     500                 :             :  * Since: 1.0
+     501                 :             :  */
+     502                 :             : ESource *
+     503                 :          18 : valent_contact_store_get_source (ValentContactStore *store)
+     504                 :             : {
+     505                 :          18 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (store);
+     506                 :             : 
+     507         [ +  - ]:          18 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), NULL);
+     508                 :             : 
+     509                 :          18 :   return priv->source;
+     510                 :             : }
+     511                 :             : 
+     512                 :             : /**
+     513                 :             :  * valent_contact_store_get_uid: (get-property uid)
+     514                 :             :  * @store: a `ValentContactStore`
+     515                 :             :  *
+     516                 :             :  * Get the UID of @store.
+     517                 :             :  *
+     518                 :             :  * Returns: (transfer none): a UID
+     519                 :             :  *
+     520                 :             :  * Since: 1.0
+     521                 :             :  */
+     522                 :             : const char *
+     523                 :          17 : valent_contact_store_get_uid (ValentContactStore *store)
+     524                 :             : {
+     525                 :          17 :   ValentContactStorePrivate *priv = valent_contact_store_get_instance_private (store);
+     526                 :             : 
+     527         [ +  - ]:          17 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), NULL);
+     528                 :             : 
+     529                 :          17 :   return e_source_get_uid (priv->source);
+     530                 :             : }
+     531                 :             : 
+     532                 :             : /**
+     533                 :             :  * valent_contact_store_add_contact:
+     534                 :             :  * @store: a `ValentContactStore`
+     535                 :             :  * @contact: a `EContact`
+     536                 :             :  * @cancellable: (nullable): `GCancellable`
+     537                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     538                 :             :  * @user_data: (closure): user supplied data
+     539                 :             :  *
+     540                 :             :  * A convenience wrapper around [method@Valent.ContactStore.add_contacts] for
+     541                 :             :  * adding a single contact.
+     542                 :             :  *
+     543                 :             :  * Call [method@Valent.ContactStore.add_contacts_finish] to get the result.
+     544                 :             :  *
+     545                 :             :  * Since: 1.0
+     546                 :             :  */
+     547                 :             : void
+     548                 :          10 : valent_contact_store_add_contact (ValentContactStore  *store,
+     549                 :             :                                   EContact            *contact,
+     550                 :             :                                   GCancellable        *cancellable,
+     551                 :             :                                   GAsyncReadyCallback  callback,
+     552                 :             :                                   gpointer             user_data)
+     553                 :             : {
+     554                 :          20 :   g_autoptr (GSList) contacts = NULL;
+     555                 :             : 
+     556                 :          10 :   VALENT_ENTRY;
+     557                 :             : 
+     558         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     559   [ +  -  +  -  :          10 :   g_return_if_fail (E_IS_CONTACT (contact));
+             -  +  -  - ]
+     560   [ +  +  +  -  :          10 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     561                 :             : 
+     562                 :          10 :   contacts = g_slist_append (contacts, contact);
+     563                 :          10 :   valent_contact_store_add_contacts (store,
+     564                 :             :                                      contacts,
+     565                 :             :                                      cancellable,
+     566                 :             :                                      callback,
+     567                 :             :                                      user_data);
+     568                 :             : 
+     569         [ +  - ]:          10 :   VALENT_EXIT;
+     570                 :             : }
+     571                 :             : 
+     572                 :             : /**
+     573                 :             :  * valent_contact_store_add_contacts: (virtual add_contacts)
+     574                 :             :  * @store: a `ValentContactStore`
+     575                 :             :  * @contacts: (element-type EContact): a `GSList`
+     576                 :             :  * @cancellable: (nullable): `GCancellable`
+     577                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     578                 :             :  * @user_data: (closure): user supplied data
+     579                 :             :  *
+     580                 :             :  * Add @contacts to @store.
+     581                 :             :  *
+     582                 :             :  * Call [method@Valent.ContactStore.add_contacts_finish] to get the result.
+     583                 :             :  *
+     584                 :             :  * Since: 1.0
+     585                 :             :  */
+     586                 :             : void
+     587                 :          14 : valent_contact_store_add_contacts (ValentContactStore  *store,
+     588                 :             :                                    GSList              *contacts,
+     589                 :             :                                    GCancellable        *cancellable,
+     590                 :             :                                    GAsyncReadyCallback  callback,
+     591                 :             :                                    gpointer             user_data)
+     592                 :             : {
+     593                 :          14 :   VALENT_ENTRY;
+     594                 :             : 
+     595         [ +  - ]:          14 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     596         [ -  + ]:          14 :   g_return_if_fail (contacts != NULL);
+     597   [ +  +  +  -  :          14 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     598                 :             : 
+     599                 :          14 :   VALENT_CONTACT_STORE_GET_CLASS (store)->add_contacts (store,
+     600                 :             :                                                         contacts,
+     601                 :             :                                                         cancellable,
+     602                 :             :                                                         callback,
+     603                 :             :                                                         user_data);
+     604                 :             : 
+     605                 :          14 :   VALENT_EXIT;
+     606                 :             : }
+     607                 :             : 
+     608                 :             : /**
+     609                 :             :  * valent_contact_store_add_contacts_finish:
+     610                 :             :  * @store: a `ValentContactStore`
+     611                 :             :  * @result: a `GAsyncResult`
+     612                 :             :  * @error: (nullable): a `GError`
+     613                 :             :  *
+     614                 :             :  * Finish an operation started by [method@Valent.ContactStore.add_contact] or
+     615                 :             :  * [method@Valent.ContactStore.add_contacts].
+     616                 :             :  *
+     617                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     618                 :             :  *
+     619                 :             :  * Since: 1.0
+     620                 :             :  */
+     621                 :             : gboolean
+     622                 :          14 : valent_contact_store_add_contacts_finish (ValentContactStore  *store,
+     623                 :             :                                           GAsyncResult        *result,
+     624                 :             :                                           GError             **error)
+     625                 :             : {
+     626                 :          14 :   gboolean ret;
+     627                 :             : 
+     628                 :          14 :   VALENT_ENTRY;
+     629                 :             : 
+     630         [ +  - ]:          14 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), FALSE);
+     631         [ -  + ]:          14 :   g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+     632   [ +  -  -  + ]:          14 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     633                 :             : 
+     634                 :          14 :   ret = g_task_propagate_boolean (G_TASK (result), error);
+     635                 :             : 
+     636                 :          14 :   VALENT_RETURN (ret);
+     637                 :             : }
+     638                 :             : 
+     639                 :             : /**
+     640                 :             :  * valent_contact_store_remove_contact:
+     641                 :             :  * @store: a `ValentContactStore`
+     642                 :             :  * @uid: a contact UID
+     643                 :             :  * @cancellable: (nullable): `GCancellable`
+     644                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     645                 :             :  * @user_data: (closure): user supplied data
+     646                 :             :  *
+     647                 :             :  * Remove contact @uid from @store.
+     648                 :             :  *
+     649                 :             :  * A convenience wrapper around [method@Valent.ContactStore.remove_contacts] for
+     650                 :             :  * removing a single contact.
+     651                 :             :  *
+     652                 :             :  * Call [method@Valent.ContactStore.remove_contacts_finish] to get the result.
+     653                 :             :  *
+     654                 :             :  * Since: 1.0
+     655                 :             :  */
+     656                 :             : void
+     657                 :           1 : valent_contact_store_remove_contact (ValentContactStore  *store,
+     658                 :             :                                      const char          *uid,
+     659                 :             :                                      GCancellable        *cancellable,
+     660                 :             :                                      GAsyncReadyCallback  callback,
+     661                 :             :                                      gpointer             user_data)
+     662                 :             : {
+     663                 :           2 :   g_autoptr (GSList) contacts = NULL;
+     664                 :             : 
+     665                 :           1 :   VALENT_ENTRY;
+     666                 :             : 
+     667         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     668         [ -  + ]:           1 :   g_return_if_fail (uid != NULL);
+     669   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     670                 :             : 
+     671                 :           1 :   contacts = g_slist_append (contacts, (char *)uid);
+     672                 :           1 :   valent_contact_store_remove_contacts (store,
+     673                 :             :                                         contacts,
+     674                 :             :                                         cancellable,
+     675                 :             :                                         callback,
+     676                 :             :                                         user_data);
+     677                 :             : 
+     678         [ +  - ]:           1 :   VALENT_EXIT;
+     679                 :             : }
+     680                 :             : 
+     681                 :             : /**
+     682                 :             :  * valent_contact_store_remove_contacts: (virtual remove_contacts)
+     683                 :             :  * @store: a `ValentContactStore`
+     684                 :             :  * @uids: (element-type utf8): a `GSList` of contact UIDs
+     685                 :             :  * @cancellable: (nullable): `GCancellable`
+     686                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     687                 :             :  * @user_data: (closure): user supplied data
+     688                 :             :  *
+     689                 :             :  * Remove contact @uid from @store.
+     690                 :             :  *
+     691                 :             :  * Call [method@Valent.ContactStore.remove_contacts_finish] to get the result.
+     692                 :             :  *
+     693                 :             :  * Since: 1.0
+     694                 :             :  */
+     695                 :             : void
+     696                 :           1 : valent_contact_store_remove_contacts (ValentContactStore  *store,
+     697                 :             :                                       GSList              *uids,
+     698                 :             :                                       GCancellable        *cancellable,
+     699                 :             :                                       GAsyncReadyCallback  callback,
+     700                 :             :                                       gpointer             user_data)
+     701                 :             : {
+     702                 :           1 :   VALENT_ENTRY;
+     703                 :             : 
+     704         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     705         [ -  + ]:           1 :   g_return_if_fail (uids != NULL);
+     706   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     707                 :             : 
+     708                 :           1 :   VALENT_CONTACT_STORE_GET_CLASS (store)->remove_contacts (store,
+     709                 :             :                                                            uids,
+     710                 :             :                                                            cancellable,
+     711                 :             :                                                            callback,
+     712                 :             :                                                            user_data);
+     713                 :             : 
+     714                 :           1 :   VALENT_EXIT;
+     715                 :             : }
+     716                 :             : 
+     717                 :             : /**
+     718                 :             :  * valent_contact_store_remove_contacts_finish:
+     719                 :             :  * @store: a `ValentContactStore`
+     720                 :             :  * @result: a `GAsyncResult`
+     721                 :             :  * @error: (nullable): a `GError`
+     722                 :             :  *
+     723                 :             :  * Finish an operation started by [method@Valent.ContactStore.remove_contact] or
+     724                 :             :  * [method@Valent.ContactStore.remove_contacts].
+     725                 :             :  *
+     726                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     727                 :             :  *
+     728                 :             :  * Since: 1.0
+     729                 :             :  */
+     730                 :             : gboolean
+     731                 :           1 : valent_contact_store_remove_contacts_finish (ValentContactStore  *store,
+     732                 :             :                                              GAsyncResult        *result,
+     733                 :             :                                              GError             **error)
+     734                 :             : {
+     735                 :           1 :   gboolean ret;
+     736                 :             : 
+     737                 :           1 :   VALENT_ENTRY;
+     738                 :             : 
+     739         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), FALSE);
+     740         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+     741   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     742                 :             : 
+     743                 :           1 :   ret = g_task_propagate_boolean (G_TASK (result), error);
+     744                 :             : 
+     745                 :           1 :   VALENT_RETURN (ret);
+     746                 :             : }
+     747                 :             : 
+     748                 :             : /**
+     749                 :             :  * valent_contact_store_query: (virtual query)
+     750                 :             :  * @store: a `ValentContactStore`
+     751                 :             :  * @query: a search expression
+     752                 :             :  * @cancellable: (nullable): `GCancellable`
+     753                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     754                 :             :  * @user_data: (closure): user supplied data
+     755                 :             :  *
+     756                 :             :  * Query @store for contacts matching @query.
+     757                 :             :  *
+     758                 :             :  * Call [method@Valent.ContactStore.query_finish] to get the result.
+     759                 :             :  *
+     760                 :             :  * Since: 1.0
+     761                 :             :  */
+     762                 :             : void
+     763                 :          12 : valent_contact_store_query (ValentContactStore  *store,
+     764                 :             :                             const char          *query,
+     765                 :             :                             GCancellable        *cancellable,
+     766                 :             :                             GAsyncReadyCallback  callback,
+     767                 :             :                             gpointer             user_data)
+     768                 :             : {
+     769                 :          12 :   VALENT_ENTRY;
+     770                 :             : 
+     771         [ +  - ]:          12 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     772         [ -  + ]:          12 :   g_return_if_fail (query != NULL);
+     773   [ +  +  +  -  :          12 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     774                 :             : 
+     775                 :          12 :   VALENT_CONTACT_STORE_GET_CLASS (store)->query (store,
+     776                 :             :                                                  query,
+     777                 :             :                                                  cancellable,
+     778                 :             :                                                  callback,
+     779                 :             :                                                  user_data);
+     780                 :             : 
+     781                 :          12 :   VALENT_EXIT;
+     782                 :             : }
+     783                 :             : 
+     784                 :             : /**
+     785                 :             :  * valent_contact_store_query_finish:
+     786                 :             :  * @store: a `ValentContactStore`
+     787                 :             :  * @result: a `GAsyncResult`
+     788                 :             :  * @error: (nullable): a `GError`
+     789                 :             :  *
+     790                 :             :  * Finish an operation started by [method@Valent.ContactStore.query].
+     791                 :             :  *
+     792                 :             :  * Returns: (transfer full) (element-type EContact): a `GSList`
+     793                 :             :  *
+     794                 :             :  * Since: 1.0
+     795                 :             :  */
+     796                 :             : GSList *
+     797                 :          11 : valent_contact_store_query_finish (ValentContactStore  *store,
+     798                 :             :                                    GAsyncResult        *result,
+     799                 :             :                                    GError             **error)
+     800                 :             : {
+     801                 :          11 :   GSList *ret;
+     802                 :             : 
+     803                 :          11 :   VALENT_ENTRY;
+     804                 :             : 
+     805         [ +  - ]:          11 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), NULL);
+     806         [ -  + ]:          11 :   g_return_val_if_fail (g_task_is_valid (result, store), NULL);
+     807   [ +  -  -  + ]:          11 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     808                 :             : 
+     809                 :          11 :   ret = g_task_propagate_pointer (G_TASK (result), error);
+     810                 :             : 
+     811                 :          11 :   VALENT_RETURN (ret);
+     812                 :             : }
+     813                 :             : 
+     814                 :             : /**
+     815                 :             :  * valent_contact_store_get_contact: (virtual get_contact)
+     816                 :             :  * @store: a `ValentContactStore`
+     817                 :             :  * @uid: a contact UID
+     818                 :             :  * @cancellable: (nullable): `GCancellable`
+     819                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     820                 :             :  * @user_data: (closure): user supplied data
+     821                 :             :  *
+     822                 :             :  * Get a contact by UID.
+     823                 :             :  *
+     824                 :             :  * Call [method@Valent.ContactStore.get_contact_finish] to get the result.
+     825                 :             :  *
+     826                 :             :  * Since: 1.0
+     827                 :             :  */
+     828                 :             : void
+     829                 :           2 : valent_contact_store_get_contact (ValentContactStore  *store,
+     830                 :             :                                   const char          *uid,
+     831                 :             :                                   GCancellable        *cancellable,
+     832                 :             :                                   GAsyncReadyCallback  callback,
+     833                 :             :                                   gpointer             user_data)
+     834                 :             : {
+     835                 :           2 :   VALENT_ENTRY;
+     836                 :             : 
+     837         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     838         [ -  + ]:           2 :   g_return_if_fail (uid != NULL);
+     839   [ -  +  -  -  :           2 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     840                 :             : 
+     841                 :           2 :   VALENT_CONTACT_STORE_GET_CLASS (store)->get_contact (store,
+     842                 :             :                                                        uid,
+     843                 :             :                                                        cancellable,
+     844                 :             :                                                        callback,
+     845                 :             :                                                        user_data);
+     846                 :             : 
+     847                 :           2 :   VALENT_EXIT;
+     848                 :             : }
+     849                 :             : 
+     850                 :             : /**
+     851                 :             :  * valent_contact_store_get_contact_finish:
+     852                 :             :  * @store: a `ValentContactStore`
+     853                 :             :  * @result: a `GAsyncResult`
+     854                 :             :  * @error: (nullable): a `GError`
+     855                 :             :  *
+     856                 :             :  * Finish an operation started by valent_contact_store_get_contact().
+     857                 :             :  *
+     858                 :             :  * Returns: (transfer full) (nullable): a `EContact`
+     859                 :             :  *
+     860                 :             :  * Since: 1.0
+     861                 :             :  */
+     862                 :             : EContact *
+     863                 :           2 : valent_contact_store_get_contact_finish (ValentContactStore  *store,
+     864                 :             :                                          GAsyncResult        *result,
+     865                 :             :                                          GError             **error)
+     866                 :             : {
+     867                 :           2 :   EContact *ret;
+     868                 :             : 
+     869                 :           2 :   VALENT_ENTRY;
+     870                 :             : 
+     871         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), NULL);
+     872         [ -  + ]:           2 :   g_return_val_if_fail (g_task_is_valid (result, store), NULL);
+     873   [ +  -  -  + ]:           2 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     874                 :             : 
+     875                 :           2 :   ret = g_task_propagate_pointer (G_TASK (result), error);
+     876                 :             : 
+     877                 :           2 :   VALENT_RETURN (ret);
+     878                 :             : }
+     879                 :             : 
+     880                 :             : /**
+     881                 :             :  * valent_contact_store_get_contacts:
+     882                 :             :  * @store: a `ValentContactStore`
+     883                 :             :  * @uids: a list of UIDs
+     884                 :             :  * @cancellable: (nullable): `GCancellable`
+     885                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     886                 :             :  * @user_data: (closure): user supplied data
+     887                 :             :  *
+     888                 :             :  * A convenience wrapper around [method@Valent.ContactStore.query] for searching
+     889                 :             :  * contacts by UID.
+     890                 :             :  *
+     891                 :             :  * Call [method@Valent.ContactStore.query_finish] to get the result.
+     892                 :             :  *
+     893                 :             :  * Since: 1.0
+     894                 :             :  */
+     895                 :             : void
+     896                 :           1 : valent_contact_store_get_contacts (ValentContactStore   *store,
+     897                 :             :                                    char                **uids,
+     898                 :             :                                    GCancellable         *cancellable,
+     899                 :             :                                    GAsyncReadyCallback   callback,
+     900                 :             :                                    gpointer              user_data)
+     901                 :             : {
+     902                 :           2 :   g_autofree char *sexp = NULL;
+     903                 :           1 :   g_autofree EBookQuery **queries = NULL;
+     904                 :           1 :   g_autoptr (EBookQuery) query = NULL;
+     905                 :           1 :   unsigned int n;
+     906                 :             : 
+     907                 :           1 :   VALENT_ENTRY;
+     908                 :             : 
+     909         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     910   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     911                 :             : 
+     912                 :           1 :   n = g_strv_length (uids);
+     913         [ -  + ]:           1 :   queries = g_new0 (EBookQuery *, n);
+     914                 :             : 
+     915         [ +  + ]:           2 :   for (unsigned int i = 0; i < n; i++)
+     916                 :           1 :     queries[i] = e_book_query_field_test (E_CONTACT_UID, E_BOOK_QUERY_IS, uids[i]);
+     917                 :             : 
+     918                 :           1 :   query = e_book_query_or (n, queries, TRUE);
+     919                 :           1 :   sexp = e_book_query_to_string (query);
+     920                 :             : 
+     921                 :           1 :   valent_contact_store_query (store, sexp, cancellable, callback, user_data);
+     922                 :             : 
+     923         [ -  + ]:           1 :   VALENT_EXIT;
+     924                 :             : }
+     925                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-store.h.func-c.html b/coverage/src/libvalent/contacts/valent-contact-store.h.func-c.html new file mode 100644 index 00000000000..3b9b0db2c0a --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-store.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-store.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %105
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACT_STORE190
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-store.h.func.html b/coverage/src/libvalent/contacts/valent-contact-store.h.func.html new file mode 100644 index 00000000000..794fd7a6128 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-store.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-store.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %105
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACT_STORE190
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contact-store.h.gcov.html b/coverage/src/libvalent/contacts/valent-contact-store.h.gcov.html new file mode 100644 index 00000000000..2b267afbfe2 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contact-store.h.gcov.html @@ -0,0 +1,226 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contact-store.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contact-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %105
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : #include "valent-eds.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_CONTACT_STORE (valent_contact_store_get_type())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :         284 : G_DECLARE_DERIVABLE_TYPE (ValentContactStore, valent_contact_store, VALENT, CONTACT_STORE, ValentObject)
+          +  -  +  -  +  
+                      - ]
+      19                 :             : 
+      20                 :             : struct _ValentContactStoreClass
+      21                 :             : {
+      22                 :             :   ValentObjectClass   parent_class;
+      23                 :             : 
+      24                 :             :   /* virtual functions */
+      25                 :             :   void                (*add_contacts)    (ValentContactStore   *store,
+      26                 :             :                                           GSList               *contacts,
+      27                 :             :                                           GCancellable         *cancellable,
+      28                 :             :                                           GAsyncReadyCallback   callback,
+      29                 :             :                                           gpointer              user_data);
+      30                 :             :   void                (*remove_contacts) (ValentContactStore   *store,
+      31                 :             :                                           GSList               *uids,
+      32                 :             :                                           GCancellable         *cancellable,
+      33                 :             :                                           GAsyncReadyCallback   callback,
+      34                 :             :                                           gpointer              user_data);
+      35                 :             :   void                (*query)           (ValentContactStore   *store,
+      36                 :             :                                           const char           *query,
+      37                 :             :                                           GCancellable         *cancellable,
+      38                 :             :                                           GAsyncReadyCallback   callback,
+      39                 :             :                                           gpointer              user_data);
+      40                 :             :   void                (*get_contact)     (ValentContactStore   *store,
+      41                 :             :                                           const char           *uid,
+      42                 :             :                                           GCancellable         *cancellable,
+      43                 :             :                                           GAsyncReadyCallback   callback,
+      44                 :             :                                           gpointer              user_data);
+      45                 :             : 
+      46                 :             :   /* signals */
+      47                 :             :   void                (*contact_added)   (ValentContactStore   *store,
+      48                 :             :                                           EContact             *contact);
+      49                 :             :   void                (*contact_removed) (ValentContactStore   *store,
+      50                 :             :                                           const char           *uid);
+      51                 :             : 
+      52                 :             :   /*< private >*/
+      53                 :             :   gpointer            padding[8];
+      54                 :             : };
+      55                 :             : 
+      56                 :             : 
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : void         valent_contact_store_contact_added          (ValentContactStore   *store,
+      59                 :             :                                                           EContact             *contact);
+      60                 :             : VALENT_AVAILABLE_IN_1_0
+      61                 :             : void         valent_contact_store_contact_removed        (ValentContactStore   *store,
+      62                 :             :                                                           const char           *uid);
+      63                 :             : VALENT_AVAILABLE_IN_1_0
+      64                 :             : const char * valent_contact_store_get_name               (ValentContactStore   *store);
+      65                 :             : VALENT_AVAILABLE_IN_1_0
+      66                 :             : void         valent_contact_store_set_name               (ValentContactStore   *store,
+      67                 :             :                                                           const char           *name);
+      68                 :             : VALENT_AVAILABLE_IN_1_0
+      69                 :             : ESource    * valent_contact_store_get_source             (ValentContactStore   *store);
+      70                 :             : VALENT_AVAILABLE_IN_1_0
+      71                 :             : const char * valent_contact_store_get_uid                (ValentContactStore   *store);
+      72                 :             : 
+      73                 :             : VALENT_AVAILABLE_IN_1_0
+      74                 :             : void         valent_contact_store_add_contact            (ValentContactStore   *store,
+      75                 :             :                                                           EContact             *contact,
+      76                 :             :                                                           GCancellable         *cancellable,
+      77                 :             :                                                           GAsyncReadyCallback   callback,
+      78                 :             :                                                           gpointer              user_data);
+      79                 :             : VALENT_AVAILABLE_IN_1_0
+      80                 :             : void         valent_contact_store_add_contacts           (ValentContactStore   *store,
+      81                 :             :                                                           GSList               *contacts,
+      82                 :             :                                                           GCancellable         *cancellable,
+      83                 :             :                                                           GAsyncReadyCallback   callback,
+      84                 :             :                                                           gpointer              user_data);
+      85                 :             : VALENT_AVAILABLE_IN_1_0
+      86                 :             : gboolean     valent_contact_store_add_contacts_finish    (ValentContactStore   *store,
+      87                 :             :                                                           GAsyncResult         *result,
+      88                 :             :                                                           GError              **error);
+      89                 :             : VALENT_AVAILABLE_IN_1_0
+      90                 :             : void         valent_contact_store_remove_contact         (ValentContactStore   *store,
+      91                 :             :                                                           const char           *uid,
+      92                 :             :                                                           GCancellable         *cancellable,
+      93                 :             :                                                           GAsyncReadyCallback   callback,
+      94                 :             :                                                           gpointer              user_data);
+      95                 :             : VALENT_AVAILABLE_IN_1_0
+      96                 :             : void         valent_contact_store_remove_contacts        (ValentContactStore   *store,
+      97                 :             :                                                           GSList               *uids,
+      98                 :             :                                                           GCancellable         *cancellable,
+      99                 :             :                                                           GAsyncReadyCallback   callback,
+     100                 :             :                                                           gpointer              user_data);
+     101                 :             : VALENT_AVAILABLE_IN_1_0
+     102                 :             : gboolean     valent_contact_store_remove_contacts_finish (ValentContactStore   *store,
+     103                 :             :                                                           GAsyncResult         *result,
+     104                 :             :                                                           GError              **error);
+     105                 :             : VALENT_AVAILABLE_IN_1_0
+     106                 :             : void         valent_contact_store_get_contact            (ValentContactStore   *store,
+     107                 :             :                                                           const char           *uid,
+     108                 :             :                                                           GCancellable         *cancellable,
+     109                 :             :                                                           GAsyncReadyCallback   callback,
+     110                 :             :                                                           gpointer              user_data);
+     111                 :             : VALENT_AVAILABLE_IN_1_0
+     112                 :             : EContact   * valent_contact_store_get_contact_finish     (ValentContactStore   *store,
+     113                 :             :                                                           GAsyncResult         *result,
+     114                 :             :                                                           GError              **error);
+     115                 :             : VALENT_AVAILABLE_IN_1_0
+     116                 :             : void         valent_contact_store_get_contacts           (ValentContactStore   *store,
+     117                 :             :                                                           char                **uids,
+     118                 :             :                                                           GCancellable         *cancellable,
+     119                 :             :                                                           GAsyncReadyCallback   callback,
+     120                 :             :                                                           gpointer              user_data);
+     121                 :             : VALENT_AVAILABLE_IN_1_0
+     122                 :             : void         valent_contact_store_query                  (ValentContactStore   *store,
+     123                 :             :                                                           const char           *query,
+     124                 :             :                                                           GCancellable         *cancellable,
+     125                 :             :                                                           GAsyncReadyCallback   callback,
+     126                 :             :                                                           gpointer              user_data);
+     127                 :             : VALENT_AVAILABLE_IN_1_0
+     128                 :             : GSList     * valent_contact_store_query_finish           (ValentContactStore   *store,
+     129                 :             :                                                           GAsyncResult         *result,
+     130                 :             :                                                           GError              **error);
+     131                 :             : 
+     132                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts-adapter.c.func-c.html b/coverage/src/libvalent/contacts/valent-contacts-adapter.c.func-c.html new file mode 100644 index 00000000000..4d8fe351f39 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts-adapter.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.2 %5147
Test Date:2024-03-31 18:46:36Functions:90.9 %1110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.2 %2413
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contacts_adapter_get_item_type0
valent_contacts_adapter_store_removed2
valent_contacts_adapter_finalize3
valent_contacts_adapter_init9
valent_contacts_adapter_store_added11
valent_contacts_adapter_get_item12
valent_contacts_adapter_get_n_items14
g_list_model_iface_init66
valent_contacts_adapter_get_type459
valent_contacts_adapter_class_intern_init66
valent_contacts_adapter_get_type_once86
valent_contacts_adapter_get_type307
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts-adapter.c.func.html b/coverage/src/libvalent/contacts/valent-contacts-adapter.c.func.html new file mode 100644 index 00000000000..fa4415a59d2 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts-adapter.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.2 %5147
Test Date:2024-03-31 18:46:36Functions:90.9 %1110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.2 %2413
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init66
valent_contacts_adapter_finalize3
valent_contacts_adapter_get_item12
valent_contacts_adapter_get_item_type0
valent_contacts_adapter_get_n_items14
valent_contacts_adapter_get_type459
valent_contacts_adapter_class_intern_init66
valent_contacts_adapter_get_type307
valent_contacts_adapter_get_type_once86
valent_contacts_adapter_init9
valent_contacts_adapter_store_added11
valent_contacts_adapter_store_removed2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts-adapter.c.gcov.html b/coverage/src/libvalent/contacts/valent-contacts-adapter.c.gcov.html new file mode 100644 index 00000000000..ebab9b14099 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts-adapter.c.gcov.html @@ -0,0 +1,282 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.2 %5147
Test Date:2024-03-31 18:46:36Functions:90.9 %1110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.2 %2413
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contacts-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-contact-store.h"
+      12                 :             : #include "valent-contacts-adapter.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentContactsAdapter:
+      17                 :             :  *
+      18                 :             :  * An abstract base class for address book providers.
+      19                 :             :  *
+      20                 :             :  * `ValentContactsAdapter` is a base class for plugins that provide an
+      21                 :             :  * interface to manage address books. This usually means monitoring and
+      22                 :             :  * querying [class@Valent.ContactStore] instances.
+      23                 :             :  *
+      24                 :             :  * ## `.plugin` File
+      25                 :             :  *
+      26                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      27                 :             :  *
+      28                 :             :  * - `X-ContactsAdapterPriority`
+      29                 :             :  *
+      30                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      31                 :             :  *     lowest value will be used as the primary adapter.
+      32                 :             :  *
+      33                 :             :  * Since: 1.0
+      34                 :             :  */
+      35                 :             : 
+      36                 :             : typedef struct
+      37                 :             : {
+      38                 :             :   GPtrArray      *stores;
+      39                 :             : } ValentContactsAdapterPrivate;
+      40                 :             : 
+      41                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      42                 :             : 
+      43   [ +  +  +  - ]:         510 : G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ValentContactsAdapter, valent_contacts_adapter, VALENT_TYPE_EXTENSION,
+      44                 :             :                                   G_ADD_PRIVATE (ValentContactsAdapter)
+      45                 :             :                                   G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      46                 :             : 
+      47                 :             : /**
+      48                 :             :  * ValentContactsAdapterClass:
+      49                 :             :  *
+      50                 :             :  * The virtual function table for `ValentContactsAdapter`.
+      51                 :             :  */
+      52                 :             : 
+      53                 :             : 
+      54                 :             : /*
+      55                 :             :  * GListModel
+      56                 :             :  */
+      57                 :             : static gpointer
+      58                 :          12 : valent_contacts_adapter_get_item (GListModel   *list,
+      59                 :             :                                   unsigned int  position)
+      60                 :             : {
+      61                 :          12 :   ValentContactsAdapter *self = VALENT_CONTACTS_ADAPTER (list);
+      62                 :          12 :   ValentContactsAdapterPrivate *priv = valent_contacts_adapter_get_instance_private (self);
+      63                 :             : 
+      64         [ +  - ]:          12 :   g_assert (VALENT_IS_CONTACTS_ADAPTER (self));
+      65                 :             : 
+      66         [ +  - ]:          12 :   if G_UNLIKELY (position >= priv->stores->len)
+      67                 :             :     return NULL;
+      68                 :             : 
+      69                 :          12 :   return g_object_ref (g_ptr_array_index (priv->stores, position));
+      70                 :             : }
+      71                 :             : 
+      72                 :             : static GType
+      73                 :           0 : valent_contacts_adapter_get_item_type (GListModel *list)
+      74                 :             : {
+      75                 :           0 :   return VALENT_TYPE_CONTACTS_ADAPTER;
+      76                 :             : }
+      77                 :             : 
+      78                 :             : static unsigned int
+      79                 :          14 : valent_contacts_adapter_get_n_items (GListModel *list)
+      80                 :             : {
+      81                 :          14 :   ValentContactsAdapter *self = VALENT_CONTACTS_ADAPTER (list);
+      82                 :          14 :   ValentContactsAdapterPrivate *priv = valent_contacts_adapter_get_instance_private (self);
+      83                 :             : 
+      84         [ +  - ]:          14 :   g_assert (VALENT_IS_CONTACTS_ADAPTER (self));
+      85                 :             : 
+      86                 :          14 :   return priv->stores->len;
+      87                 :             : }
+      88                 :             : 
+      89                 :             : static void
+      90                 :          66 : g_list_model_iface_init (GListModelInterface *iface)
+      91                 :             : {
+      92                 :          66 :   iface->get_item = valent_contacts_adapter_get_item;
+      93                 :          66 :   iface->get_item_type = valent_contacts_adapter_get_item_type;
+      94                 :          66 :   iface->get_n_items = valent_contacts_adapter_get_n_items;
+      95                 :          66 : }
+      96                 :             : 
+      97                 :             : /*
+      98                 :             :  * GObject
+      99                 :             :  */
+     100                 :             : static void
+     101                 :           3 : valent_contacts_adapter_finalize (GObject *object)
+     102                 :             : {
+     103                 :           3 :   ValentContactsAdapter *self = VALENT_CONTACTS_ADAPTER (object);
+     104                 :           3 :   ValentContactsAdapterPrivate *priv = valent_contacts_adapter_get_instance_private (self);
+     105                 :             : 
+     106         [ +  - ]:           3 :   g_clear_pointer (&priv->stores, g_ptr_array_unref);
+     107                 :             : 
+     108                 :           3 :   G_OBJECT_CLASS (valent_contacts_adapter_parent_class)->finalize (object);
+     109                 :           3 : }
+     110                 :             : 
+     111                 :             : static void
+     112                 :          66 : valent_contacts_adapter_class_init (ValentContactsAdapterClass *klass)
+     113                 :             : {
+     114                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     115                 :             : 
+     116                 :          66 :   object_class->finalize = valent_contacts_adapter_finalize;
+     117                 :             : }
+     118                 :             : 
+     119                 :             : static void
+     120                 :           9 : valent_contacts_adapter_init (ValentContactsAdapter *adapter)
+     121                 :             : {
+     122                 :           9 :   ValentContactsAdapterPrivate *priv = valent_contacts_adapter_get_instance_private (adapter);
+     123                 :             : 
+     124                 :           9 :   priv->stores = g_ptr_array_new_with_free_func (g_object_unref);
+     125                 :           9 : }
+     126                 :             : 
+     127                 :             : /**
+     128                 :             :  * valent_contacts_adapter_store_added:
+     129                 :             :  * @adapter: a `ValentContactsAdapter`
+     130                 :             :  * @store: a `ValentContactStore`
+     131                 :             :  *
+     132                 :             :  * Called when @store has been added to @adapter.
+     133                 :             :  *
+     134                 :             :  * This method should only be called by implementations of
+     135                 :             :  * [class@Valent.ContactsAdapter]. @adapter will hold a reference on @store and
+     136                 :             :  * emit [signal@Gio.ListModel::items-changed].
+     137                 :             :  *
+     138                 :             :  * Since: 1.0
+     139                 :             :  */
+     140                 :             : void
+     141                 :          11 : valent_contacts_adapter_store_added (ValentContactsAdapter *adapter,
+     142                 :             :                                      ValentContactStore    *store)
+     143                 :             : {
+     144                 :          11 :   ValentContactsAdapterPrivate *priv = valent_contacts_adapter_get_instance_private (adapter);
+     145                 :          11 :   unsigned int position = 0;
+     146                 :             : 
+     147         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_CONTACTS_ADAPTER (adapter));
+     148         [ -  + ]:          11 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     149                 :             : 
+     150                 :          11 :   position = priv->stores->len;
+     151                 :          11 :   g_ptr_array_add (priv->stores, g_object_ref (store));
+     152                 :          11 :   g_list_model_items_changed (G_LIST_MODEL (adapter), position, 0, 1);
+     153                 :             : }
+     154                 :             : 
+     155                 :             : /**
+     156                 :             :  * valent_contacts_adapter_store_removed:
+     157                 :             :  * @adapter: a `ValentContactsAdapter`
+     158                 :             :  * @store: a `ValentContactStore`
+     159                 :             :  *
+     160                 :             :  * Called when @store has been removed from @adapter.
+     161                 :             :  *
+     162                 :             :  * This method should only be called by implementations of
+     163                 :             :  * [class@Valent.ContactsAdapter]. @adapter will drop its reference on @store
+     164                 :             :  * and emit [signal@Gio.ListModel::items-changed].
+     165                 :             :  *
+     166                 :             :  * Since: 1.0
+     167                 :             :  */
+     168                 :             : void
+     169                 :           2 : valent_contacts_adapter_store_removed (ValentContactsAdapter *adapter,
+     170                 :             :                                        ValentContactStore    *store)
+     171                 :             : {
+     172                 :           2 :   ValentContactsAdapterPrivate *priv = valent_contacts_adapter_get_instance_private (adapter);
+     173                 :           2 :   g_autoptr (ValentContactStore) item = NULL;
+     174                 :           2 :   unsigned int position = 0;
+     175                 :             : 
+     176         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_CONTACTS_ADAPTER (adapter));
+     177         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     178                 :             : 
+     179         [ -  + ]:           2 :   if (!g_ptr_array_find (priv->stores, store, &position))
+     180                 :             :     {
+     181                 :           0 :       g_warning ("No such store \"%s\" found in \"%s\"",
+     182                 :             :                  G_OBJECT_TYPE_NAME (store),
+     183                 :             :                  G_OBJECT_TYPE_NAME (adapter));
+     184                 :           0 :       return;
+     185                 :             :     }
+     186                 :             : 
+     187                 :           2 :   item = g_ptr_array_steal_index (priv->stores, position);
+     188         [ +  - ]:           2 :   g_list_model_items_changed (G_LIST_MODEL (adapter), position, 1, 0);
+     189                 :             : }
+     190                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts-adapter.h.func-c.html b/coverage/src/libvalent/contacts/valent-contacts-adapter.h.func-c.html new file mode 100644 index 00000000000..82ececb4f36 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS_ADAPTER76
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts-adapter.h.func.html b/coverage/src/libvalent/contacts/valent-contacts-adapter.h.func.html new file mode 100644 index 00000000000..03ce4f47175 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS_ADAPTER76
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts-adapter.h.gcov.html b/coverage/src/libvalent/contacts/valent-contacts-adapter.h.gcov.html new file mode 100644 index 00000000000..579dcc5c38e --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts-adapter.h.gcov.html @@ -0,0 +1,129 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : #include "valent-contact-store.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_CONTACTS_ADAPTER (valent_contacts_adapter_get_type())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :          76 : G_DECLARE_DERIVABLE_TYPE (ValentContactsAdapter, valent_contacts_adapter, VALENT, CONTACTS_ADAPTER, ValentExtension)
+                   +  - ]
+      19                 :             : 
+      20                 :             : struct _ValentContactsAdapterClass
+      21                 :             : {
+      22                 :             :   ValentExtensionClass  parent_class;
+      23                 :             : 
+      24                 :             :   /*< private >*/
+      25                 :             :   gpointer              padding[8];
+      26                 :             : };
+      27                 :             : 
+      28                 :             : VALENT_AVAILABLE_IN_1_0
+      29                 :             : void   valent_contacts_adapter_store_added   (ValentContactsAdapter *adapter,
+      30                 :             :                                               ValentContactStore    *store);
+      31                 :             : VALENT_AVAILABLE_IN_1_0
+      32                 :             : void   valent_contacts_adapter_store_removed (ValentContactsAdapter *adapter,
+      33                 :             :                                               ValentContactStore    *store);
+      34                 :             : 
+      35                 :             : G_END_DECLS
+      36                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts.c.func-c.html b/coverage/src/libvalent/contacts/valent-contacts.c.func-c.html new file mode 100644 index 00000000000..67ef5302e6b --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.2 %105100
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %6036
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contacts_get_item_type0
valent_contacts_finalize3
valent_contacts_unbind_extension3
valent_contacts_create_store5
valent_contacts_get_n_items5
valent_contacts_get_item6
g_list_model_iface_init8
valent_contacts_class_init8
valent_contacts_ensure_store8
valent_contacts_bind_extension9
valent_contacts_init9
valent_contacts_get_default15
on_items_changed25
valent_contacts_get_type237
valent_contacts_class_intern_init8
valent_contacts_get_type_once86
valent_contacts_get_type143
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts.c.func.html b/coverage/src/libvalent/contacts/valent-contacts.c.func.html new file mode 100644 index 00000000000..420354b8fa2 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.2 %105100
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %6036
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init8
on_items_changed25
valent_contacts_bind_extension9
valent_contacts_class_init8
valent_contacts_create_store5
valent_contacts_ensure_store8
valent_contacts_finalize3
valent_contacts_get_default15
valent_contacts_get_item6
valent_contacts_get_item_type0
valent_contacts_get_n_items5
valent_contacts_get_type237
valent_contacts_class_intern_init8
valent_contacts_get_type143
valent_contacts_get_type_once86
valent_contacts_init9
valent_contacts_unbind_extension3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts.c.gcov.html b/coverage/src/libvalent/contacts/valent-contacts.c.gcov.html new file mode 100644 index 00000000000..2e2a6ac7171 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts.c.gcov.html @@ -0,0 +1,408 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.2 %105100
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %6036
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contacts"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-contacts.h"
+      13                 :             : #include "valent-contacts-adapter.h"
+      14                 :             : #include "valent-contact-store.h"
+      15                 :             : #include "valent-contact-cache-private.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : /**
+      19                 :             :  * ValentContacts:
+      20                 :             :  *
+      21                 :             :  * A class for managing address books.
+      22                 :             :  *
+      23                 :             :  * `ValentContacts` is an address book manager, intended for use by
+      24                 :             :  * [class@Valent.DevicePlugin] implementations.
+      25                 :             :  *
+      26                 :             :  * Plugins can implement [class@Valent.ContactsAdapter] to provide an interface
+      27                 :             :  * to manage instances of [class@Valent.ContactStore].
+      28                 :             :  *
+      29                 :             :  * Since: 1.0
+      30                 :             :  */
+      31                 :             : 
+      32                 :             : struct _ValentContacts
+      33                 :             : {
+      34                 :             :   ValentComponent  parent_instance;
+      35                 :             : 
+      36                 :             :   GPtrArray       *adapters;
+      37                 :             :   GPtrArray       *stores;
+      38                 :             : };
+      39                 :             : 
+      40                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      41                 :             : 
+      42   [ +  +  +  - ]:         237 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentContacts, valent_contacts, VALENT_TYPE_COMPONENT,
+      43                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      44                 :             : 
+      45                 :             : static ValentContacts *default_contacts = NULL;
+      46                 :             : 
+      47                 :             : 
+      48                 :             : static void
+      49                 :          25 : on_items_changed (GListModel     *list,
+      50                 :             :                   unsigned int    position,
+      51                 :             :                   unsigned int    removed,
+      52                 :             :                   unsigned int    added,
+      53                 :             :                   ValentContacts *self)
+      54                 :             : {
+      55                 :          25 :   unsigned int real_position = 0;
+      56                 :             : 
+      57                 :          25 :   VALENT_ENTRY;
+      58                 :             : 
+      59         [ +  - ]:          25 :   g_assert (VALENT_IS_CONTACTS_ADAPTER (list));
+      60         [ +  - ]:          25 :   g_assert (VALENT_IS_CONTACTS (self));
+      61                 :             : 
+      62                 :             :   /* Translate the adapter position */
+      63         [ +  - ]:          25 :   for (unsigned int i = 0; i < self->adapters->len; i++)
+      64                 :             :     {
+      65                 :          25 :       GListModel *adapter = g_ptr_array_index (self->adapters, i);
+      66                 :             : 
+      67         [ -  + ]:          25 :       if (adapter == list)
+      68                 :             :         break;
+      69                 :             : 
+      70                 :           0 :       real_position += g_list_model_get_n_items (adapter);
+      71                 :             :     }
+      72                 :             : 
+      73                 :          25 :   real_position += position;
+      74                 :             : 
+      75                 :             :   /* Propagate the changes */
+      76         [ +  + ]:          30 :   for (unsigned int i = 0; i < removed; i++)
+      77                 :           5 :     g_ptr_array_remove_index (self->stores, real_position);
+      78                 :             : 
+      79         [ +  + ]:          36 :   for (unsigned int i = 0; i < added; i++)
+      80                 :          11 :     g_ptr_array_insert (self->stores,
+      81                 :          11 :                         real_position + i,
+      82                 :             :                         g_list_model_get_item (list, position + i));
+      83                 :             : 
+      84                 :          25 :   g_list_model_items_changed (G_LIST_MODEL (self), real_position, removed, added);
+      85                 :             : 
+      86                 :          25 :   VALENT_EXIT;
+      87                 :             : }
+      88                 :             : 
+      89                 :             : /*
+      90                 :             :  * GListModel
+      91                 :             :  */
+      92                 :             : static gpointer
+      93                 :           6 : valent_contacts_get_item (GListModel   *list,
+      94                 :             :                           unsigned int  position)
+      95                 :             : {
+      96                 :           6 :   ValentContacts *self = VALENT_CONTACTS (list);
+      97                 :             : 
+      98         [ +  - ]:           6 :   g_assert (VALENT_IS_CONTACTS (self));
+      99                 :             : 
+     100         [ +  - ]:           6 :   if G_UNLIKELY (position >= self->stores->len)
+     101                 :             :     return NULL;
+     102                 :             : 
+     103                 :           6 :   return g_object_ref (g_ptr_array_index (self->stores, position));
+     104                 :             : }
+     105                 :             : 
+     106                 :             : static GType
+     107                 :           0 : valent_contacts_get_item_type (GListModel *list)
+     108                 :             : {
+     109                 :           0 :   return VALENT_TYPE_CONTACT_STORE;
+     110                 :             : }
+     111                 :             : 
+     112                 :             : static unsigned int
+     113                 :           5 : valent_contacts_get_n_items (GListModel *list)
+     114                 :             : {
+     115                 :           5 :   ValentContacts *self = VALENT_CONTACTS (list);
+     116                 :             : 
+     117         [ +  - ]:           5 :   g_assert (VALENT_IS_CONTACTS (self));
+     118                 :             : 
+     119                 :           5 :   return self->stores->len;
+     120                 :             : }
+     121                 :             : 
+     122                 :             : static void
+     123                 :           8 : g_list_model_iface_init (GListModelInterface *iface)
+     124                 :             : {
+     125                 :           8 :   iface->get_item = valent_contacts_get_item;
+     126                 :           8 :   iface->get_item_type = valent_contacts_get_item_type;
+     127                 :           8 :   iface->get_n_items = valent_contacts_get_n_items;
+     128                 :           8 : }
+     129                 :             : 
+     130                 :             : /*
+     131                 :             :  * ValentComponent
+     132                 :             :  */
+     133                 :             : static void
+     134                 :           9 : valent_contacts_bind_extension (ValentComponent *component,
+     135                 :             :                                 GObject         *extension)
+     136                 :             : {
+     137                 :           9 :   ValentContacts *self = VALENT_CONTACTS (component);
+     138                 :           9 :   GListModel *list = G_LIST_MODEL (extension);
+     139                 :             : 
+     140                 :           9 :   VALENT_ENTRY;
+     141                 :             : 
+     142         [ +  - ]:           9 :   g_assert (VALENT_IS_CONTACTS (self));
+     143         [ -  + ]:           9 :   g_assert (VALENT_IS_CONTACTS_ADAPTER (extension));
+     144                 :             : 
+     145                 :           9 :   g_ptr_array_add (self->adapters, g_object_ref (extension));
+     146                 :           9 :   on_items_changed (list, 0, 0, g_list_model_get_n_items (list), self);
+     147                 :           9 :   g_signal_connect_object (list,
+     148                 :             :                            "items-changed",
+     149                 :             :                            G_CALLBACK (on_items_changed),
+     150                 :             :                            self,
+     151                 :             :                            0);
+     152                 :             : 
+     153                 :           9 :   VALENT_EXIT;
+     154                 :             : }
+     155                 :             : 
+     156                 :             : static void
+     157                 :           3 : valent_contacts_unbind_extension (ValentComponent *component,
+     158                 :             :                                   GObject         *extension)
+     159                 :             : {
+     160                 :           3 :   ValentContacts *self = VALENT_CONTACTS (component);
+     161                 :           3 :   GListModel *list = G_LIST_MODEL (extension);
+     162                 :             : 
+     163                 :           3 :   VALENT_ENTRY;
+     164                 :             : 
+     165         [ +  - ]:           3 :   g_assert (VALENT_IS_CONTACTS (self));
+     166         [ -  + ]:           3 :   g_assert (VALENT_IS_CONTACTS_ADAPTER (extension));
+     167                 :             : 
+     168         [ -  + ]:           3 :   if (!g_ptr_array_find (self->adapters, extension, NULL))
+     169                 :             :     {
+     170                 :           0 :       g_warning ("No such adapter \"%s\" found in \"%s\"",
+     171                 :             :                  G_OBJECT_TYPE_NAME (extension),
+     172                 :             :                  G_OBJECT_TYPE_NAME (component));
+     173                 :           0 :       return;
+     174                 :             :     }
+     175                 :             : 
+     176                 :           3 :   g_signal_handlers_disconnect_by_func (list, on_items_changed, self);
+     177                 :           3 :   on_items_changed (list, 0, g_list_model_get_n_items (list), 0, self);
+     178                 :           3 :   g_ptr_array_remove (self->adapters, extension);
+     179                 :             : 
+     180                 :           3 :   VALENT_EXIT;
+     181                 :             : }
+     182                 :             : 
+     183                 :             : /*
+     184                 :             :  * ValentContacts
+     185                 :             :  */
+     186                 :             : static ValentContactStore *
+     187                 :           5 : valent_contacts_create_store (const char *uid,
+     188                 :             :                               const char *name,
+     189                 :             :                               const char *icon_name)
+     190                 :             : {
+     191                 :          10 :   g_autoptr (ESource) source = NULL;
+     192                 :           5 :   ESourceBackend *backend;
+     193                 :             : 
+     194   [ +  -  +  - ]:           5 :   g_assert (uid != NULL && *uid != '\0');
+     195   [ +  -  -  + ]:           5 :   g_assert (name != NULL && *name != '\0');
+     196                 :             : 
+     197                 :             :   /* Create a scratch source for a local addressbook source */
+     198                 :           5 :   source = e_source_new_with_uid (uid, NULL, NULL);
+     199                 :           5 :   backend = e_source_get_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK);
+     200                 :           5 :   e_source_backend_set_backend_name (backend, "local");
+     201                 :           5 :   e_source_set_display_name (source, name);
+     202                 :             : 
+     203         [ +  - ]:           5 :   return g_object_new (VALENT_TYPE_CONTACT_CACHE,
+     204                 :             :                        "source", source,
+     205                 :             :                        NULL);
+     206                 :             : }
+     207                 :             : 
+     208                 :             : /*
+     209                 :             :  * GObject
+     210                 :             :  */
+     211                 :             : static void
+     212                 :           3 : valent_contacts_finalize (GObject *object)
+     213                 :             : {
+     214                 :           3 :   ValentContacts *self = VALENT_CONTACTS (object);
+     215                 :             : 
+     216         [ +  - ]:           3 :   g_clear_pointer (&self->adapters, g_ptr_array_unref);
+     217         [ +  - ]:           3 :   g_clear_pointer (&self->stores, g_ptr_array_unref);
+     218                 :             : 
+     219                 :           3 :   G_OBJECT_CLASS (valent_contacts_parent_class)->finalize (object);
+     220                 :           3 : }
+     221                 :             : 
+     222                 :             : static void
+     223                 :           8 : valent_contacts_class_init (ValentContactsClass *klass)
+     224                 :             : {
+     225                 :           8 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     226                 :           8 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     227                 :             : 
+     228                 :             :   /* Ensure we don't hit a MT race condition */
+     229                 :           8 :   g_type_ensure (E_TYPE_SOURCE);
+     230                 :             : 
+     231                 :           8 :   object_class->finalize = valent_contacts_finalize;
+     232                 :             : 
+     233                 :           8 :   component_class->bind_extension = valent_contacts_bind_extension;
+     234                 :           8 :   component_class->unbind_extension = valent_contacts_unbind_extension;
+     235                 :           8 : }
+     236                 :             : 
+     237                 :             : static void
+     238                 :           9 : valent_contacts_init (ValentContacts *self)
+     239                 :             : {
+     240                 :           9 :   self->adapters = g_ptr_array_new_with_free_func (g_object_unref);
+     241                 :           9 :   self->stores = g_ptr_array_new_with_free_func (g_object_unref);
+     242                 :           9 : }
+     243                 :             : 
+     244                 :             : /**
+     245                 :             :  * valent_contacts_get_default:
+     246                 :             :  *
+     247                 :             :  * Get the default [class@Valent.Contacts].
+     248                 :             :  *
+     249                 :             :  * Returns: (transfer none) (not nullable): a `ValentContacts`
+     250                 :             :  *
+     251                 :             :  * Since: 1.0
+     252                 :             :  */
+     253                 :             : ValentContacts *
+     254                 :          15 : valent_contacts_get_default (void)
+     255                 :             : {
+     256         [ +  + ]:          15 :   if (default_contacts == NULL)
+     257                 :             :     {
+     258                 :           9 :       default_contacts = g_object_new (VALENT_TYPE_CONTACTS,
+     259                 :             :                                        "plugin-domain", "contacts",
+     260                 :             :                                        "plugin-type",   VALENT_TYPE_CONTACTS_ADAPTER,
+     261                 :             :                                        NULL);
+     262                 :             : 
+     263                 :           9 :       g_object_add_weak_pointer (G_OBJECT (default_contacts),
+     264                 :             :                                  (gpointer)&default_contacts);
+     265                 :             :     }
+     266                 :             : 
+     267                 :          15 :   return default_contacts;
+     268                 :             : }
+     269                 :             : 
+     270                 :             : /**
+     271                 :             :  * valent_contacts_ensure_store:
+     272                 :             :  * @contacts: a `ValentContacts`
+     273                 :             :  * @uid: a unique id
+     274                 :             :  * @name: a display name
+     275                 :             :  *
+     276                 :             :  * Get a `ValentContactStore` for @uid.
+     277                 :             :  *
+     278                 :             :  * If the contact store does not exist, one will be created using the default
+     279                 :             :  * adapter and passed @name and @description. If no adapter is available, a new
+     280                 :             :  * file-based store will be created.
+     281                 :             :  *
+     282                 :             :  * Returns: (transfer none) (not nullable): an address book
+     283                 :             :  *
+     284                 :             :  * Since: 1.0
+     285                 :             :  */
+     286                 :             : ValentContactStore *
+     287                 :           8 : valent_contacts_ensure_store (ValentContacts *contacts,
+     288                 :             :                               const char     *uid,
+     289                 :             :                               const char     *name)
+     290                 :             : {
+     291                 :           8 :   ValentContactStore *ret;
+     292                 :           8 :   unsigned int position = 0;
+     293                 :             : 
+     294                 :           8 :   VALENT_ENTRY;
+     295                 :             : 
+     296   [ +  -  +  - ]:           8 :   g_return_val_if_fail (uid != NULL && *uid != '\0', NULL);
+     297   [ +  -  -  + ]:           8 :   g_return_val_if_fail (name != NULL && *name != '\0', NULL);
+     298                 :             : 
+     299                 :             :   /* Try to find an existing store */
+     300         [ +  + ]:          16 :   for (unsigned int i = 0, len = contacts->stores->len; i < len; i++)
+     301                 :             :     {
+     302                 :          11 :       ret = g_ptr_array_index (contacts->stores, i);
+     303                 :             : 
+     304         [ +  + ]:          11 :       if (g_strcmp0 (valent_contact_store_get_uid (ret), uid) == 0)
+     305                 :           8 :         VALENT_RETURN (ret);
+     306                 :             :     }
+     307                 :             : 
+     308                 :             :   /* Create a new store */
+     309                 :           5 :   ret = valent_contacts_create_store (uid, name, NULL);
+     310                 :           5 :   position = contacts->stores->len;
+     311                 :           5 :   g_ptr_array_add (contacts->stores, ret);
+     312                 :           5 :   g_list_model_items_changed (G_LIST_MODEL (contacts), position, 0, 1);
+     313                 :             : 
+     314                 :           5 :   VALENT_RETURN (ret);
+     315                 :             : }
+     316                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts.h.func-c.html b/coverage/src/libvalent/contacts/valent-contacts.h.func-c.html new file mode 100644 index 00000000000..dad71908589 --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS48
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts.h.func.html b/coverage/src/libvalent/contacts/valent-contacts.h.func.html new file mode 100644 index 00000000000..53f3b784a1f --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS48
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/contacts/valent-contacts.h.gcov.html b/coverage/src/libvalent/contacts/valent-contacts.h.gcov.html new file mode 100644 index 00000000000..e9d8d9ad7cc --- /dev/null +++ b/coverage/src/libvalent/contacts/valent-contacts.h.gcov.html @@ -0,0 +1,123 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/contacts/valent-contacts.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/contacts - valent-contacts.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : #include "valent-contact-store.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : #define VALENT_TYPE_CONTACTS (valent_contacts_get_type ())
+      17                 :             : 
+      18                 :             : VALENT_AVAILABLE_IN_1_0
+      19   [ +  -  +  -  :          48 : G_DECLARE_FINAL_TYPE (ValentContacts, valent_contacts, VALENT, CONTACTS, ValentComponent)
+                   -  + ]
+      20                 :             : 
+      21                 :             : VALENT_AVAILABLE_IN_1_0
+      22                 :             : ValentContacts     * valent_contacts_get_default  (void);
+      23                 :             : 
+      24                 :             : VALENT_AVAILABLE_IN_1_0
+      25                 :             : ValentContactStore * valent_contacts_ensure_store (ValentContacts *contacts,
+      26                 :             :                                                    const char     *uid,
+      27                 :             :                                                    const char     *name);
+      28                 :             : 
+      29                 :             : G_END_DECLS
+      30                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-detail-sort-b.html b/coverage/src/libvalent/core/index-detail-sort-b.html new file mode 100644 index 00000000000..53866a7b127 --- /dev/null +++ b/coverage/src/libvalent/core/index-detail-sort-b.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-detail-sort-f.html b/coverage/src/libvalent/core/index-detail-sort-f.html new file mode 100644 index 00000000000..bb3a82506ad --- /dev/null +++ b/coverage/src/libvalent/core/index-detail-sort-f.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-detail-sort-l.html b/coverage/src/libvalent/core/index-detail-sort-l.html new file mode 100644 index 00000000000..b7b2d463a74 --- /dev/null +++ b/coverage/src/libvalent/core/index-detail-sort-l.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-detail.html b/coverage/src/libvalent/core/index-detail.html new file mode 100644 index 00000000000..ea72429abcd --- /dev/null +++ b/coverage/src/libvalent/core/index-detail.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-sort-b.html b/coverage/src/libvalent/core/index-sort-b.html new file mode 100644 index 00000000000..53866a7b127 --- /dev/null +++ b/coverage/src/libvalent/core/index-sort-b.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-sort-f.html b/coverage/src/libvalent/core/index-sort-f.html new file mode 100644 index 00000000000..bb3a82506ad --- /dev/null +++ b/coverage/src/libvalent/core/index-sort-f.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index-sort-l.html b/coverage/src/libvalent/core/index-sort-l.html new file mode 100644 index 00000000000..b7b2d463a74 --- /dev/null +++ b/coverage/src/libvalent/core/index-sort-l.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/index.html b/coverage/src/libvalent/core/index.html new file mode 100644 index 00000000000..ea72429abcd --- /dev/null +++ b/coverage/src/libvalent/core/index.html @@ -0,0 +1,368 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/coreCoverageTotalHit
Test:Code CoverageLines:84.5 %13191115
Test Date:2024-03-31 18:46:36Functions:93.9 %163153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:51.9 %835433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-application-plugin.c +
88.1%88.1%
+
88.1 %595241.1 %562390.9 %1110
valent-application-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-application.c +
94.7%94.7%
+
94.7 %15214461.1 %9055100.0 %1919
valent-application.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-component-private.h +
100.0%
+
100.0 %282860.0 %2012100.0 %33
valent-component.c +
74.6%74.6%
+
74.6 %22416743.7 %1426281.0 %2117
valent-component.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-context.c +
76.9%76.9%
+
76.9 %19915347.5 %1607692.0 %2523
valent-context.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-extension.c +
92.4%92.4%
+
92.4 %23721966.0 %10670100.0 %2828
valent-extension.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-global.c +
83.0%83.0%
+
83.0 %534450.0 %3417100.0 %66
valent-object.c +
91.7%91.7%
+
91.7 %19217659.8 %8249100.0 %2222
valent-object.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-transfer.c +
72.8%72.8%
+
72.8 %15811542.4 %853682.4 %1714
valent-transfer.h +
100.0%
+
100.0 %1150.0 %168100.0 %11
valent-version.c +
100.0%
+
100.0 %101075.0 %43100.0 %44
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application-plugin.c.func-c.html b/coverage/src/libvalent/core/valent-application-plugin.c.func-c.html new file mode 100644 index 00000000000..717042f4e9a --- /dev/null +++ b/coverage/src/libvalent/core/valent-application-plugin.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.1 %5952
Test Date:2024-03-31 18:46:36Functions:90.9 %1110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:41.1 %5623
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_application_plugin_command_line0
valent_application_plugin_open2
valent_application_plugin_activate6
valent_application_plugin_dbus_register7
valent_application_plugin_dbus_unregister7
valent_application_plugin_startup14
valent_application_plugin_shutdown16
valent_application_plugin_init20
valent_application_plugin_get_type689
valent_application_plugin_class_intern_init66
valent_application_plugin_get_type_once86
valent_application_plugin_get_type537
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application-plugin.c.func.html b/coverage/src/libvalent/core/valent-application-plugin.c.func.html new file mode 100644 index 00000000000..68f53ad0954 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application-plugin.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.1 %5952
Test Date:2024-03-31 18:46:36Functions:90.9 %1110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:41.1 %5623
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_application_plugin_activate6
valent_application_plugin_command_line0
valent_application_plugin_dbus_register7
valent_application_plugin_dbus_unregister7
valent_application_plugin_get_type689
valent_application_plugin_class_intern_init66
valent_application_plugin_get_type537
valent_application_plugin_get_type_once86
valent_application_plugin_init20
valent_application_plugin_open2
valent_application_plugin_shutdown16
valent_application_plugin_startup14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application-plugin.c.gcov.html b/coverage/src/libvalent/core/valent-application-plugin.c.gcov.html new file mode 100644 index 00000000000..b89b9643faa --- /dev/null +++ b/coverage/src/libvalent/core/valent-application-plugin.c.gcov.html @@ -0,0 +1,465 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.1 %5952
Test Date:2024-03-31 18:46:36Functions:90.9 %1110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:41.1 %5623
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-application-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : 
+      10                 :             : #include "valent-application-plugin.h"
+      11                 :             : #include "valent-debug.h"
+      12                 :             : #include "valent-extension.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentApplicationPlugin:
+      17                 :             :  *
+      18                 :             :  * An abstract base class for application plugins.
+      19                 :             :  *
+      20                 :             :  * `ValentApplicationPlugin` is a base class for plugins that operate in the
+      21                 :             :  * scope of the application. This usually means integrating the application with
+      22                 :             :  * the host environment (eg. XDG Autostart).
+      23                 :             :  *
+      24                 :             :  * ## Implementation Notes
+      25                 :             :  *
+      26                 :             :  * Implementations may handle application events by overriding the appropriate
+      27                 :             :  * virtual function, including [vfunc@Valent.ApplicationPlugin.activate] to
+      28                 :             :  * handle activation, [vfunc@Valent.ApplicationPlugin.command_line] to handle
+      29                 :             :  * CLI options, or [vfunc@Valent.ApplicationPlugin.open] to handle files.
+      30                 :             :  *
+      31                 :             :  * For plugin preferences see [class@Valent.PreferencesPage].
+      32                 :             :  *
+      33                 :             :  * ## `.plugin` File
+      34                 :             :  *
+      35                 :             :  * Application plugins have no special fields in the `.plugin` file.
+      36                 :             :  *
+      37                 :             :  * Since: 1.0
+      38                 :             :  */
+      39                 :             : 
+      40                 :             : typedef struct
+      41                 :             : {
+      42                 :             :   gpointer  reserved[1];
+      43                 :             : } ValentApplicationPluginPrivate;
+      44                 :             : 
+      45   [ +  +  +  - ]:         689 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentApplicationPlugin, valent_application_plugin, VALENT_TYPE_EXTENSION)
+      46                 :             : 
+      47                 :             : /**
+      48                 :             :  * ValentApplicationPluginClass:
+      49                 :             :  * @activate: the virtual function pointer for valent_application_plugin_activate()
+      50                 :             :  * @command_line: the virtual function pointer for valent_application_plugin_command_line()
+      51                 :             :  * @dbus_register: the virtual function pointer for valent_application_plugin_dbus_register()
+      52                 :             :  * @dbus_unregister: the virtual function pointer for valent_application_plugin_dbus_unregister()
+      53                 :             :  * @open: the virtual function pointer for valent_application_plugin_open()
+      54                 :             :  * @shutdown: the virtual function pointer for valent_application_plugin_shutdown()
+      55                 :             :  * @startup: the virtual function pointer for valent_application_plugin_startup()
+      56                 :             :  *
+      57                 :             :  * The virtual function table for `ValentApplicationPlugin`.
+      58                 :             :  */
+      59                 :             : 
+      60                 :             : 
+      61                 :             : /* LCOV_EXCL_START */
+      62                 :             : static gboolean
+      63                 :             : valent_application_plugin_real_activate (ValentApplicationPlugin *plugin)
+      64                 :             : {
+      65                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+      66                 :             : 
+      67                 :             :   return FALSE;
+      68                 :             : }
+      69                 :             : 
+      70                 :             : static int
+      71                 :             : valent_application_plugin_real_command_line (ValentApplicationPlugin *plugin,
+      72                 :             :                                              GApplicationCommandLine *command_line)
+      73                 :             : {
+      74                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+      75                 :             :   g_assert (G_IS_APPLICATION_COMMAND_LINE (command_line));
+      76                 :             : 
+      77                 :             :   return 0;
+      78                 :             : }
+      79                 :             : 
+      80                 :             : static gboolean
+      81                 :             : valent_application_plugin_real_dbus_register (ValentApplicationPlugin  *plugin,
+      82                 :             :                                               GDBusConnection          *connection,
+      83                 :             :                                               const char               *object_path,
+      84                 :             :                                               GError                  **error)
+      85                 :             : {
+      86                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+      87                 :             :   g_assert (G_IS_DBUS_CONNECTION (connection));
+      88                 :             :   g_assert (g_variant_is_object_path (object_path));
+      89                 :             :   g_assert (error == NULL || *error == NULL);
+      90                 :             : 
+      91                 :             :   return TRUE;
+      92                 :             : }
+      93                 :             : 
+      94                 :             : static void
+      95                 :             : valent_application_plugin_real_dbus_unregister (ValentApplicationPlugin *plugin,
+      96                 :             :                                                 GDBusConnection         *connection,
+      97                 :             :                                                 const char              *object_path)
+      98                 :             : {
+      99                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     100                 :             :   g_assert (G_IS_DBUS_CONNECTION (connection));
+     101                 :             :   g_assert (g_variant_is_object_path (object_path));
+     102                 :             : }
+     103                 :             : 
+     104                 :             : static gboolean
+     105                 :             : valent_application_plugin_real_open (ValentApplicationPlugin  *plugin,
+     106                 :             :                                      GFile                   **files,
+     107                 :             :                                      int                       n_files,
+     108                 :             :                                      const char               *hint)
+     109                 :             : {
+     110                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     111                 :             :   g_assert (files != NULL);
+     112                 :             :   g_assert (n_files > 0);
+     113                 :             :   g_assert (hint != NULL);
+     114                 :             : 
+     115                 :             :   return FALSE;
+     116                 :             : }
+     117                 :             : 
+     118                 :             : static void
+     119                 :             : valent_application_plugin_real_shutdown (ValentApplicationPlugin *plugin)
+     120                 :             : {
+     121                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     122                 :             : }
+     123                 :             : 
+     124                 :             : static void
+     125                 :             : valent_application_plugin_real_startup (ValentApplicationPlugin *plugin)
+     126                 :             : {
+     127                 :             :   g_assert (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     128                 :             : }
+     129                 :             : /* LCOV_EXCL_STOP */
+     130                 :             : 
+     131                 :             : /*
+     132                 :             :  * GObject
+     133                 :             :  */
+     134                 :             : static void
+     135                 :          66 : valent_application_plugin_class_init (ValentApplicationPluginClass *klass)
+     136                 :             : {
+     137                 :          66 :   klass->activate = valent_application_plugin_real_activate;
+     138                 :          66 :   klass->command_line = valent_application_plugin_real_command_line;
+     139                 :          66 :   klass->dbus_register = valent_application_plugin_real_dbus_register;
+     140                 :          66 :   klass->dbus_unregister = valent_application_plugin_real_dbus_unregister;
+     141                 :          66 :   klass->open = valent_application_plugin_real_open;
+     142                 :          66 :   klass->shutdown = valent_application_plugin_real_shutdown;
+     143                 :          66 :   klass->startup = valent_application_plugin_real_startup;
+     144                 :             : }
+     145                 :             : 
+     146                 :             : static void
+     147                 :          20 : valent_application_plugin_init (ValentApplicationPlugin *adapter)
+     148                 :             : {
+     149                 :          20 : }
+     150                 :             : 
+     151                 :             : /**
+     152                 :             :  * valent_application_plugin_activate: (virtual activate)
+     153                 :             :  * @plugin: a `ValentApplicationPlugin`
+     154                 :             :  *
+     155                 :             :  * Handle activation of the application.
+     156                 :             :  *
+     157                 :             :  * Implementations should override this method to handle activation, as
+     158                 :             :  * a result of [signal@Gio.Application::activate] being emitted on the primary
+     159                 :             :  * instance of the application.
+     160                 :             :  *
+     161                 :             :  * Returns: %TRUE if handled, or %FALSE if not
+     162                 :             :  *
+     163                 :             :  * Since: 1.0
+     164                 :             :  */
+     165                 :             : gboolean
+     166                 :           6 : valent_application_plugin_activate (ValentApplicationPlugin *plugin)
+     167                 :             : {
+     168                 :           6 :   gboolean ret;
+     169                 :             : 
+     170                 :           6 :   VALENT_ENTRY;
+     171                 :             : 
+     172         [ +  - ]:           6 :   g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), FALSE);
+     173                 :             : 
+     174                 :           6 :   ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->activate (plugin);
+     175                 :             : 
+     176                 :           6 :   VALENT_RETURN (ret);
+     177                 :             : }
+     178                 :             : 
+     179                 :             : /**
+     180                 :             :  * valent_application_plugin_command_line: (virtual command_line)
+     181                 :             :  * @plugin: a `ValentApplicationPlugin`
+     182                 :             :  * @command_line: a `GApplicationCommandLine`
+     183                 :             :  *
+     184                 :             :  * Handle the given command-line options.
+     185                 :             :  *
+     186                 :             :  * Implementations should override this method to handle command-line options,
+     187                 :             :  * as a result of [signal@Gio.Application::command-line] being emitted on the
+     188                 :             :  * primary instance of the application.
+     189                 :             :  *
+     190                 :             :  * Returns: an integer that is set as the exit status for the calling process
+     191                 :             :  *
+     192                 :             :  * Since: 1.0
+     193                 :             :  */
+     194                 :             : int
+     195                 :           0 : valent_application_plugin_command_line (ValentApplicationPlugin *plugin,
+     196                 :             :                                         GApplicationCommandLine *command_line)
+     197                 :             : {
+     198                 :           0 :   int ret;
+     199                 :             : 
+     200                 :           0 :   VALENT_ENTRY;
+     201                 :             : 
+     202         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), 1);
+     203   [ #  #  #  #  :           0 :   g_return_val_if_fail (G_IS_APPLICATION_COMMAND_LINE (command_line), 1);
+             #  #  #  # ]
+     204                 :             : 
+     205                 :           0 :   ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->command_line (plugin,
+     206                 :             :                                                                     command_line);
+     207                 :             : 
+     208                 :           0 :   VALENT_RETURN (ret);
+     209                 :             : }
+     210                 :             : 
+     211                 :             : /**
+     212                 :             :  * valent_application_plugin_dbus_register: (virtual dbus_register)
+     213                 :             :  * @plugin: a `ValentApplicationPlugin`
+     214                 :             :  * @connection: a `Gio.DBusCOnnection`
+     215                 :             :  * @object_path: a D-Bus object path
+     216                 :             :  * @error: (nullable): a `GError`
+     217                 :             :  *
+     218                 :             :  * Handle the D-Bus registration phase of the application.
+     219                 :             :  *
+     220                 :             :  * Implementations may override this method to export extra objects on the
+     221                 :             :  * bus, that need to exist before the application tries to own the bus name.
+     222                 :             :  *
+     223                 :             :  * D-Bus registration will be aborted if %FALSE is returned, so implementations
+     224                 :             :  * may return %TRUE and report the error by other means if it is not intended
+     225                 :             :  * to be fatal.
+     226                 :             :  *
+     227                 :             :  * Returns: %TRUE, or %FALSE with @error set
+     228                 :             :  *
+     229                 :             :  * Since: 1.0
+     230                 :             :  */
+     231                 :             : gboolean
+     232                 :           7 : valent_application_plugin_dbus_register (ValentApplicationPlugin  *plugin,
+     233                 :             :                                          GDBusConnection          *connection,
+     234                 :             :                                          const char               *object_path,
+     235                 :             :                                          GError                  **error)
+     236                 :             : {
+     237                 :           7 :   gboolean ret;
+     238                 :             : 
+     239                 :           7 :   VALENT_ENTRY;
+     240                 :             : 
+     241         [ +  - ]:           7 :   g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), FALSE);
+     242   [ +  -  +  -  :           7 :   g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE);
+             -  +  -  - ]
+     243         [ -  + ]:           7 :   g_return_val_if_fail (g_variant_is_object_path (object_path), FALSE);
+     244   [ +  +  -  + ]:           7 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     245                 :             : 
+     246                 :           7 :   ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->dbus_register (plugin,
+     247                 :             :                                                                      connection,
+     248                 :             :                                                                      object_path,
+     249                 :             :                                                                      error);
+     250                 :             : 
+     251                 :           7 :   VALENT_RETURN (ret);
+     252                 :             : }
+     253                 :             : 
+     254                 :             : /**
+     255                 :             :  * valent_application_plugin_dbus_unregister: (virtual dbus_unregister)
+     256                 :             :  * @plugin: a `ValentApplicationPlugin`
+     257                 :             :  * @connection: a `Gio.DBusCOnnection`
+     258                 :             :  * @object_path: a D
+     259                 :             :  *
+     260                 :             :  * Handle the D-Bus unregistration phase of the application.
+     261                 :             :  *
+     262                 :             :  * Implementations should override this method to unexport anything exported in
+     263                 :             :  * [vfunc@Valent.ApplicationPlugin.dbus_register].
+     264                 :             :  *
+     265                 :             :  * Since: 1.0
+     266                 :             :  */
+     267                 :             : void
+     268                 :           7 : valent_application_plugin_dbus_unregister (ValentApplicationPlugin  *plugin,
+     269                 :             :                                            GDBusConnection          *connection,
+     270                 :             :                                            const char               *object_path)
+     271                 :             : {
+     272                 :           7 :   VALENT_ENTRY;
+     273                 :             : 
+     274         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     275   [ +  -  +  -  :           7 :   g_return_if_fail (G_IS_DBUS_CONNECTION (connection));
+             -  +  -  - ]
+     276         [ -  + ]:           7 :   g_return_if_fail (g_variant_is_object_path (object_path));
+     277                 :             : 
+     278                 :           7 :   VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->dbus_unregister (plugin,
+     279                 :             :                                                                  connection,
+     280                 :             :                                                                  object_path);
+     281                 :             : 
+     282                 :           7 :   VALENT_EXIT;
+     283                 :             : }
+     284                 :             : 
+     285                 :             : /**
+     286                 :             :  * valent_application_plugin_open: (virtual open)
+     287                 :             :  * @plugin: a `ValentApplicationPlugin`
+     288                 :             :  * @files: (array length=n_files): an array of `GFiles` to open
+     289                 :             :  * @n_files: the length of the @files array
+     290                 :             :  * @hint: (not nullable): a hint (or "")
+     291                 :             :  *
+     292                 :             :  * Open the given files.
+     293                 :             :  *
+     294                 :             :  * Implementations should override this method to handle files and URIs, as
+     295                 :             :  * a result of [signal@Gio.Application::open] being emitted on the primary
+     296                 :             :  * instance of the application.
+     297                 :             :  *
+     298                 :             :  * Returns: %TRUE if handled, or %FALSE if not
+     299                 :             :  *
+     300                 :             :  * Since: 1.0
+     301                 :             :  */
+     302                 :             : gboolean
+     303                 :           2 : valent_application_plugin_open (ValentApplicationPlugin  *plugin,
+     304                 :             :                                 GFile                   **files,
+     305                 :             :                                 int                       n_files,
+     306                 :             :                                 const char               *hint)
+     307                 :             : {
+     308                 :           2 :   gboolean ret;
+     309                 :             : 
+     310                 :           2 :   VALENT_ENTRY;
+     311                 :             : 
+     312         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin), FALSE);
+     313         [ -  + ]:           2 :   g_return_val_if_fail (files != NULL, FALSE);
+     314         [ -  + ]:           2 :   g_return_val_if_fail (n_files > 0, FALSE);
+     315         [ -  + ]:           2 :   g_return_val_if_fail (hint != NULL, FALSE);
+     316                 :             : 
+     317                 :           2 :   ret = VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->open (plugin,
+     318                 :             :                                                             files,
+     319                 :             :                                                             n_files,
+     320                 :             :                                                             hint);
+     321                 :             : 
+     322                 :           2 :   VALENT_RETURN (ret);
+     323                 :             : }
+     324                 :             : 
+     325                 :             : /**
+     326                 :             :  * valent_application_plugin_shutdown: (virtual shutdown)
+     327                 :             :  * @plugin: a `ValentApplicationPlugin`
+     328                 :             :  *
+     329                 :             :  * Handle the shutdown phase of the application.
+     330                 :             :  *
+     331                 :             :  * Implementations should override this method to reverse anything done in
+     332                 :             :  * [vfunc@Valent.ApplicationPlugin.startup].
+     333                 :             :  *
+     334                 :             :  * Since: 1.0
+     335                 :             :  */
+     336                 :             : void
+     337                 :          16 : valent_application_plugin_shutdown (ValentApplicationPlugin *plugin)
+     338                 :             : {
+     339                 :          16 :   VALENT_ENTRY;
+     340                 :             : 
+     341         [ +  - ]:          16 :   g_return_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     342                 :             : 
+     343                 :          16 :   VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->shutdown (plugin);
+     344                 :             : 
+     345                 :          16 :   VALENT_EXIT;
+     346                 :             : }
+     347                 :             : 
+     348                 :             : /**
+     349                 :             :  * valent_application_plugin_startup: (virtual startup)
+     350                 :             :  * @plugin: a `ValentApplicationPlugin`
+     351                 :             :  *
+     352                 :             :  * Handle the startup phase of the application.
+     353                 :             :  *
+     354                 :             :  * Implementations may override this method to perform setup task that should
+     355                 :             :  * only happen on the primary instance.
+     356                 :             :  *
+     357                 :             :  * Since: 1.0
+     358                 :             :  */
+     359                 :             : void
+     360                 :          14 : valent_application_plugin_startup (ValentApplicationPlugin *plugin)
+     361                 :             : {
+     362                 :          14 :   VALENT_ENTRY;
+     363                 :             : 
+     364         [ +  - ]:          14 :   g_return_if_fail (VALENT_IS_APPLICATION_PLUGIN (plugin));
+     365                 :             : 
+     366                 :          14 :   VALENT_APPLICATION_PLUGIN_GET_CLASS (plugin)->startup (plugin);
+     367                 :             : 
+     368                 :          14 :   VALENT_EXIT;
+     369                 :             : }
+     370                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application-plugin.h.func-c.html b/coverage/src/libvalent/core/valent-application-plugin.h.func-c.html new file mode 100644 index 00000000000..330b94c07aa --- /dev/null +++ b/coverage/src/libvalent/core/valent-application-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_APPLICATION_PLUGIN56
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application-plugin.h.func.html b/coverage/src/libvalent/core/valent-application-plugin.h.func.html new file mode 100644 index 00000000000..be927904ab9 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_APPLICATION_PLUGIN56
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application-plugin.h.gcov.html b/coverage/src/libvalent/core/valent-application-plugin.h.gcov.html new file mode 100644 index 00000000000..709948a3521 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application-plugin.h.gcov.html @@ -0,0 +1,163 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "valent-extension.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_APPLICATION_PLUGIN (valent_application_plugin_get_type ())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :         109 : G_DECLARE_DERIVABLE_TYPE (ValentApplicationPlugin, valent_application_plugin, VALENT, APPLICATION_PLUGIN, ValentExtension)
+                   +  - ]
+      18                 :             : 
+      19                 :             : struct _ValentApplicationPluginClass
+      20                 :             : {
+      21                 :             :   ValentExtensionClass   parent_class;
+      22                 :             : 
+      23                 :             :   /* virtual functions */
+      24                 :             :   gboolean               (*activate)        (ValentApplicationPlugin  *plugin);
+      25                 :             :   int                    (*command_line)    (ValentApplicationPlugin  *plugin,
+      26                 :             :                                              GApplicationCommandLine  *command_line);
+      27                 :             :   gboolean               (*dbus_register)   (ValentApplicationPlugin  *plugin,
+      28                 :             :                                              GDBusConnection          *connection,
+      29                 :             :                                              const char               *object_path,
+      30                 :             :                                              GError                  **error);
+      31                 :             :   void                   (*dbus_unregister) (ValentApplicationPlugin  *plugin,
+      32                 :             :                                              GDBusConnection          *connection,
+      33                 :             :                                              const char               *object_path);
+      34                 :             :   gboolean               (*open)            (ValentApplicationPlugin  *plugin,
+      35                 :             :                                              GFile                   **files,
+      36                 :             :                                              int                       n_files,
+      37                 :             :                                              const char               *hint);
+      38                 :             :   void                   (*shutdown)        (ValentApplicationPlugin  *plugin);
+      39                 :             :   void                   (*startup)         (ValentApplicationPlugin  *plugin);
+      40                 :             : 
+      41                 :             :   /*< private >*/
+      42                 :             :   gpointer               padding[8];
+      43                 :             : };
+      44                 :             : 
+      45                 :             : VALENT_AVAILABLE_IN_1_0
+      46                 :             : gboolean       valent_application_plugin_activate        (ValentApplicationPlugin  *plugin);
+      47                 :             : VALENT_AVAILABLE_IN_1_0
+      48                 :             : int            valent_application_plugin_command_line    (ValentApplicationPlugin  *plugin,
+      49                 :             :                                                           GApplicationCommandLine  *command_line);
+      50                 :             : VALENT_AVAILABLE_IN_1_0
+      51                 :             : gboolean       valent_application_plugin_dbus_register   (ValentApplicationPlugin  *plugin,
+      52                 :             :                                                           GDBusConnection          *connection,
+      53                 :             :                                                           const char               *object_path,
+      54                 :             :                                                           GError                  **error);
+      55                 :             : VALENT_AVAILABLE_IN_1_0
+      56                 :             : void           valent_application_plugin_dbus_unregister (ValentApplicationPlugin  *plugin,
+      57                 :             :                                                           GDBusConnection          *connection,
+      58                 :             :                                                           const char               *object_path);
+      59                 :             : VALENT_AVAILABLE_IN_1_0
+      60                 :             : gboolean       valent_application_plugin_open            (ValentApplicationPlugin  *plugin,
+      61                 :             :                                                           GFile                   **files,
+      62                 :             :                                                           int                       n_files,
+      63                 :             :                                                           const char               *hint);
+      64                 :             : VALENT_AVAILABLE_IN_1_0
+      65                 :             : void           valent_application_plugin_shutdown        (ValentApplicationPlugin  *plugin);
+      66                 :             : VALENT_AVAILABLE_IN_1_0
+      67                 :             : void           valent_application_plugin_startup         (ValentApplicationPlugin  *plugin);
+      68                 :             : 
+      69                 :             : G_END_DECLS
+      70                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application.c.func-c.html b/coverage/src/libvalent/core/valent-application.c.func-c.html new file mode 100644 index 00000000000..475353e0413 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.7 %152144
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %9055
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_unload_plugin1
quit_action1
valent_application_disable_plugin1
valent_application_open1
on_plugin_enabled_changed2
_valent_application_new3
valent_application_activate3
valent_application_constructed3
valent_application_dbus_register3
valent_application_dbus_unregister3
valent_application_dispose3
valent_application_init3
valent_application_shutdown3
valent_application_startup3
valent_application_enable_plugin8
on_load_plugin13
valent_application_get_type209
valent_application_class_intern_init2
valent_application_get_type_once86
valent_application_get_type121
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application.c.func.html b/coverage/src/libvalent/core/valent-application.c.func.html new file mode 100644 index 00000000000..8f355e933a3 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.7 %152144
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %9055
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_valent_application_new3
on_load_plugin13
on_plugin_enabled_changed2
on_unload_plugin1
quit_action1
valent_application_activate3
valent_application_constructed3
valent_application_dbus_register3
valent_application_dbus_unregister3
valent_application_disable_plugin1
valent_application_dispose3
valent_application_enable_plugin8
valent_application_get_type209
valent_application_class_intern_init2
valent_application_get_type121
valent_application_get_type_once86
valent_application_init3
valent_application_open1
valent_application_shutdown3
valent_application_startup3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application.c.gcov.html b/coverage/src/libvalent/core/valent-application.c.gcov.html new file mode 100644 index 00000000000..6fa72e24bfe --- /dev/null +++ b/coverage/src/libvalent/core/valent-application.c.gcov.html @@ -0,0 +1,483 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.7 %152144
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %9055
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-application"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : 
+      10                 :             : #include "valent-application.h"
+      11                 :             : #include "valent-application-plugin.h"
+      12                 :             : #include "valent-component-private.h"
+      13                 :             : #include "valent-debug.h"
+      14                 :             : #include "valent-global.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentApplication:
+      19                 :             :  *
+      20                 :             :  * The primary application class of Valent.
+      21                 :             :  *
+      22                 :             :  * `ValentApplication` is the primary application class for Valent.
+      23                 :             :  *
+      24                 :             :  * Since: 1.0
+      25                 :             :  */
+      26                 :             : 
+      27                 :             : struct _ValentApplication
+      28                 :             : {
+      29                 :             :   GApplication   parent_instance;
+      30                 :             : 
+      31                 :             :   GHashTable    *plugins;
+      32                 :             :   ValentContext *plugins_context;
+      33                 :             : };
+      34                 :             : 
+      35   [ +  +  +  - ]:         209 : G_DEFINE_FINAL_TYPE (ValentApplication, valent_application, G_TYPE_APPLICATION)
+      36                 :             : 
+      37                 :             : 
+      38                 :             : /*
+      39                 :             :  * PeasEngine
+      40                 :             :  */
+      41                 :             : static inline void
+      42                 :           8 : valent_application_enable_plugin (ValentApplication *self,
+      43                 :             :                                   ValentPlugin      *plugin)
+      44                 :             : {
+      45         [ +  - ]:           8 :   g_assert (VALENT_IS_APPLICATION (self));
+      46                 :             : 
+      47                 :           8 :   plugin->extension = peas_engine_create_extension (valent_get_plugin_engine (),
+      48                 :             :                                                     plugin->info,
+      49                 :             :                                                     VALENT_TYPE_APPLICATION_PLUGIN,
+      50                 :             :                                                     "object", self,
+      51                 :             :                                                     NULL);
+      52         [ -  + ]:           8 :   g_return_if_fail (G_IS_OBJECT (plugin->extension));
+      53                 :             : }
+      54                 :             : 
+      55                 :             : static inline void
+      56                 :           1 : valent_application_disable_plugin (ValentApplication *self,
+      57                 :             :                                    ValentPlugin      *plugin)
+      58                 :             : {
+      59         [ +  - ]:           1 :   g_assert (VALENT_IS_APPLICATION (self));
+      60                 :             : 
+      61         [ +  - ]:           1 :   g_clear_object (&plugin->extension);
+      62                 :           1 : }
+      63                 :             : 
+      64                 :             : static void
+      65                 :           2 : on_plugin_enabled_changed (ValentPlugin *plugin)
+      66                 :             : {
+      67         [ +  - ]:           2 :   g_assert (plugin != NULL);
+      68         [ -  + ]:           2 :   g_assert (VALENT_IS_APPLICATION (plugin->parent));
+      69                 :             : 
+      70         [ +  + ]:           2 :   if (valent_plugin_get_enabled (plugin))
+      71                 :           1 :     valent_application_enable_plugin (plugin->parent, plugin);
+      72                 :             :   else
+      73                 :           1 :     valent_application_disable_plugin (plugin->parent, plugin);
+      74                 :           2 : }
+      75                 :             : 
+      76                 :             : static void
+      77                 :          13 : on_load_plugin (PeasEngine        *engine,
+      78                 :             :                 PeasPluginInfo    *info,
+      79                 :             :                 ValentApplication *self)
+      80                 :             : {
+      81                 :          13 :   ValentPlugin *plugin = NULL;
+      82                 :             : 
+      83         [ +  - ]:          13 :   g_assert (PEAS_IS_ENGINE (engine));
+      84         [ -  + ]:          13 :   g_assert (info != NULL);
+      85         [ -  + ]:          13 :   g_assert (VALENT_IS_APPLICATION (self));
+      86                 :             : 
+      87         [ +  + ]:          13 :   if (!peas_engine_provides_extension (engine, info, VALENT_TYPE_APPLICATION_PLUGIN))
+      88                 :             :     return;
+      89                 :             : 
+      90                 :           7 :   VALENT_NOTE ("%s: %s",
+      91                 :             :                g_type_name (VALENT_TYPE_APPLICATION_PLUGIN),
+      92                 :             :                peas_plugin_info_get_module_name (info));
+      93                 :             : 
+      94                 :           7 :   plugin = valent_plugin_new (self, self->plugins_context, info,
+      95                 :             :                               G_CALLBACK (on_plugin_enabled_changed));
+      96                 :           7 :   g_hash_table_insert (self->plugins, info, plugin);
+      97                 :             : 
+      98         [ +  - ]:           7 :   if (valent_plugin_get_enabled (plugin))
+      99                 :           7 :     valent_application_enable_plugin (self, plugin);
+     100                 :             : }
+     101                 :             : 
+     102                 :             : static void
+     103                 :           1 : on_unload_plugin (PeasEngine        *engine,
+     104                 :             :                   PeasPluginInfo    *info,
+     105                 :             :                   ValentApplication *self)
+     106                 :             : {
+     107         [ +  - ]:           1 :   g_assert (PEAS_IS_ENGINE (engine));
+     108         [ -  + ]:           1 :   g_assert (info != NULL);
+     109         [ -  + ]:           1 :   g_assert (VALENT_IS_APPLICATION (self));
+     110                 :             : 
+     111         [ +  - ]:           1 :   if (!peas_engine_provides_extension (engine, info, VALENT_TYPE_APPLICATION_PLUGIN))
+     112                 :             :     return;
+     113                 :             : 
+     114                 :           1 :   g_hash_table_remove (self->plugins, info);
+     115                 :             : }
+     116                 :             : 
+     117                 :             : 
+     118                 :             : /*
+     119                 :             :  * GActions
+     120                 :             :  */
+     121                 :             : static void
+     122                 :           1 : quit_action (GSimpleAction *action,
+     123                 :             :              GVariant      *parameter,
+     124                 :             :              gpointer       user_data)
+     125                 :             : {
+     126                 :           1 :   GApplication *application = G_APPLICATION (user_data);
+     127                 :             : 
+     128   [ +  -  +  -  :           1 :   g_assert (G_IS_APPLICATION (application));
+             +  -  -  + ]
+     129                 :             : 
+     130                 :           1 :   g_application_quit (application);
+     131                 :           1 : }
+     132                 :             : 
+     133                 :             : static const GActionEntry app_actions[] = {
+     134                 :             :   { "quit", quit_action, NULL, NULL, NULL },
+     135                 :             : };
+     136                 :             : 
+     137                 :             : 
+     138                 :             : /*
+     139                 :             :  * GApplication
+     140                 :             :  */
+     141                 :             : static void
+     142                 :           3 : valent_application_activate (GApplication *application)
+     143                 :             : {
+     144                 :           3 :   ValentApplication *self = VALENT_APPLICATION (application);
+     145                 :           3 :   GHashTableIter iter;
+     146                 :           3 :   ValentPlugin *plugin;
+     147                 :             : 
+     148         [ +  - ]:           3 :   g_assert (VALENT_IS_APPLICATION (self));
+     149                 :             : 
+     150                 :           3 :   g_hash_table_iter_init (&iter, self->plugins);
+     151                 :             : 
+     152         [ +  - ]:           6 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+     153                 :             :     {
+     154         [ -  + ]:           6 :       if (plugin->extension == NULL)
+     155                 :           0 :         continue;
+     156                 :             : 
+     157         [ +  + ]:           6 :       if (valent_application_plugin_activate (VALENT_APPLICATION_PLUGIN (plugin->extension)))
+     158                 :           3 :         return;
+     159                 :             :     }
+     160                 :             : 
+     161                 :           0 :   g_debug ("%s(): unhandled activation", G_STRFUNC);
+     162                 :             : }
+     163                 :             : 
+     164                 :             : static void
+     165                 :           1 : valent_application_open (GApplication  *application,
+     166                 :             :                          GFile        **files,
+     167                 :             :                          int            n_files,
+     168                 :             :                          const char    *hint)
+     169                 :             : {
+     170                 :           1 :   ValentApplication *self = VALENT_APPLICATION (application);
+     171                 :           1 :   GHashTableIter iter;
+     172                 :           1 :   ValentPlugin *plugin;
+     173                 :             : 
+     174         [ +  - ]:           1 :   g_assert (VALENT_IS_APPLICATION (self));
+     175                 :             : 
+     176                 :           1 :   g_hash_table_iter_init (&iter, self->plugins);
+     177                 :             : 
+     178         [ +  - ]:           2 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+     179                 :             :     {
+     180         [ -  + ]:           2 :       if (plugin->extension == NULL)
+     181                 :           0 :         continue;
+     182                 :             : 
+     183         [ +  + ]:           2 :       if (valent_application_plugin_open (VALENT_APPLICATION_PLUGIN (plugin->extension),
+     184                 :             :                                           files,
+     185                 :             :                                           n_files,
+     186                 :             :                                           hint))
+     187                 :           1 :         return;
+     188                 :             :     }
+     189                 :             : 
+     190                 :             :   /* If no plugin takes ownership of the files, print a warning. */
+     191                 :           0 :   g_warning ("%s(): %i unhandled files", G_STRFUNC, n_files);
+     192                 :             : }
+     193                 :             : 
+     194                 :             : static void
+     195                 :           3 : valent_application_startup (GApplication *application)
+     196                 :             : {
+     197                 :           3 :   ValentApplication *self = VALENT_APPLICATION (application);
+     198                 :           3 :   GHashTableIter iter;
+     199                 :           3 :   ValentPlugin *plugin;
+     200                 :             : 
+     201         [ +  - ]:           3 :   g_assert (VALENT_IS_APPLICATION (application));
+     202                 :             : 
+     203                 :             :   /* Chain-up first */
+     204                 :           3 :   G_APPLICATION_CLASS (valent_application_parent_class)->startup (application);
+     205                 :           3 :   g_application_hold (application);
+     206                 :             : 
+     207                 :           3 :   g_action_map_add_action_entries (G_ACTION_MAP (application),
+     208                 :             :                                    app_actions,
+     209                 :             :                                    G_N_ELEMENTS (app_actions),
+     210                 :             :                                    application);
+     211                 :             : 
+     212                 :           3 :   g_hash_table_iter_init (&iter, self->plugins);
+     213                 :             : 
+     214         [ +  + ]:           9 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+     215                 :             :     {
+     216         [ -  + ]:           6 :       if (plugin->extension == NULL)
+     217                 :           0 :         continue;
+     218                 :             : 
+     219                 :           6 :       valent_application_plugin_startup (VALENT_APPLICATION_PLUGIN (plugin->extension));
+     220                 :             :     }
+     221                 :           3 : }
+     222                 :             : 
+     223                 :             : static void
+     224                 :           3 : valent_application_shutdown (GApplication *application)
+     225                 :             : {
+     226                 :           3 :   ValentApplication *self = VALENT_APPLICATION (application);
+     227                 :           3 :   GHashTableIter iter;
+     228                 :           3 :   ValentPlugin *plugin;
+     229                 :             : 
+     230                 :           3 :   g_hash_table_iter_init (&iter, self->plugins);
+     231                 :             : 
+     232         [ +  + ]:           9 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+     233                 :             :     {
+     234         [ -  + ]:           6 :       if (plugin->extension == NULL)
+     235                 :           0 :         continue;
+     236                 :             : 
+     237                 :           6 :       valent_application_plugin_shutdown (VALENT_APPLICATION_PLUGIN (plugin->extension));
+     238                 :             :     }
+     239                 :             : 
+     240                 :           3 :   G_APPLICATION_CLASS (valent_application_parent_class)->shutdown (application);
+     241                 :           3 : }
+     242                 :             : 
+     243                 :             : static gboolean
+     244                 :           3 : valent_application_dbus_register (GApplication     *application,
+     245                 :             :                                   GDBusConnection  *connection,
+     246                 :             :                                   const char       *object_path,
+     247                 :             :                                   GError          **error)
+     248                 :             : {
+     249                 :           3 :   ValentApplication *self = VALENT_APPLICATION (application);
+     250                 :           3 :   GApplicationClass *klass = G_APPLICATION_CLASS (valent_application_parent_class);
+     251                 :           3 :   GHashTableIter iter;
+     252                 :           3 :   ValentPlugin *plugin;
+     253                 :             : 
+     254                 :             :   /* Chain-up first */
+     255         [ -  + ]:           3 :   if (!klass->dbus_register (application, connection, object_path, error))
+     256                 :             :     return FALSE;
+     257                 :             : 
+     258                 :           3 :   g_hash_table_iter_init (&iter, self->plugins);
+     259                 :             : 
+     260         [ +  + ]:           9 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+     261                 :             :     {
+     262         [ -  + ]:           6 :       if (plugin->extension == NULL)
+     263                 :           0 :         continue;
+     264                 :             : 
+     265         [ -  + ]:           6 :       if (!valent_application_plugin_dbus_register (VALENT_APPLICATION_PLUGIN (plugin->extension),
+     266                 :             :                                                     connection,
+     267                 :             :                                                     object_path,
+     268                 :             :                                                     error))
+     269                 :             :         return FALSE;
+     270                 :             :     }
+     271                 :             : 
+     272                 :             :   return TRUE;
+     273                 :             : }
+     274                 :             : 
+     275                 :             : static void
+     276                 :           3 : valent_application_dbus_unregister (GApplication    *application,
+     277                 :             :                                     GDBusConnection *connection,
+     278                 :             :                                     const char      *object_path)
+     279                 :             : {
+     280                 :           3 :   ValentApplication *self = VALENT_APPLICATION (application);
+     281                 :           3 :   GApplicationClass *klass = G_APPLICATION_CLASS (valent_application_parent_class);
+     282                 :           3 :   GHashTableIter iter;
+     283                 :           3 :   ValentPlugin *plugin;
+     284                 :             : 
+     285                 :           3 :   g_hash_table_iter_init (&iter, self->plugins);
+     286                 :             : 
+     287         [ +  + ]:           9 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+     288                 :             :     {
+     289         [ -  + ]:           6 :       if (plugin->extension == NULL)
+     290                 :           0 :         continue;
+     291                 :             : 
+     292                 :           6 :       valent_application_plugin_dbus_unregister (VALENT_APPLICATION_PLUGIN (plugin->extension),
+     293                 :             :                                                  connection,
+     294                 :             :                                                  object_path);
+     295                 :             :     }
+     296                 :             : 
+     297                 :             :   /* Chain-up last */
+     298                 :           3 :   klass->dbus_unregister (application, connection, object_path);
+     299                 :           3 : }
+     300                 :             : 
+     301                 :             : 
+     302                 :             : /*
+     303                 :             :  * GObject
+     304                 :             :  */
+     305                 :             : static void
+     306                 :           3 : valent_application_constructed (GObject *object)
+     307                 :             : {
+     308                 :           3 :   ValentApplication *self = VALENT_APPLICATION (object);
+     309                 :           3 :   PeasEngine *engine = NULL;
+     310                 :           3 :   unsigned int n_plugins = 0;
+     311                 :             : 
+     312                 :           3 :   self->plugins = g_hash_table_new_full (NULL, NULL, NULL, valent_plugin_free);
+     313                 :           3 :   self->plugins_context = valent_context_new (NULL, "application", NULL);
+     314                 :             : 
+     315                 :           3 :   engine = valent_get_plugin_engine ();
+     316                 :           3 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (engine));
+     317                 :             : 
+     318         [ +  + ]:          15 :   for (unsigned int i = 0; i < n_plugins; i++)
+     319                 :             :     {
+     320                 :          12 :       g_autoptr (PeasPluginInfo) info = NULL;
+     321                 :             : 
+     322                 :          12 :       info = g_list_model_get_item (G_LIST_MODEL (engine), i);
+     323                 :             : 
+     324         [ +  - ]:          12 :       if (peas_plugin_info_is_loaded (info))
+     325                 :          12 :         on_load_plugin (engine, info, self);
+     326                 :             :     }
+     327                 :             : 
+     328                 :           3 :   g_signal_connect_object (engine,
+     329                 :             :                            "load-plugin",
+     330                 :             :                            G_CALLBACK (on_load_plugin),
+     331                 :             :                            self,
+     332                 :             :                            G_CONNECT_AFTER);
+     333                 :             : 
+     334                 :           3 :   g_signal_connect_object (engine,
+     335                 :             :                            "unload-plugin",
+     336                 :             :                            G_CALLBACK (on_unload_plugin),
+     337                 :             :                            self,
+     338                 :             :                            0);
+     339                 :             : 
+     340                 :           3 :   G_OBJECT_CLASS (valent_application_parent_class)->constructed (object);
+     341                 :           3 : }
+     342                 :             : 
+     343                 :             : static void
+     344                 :           3 : valent_application_dispose (GObject *object)
+     345                 :             : {
+     346                 :           3 :   ValentApplication *self = VALENT_APPLICATION (object);
+     347                 :           3 :   PeasEngine *engine = NULL;
+     348                 :             : 
+     349                 :           3 :   engine = valent_get_plugin_engine ();
+     350                 :           3 :   g_signal_handlers_disconnect_by_data (engine, self);
+     351                 :             : 
+     352                 :           3 :   g_hash_table_remove_all (self->plugins);
+     353         [ +  - ]:           3 :   g_clear_pointer (&self->plugins, g_hash_table_unref);
+     354         [ +  - ]:           3 :   g_clear_object (&self->plugins_context);
+     355                 :             : 
+     356                 :           3 :   G_OBJECT_CLASS (valent_application_parent_class)->dispose (object);
+     357                 :           3 : }
+     358                 :             : 
+     359                 :             : static void
+     360                 :           2 : valent_application_class_init (ValentApplicationClass *klass)
+     361                 :             : {
+     362                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     363                 :           2 :   GApplicationClass *application_class = G_APPLICATION_CLASS (klass);
+     364                 :             : 
+     365                 :           2 :   object_class->constructed = valent_application_constructed;
+     366                 :           2 :   object_class->dispose = valent_application_dispose;
+     367                 :             : 
+     368                 :           2 :   application_class->activate = valent_application_activate;
+     369                 :           2 :   application_class->startup = valent_application_startup;
+     370                 :           2 :   application_class->shutdown = valent_application_shutdown;
+     371                 :           2 :   application_class->open = valent_application_open;
+     372                 :           2 :   application_class->dbus_register = valent_application_dbus_register;
+     373                 :           2 :   application_class->dbus_unregister = valent_application_dbus_unregister;
+     374                 :             : }
+     375                 :             : 
+     376                 :             : static void
+     377                 :           3 : valent_application_init (ValentApplication *self)
+     378                 :             : {
+     379                 :           3 : }
+     380                 :             : 
+     381                 :             : GApplication *
+     382                 :           3 : _valent_application_new (void)
+     383                 :             : {
+     384                 :           3 :   return g_object_new (VALENT_TYPE_APPLICATION,
+     385                 :             :                        "application-id",     APPLICATION_ID,
+     386                 :             :                        "resource-base-path", "/ca/andyholmes/Valent",
+     387                 :             :                        "flags",              G_APPLICATION_HANDLES_OPEN,
+     388                 :             :                        NULL);
+     389                 :             : }
+     390                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application.h.func-c.html b/coverage/src/libvalent/core/valent-application.h.func-c.html new file mode 100644 index 00000000000..2f6818d3546 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_APPLICATION32
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application.h.func.html b/coverage/src/libvalent/core/valent-application.h.func.html new file mode 100644 index 00000000000..84ac1ceaf81 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_APPLICATION32
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-application.h.gcov.html b/coverage/src/libvalent/core/valent-application.h.gcov.html new file mode 100644 index 00000000000..cdc50df8710 --- /dev/null +++ b/coverage/src/libvalent/core/valent-application.h.gcov.html @@ -0,0 +1,117 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-application.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-application.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : 
+      12                 :             : #include "valent-version.h"
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : #define VALENT_TYPE_APPLICATION (valent_application_get_type())
+      17                 :             : 
+      18                 :             : VALENT_AVAILABLE_IN_1_0
+      19   [ +  -  +  -  :          32 : G_DECLARE_FINAL_TYPE (ValentApplication, valent_application, VALENT, APPLICATION, GApplication)
+                   -  + ]
+      20                 :             : 
+      21                 :             : VALENT_AVAILABLE_IN_1_0
+      22                 :             : GApplication * _valent_application_new (void);
+      23                 :             : 
+      24                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component-private.h.func-c.html b/coverage/src/libvalent/core/valent-component-private.h.func-c.html new file mode 100644 index 00000000000..9b2e8b1d046 --- /dev/null +++ b/coverage/src/libvalent/core/valent-component-private.h.func-c.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component-private.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component-private.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2828
Test Date:2024-03-31 18:46:36Functions:100.0 %33
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %2012
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_plugin_free248
valent_plugin_new273
valent_plugin_get_enabled281
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component-private.h.func.html b/coverage/src/libvalent/core/valent-component-private.h.func.html new file mode 100644 index 00000000000..1eb10836e15 --- /dev/null +++ b/coverage/src/libvalent/core/valent-component-private.h.func.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component-private.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component-private.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2828
Test Date:2024-03-31 18:46:36Functions:100.0 %33
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %2012
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_plugin_free248
valent_plugin_get_enabled281
valent_plugin_new273
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component-private.h.gcov.html b/coverage/src/libvalent/core/valent-component-private.h.gcov.html new file mode 100644 index 00000000000..4340177d1ac --- /dev/null +++ b/coverage/src/libvalent/core/valent-component-private.h.gcov.html @@ -0,0 +1,212 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component-private.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component-private.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2828
Test Date:2024-03-31 18:46:36Functions:100.0 %33
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %2012
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include "valent-component.h"
+       7                 :             : #include "valent-context.h"
+       8                 :             : 
+       9                 :             : #define VALENT_PLUGIN_SCHEMA "ca.andyholmes.Valent.Plugin"
+      10                 :             : 
+      11                 :             : G_BEGIN_DECLS
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN
+      14                 :             : GObject * valent_component_get_preferred (ValentComponent *self);
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /*< private >
+      18                 :             :  * ValentPlugin:
+      19                 :             :  * @parent: (type GObject.Object): the owner of the plugin
+      20                 :             :  * @context: the plugin context
+      21                 :             :  * @info: the plugin info
+      22                 :             :  * @extension: the plugin extension
+      23                 :             :  * @cancellable: the initialization cancellable
+      24                 :             :  * @settings: the plugin settings
+      25                 :             :  *
+      26                 :             :  * A `struct` for representing a plugin pod.
+      27                 :             :  */
+      28                 :             : typedef struct
+      29                 :             : {
+      30                 :             :   gpointer        parent;
+      31                 :             :   ValentContext  *context;
+      32                 :             :   PeasPluginInfo *info;
+      33                 :             :   GObject        *extension;
+      34                 :             :   GCancellable   *cancellable;
+      35                 :             : 
+      36                 :             :   /*< private >*/
+      37                 :             :   GSettings      *settings;
+      38                 :             : } ValentPlugin;
+      39                 :             : 
+      40                 :             : 
+      41                 :             : /*< private >
+      42                 :             :  * valent_plugin_new:
+      43                 :             :  * @parent: (type GObject.Object): the parent
+      44                 :             :  * @parent_context: the parent context
+      45                 :             :  * @info: the plugin info
+      46                 :             :  *
+      47                 :             :  * Create a new `ValentPlugin`.
+      48                 :             :  *
+      49                 :             :  * Returns: (transfer full): a new `ValentPlugin`
+      50                 :             :  */
+      51                 :             : static inline ValentPlugin *
+      52                 :         273 : valent_plugin_new (gpointer        parent,
+      53                 :             :                    ValentContext  *parent_context,
+      54                 :             :                    PeasPluginInfo *info,
+      55                 :             :                    GCallback       enable_func)
+      56                 :             : {
+      57                 :         273 :   ValentPlugin *plugin = NULL;
+      58                 :             : 
+      59         [ +  - ]:         273 :   g_assert (G_IS_OBJECT (parent));
+      60         [ -  + ]:         273 :   g_assert (VALENT_IS_CONTEXT (parent_context));
+      61         [ -  + ]:         273 :   g_assert (info != NULL);
+      62                 :             : 
+      63                 :         273 :   plugin = g_new0 (ValentPlugin, 1);
+      64                 :         273 :   plugin->parent = parent;
+      65                 :         273 :   plugin->info = g_object_ref (info);
+      66                 :         273 :   plugin->context = valent_context_get_plugin_context (parent_context, info);
+      67                 :         273 :   plugin->settings = valent_context_create_settings (plugin->context,
+      68                 :             :                                                      VALENT_PLUGIN_SCHEMA);
+      69                 :             : 
+      70                 :         273 :   g_signal_connect_swapped (plugin->settings,
+      71                 :             :                             "changed::enabled",
+      72                 :             :                             enable_func,
+      73                 :             :                             plugin);
+      74                 :             : 
+      75                 :         273 :   return g_steal_pointer (&plugin);
+      76                 :             : }
+      77                 :             : 
+      78                 :             : /*< private >
+      79                 :             :  * valent_plugin_get_enabled:
+      80                 :             :  * @data: a `ValentPlugin`
+      81                 :             :  *
+      82                 :             :  * Get whether the plugin is enabled.
+      83                 :             :  *
+      84                 :             :  * Returns: %TRUE if enabled, %FALSE if not
+      85                 :             :  */
+      86                 :             : static inline gboolean
+      87                 :         281 : valent_plugin_get_enabled (ValentPlugin *plugin)
+      88                 :             : {
+      89         [ +  - ]:         281 :   g_assert (plugin != NULL);
+      90                 :             : 
+      91                 :         281 :   return g_settings_get_boolean (plugin->settings, "enabled");
+      92                 :             : }
+      93                 :             : 
+      94                 :             : /*< private >
+      95                 :             :  * valent_plugin_free:
+      96                 :             :  * @data: a `ValentPlugin`
+      97                 :             :  *
+      98                 :             :  * Free a `ValentPlugin`.
+      99                 :             :  */
+     100                 :             : static inline void
+     101                 :         248 : valent_plugin_free (gpointer data)
+     102                 :             : {
+     103                 :         248 :   ValentPlugin *plugin = (ValentPlugin *)data;
+     104                 :             : 
+     105         [ +  - ]:         248 :   g_assert (data != NULL);
+     106                 :             : 
+     107                 :         248 :   g_cancellable_cancel (plugin->cancellable);
+     108                 :         248 :   g_signal_handlers_disconnect_by_data (plugin->settings, plugin);
+     109                 :             : 
+     110                 :         248 :   plugin->parent = NULL;
+     111         [ +  - ]:         248 :   g_clear_object (&plugin->info);
+     112         [ +  + ]:         248 :   g_clear_object (&plugin->cancellable);
+     113         [ +  - ]:         248 :   g_clear_object (&plugin->context);
+     114         [ +  + ]:         248 :   g_clear_object (&plugin->extension);
+     115         [ +  - ]:         248 :   g_clear_object (&plugin->settings);
+     116                 :         248 :   g_clear_pointer (&plugin, g_free);
+     117                 :         248 : }
+     118                 :             : 
+     119                 :             : G_END_DECLS
+     120                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component.c.func-c.html b/coverage/src/libvalent/core/valent-component.c.func-c.html new file mode 100644 index 00000000000..61e12636180 --- /dev/null +++ b/coverage/src/libvalent/core/valent-component.c.func-c.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:74.6 %224167
Test Date:2024-03-31 18:46:36Functions:81.0 %2117
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.7 %14262
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_plugin_enabled_changed0
on_unload_plugin0
valent_component_disable_plugin0
valent_component_get_property0
g_async_initable_init_async_cb18
on_plugin_state_changed19
valent_component_get_preferred27
valent_component_class_init32
valent_component_destroy33
valent_component_finalize33
component_plugin_free43
valent_component_constructed51
valent_component_init51
valent_component_enable_plugin55
_peas_plugin_info_get_priority69
valent_component_update_preferred74
valent_component_set_property102
on_load_plugin237
valent_component_get_type1334
valent_component_class_intern_init32
valent_component_get_type_once86
valent_component_get_type1216
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component.c.func.html b/coverage/src/libvalent/core/valent-component.c.func.html new file mode 100644 index 00000000000..81c83b3d75e --- /dev/null +++ b/coverage/src/libvalent/core/valent-component.c.func.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:74.6 %224167
Test Date:2024-03-31 18:46:36Functions:81.0 %2117
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.7 %14262
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_peas_plugin_info_get_priority69
component_plugin_free43
g_async_initable_init_async_cb18
on_load_plugin237
on_plugin_enabled_changed0
on_plugin_state_changed19
on_unload_plugin0
valent_component_class_init32
valent_component_constructed51
valent_component_destroy33
valent_component_disable_plugin0
valent_component_enable_plugin55
valent_component_finalize33
valent_component_get_preferred27
valent_component_get_property0
valent_component_get_type1334
valent_component_class_intern_init32
valent_component_get_type1216
valent_component_get_type_once86
valent_component_init51
valent_component_set_property102
valent_component_update_preferred74
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component.c.gcov.html b/coverage/src/libvalent/core/valent-component.c.gcov.html new file mode 100644 index 00000000000..19082253939 --- /dev/null +++ b/coverage/src/libvalent/core/valent-component.c.gcov.html @@ -0,0 +1,687 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:74.6 %224167
Test Date:2024-03-31 18:46:36Functions:81.0 %2117
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.7 %14262
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-component"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : 
+      11                 :             : #include "valent-component.h"
+      12                 :             : #include "valent-component-private.h"
+      13                 :             : #include "valent-debug.h"
+      14                 :             : #include "valent-extension.h"
+      15                 :             : #include "valent-global.h"
+      16                 :             : #include "valent-object.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : /**
+      20                 :             :  * ValentComponent:
+      21                 :             :  *
+      22                 :             :  * An abstract base class for components.
+      23                 :             :  *
+      24                 :             :  * `ValentComponent` is a base class for session and system components, such as
+      25                 :             :  * the clipboard or volume control. Each component is typically used in a
+      26                 :             :  * singleton pattern, backed by one or more extensions.
+      27                 :             :  *
+      28                 :             :  * Since: 1.0
+      29                 :             :  */
+      30                 :             : 
+      31                 :             : typedef struct
+      32                 :             : {
+      33                 :             :   PeasEngine    *engine;
+      34                 :             :   ValentContext *context;
+      35                 :             :   char          *plugin_domain;
+      36                 :             :   char          *plugin_priority;
+      37                 :             :   GType          plugin_type;
+      38                 :             :   GHashTable    *plugins;
+      39                 :             :   GObject       *preferred;
+      40                 :             : } ValentComponentPrivate;
+      41                 :             : 
+      42   [ +  +  +  - ]:        1997 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentComponent, valent_component, VALENT_TYPE_OBJECT);
+      43                 :             : 
+      44                 :             : 
+      45                 :             : /**
+      46                 :             :  * ValentComponentClass:
+      47                 :             :  * @bind_extension: the virtual function pointer for bind_extension()
+      48                 :             :  * @unbind_extension: the virtual function pointer for unbind_extension()
+      49                 :             :  *
+      50                 :             :  * The virtual function table for `ValentComponent`.
+      51                 :             :  */
+      52                 :             : 
+      53                 :             : enum {
+      54                 :             :   PROP_0,
+      55                 :             :   PROP_PLUGIN_DOMAIN,
+      56                 :             :   PROP_PLUGIN_TYPE,
+      57                 :             :   N_PROPERTIES
+      58                 :             : };
+      59                 :             : 
+      60                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      61                 :             : 
+      62                 :             : 
+      63                 :             : static void
+      64                 :          43 : component_plugin_free (gpointer data)
+      65                 :             : {
+      66                 :          43 :   ValentPlugin *plugin = data;
+      67                 :             : 
+      68         [ +  + ]:          43 :   if (plugin->extension != NULL)
+      69                 :             :     {
+      70         [ +  - ]:          36 :       ValentComponentClass *klass = VALENT_COMPONENT_GET_CLASS (plugin->parent);
+      71                 :             : 
+      72         [ +  - ]:          36 :       if (klass->unbind_extension != NULL)
+      73                 :          36 :         klass->unbind_extension (plugin->parent, plugin->extension);
+      74                 :             :     }
+      75                 :             : 
+      76                 :          43 :   g_clear_pointer (&plugin, valent_plugin_free);
+      77                 :          43 : }
+      78                 :             : 
+      79                 :             : 
+      80                 :             : static int64_t
+      81                 :          69 : _peas_plugin_info_get_priority (PeasPluginInfo *info,
+      82                 :             :                                 const char     *key)
+      83                 :             : {
+      84                 :          69 :   const char *priority_str = NULL;
+      85                 :          69 :   int64_t priority = 0;
+      86                 :             : 
+      87         [ +  - ]:          69 :   if (info != NULL && key != NULL)
+      88                 :          69 :     priority_str = peas_plugin_info_get_external_data (info, key);
+      89                 :             : 
+      90         [ +  + ]:          69 :   if (priority_str != NULL)
+      91                 :          57 :     priority = g_ascii_strtoll (priority_str, NULL, 10);
+      92                 :             : 
+      93                 :          69 :   return priority;
+      94                 :             : }
+      95                 :             : 
+      96                 :             : static void
+      97                 :          74 : valent_component_update_preferred (ValentComponent *self)
+      98                 :             : {
+      99                 :          74 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     100                 :          74 :   GHashTableIter iter;
+     101                 :          74 :   PeasPluginInfo *info;
+     102                 :          74 :   ValentPlugin *plugin;
+     103                 :          74 :   GObject *extension = NULL;
+     104                 :          74 :   int64_t extension_priority = 0;
+     105                 :             : 
+     106                 :          74 :   VALENT_ENTRY;
+     107                 :             : 
+     108         [ +  - ]:          74 :   g_assert (VALENT_IS_COMPONENT (self));
+     109                 :             : 
+     110                 :          74 :   g_hash_table_iter_init (&iter, priv->plugins);
+     111                 :             : 
+     112         [ +  + ]:         169 :   while (g_hash_table_iter_next (&iter, (void **)&info, (void **)&plugin))
+     113                 :             :     {
+     114                 :          95 :       ValentPluginState state;
+     115                 :          95 :       int64_t priority;
+     116                 :             : 
+     117         [ +  + ]:          95 :       if (plugin->extension == NULL)
+     118                 :          13 :         continue;
+     119                 :             : 
+     120                 :          82 :       state = valent_extension_plugin_state_check (VALENT_EXTENSION (plugin->extension), NULL);
+     121                 :             : 
+     122         [ +  + ]:          82 :       if (state != VALENT_PLUGIN_STATE_ACTIVE)
+     123                 :          13 :         continue;
+     124                 :             : 
+     125                 :          69 :       priority = _peas_plugin_info_get_priority (info, priv->plugin_priority);
+     126                 :             : 
+     127         [ +  + ]:          69 :       if (extension == NULL || priority < extension_priority)
+     128                 :             :         {
+     129                 :          68 :           extension = plugin->extension;
+     130                 :          68 :           extension_priority = priority;
+     131                 :             :         }
+     132                 :             :     }
+     133                 :             : 
+     134         [ +  - ]:          74 :   if (priv->preferred != extension)
+     135                 :             :     {
+     136                 :          74 :       VALENT_NOTE ("%s(): %s: %s", G_STRFUNC, G_OBJECT_TYPE_NAME (self),
+     137                 :             :                    extension ? G_OBJECT_TYPE_NAME (extension) : "No Adapter");
+     138                 :          74 :       priv->preferred = extension;
+     139                 :          74 :       VALENT_COMPONENT_GET_CLASS (self)->bind_preferred (self, priv->preferred);
+     140                 :             :     }
+     141                 :             : 
+     142                 :          74 :   VALENT_EXIT;
+     143                 :             : }
+     144                 :             : 
+     145                 :             : 
+     146                 :             : /*
+     147                 :             :  * GSettings Handlers
+     148                 :             :  */
+     149                 :             : static void
+     150                 :          19 : on_plugin_state_changed (ValentExtension *extension,
+     151                 :             :                          GParamSpec      *pspec,
+     152                 :             :                          ValentComponent *self)
+     153                 :             : {
+     154                 :          19 :   ValentPluginState state = VALENT_PLUGIN_STATE_ACTIVE;
+     155                 :          38 :   g_autoptr (GError) error = NULL;
+     156                 :             : 
+     157         [ +  - ]:          19 :   g_assert (VALENT_IS_EXTENSION (extension));
+     158         [ -  + ]:          19 :   g_assert (VALENT_IS_COMPONENT (self));
+     159                 :             : 
+     160                 :          19 :   state = valent_extension_plugin_state_check (extension, &error);
+     161                 :             : 
+     162         [ -  + ]:          19 :   if (state == VALENT_PLUGIN_STATE_ERROR)
+     163                 :           0 :     g_warning ("%s(): %s", G_OBJECT_TYPE_NAME (extension), error->message);
+     164                 :             : 
+     165         [ -  + ]:          19 :   valent_component_update_preferred (self);
+     166                 :          19 : }
+     167                 :             : 
+     168                 :             : static void
+     169                 :          18 : g_async_initable_init_async_cb (GObject      *object,
+     170                 :             :                                 GAsyncResult *result,
+     171                 :             :                                 gpointer      user_data)
+     172                 :             : {
+     173                 :          18 :   GAsyncInitable *initable = G_ASYNC_INITABLE (object);
+     174                 :          36 :   g_autoptr (GError) error = NULL;
+     175                 :             : 
+     176                 :          18 :   VALENT_ENTRY;
+     177                 :             : 
+     178   [ -  +  -  - ]:          18 :   if (!g_async_initable_init_finish (initable, result, &error) &&
+     179                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     180                 :             :     {
+     181                 :           0 :       g_warning ("%s initialization failed: %s",
+     182                 :             :                  G_OBJECT_TYPE_NAME (initable),
+     183                 :             :                  error->message);
+     184                 :             :     }
+     185                 :             : 
+     186         [ -  + ]:          18 :   VALENT_EXIT;
+     187                 :             : }
+     188                 :             : 
+     189                 :             : static void
+     190                 :          55 : valent_component_enable_plugin (ValentComponent *self,
+     191                 :             :                                 ValentPlugin    *plugin)
+     192                 :             : {
+     193                 :          55 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     194                 :             : 
+     195                 :          55 :   VALENT_ENTRY;
+     196                 :             : 
+     197         [ +  - ]:          55 :   g_assert (VALENT_IS_COMPONENT (self));
+     198         [ -  + ]:          55 :   g_assert (plugin != NULL);
+     199                 :             : 
+     200                 :          55 :   plugin->extension = peas_engine_create_extension (priv->engine,
+     201                 :             :                                                     plugin->info,
+     202                 :             :                                                     priv->plugin_type,
+     203                 :             :                                                     "object", self,
+     204                 :             :                                                     NULL);
+     205         [ -  + ]:          55 :   g_return_if_fail (G_IS_OBJECT (plugin->extension));
+     206                 :             : 
+     207                 :          55 :   VALENT_COMPONENT_GET_CLASS (self)->bind_extension (self, plugin->extension);
+     208                 :          55 :   valent_component_update_preferred (self);
+     209                 :             : 
+     210                 :             :   /* If the extension state changes, update the preferred adapter */
+     211                 :          55 :   g_signal_connect_object (plugin->extension,
+     212                 :             :                            "notify::plugin-state",
+     213                 :             :                            G_CALLBACK (on_plugin_state_changed),
+     214                 :             :                            self, 0);
+     215                 :             : 
+     216                 :             :   /* If the extension requires initialization, use a chained cancellable in case
+     217                 :             :    * the plugin is unloaded or the component is destroyed. */
+     218   [ +  -  +  -  :          55 :   if (G_IS_ASYNC_INITABLE (plugin->extension))
+             +  -  +  + ]
+     219                 :             :     {
+     220                 :          19 :       GAsyncInitable *initable = G_ASYNC_INITABLE (plugin->extension);
+     221                 :          74 :       g_autoptr (GCancellable) destroy = NULL;
+     222                 :             : 
+     223                 :          19 :       plugin->cancellable = g_cancellable_new ();
+     224                 :          19 :       destroy = valent_object_chain_cancellable (VALENT_OBJECT (self),
+     225                 :             :                                                  plugin->cancellable);
+     226                 :             : 
+     227         [ +  - ]:          19 :       g_async_initable_init_async (initable,
+     228                 :             :                                    G_PRIORITY_DEFAULT,
+     229                 :             :                                    destroy,
+     230                 :             :                                    g_async_initable_init_async_cb,
+     231                 :             :                                    NULL);
+     232                 :             :     }
+     233   [ +  -  +  -  :          36 :   else if (G_IS_INITABLE (plugin->extension))
+             +  -  -  + ]
+     234                 :             :     {
+     235                 :           0 :       GInitable *initable = G_INITABLE (plugin->extension);
+     236                 :           0 :       g_autoptr (GCancellable) destroy = NULL;
+     237         [ #  # ]:           0 :       g_autoptr (GError) error = NULL;
+     238                 :             : 
+     239                 :           0 :       plugin->cancellable = g_cancellable_new ();
+     240                 :           0 :       destroy = valent_object_chain_cancellable (VALENT_OBJECT (self),
+     241                 :             :                                                  plugin->cancellable);
+     242                 :             : 
+     243   [ #  #  #  # ]:           0 :       if (!g_initable_init (initable, destroy, &error) &&
+     244                 :           0 :           !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     245                 :             :         {
+     246                 :           0 :           g_warning ("%s initialization failed: %s",
+     247                 :             :                      G_OBJECT_TYPE_NAME (initable),
+     248                 :             :                      error->message);
+     249                 :             :         }
+     250                 :             :     }
+     251                 :             : 
+     252                 :          55 :   VALENT_EXIT;
+     253                 :             : }
+     254                 :             : 
+     255                 :             : static void
+     256                 :           0 : valent_component_disable_plugin (ValentComponent *self,
+     257                 :             :                                  ValentPlugin    *plugin)
+     258                 :             : {
+     259                 :           0 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     260                 :           0 :   g_autoptr (GObject) extension = NULL;
+     261                 :             : 
+     262         [ #  # ]:           0 :   g_assert (VALENT_IS_COMPONENT (self));
+     263         [ #  # ]:           0 :   g_assert (plugin != NULL);
+     264                 :             : 
+     265                 :             :   /* Ensure any in-progress initialization is cancelled */
+     266                 :           0 :   g_cancellable_cancel (plugin->cancellable);
+     267         [ #  # ]:           0 :   g_clear_object (&plugin->cancellable);
+     268                 :             : 
+     269                 :             :   /* Steal the object and reset the preferred adapter */
+     270         [ #  # ]:           0 :   extension = g_steal_pointer (&plugin->extension);
+     271   [ #  #  #  # ]:           0 :   g_return_if_fail (G_IS_OBJECT (extension));
+     272                 :             : 
+     273         [ #  # ]:           0 :   if (priv->preferred == extension)
+     274                 :           0 :     valent_component_update_preferred (self);
+     275                 :             : 
+     276         [ #  # ]:           0 :   VALENT_COMPONENT_GET_CLASS (self)->unbind_extension (self, extension);
+     277                 :             : }
+     278                 :             : 
+     279                 :             : static void
+     280                 :           0 : on_plugin_enabled_changed (ValentPlugin *plugin)
+     281                 :             : {
+     282         [ #  # ]:           0 :   g_assert (plugin != NULL);
+     283         [ #  # ]:           0 :   g_assert (VALENT_IS_COMPONENT (plugin->parent));
+     284                 :             : 
+     285         [ #  # ]:           0 :   if (valent_plugin_get_enabled (plugin))
+     286                 :           0 :     valent_component_enable_plugin (plugin->parent, plugin);
+     287                 :             :   else
+     288                 :           0 :     valent_component_disable_plugin (plugin->parent, plugin);
+     289                 :           0 : }
+     290                 :             : 
+     291                 :             : /*
+     292                 :             :  * PeasEngine Callbacks
+     293                 :             :  */
+     294                 :             : static void
+     295                 :         237 : on_load_plugin (PeasEngine      *engine,
+     296                 :             :                 PeasPluginInfo  *info,
+     297                 :             :                 ValentComponent *self)
+     298                 :             : {
+     299                 :         237 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     300                 :         237 :   ValentPlugin *plugin;
+     301                 :             : 
+     302                 :         237 :   VALENT_ENTRY;
+     303                 :             : 
+     304         [ +  - ]:         237 :   g_assert (PEAS_IS_ENGINE (engine));
+     305         [ -  + ]:         237 :   g_assert (info != NULL);
+     306         [ -  + ]:         237 :   g_assert (VALENT_IS_COMPONENT (self));
+     307                 :             : 
+     308                 :             :   /* We're only interested in one GType */
+     309         [ +  + ]:         237 :   if (!peas_engine_provides_extension (engine, info, priv->plugin_type))
+     310                 :          62 :     VALENT_EXIT;
+     311                 :             : 
+     312                 :          62 :   VALENT_NOTE ("%s: %s",
+     313                 :             :                g_type_name (priv->plugin_type),
+     314                 :             :                peas_plugin_info_get_module_name (info));
+     315                 :             : 
+     316                 :          62 :   plugin = valent_plugin_new (self, priv->context, info,
+     317                 :             :                               G_CALLBACK (on_plugin_enabled_changed));
+     318                 :          62 :   g_hash_table_insert (priv->plugins, info, plugin);
+     319                 :             : 
+     320         [ +  + ]:          62 :   if (valent_plugin_get_enabled (plugin))
+     321                 :          55 :     valent_component_enable_plugin (self, plugin);
+     322                 :             : 
+     323                 :         237 :   VALENT_EXIT;
+     324                 :             : }
+     325                 :             : 
+     326                 :             : static void
+     327                 :           0 : on_unload_plugin (PeasEngine      *engine,
+     328                 :             :                   PeasPluginInfo  *info,
+     329                 :             :                   ValentComponent *self)
+     330                 :             : {
+     331                 :           0 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     332                 :             : 
+     333                 :           0 :   VALENT_ENTRY;
+     334                 :             : 
+     335         [ #  # ]:           0 :   g_assert (PEAS_IS_ENGINE (engine));
+     336         [ #  # ]:           0 :   g_assert (info != NULL);
+     337         [ #  # ]:           0 :   g_assert (VALENT_IS_COMPONENT (self));
+     338                 :             : 
+     339                 :             :   /* We're only interested in one GType */
+     340         [ #  # ]:           0 :   if (!peas_engine_provides_extension (engine, info, priv->plugin_type))
+     341                 :           0 :     VALENT_EXIT;
+     342                 :             : 
+     343                 :           0 :   VALENT_NOTE ("%s: %s",
+     344                 :             :                g_type_name (priv->plugin_type),
+     345                 :             :                peas_plugin_info_get_module_name (info));
+     346                 :             : 
+     347                 :           0 :   g_hash_table_remove (priv->plugins, info);
+     348                 :             : 
+     349                 :           0 :   VALENT_EXIT;
+     350                 :             : }
+     351                 :             : 
+     352                 :             : /* LCOV_EXCL_START */
+     353                 :             : static void
+     354                 :             : valent_component_real_bind_preferred (ValentComponent *component,
+     355                 :             :                                       GObject         *extension)
+     356                 :             : {
+     357                 :             :   g_assert (VALENT_IS_COMPONENT (component));
+     358                 :             :   g_assert (extension == NULL || G_IS_OBJECT (extension));
+     359                 :             : }
+     360                 :             : 
+     361                 :             : static void
+     362                 :             : valent_component_real_bind_extension (ValentComponent *component,
+     363                 :             :                                       GObject         *extension)
+     364                 :             : {
+     365                 :             :   g_assert (VALENT_IS_COMPONENT (component));
+     366                 :             :   g_assert (G_IS_OBJECT (extension));
+     367                 :             : }
+     368                 :             : 
+     369                 :             : static void
+     370                 :             : valent_component_real_unbind_extension (ValentComponent *component,
+     371                 :             :                                         GObject         *extension)
+     372                 :             : {
+     373                 :             :   g_assert (VALENT_IS_COMPONENT (component));
+     374                 :             :   g_assert (G_IS_OBJECT (extension));
+     375                 :             : }
+     376                 :             : /* LCOV_EXCL_STOP */
+     377                 :             : 
+     378                 :             : /*< private >
+     379                 :             :  * valent_component_get_preferred:
+     380                 :             :  * @self: a `ValentComponent`
+     381                 :             :  *
+     382                 :             :  * Get the extension with the highest priority for @self.
+     383                 :             :  *
+     384                 :             :  * The default value for extensions is `0`; the lower the value the higher the
+     385                 :             :  * priority.
+     386                 :             :  *
+     387                 :             :  * Returns: (transfer none) (nullable): a `GObject`
+     388                 :             :  */
+     389                 :             : GObject *
+     390                 :          27 : valent_component_get_preferred (ValentComponent *self)
+     391                 :             : {
+     392                 :          27 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     393                 :             : 
+     394         [ +  - ]:          27 :   g_assert (VALENT_IS_COMPONENT (self));
+     395                 :             : 
+     396                 :          27 :   return priv->preferred;
+     397                 :             : }
+     398                 :             : 
+     399                 :             : /*
+     400                 :             :  * ValentObject
+     401                 :             :  */
+     402                 :             : static void
+     403                 :          33 : valent_component_destroy (ValentObject *object)
+     404                 :             : {
+     405                 :          33 :   ValentComponent *self = VALENT_COMPONENT (object);
+     406                 :          33 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     407                 :             : 
+     408                 :          33 :   g_signal_handlers_disconnect_by_func (priv->engine, on_load_plugin, self);
+     409                 :          33 :   g_signal_handlers_disconnect_by_func (priv->engine, on_unload_plugin, self);
+     410                 :          33 :   g_hash_table_remove_all (priv->plugins);
+     411                 :             : 
+     412                 :          33 :   VALENT_OBJECT_CLASS (valent_component_parent_class)->destroy (object);
+     413                 :          33 : }
+     414                 :             : 
+     415                 :             : /*
+     416                 :             :  * GObject
+     417                 :             :  */
+     418                 :             : static void
+     419                 :          51 : valent_component_constructed (GObject *object)
+     420                 :             : {
+     421                 :          51 :   ValentComponent *self = VALENT_COMPONENT (object);
+     422                 :          51 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     423                 :          51 :   unsigned int n_plugins = 0;
+     424                 :             : 
+     425         [ +  - ]:          51 :   g_assert (priv->plugin_domain != NULL);
+     426         [ -  + ]:          51 :   g_assert (priv->plugin_type != G_TYPE_NONE);
+     427                 :             : 
+     428                 :          51 :   priv->context = valent_context_new (NULL, priv->plugin_domain, NULL);
+     429                 :             : 
+     430                 :             :   /* Infer the priority key */
+     431         [ +  - ]:          51 :   if (g_type_name (priv->plugin_type) != NULL)
+     432                 :             :     {
+     433                 :          51 :       const char *type_name = g_type_name (priv->plugin_type);
+     434                 :             : 
+     435   [ +  -  +  -  :          51 :       if (g_str_has_prefix (type_name, "Valent"))
+                   +  - ]
+     436                 :          51 :         priv->plugin_priority = g_strdup_printf ("X-%sPriority", &type_name[6]);
+     437                 :             :       else
+     438                 :           0 :         priv->plugin_priority = g_strdup_printf ("X-%sPriority", type_name);
+     439                 :             :     }
+     440                 :             : 
+     441                 :             :   /* Setup PeasEngine */
+     442                 :          51 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (priv->engine));
+     443                 :             : 
+     444         [ +  + ]:         288 :   for (unsigned int i = 0; i < n_plugins; i++)
+     445                 :             :     {
+     446                 :         237 :       g_autoptr (PeasPluginInfo) info = NULL;
+     447                 :             : 
+     448                 :         237 :       info = g_list_model_get_item (G_LIST_MODEL (priv->engine), i);
+     449                 :             : 
+     450         [ +  - ]:         237 :       if (peas_plugin_info_is_loaded (info))
+     451                 :         237 :         on_load_plugin (priv->engine, info, self);
+     452                 :             :     }
+     453                 :             : 
+     454                 :          51 :   g_signal_connect_object (priv->engine,
+     455                 :             :                            "load-plugin",
+     456                 :             :                            G_CALLBACK (on_load_plugin),
+     457                 :             :                            self,
+     458                 :             :                            G_CONNECT_AFTER);
+     459                 :             : 
+     460                 :          51 :   g_signal_connect_object (priv->engine,
+     461                 :             :                            "unload-plugin",
+     462                 :             :                            G_CALLBACK (on_unload_plugin),
+     463                 :             :                            self,
+     464                 :             :                            0);
+     465                 :             : 
+     466                 :          51 :   G_OBJECT_CLASS (valent_component_parent_class)->constructed (object);
+     467                 :          51 : }
+     468                 :             : 
+     469                 :             : static void
+     470                 :          33 : valent_component_finalize (GObject *object)
+     471                 :             : {
+     472                 :          33 :   ValentComponent *self = VALENT_COMPONENT (object);
+     473                 :          33 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     474                 :             : 
+     475         [ +  - ]:          33 :   g_clear_pointer (&priv->plugin_domain, g_free);
+     476         [ +  - ]:          33 :   g_clear_pointer (&priv->plugin_priority, g_free);
+     477         [ +  - ]:          33 :   g_clear_pointer (&priv->plugins, g_hash_table_unref);
+     478         [ +  - ]:          33 :   g_clear_object (&priv->context);
+     479                 :             : 
+     480                 :          33 :   G_OBJECT_CLASS (valent_component_parent_class)->finalize (object);
+     481                 :          33 : }
+     482                 :             : 
+     483                 :             : static void
+     484                 :           0 : valent_component_get_property (GObject    *object,
+     485                 :             :                                guint       prop_id,
+     486                 :             :                                GValue     *value,
+     487                 :             :                                GParamSpec *pspec)
+     488                 :             : {
+     489                 :           0 :   ValentComponent *self = VALENT_COMPONENT (object);
+     490                 :           0 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     491                 :             : 
+     492      [ #  #  # ]:           0 :   switch (prop_id)
+     493                 :             :     {
+     494                 :           0 :     case PROP_PLUGIN_DOMAIN:
+     495                 :           0 :       g_value_set_string (value, priv->plugin_domain);
+     496                 :           0 :       break;
+     497                 :             : 
+     498                 :           0 :     case PROP_PLUGIN_TYPE:
+     499                 :           0 :       g_value_set_gtype (value, priv->plugin_type);
+     500                 :           0 :       break;
+     501                 :             : 
+     502                 :           0 :     default:
+     503                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     504                 :             :     }
+     505                 :           0 : }
+     506                 :             : 
+     507                 :             : static void
+     508                 :         102 : valent_component_set_property (GObject      *object,
+     509                 :             :                                guint         prop_id,
+     510                 :             :                                const GValue *value,
+     511                 :             :                                GParamSpec   *pspec)
+     512                 :             : {
+     513                 :         102 :   ValentComponent *self = VALENT_COMPONENT (object);
+     514                 :         102 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     515                 :             : 
+     516      [ +  +  - ]:         102 :   switch (prop_id)
+     517                 :             :     {
+     518                 :          51 :     case PROP_PLUGIN_DOMAIN:
+     519                 :          51 :       priv->plugin_domain = g_value_dup_string (value);
+     520                 :          51 :       break;
+     521                 :             : 
+     522                 :          51 :     case PROP_PLUGIN_TYPE:
+     523                 :          51 :       priv->plugin_type = g_value_get_gtype (value);
+     524                 :          51 :       break;
+     525                 :             : 
+     526                 :           0 :     default:
+     527                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     528                 :             :     }
+     529                 :         102 : }
+     530                 :             : 
+     531                 :             : static void
+     532                 :          32 : valent_component_class_init (ValentComponentClass *klass)
+     533                 :             : {
+     534                 :          32 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     535                 :          32 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     536                 :             : 
+     537                 :          32 :   object_class->constructed = valent_component_constructed;
+     538                 :          32 :   object_class->finalize = valent_component_finalize;
+     539                 :          32 :   object_class->get_property = valent_component_get_property;
+     540                 :          32 :   object_class->set_property = valent_component_set_property;
+     541                 :             : 
+     542                 :          32 :   vobject_class->destroy = valent_component_destroy;
+     543                 :             : 
+     544                 :          32 :   klass->bind_extension = valent_component_real_bind_extension;
+     545                 :          32 :   klass->unbind_extension = valent_component_real_unbind_extension;
+     546                 :          32 :   klass->bind_preferred = valent_component_real_bind_preferred;
+     547                 :             : 
+     548                 :             :   /**
+     549                 :             :    * ValentComponent:plugin-context:
+     550                 :             :    *
+     551                 :             :    * The domain of the component.
+     552                 :             :    *
+     553                 :             :    * This is a `GSettings` safe string such as "contacts" or "media", used to
+     554                 :             :    * structure settings and files of components and their extensions.
+     555                 :             :    *
+     556                 :             :    * Since: 1.0
+     557                 :             :    */
+     558                 :          64 :   properties [PROP_PLUGIN_DOMAIN] =
+     559                 :          32 :     g_param_spec_string ("plugin-domain", NULL, NULL,
+     560                 :             :                          NULL,
+     561                 :             :                          (G_PARAM_READWRITE |
+     562                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     563                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     564                 :             :                           G_PARAM_STATIC_STRINGS));
+     565                 :             : 
+     566                 :             :   /**
+     567                 :             :    * ValentComponent:plugin-type:
+     568                 :             :    *
+     569                 :             :    * The extension point [alias@GObject.Type].
+     570                 :             :    *
+     571                 :             :    * Since: 1.0
+     572                 :             :    */
+     573                 :          64 :   properties [PROP_PLUGIN_TYPE] =
+     574                 :          32 :     g_param_spec_gtype ("plugin-type", NULL, NULL,
+     575                 :             :                         G_TYPE_NONE,
+     576                 :             :                         (G_PARAM_READWRITE |
+     577                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     578                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     579                 :             :                          G_PARAM_STATIC_STRINGS));
+     580                 :             : 
+     581                 :          32 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     582                 :          32 : }
+     583                 :             : 
+     584                 :             : static void
+     585                 :          51 : valent_component_init (ValentComponent *self)
+     586                 :             : {
+     587                 :          51 :   ValentComponentPrivate *priv = valent_component_get_instance_private (self);
+     588                 :             : 
+     589                 :          51 :   priv->engine = valent_get_plugin_engine ();
+     590                 :          51 :   priv->plugins = g_hash_table_new_full (NULL, NULL, NULL, component_plugin_free);
+     591                 :          51 : }
+     592                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component.h.func-c.html b/coverage/src/libvalent/core/valent-component.h.func-c.html new file mode 100644 index 00000000000..32bf8249a34 --- /dev/null +++ b/coverage/src/libvalent/core/valent-component.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_COMPONENT528
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component.h.func.html b/coverage/src/libvalent/core/valent-component.h.func.html new file mode 100644 index 00000000000..3736f94b0da --- /dev/null +++ b/coverage/src/libvalent/core/valent-component.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_COMPONENT528
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-component.h.gcov.html b/coverage/src/libvalent/core/valent-component.h.gcov.html new file mode 100644 index 00000000000..cdad0603d35 --- /dev/null +++ b/coverage/src/libvalent/core/valent-component.h.gcov.html @@ -0,0 +1,132 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-component.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-component.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <libpeas.h>
+      12                 :             : 
+      13                 :             : #include "valent-object.h"
+      14                 :             : 
+      15                 :             : G_BEGIN_DECLS
+      16                 :             : 
+      17                 :             : #define VALENT_TYPE_COMPONENT (valent_component_get_type())
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20   [ +  -  +  -  :         693 : G_DECLARE_DERIVABLE_TYPE (ValentComponent, valent_component, VALENT, COMPONENT, ValentObject)
+             +  -  +  - ]
+      21                 :             : 
+      22                 :             : struct _ValentComponentClass
+      23                 :             : {
+      24                 :             :   ValentObjectClass   parent_class;
+      25                 :             : 
+      26                 :             :   /* virtual functions */
+      27                 :             :   void                (*bind_extension)   (ValentComponent *component,
+      28                 :             :                                            GObject         *extension);
+      29                 :             :   void                (*unbind_extension) (ValentComponent *component,
+      30                 :             :                                            GObject         *extension);
+      31                 :             :   void                (*bind_preferred)   (ValentComponent *component,
+      32                 :             :                                            GObject         *extension);
+      33                 :             : 
+      34                 :             :   /*< private >*/
+      35                 :             :   gpointer            padding[8];
+      36                 :             : };
+      37                 :             : 
+      38                 :             : G_END_DECLS
+      39                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-context.c.func-c.html b/coverage/src/libvalent/core/valent-context.c.func-c.html new file mode 100644 index 00000000000..5cf7bec9ace --- /dev/null +++ b/coverage/src/libvalent/core/valent-context.c.func-c.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-context.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-context.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:76.9 %199153
Test Date:2024-03-31 18:46:36Functions:92.0 %2523
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:47.5 %16076
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_context_get_property0
valent_context_get_root0
valent_context_clear_cache1
valent_context_get_data_file1
valent_context_get_domain1
valent_context_get_parent1
valent_context_get_id2
valent_context_clear7
remove_directory15
valent_context_get_config_file20
valent_context_get_cache_file55
valent_context_class_init67
ensure_directory76
valent_context_get_plugin_settings111
valent_context_new257
valent_context_create_settings324
valent_context_get_plugin_context407
valent_context_get_path434
valent_context_finalize626
valent_context_constructed677
valent_context_init677
valent_context_set_property2031
valent_context_get_type2803
valent_context_class_intern_init67
valent_context_get_type_once86
valent_context_get_type2650
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-context.c.func.html b/coverage/src/libvalent/core/valent-context.c.func.html new file mode 100644 index 00000000000..4801eef9e27 --- /dev/null +++ b/coverage/src/libvalent/core/valent-context.c.func.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-context.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-context.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:76.9 %199153
Test Date:2024-03-31 18:46:36Functions:92.0 %2523
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:47.5 %16076
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ensure_directory76
remove_directory15
valent_context_class_init67
valent_context_clear7
valent_context_clear_cache1
valent_context_constructed677
valent_context_create_settings324
valent_context_finalize626
valent_context_get_cache_file55
valent_context_get_config_file20
valent_context_get_data_file1
valent_context_get_domain1
valent_context_get_id2
valent_context_get_parent1
valent_context_get_path434
valent_context_get_plugin_context407
valent_context_get_plugin_settings111
valent_context_get_property0
valent_context_get_root0
valent_context_get_type2803
valent_context_class_intern_init67
valent_context_get_type2650
valent_context_get_type_once86
valent_context_init677
valent_context_new257
valent_context_set_property2031
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-context.c.gcov.html b/coverage/src/libvalent/core/valent-context.c.gcov.html new file mode 100644 index 00000000000..c4dd6b616a3 --- /dev/null +++ b/coverage/src/libvalent/core/valent-context.c.gcov.html @@ -0,0 +1,806 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-context.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-context.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:76.9 %199153
Test Date:2024-03-31 18:46:36Functions:92.0 %2523
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:47.5 %16076
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-context"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : 
+      11                 :             : #include "valent-context.h"
+      12                 :             : #include "valent-debug.h"
+      13                 :             : #include "valent-macros.h"
+      14                 :             : #include "valent-object.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentContext:
+      19                 :             :  *
+      20                 :             :  * A class representing a abstract data context.
+      21                 :             :  *
+      22                 :             :  * `ValentContext` is an abstraction of a data context, with a loose hierarchy
+      23                 :             :  * expressed as a virtual path (e.g. `device/0123456789abcdef/plugin/battery`).
+      24                 :             :  * It can be used to coordinate persistent data of various types by mapping onto
+      25                 :             :  * existing hierarchies like [class@Gio.Settings] (i.e. relocatable schemas),
+      26                 :             :  * on-disk caches and configuration files (i.e. XDG data dirs) and user files
+      27                 :             :  * (i.e. XDG user dirs).
+      28                 :             :  *
+      29                 :             :  * Since: 1.0
+      30                 :             :  */
+      31                 :             : 
+      32                 :             : typedef struct
+      33                 :             : {
+      34                 :             :   ValentContext *parent;
+      35                 :             : 
+      36                 :             :   char          *domain;
+      37                 :             :   char          *id;
+      38                 :             :   char          *path;
+      39                 :             : 
+      40                 :             :   GFile         *cache;
+      41                 :             :   GFile         *config;
+      42                 :             :   GFile         *data;
+      43                 :             : } ValentContextPrivate;
+      44                 :             : 
+      45   [ +  +  +  - ]:        7094 : G_DEFINE_TYPE_WITH_PRIVATE (ValentContext, valent_context, VALENT_TYPE_OBJECT)
+      46                 :             : 
+      47                 :             : /**
+      48                 :             :  * ValentContextClass:
+      49                 :             :  *
+      50                 :             :  * The virtual function table for `ValentContext`.
+      51                 :             :  */
+      52                 :             : 
+      53                 :             : enum {
+      54                 :             :   PROP_0,
+      55                 :             :   PROP_DOMAIN,
+      56                 :             :   PROP_ID,
+      57                 :             :   PROP_PARENT,
+      58                 :             :   N_PROPERTIES
+      59                 :             : };
+      60                 :             : 
+      61                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      62                 :             : 
+      63                 :             : 
+      64                 :             : static inline gboolean
+      65                 :          76 : ensure_directory (GFile *dir)
+      66                 :             : {
+      67   [ +  -  +  -  :          76 :   g_assert (G_IS_FILE (dir));
+             +  -  -  + ]
+      68                 :             : 
+      69         [ -  + ]:          76 :   if (g_mkdir_with_parents (g_file_peek_path (dir), 0700) == -1)
+      70                 :             :     {
+      71                 :           0 :       VALENT_NOTE ("Failed to create \"%s\": %s",
+      72                 :             :                    g_file_peek_path (dir),
+      73                 :             :                    g_strerror (errno));
+      74                 :           0 :       return FALSE;
+      75                 :             :     }
+      76                 :             : 
+      77                 :             :   return TRUE;
+      78                 :             : }
+      79                 :             : 
+      80                 :             : static gboolean
+      81                 :          15 : remove_directory (GFile         *file,
+      82                 :             :                   GCancellable  *cancellable,
+      83                 :             :                   GError       **error)
+      84                 :             : {
+      85                 :          30 :   g_autoptr (GFileEnumerator) iter = NULL;
+      86                 :             : 
+      87   [ +  -  +  -  :          15 :   g_assert (G_IS_FILE (file));
+             +  -  -  + ]
+      88   [ -  +  -  -  :          15 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+      89   [ +  -  -  + ]:          15 :   g_assert (error == NULL || *error == NULL);
+      90                 :             : 
+      91                 :          15 :   iter = g_file_enumerate_children (file,
+      92                 :             :                                     G_FILE_ATTRIBUTE_STANDARD_NAME,
+      93                 :             :                                     G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+      94                 :             :                                     cancellable,
+      95                 :             :                                     NULL);
+      96                 :             : 
+      97         [ +  + ]:          15 :   while (iter != NULL)
+      98                 :             :     {
+      99                 :           3 :       GFile *child;
+     100                 :             : 
+     101         [ +  - ]:           3 :       if (!g_file_enumerator_iterate (iter, NULL, &child, cancellable, error))
+     102                 :           0 :         return FALSE;
+     103                 :             : 
+     104         [ -  + ]:           3 :       if (child == NULL)
+     105                 :             :         break;
+     106                 :             : 
+     107         [ #  # ]:           0 :       if (!remove_directory (child, cancellable, error))
+     108                 :             :         return FALSE;
+     109                 :             :     }
+     110                 :             : 
+     111                 :          15 :   return g_file_delete (file, cancellable, error);
+     112                 :             : }
+     113                 :             : 
+     114                 :             : /*
+     115                 :             :  * GObject
+     116                 :             :  */
+     117                 :             : static void
+     118                 :         677 : valent_context_constructed (GObject *object)
+     119                 :             : {
+     120                 :         677 :   ValentContext *self = VALENT_CONTEXT (object);
+     121                 :         677 :   ValentContextPrivate *priv = valent_context_get_instance_private (self);
+     122                 :             : 
+     123         [ +  + ]:         677 :   if (priv->parent != NULL)
+     124                 :             :     {
+     125                 :         434 :       const char *base_path;
+     126                 :             : 
+     127                 :         434 :       base_path = valent_context_get_path (priv->parent);
+     128                 :         434 :       priv->path = g_build_filename (base_path, priv->domain, priv->id, NULL);
+     129                 :             :     }
+     130                 :             :   else
+     131                 :             :     {
+     132                 :         243 :       priv->path = g_build_filename (priv->domain, priv->id, NULL);
+     133                 :             :     }
+     134                 :             : 
+     135                 :         677 :   priv->cache = g_file_new_build_filename (g_get_user_cache_dir (),
+     136                 :             :                                            PACKAGE_NAME,
+     137                 :             :                                            priv->path,
+     138                 :             :                                            NULL);
+     139                 :         677 :   priv->config = g_file_new_build_filename (g_get_user_config_dir (),
+     140                 :             :                                             PACKAGE_NAME,
+     141                 :             :                                             priv->path,
+     142                 :             :                                             NULL);
+     143                 :         677 :   priv->data = g_file_new_build_filename (g_get_user_data_dir (),
+     144                 :             :                                           PACKAGE_NAME,
+     145                 :             :                                           priv->path,
+     146                 :             :                                           NULL);
+     147                 :             : 
+     148                 :         677 :   G_OBJECT_CLASS (valent_context_parent_class)->constructed (object);
+     149                 :         677 : }
+     150                 :             : 
+     151                 :             : static void
+     152                 :         626 : valent_context_finalize (GObject *object)
+     153                 :             : {
+     154                 :         626 :   ValentContext *self = VALENT_CONTEXT (object);
+     155                 :         626 :   ValentContextPrivate *priv = valent_context_get_instance_private (self);
+     156                 :             : 
+     157         [ +  - ]:         626 :   g_clear_object (&priv->cache);
+     158         [ +  - ]:         626 :   g_clear_object (&priv->config);
+     159         [ +  - ]:         626 :   g_clear_object (&priv->data);
+     160         [ +  - ]:         626 :   g_clear_pointer (&priv->path, g_free);
+     161         [ +  + ]:         626 :   g_clear_pointer (&priv->domain, g_free);
+     162         [ +  + ]:         626 :   g_clear_pointer (&priv->id, g_free);
+     163                 :             : 
+     164                 :         626 :   G_OBJECT_CLASS (valent_context_parent_class)->finalize (object);
+     165                 :         626 : }
+     166                 :             : 
+     167                 :             : static void
+     168                 :           0 : valent_context_get_property (GObject    *object,
+     169                 :             :                              guint       prop_id,
+     170                 :             :                              GValue     *value,
+     171                 :             :                              GParamSpec *pspec)
+     172                 :             : {
+     173                 :           0 :   ValentContext *self = VALENT_CONTEXT (object);
+     174                 :             : 
+     175   [ #  #  #  # ]:           0 :   switch (prop_id)
+     176                 :             :     {
+     177                 :           0 :     case PROP_DOMAIN:
+     178                 :           0 :       g_value_set_string (value, valent_context_get_domain (self));
+     179                 :           0 :       break;
+     180                 :             : 
+     181                 :           0 :     case PROP_ID:
+     182                 :           0 :       g_value_set_string (value, valent_context_get_id (self));
+     183                 :           0 :       break;
+     184                 :             : 
+     185                 :           0 :     case PROP_PARENT:
+     186                 :           0 :       g_value_set_object (value, valent_context_get_parent (self));
+     187                 :           0 :       break;
+     188                 :             : 
+     189                 :           0 :     default:
+     190                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     191                 :             :     }
+     192                 :           0 : }
+     193                 :             : 
+     194                 :             : static void
+     195                 :        2031 : valent_context_set_property (GObject      *object,
+     196                 :             :                              guint         prop_id,
+     197                 :             :                              const GValue *value,
+     198                 :             :                              GParamSpec   *pspec)
+     199                 :             : {
+     200                 :        2031 :   ValentContext *self = VALENT_CONTEXT (object);
+     201                 :        2031 :   ValentContextPrivate *priv = valent_context_get_instance_private (self);
+     202                 :             : 
+     203   [ +  +  +  - ]:        2031 :   switch (prop_id)
+     204                 :             :     {
+     205                 :         677 :     case PROP_DOMAIN:
+     206                 :         677 :       priv->domain = g_value_dup_string (value);
+     207                 :         677 :       break;
+     208                 :             : 
+     209                 :         677 :     case PROP_ID:
+     210                 :         677 :       priv->id = g_value_dup_string (value);
+     211                 :         677 :       break;
+     212                 :             : 
+     213                 :         677 :     case PROP_PARENT:
+     214                 :         677 :       priv->parent = g_value_get_object (value);
+     215                 :         677 :       break;
+     216                 :             : 
+     217                 :           0 :     default:
+     218                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     219                 :             :     }
+     220                 :        2031 : }
+     221                 :             : 
+     222                 :             : static void
+     223                 :          67 : valent_context_class_init (ValentContextClass *klass)
+     224                 :             : {
+     225                 :          67 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     226                 :             : 
+     227                 :          67 :   object_class->constructed = valent_context_constructed;
+     228                 :          67 :   object_class->finalize = valent_context_finalize;
+     229                 :          67 :   object_class->get_property = valent_context_get_property;
+     230                 :          67 :   object_class->set_property = valent_context_set_property;
+     231                 :             : 
+     232                 :             :   /**
+     233                 :             :    * ValentContext:domain: (getter get_domain)
+     234                 :             :    *
+     235                 :             :    * The domain for this context.
+     236                 :             :    *
+     237                 :             :    * Since: 1.0
+     238                 :             :    */
+     239                 :         134 :   properties [PROP_DOMAIN] =
+     240                 :          67 :     g_param_spec_string ("domain", NULL, NULL,
+     241                 :             :                          NULL,
+     242                 :             :                          (G_PARAM_READWRITE |
+     243                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     244                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     245                 :             :                           G_PARAM_STATIC_STRINGS));
+     246                 :             : 
+     247                 :             :   /**
+     248                 :             :    * ValentContext:id: (getter get_id)
+     249                 :             :    *
+     250                 :             :    * The ID for this context.
+     251                 :             :    *
+     252                 :             :    * Since: 1.0
+     253                 :             :    */
+     254                 :         134 :   properties [PROP_ID] =
+     255                 :          67 :     g_param_spec_string ("id", NULL, NULL,
+     256                 :             :                          NULL,
+     257                 :             :                          (G_PARAM_READWRITE |
+     258                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     259                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     260                 :             :                           G_PARAM_STATIC_STRINGS));
+     261                 :             : 
+     262                 :             :   /**
+     263                 :             :    * ValentContext:parent: (getter get_parent)
+     264                 :             :    *
+     265                 :             :    * The parent context.
+     266                 :             :    *
+     267                 :             :    * Since: 1.0
+     268                 :             :    */
+     269                 :         134 :   properties [PROP_PARENT] =
+     270                 :          67 :     g_param_spec_object ("parent", NULL, NULL,
+     271                 :             :                          VALENT_TYPE_CONTEXT,
+     272                 :             :                          (G_PARAM_READWRITE |
+     273                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     274                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     275                 :             :                           G_PARAM_STATIC_STRINGS));
+     276                 :             : 
+     277                 :          67 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     278                 :          67 : }
+     279                 :             : 
+     280                 :             : static void
+     281                 :         677 : valent_context_init (ValentContext *self)
+     282                 :             : {
+     283                 :         677 : }
+     284                 :             : 
+     285                 :             : /**
+     286                 :             :  * valent_context_new:
+     287                 :             :  * @parent: (nullable): a parent context
+     288                 :             :  * @domain: (nullable): a domain
+     289                 :             :  * @id: (nullable): a unique identifier
+     290                 :             :  *
+     291                 :             :  * Create a new `ValentContext`.
+     292                 :             :  *
+     293                 :             :  * If given, @parent will be taken into consideration when building paths.
+     294                 :             :  *
+     295                 :             :  * If given, @domain should be an identifier describing the scope of the
+     296                 :             :  * contexts that will share it.
+     297                 :             :  *
+     298                 :             :  * If given, @id should be an identifier that is at least unique to @domain,
+     299                 :             :  * even if @domain is %NULL.
+     300                 :             :  *
+     301                 :             :  * Returns: (transfer full): a new `ValentContext`.
+     302                 :             :  *
+     303                 :             :  * Since: 1.0
+     304                 :             :  */
+     305                 :             : ValentContext *
+     306                 :         257 : valent_context_new (ValentContext *parent,
+     307                 :             :                     const char    *domain,
+     308                 :             :                     const char    *id)
+     309                 :             : {
+     310                 :         257 :   return g_object_new (VALENT_TYPE_CONTEXT,
+     311                 :             :                        "domain", domain,
+     312                 :             :                        "id",     id,
+     313                 :             :                        "parent", parent,
+     314                 :             :                        NULL);
+     315                 :             : }
+     316                 :             : 
+     317                 :             : /**
+     318                 :             :  * valent_context_get_domain: (get-property domain)
+     319                 :             :  * @context: a `ValentContext`
+     320                 :             :  *
+     321                 :             :  * Get the context domain.
+     322                 :             :  *
+     323                 :             :  * Returns: (transfer none): the context domain
+     324                 :             :  *
+     325                 :             :  * Since: 1.0
+     326                 :             :  */
+     327                 :             : const char *
+     328                 :           1 : valent_context_get_domain (ValentContext *context)
+     329                 :             : {
+     330                 :           1 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     331                 :             : 
+     332         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     333                 :             : 
+     334                 :           1 :   return priv->domain;
+     335                 :             : }
+     336                 :             : 
+     337                 :             : /**
+     338                 :             :  * valent_context_get_id: (get-property id)
+     339                 :             :  * @context: a `ValentContext`
+     340                 :             :  *
+     341                 :             :  * Get the context ID.
+     342                 :             :  *
+     343                 :             :  * Returns: (transfer none): the context ID
+     344                 :             :  *
+     345                 :             :  * Since: 1.0
+     346                 :             :  */
+     347                 :             : const char *
+     348                 :           2 : valent_context_get_id (ValentContext *context)
+     349                 :             : {
+     350                 :           2 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     351                 :             : 
+     352         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     353                 :             : 
+     354                 :           2 :   return priv->id;
+     355                 :             : }
+     356                 :             : 
+     357                 :             : /**
+     358                 :             :  * valent_context_get_parent: (get-property parent)
+     359                 :             :  * @context: a `ValentContext`
+     360                 :             :  *
+     361                 :             :  * Get the parent context.
+     362                 :             :  *
+     363                 :             :  * Returns: (transfer none) (nullable): a `ValentContext`
+     364                 :             :  */
+     365                 :             : ValentContext *
+     366                 :           1 : valent_context_get_parent (ValentContext *context)
+     367                 :             : {
+     368                 :           1 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     369                 :             : 
+     370         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     371                 :             : 
+     372                 :           1 :   return priv->parent;
+     373                 :             : }
+     374                 :             : 
+     375                 :             : /**
+     376                 :             :  * valent_context_get_path:
+     377                 :             :  * @context: a `ValentContext`
+     378                 :             :  *
+     379                 :             :  * Get the virtual path.
+     380                 :             :  *
+     381                 :             :  * Returns: (transfer none): a relative path
+     382                 :             :  *
+     383                 :             :  * Since: 1.0
+     384                 :             :  */
+     385                 :             : const char *
+     386                 :         434 : valent_context_get_path (ValentContext *context)
+     387                 :             : {
+     388                 :         434 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     389                 :             : 
+     390         [ +  - ]:         434 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     391                 :             : 
+     392                 :         434 :   return priv->path;
+     393                 :             : }
+     394                 :             : 
+     395                 :             : /**
+     396                 :             :  * valent_context_clear_cache:
+     397                 :             :  * @context: a `ValentContext`
+     398                 :             :  *
+     399                 :             :  * Clear cache data.
+     400                 :             :  *
+     401                 :             :  * The method will remove all files in the cache directory.
+     402                 :             :  *
+     403                 :             :  * Since: 1.0
+     404                 :             :  */
+     405                 :             : void
+     406                 :           1 : valent_context_clear_cache (ValentContext *context)
+     407                 :             : {
+     408                 :           1 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     409                 :           1 :   g_autoptr (GError) error = NULL;
+     410                 :             : 
+     411   [ +  -  -  - ]:           1 :   g_return_if_fail (VALENT_IS_CONTEXT (context));
+     412                 :             : 
+     413   [ -  +  -  - ]:           1 :   if (!remove_directory (priv->cache, NULL, &error) &&
+     414                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+     415                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     416                 :             : }
+     417                 :             : 
+     418                 :             : /**
+     419                 :             :  * valent_context_clear:
+     420                 :             :  * @context: a `ValentContext`
+     421                 :             :  *
+     422                 :             :  * Clear cache and configuration data.
+     423                 :             :  *
+     424                 :             :  * The method will remove all files in the cache and configuration directories.
+     425                 :             :  *
+     426                 :             :  * Since: 1.0
+     427                 :             :  */
+     428                 :             : void
+     429                 :           7 : valent_context_clear (ValentContext *context)
+     430                 :             : {
+     431                 :           7 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     432                 :           7 :   g_autoptr (GError) error = NULL;
+     433                 :             : 
+     434         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_CONTEXT (context));
+     435                 :             : 
+     436                 :             :   /* FIXME: We have to be careful not to remove device config directories */
+     437         [ +  - ]:           7 :   if (priv->domain == NULL)
+     438                 :             :     return;
+     439                 :             : 
+     440   [ +  +  -  + ]:          13 :   if (!remove_directory (priv->cache, NULL, &error) &&
+     441                 :           6 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+     442                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     443                 :           7 :   g_clear_error (&error);
+     444                 :             : 
+     445   [ +  +  -  + ]:          13 :   if (!remove_directory (priv->config, NULL, &error) &&
+     446                 :           6 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+     447                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     448         [ -  + ]:           7 :   g_clear_error (&error);
+     449                 :             : }
+     450                 :             : 
+     451                 :             : /**
+     452                 :             :  * valent_context_get_cache_file:
+     453                 :             :  * @context: a `ValentContext`
+     454                 :             :  * @filename: (type filename): a filename
+     455                 :             :  *
+     456                 :             :  * Create a new cache file.
+     457                 :             :  *
+     458                 :             :  * This method creates a new [iface@Gio.File] for @filename in the cache
+     459                 :             :  * directory.
+     460                 :             :  *
+     461                 :             :  * Returns: (transfer full) (nullable): a new `GFile`
+     462                 :             :  *
+     463                 :             :  * Since: 1.0
+     464                 :             :  */
+     465                 :             : GFile *
+     466                 :          55 : valent_context_get_cache_file (ValentContext *context,
+     467                 :             :                                const char    *filename)
+     468                 :             : {
+     469                 :          55 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     470                 :             : 
+     471         [ +  - ]:          55 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     472         [ -  + ]:          55 :   g_return_val_if_fail (ensure_directory (priv->cache), NULL);
+     473   [ +  -  -  + ]:          55 :   g_return_val_if_fail (filename != NULL && *filename != '\0', NULL);
+     474                 :             : 
+     475                 :          55 :   return g_file_get_child (priv->cache, filename);
+     476                 :             : }
+     477                 :             : 
+     478                 :             : /**
+     479                 :             :  * valent_context_get_config_file:
+     480                 :             :  * @context: a `ValentContext`
+     481                 :             :  * @filename: (type filename): a filename
+     482                 :             :  *
+     483                 :             :  * Create a new config file.
+     484                 :             :  *
+     485                 :             :  * This method creates a new [iface@Gio.File] for @filename in the config
+     486                 :             :  * directory.
+     487                 :             :  *
+     488                 :             :  * Returns: (transfer full) (nullable): a new `GFile`
+     489                 :             :  *
+     490                 :             :  * Since: 1.0
+     491                 :             :  */
+     492                 :             : GFile *
+     493                 :          20 : valent_context_get_config_file (ValentContext *context,
+     494                 :             :                                 const char    *filename)
+     495                 :             : {
+     496                 :          20 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     497                 :             : 
+     498         [ +  - ]:          20 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     499         [ -  + ]:          20 :   g_return_val_if_fail (ensure_directory (priv->config), NULL);
+     500   [ +  -  -  + ]:          20 :   g_return_val_if_fail (filename != NULL && *filename != '\0', NULL);
+     501                 :             : 
+     502                 :          20 :   return g_file_get_child (priv->config, filename);
+     503                 :             : }
+     504                 :             : 
+     505                 :             : /**
+     506                 :             :  * valent_context_get_data_file:
+     507                 :             :  * @context: a `ValentContext`
+     508                 :             :  * @filename: (type filename): a filename
+     509                 :             :  *
+     510                 :             :  * Create a new data file.
+     511                 :             :  *
+     512                 :             :  * This method creates a new [iface@Gio.File] for @filename in the data
+     513                 :             :  * directory.
+     514                 :             :  *
+     515                 :             :  * Returns: (transfer full) (nullable): a new `GFile`
+     516                 :             :  *
+     517                 :             :  * Since: 1.0
+     518                 :             :  */
+     519                 :             : GFile *
+     520                 :           1 : valent_context_get_data_file (ValentContext *context,
+     521                 :             :                               const char    *filename)
+     522                 :             : {
+     523                 :           1 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     524                 :             : 
+     525         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     526         [ -  + ]:           1 :   g_return_val_if_fail (ensure_directory (priv->data), NULL);
+     527   [ +  -  -  + ]:           1 :   g_return_val_if_fail (filename != NULL && *filename != '\0', NULL);
+     528                 :             : 
+     529                 :           1 :   return g_file_get_child (priv->data, filename);
+     530                 :             : }
+     531                 :             : 
+     532                 :             : /**
+     533                 :             :  * valent_context_get_plugin_context:
+     534                 :             :  * @context: a `ValentContext`
+     535                 :             :  * @plugin_info: a `PeasPluginInfo`
+     536                 :             :  *
+     537                 :             :  * Create a new `ValentContext` for a plugin.
+     538                 :             :  *
+     539                 :             :  * If given, @domain should be an identifier describing the scope of the
+     540                 :             :  * contexts that will share it.
+     541                 :             :  *
+     542                 :             :  * If given, @id should be an identifier that is at least unique to @domain,
+     543                 :             :  * even if @domain is %NULL.
+     544                 :             :  *
+     545                 :             :  * Returns: (transfer full): a new `ValentContext`.
+     546                 :             :  *
+     547                 :             :  * Since: 1.0
+     548                 :             :  */
+     549                 :             : ValentContext *
+     550                 :         407 : valent_context_get_plugin_context (ValentContext  *context,
+     551                 :             :                                    PeasPluginInfo *plugin_info)
+     552                 :             : {
+     553         [ +  - ]:         407 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     554         [ -  + ]:         407 :   g_return_val_if_fail (plugin_info != NULL, NULL);
+     555                 :             : 
+     556                 :         407 :   return g_object_new (VALENT_TYPE_CONTEXT,
+     557                 :             :                        "parent", context,
+     558                 :             :                        "domain", "plugin",
+     559                 :             :                        "id",     peas_plugin_info_get_module_name (plugin_info),
+     560                 :             :                        NULL);
+     561                 :             : }
+     562                 :             : 
+     563                 :             : /**
+     564                 :             :  * valent_context_get_plugin_settings:
+     565                 :             :  * @context: a `ValentContext`
+     566                 :             :  * @plugin_info: a `PeasPluginInfo`
+     567                 :             :  * @plugin_key: an external data key
+     568                 :             :  *
+     569                 :             :  * Create a [class@Gio.Settings] object for a plugin.
+     570                 :             :  *
+     571                 :             :  * If the plugin is not built-in, an attempt will be made to compile a
+     572                 :             :  * [struct@Gio.SettingsSchema] for @schema_id, in the module directory of
+     573                 :             :  * @plugin_info.
+     574                 :             :  *
+     575                 :             :  * Returns: (transfer full) (nullable): the new `GSettings` object
+     576                 :             :  *
+     577                 :             :  * Since: 1.0
+     578                 :             :  */
+     579                 :             : GSettings *
+     580                 :         111 : valent_context_get_plugin_settings (ValentContext  *context,
+     581                 :             :                                     PeasPluginInfo *plugin_info,
+     582                 :             :                                     const char     *plugin_key)
+     583                 :             : {
+     584                 :         111 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     585                 :         111 :   GSettingsSchemaSource *default_source;
+     586                 :         111 :   const char *schema_id = NULL;
+     587                 :         222 :   g_autoptr (GSettingsSchema) schema = NULL;
+     588         [ +  + ]:         111 :   g_autofree char *path = NULL;
+     589                 :             : 
+     590         [ +  - ]:         111 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     591         [ -  + ]:         111 :   g_return_val_if_fail (plugin_info != NULL, NULL);
+     592   [ +  -  -  + ]:         111 :   g_return_val_if_fail (plugin_key != NULL && *plugin_key != '\0', NULL);
+     593                 :             : 
+     594                 :         111 :   schema_id = peas_plugin_info_get_external_data (plugin_info, plugin_key);
+     595                 :             : 
+     596   [ +  +  -  + ]:         111 :   if (schema_id == NULL || *schema_id == '\0')
+     597                 :             :     return NULL;
+     598                 :             : 
+     599                 :             :   /* Check the default schema source first */
+     600                 :          81 :   default_source = g_settings_schema_source_get_default ();
+     601                 :          81 :   schema = g_settings_schema_source_lookup (default_source, schema_id, TRUE);
+     602                 :             : 
+     603                 :             :   /* Adapted from `peas-plugin-info.c` (LGPL-2.1-or-later) */
+     604         [ -  + ]:          81 :   if (schema == NULL)
+     605                 :             :     {
+     606                 :           0 :       g_autoptr (GSettingsSchemaSource) source = NULL;
+     607         [ #  # ]:           0 :       g_autoptr (GFile) gschema_compiled = NULL;
+     608                 :           0 :       const char *module_dir = NULL;
+     609                 :             : 
+     610                 :           0 :       module_dir = peas_plugin_info_get_module_dir (plugin_info);
+     611                 :           0 :       gschema_compiled = g_file_new_build_filename (module_dir,
+     612                 :             :                                                     "gschemas.compiled",
+     613                 :             :                                                     NULL);
+     614                 :             : 
+     615         [ #  # ]:           0 :       if (!g_file_query_exists (gschema_compiled, NULL))
+     616                 :             :         {
+     617                 :           0 :           const char *argv[] = {
+     618                 :             :             "glib-compile-schemas",
+     619                 :             :             "--targetdir", module_dir,
+     620                 :             :             module_dir,
+     621                 :             :             NULL
+     622                 :             :           };
+     623                 :             : 
+     624                 :           0 :           g_spawn_sync (NULL, (char **)argv, NULL, G_SPAWN_SEARCH_PATH,
+     625                 :             :                         NULL, NULL, NULL, NULL, NULL, NULL);
+     626                 :             :         }
+     627                 :             : 
+     628                 :           0 :       source = g_settings_schema_source_new_from_directory (module_dir,
+     629                 :             :                                                             default_source,
+     630                 :             :                                                             FALSE,
+     631                 :             :                                                             NULL);
+     632                 :             : 
+     633         [ #  # ]:           0 :       if (source != NULL)
+     634                 :           0 :         schema = g_settings_schema_source_lookup (source, schema_id, TRUE);
+     635                 :             :     }
+     636                 :             : 
+     637         [ #  # ]:           0 :   if (schema == NULL)
+     638                 :             :     {
+     639                 :           0 :       g_critical ("Settings schema '%s' not installed", schema_id);
+     640                 :           0 :       return NULL;
+     641                 :             :     }
+     642                 :             : 
+     643                 :          81 :   path = g_strdup_printf ("/ca/andyholmes/valent/%s/", priv->path);
+     644                 :             : 
+     645                 :          81 :   return g_settings_new_full (schema, NULL, path);
+     646                 :             : }
+     647                 :             : 
+     648                 :             : /**
+     649                 :             :  * valent_context_get_root:
+     650                 :             :  *
+     651                 :             :  * Get the root context.
+     652                 :             :  *
+     653                 :             :  * Returns: (transfer none): a `ValentContext`
+     654                 :             :  *
+     655                 :             :  * Since: 1.0
+     656                 :             :  */
+     657                 :             : ValentContext *
+     658                 :           0 : valent_context_get_root (ValentContext *context)
+     659                 :             : {
+     660                 :           0 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     661                 :           0 :   ValentContext *root = context;
+     662                 :             : 
+     663         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     664                 :             : 
+     665         [ #  # ]:           0 :   if (priv->parent != NULL)
+     666                 :             :     root = valent_context_get_root (priv->parent);
+     667                 :             : 
+     668                 :             :   return root;
+     669                 :             : }
+     670                 :             : 
+     671                 :             : /**
+     672                 :             :  * valent_context_create_settings:
+     673                 :             :  * @context: a `ValentContext`
+     674                 :             :  * @schema_id: a `GSettings` schema ID
+     675                 :             :  *
+     676                 :             :  * Create a [class@Gio.Settings] object.
+     677                 :             :  *
+     678                 :             :  * This is a simple wrapper around [ctor@Gio.Settings.new_full] that creates a
+     679                 :             :  * `GSettings` object for the path of @context. No attempt will be made to
+     680                 :             :  * find or compile missing schemas.
+     681                 :             :  *
+     682                 :             :  * Returns: (transfer full) (nullable): the new `GSettings` object
+     683                 :             :  *
+     684                 :             :  * Since: 1.0
+     685                 :             :  */
+     686                 :             : GSettings *
+     687                 :         324 : valent_context_create_settings (ValentContext *context,
+     688                 :             :                                 const char    *schema_id)
+     689                 :             : {
+     690                 :         324 :   ValentContextPrivate *priv = valent_context_get_instance_private (context);
+     691                 :         324 :   GSettingsSchemaSource *default_source;
+     692                 :         648 :   g_autoptr (GSettingsSchema) schema = NULL;
+     693         [ +  - ]:         324 :   g_autofree char *path = NULL;
+     694                 :             : 
+     695         [ +  - ]:         324 :   g_return_val_if_fail (VALENT_IS_CONTEXT (context), NULL);
+     696   [ +  -  -  + ]:         324 :   g_return_val_if_fail (schema_id != NULL && *schema_id != '\0', NULL);
+     697                 :             : 
+     698                 :         324 :   default_source = g_settings_schema_source_get_default ();
+     699                 :         324 :   schema = g_settings_schema_source_lookup (default_source, schema_id, TRUE);
+     700                 :             : 
+     701         [ -  + ]:         324 :   if (schema == NULL)
+     702                 :             :     {
+     703                 :           0 :       g_critical ("Settings schema '%s' not installed", schema_id);
+     704                 :           0 :       return NULL;
+     705                 :             :     }
+     706                 :             : 
+     707                 :         324 :   path = g_strdup_printf ("/ca/andyholmes/valent/%s/", priv->path);
+     708                 :             : 
+     709                 :         324 :   return g_settings_new_full (schema, NULL, path);
+     710                 :             : }
+     711                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-context.h.func-c.html b/coverage/src/libvalent/core/valent-context.h.func-c.html new file mode 100644 index 00000000000..a84c67d67f6 --- /dev/null +++ b/coverage/src/libvalent/core/valent-context.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-context.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-context.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTEXT1654
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-context.h.func.html b/coverage/src/libvalent/core/valent-context.h.func.html new file mode 100644 index 00000000000..6da788b2cb3 --- /dev/null +++ b/coverage/src/libvalent/core/valent-context.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-context.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-context.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTEXT1654
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-context.h.gcov.html b/coverage/src/libvalent/core/valent-context.h.gcov.html new file mode 100644 index 00000000000..1ef92f856c1 --- /dev/null +++ b/coverage/src/libvalent/core/valent-context.h.gcov.html @@ -0,0 +1,160 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-context.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-context.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <libpeas.h>
+      11                 :             : 
+      12                 :             : #include "valent-object.h"
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : #define VALENT_TYPE_CONTEXT (valent_context_get_type())
+      17                 :             : 
+      18                 :             : VALENT_AVAILABLE_IN_1_0
+      19   [ +  -  +  -  :        2097 : G_DECLARE_DERIVABLE_TYPE (ValentContext, valent_context, VALENT, CONTEXT, ValentObject)
+             +  +  -  + ]
+      20                 :             : 
+      21                 :             : struct _ValentContextClass
+      22                 :             : {
+      23                 :             :   ValentObjectClass   parent_class;
+      24                 :             : 
+      25                 :             :   /*< private >*/
+      26                 :             :   gpointer            padding[8];
+      27                 :             : };
+      28                 :             : 
+      29                 :             : VALENT_AVAILABLE_IN_1_0
+      30                 :             : ValentContext * valent_context_new                    (ValentContext  *parent,
+      31                 :             :                                                        const char     *domain,
+      32                 :             :                                                        const char     *id);
+      33                 :             : VALENT_AVAILABLE_IN_1_0
+      34                 :             : GFile         * valent_context_get_cache_file         (ValentContext  *context,
+      35                 :             :                                                        const char     *filename);
+      36                 :             : VALENT_AVAILABLE_IN_1_0
+      37                 :             : GFile         * valent_context_get_config_file        (ValentContext  *context,
+      38                 :             :                                                        const char     *filename);
+      39                 :             : VALENT_AVAILABLE_IN_1_0
+      40                 :             : GFile         * valent_context_get_data_file          (ValentContext  *context,
+      41                 :             :                                                        const char     *filename);
+      42                 :             : VALENT_AVAILABLE_IN_1_0
+      43                 :             : const char    * valent_context_get_domain             (ValentContext  *context);
+      44                 :             : VALENT_AVAILABLE_IN_1_0
+      45                 :             : const char    * valent_context_get_id                 (ValentContext  *context);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : ValentContext * valent_context_get_parent             (ValentContext  *context);
+      48                 :             : VALENT_AVAILABLE_IN_1_0
+      49                 :             : const char    * valent_context_get_path               (ValentContext  *context);
+      50                 :             : VALENT_AVAILABLE_IN_1_0
+      51                 :             : ValentContext * valent_context_get_plugin_context     (ValentContext  *context,
+      52                 :             :                                                        PeasPluginInfo *plugin_info);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : GSettings     * valent_context_get_plugin_settings    (ValentContext  *context,
+      55                 :             :                                                        PeasPluginInfo *plugin_info,
+      56                 :             :                                                        const char     *plugin_key);
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : ValentContext * valent_context_get_root               (ValentContext  *context);
+      59                 :             : VALENT_AVAILABLE_IN_1_0
+      60                 :             : void            valent_context_clear_cache            (ValentContext  *context);
+      61                 :             : VALENT_AVAILABLE_IN_1_0
+      62                 :             : void            valent_context_clear                  (ValentContext  *context);
+      63                 :             : VALENT_AVAILABLE_IN_1_0
+      64                 :             : GSettings     * valent_context_create_settings        (ValentContext  *context,
+      65                 :             :                                                        const char     *schema_id);
+      66                 :             : 
+      67                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-extension.c.func-c.html b/coverage/src/libvalent/core/valent-extension.c.func-c.html new file mode 100644 index 00000000000..4feecacc983 --- /dev/null +++ b/coverage/src/libvalent/core/valent-extension.c.func-c.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-extension.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-extension.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.4 %237219
Test Date:2024-03-31 18:46:36Functions:100.0 %2828
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.0 %10670
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_extension_activate_action1
valent_extension_change_action_state1
valent_extension_remove_action1
valent_extension_query_action2
valent_extension_get_property4
valent_extension_get_context8
on_action_state_changed46
g_action_group_iface_init67
g_action_map_iface_init67
valent_extension_class_init67
valent_extension_get_settings101
valent_extension_plugin_state_check101
valent_extension_list_actions195
valent_extension_toggle_actions237
valent_extension_finalize268
valent_extension_init293
valent_extension_set_object293
valent_extension_disconnect_action310
valent_extension_add_action322
valent_extension_lookup_action420
valent_extension_destroy474
valent_extension_plugin_state_changed496
on_action_enabled_changed573
valent_extension_get_object638
valent_extension_set_property879
valent_extension_get_type2992
valent_extension_class_intern_init67
valent_extension_get_type_once86
valent_extension_get_type2839
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-extension.c.func.html b/coverage/src/libvalent/core/valent-extension.c.func.html new file mode 100644 index 00000000000..94567255769 --- /dev/null +++ b/coverage/src/libvalent/core/valent-extension.c.func.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-extension.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-extension.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.4 %237219
Test Date:2024-03-31 18:46:36Functions:100.0 %2828
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.0 %10670
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_action_group_iface_init67
g_action_map_iface_init67
on_action_enabled_changed573
on_action_state_changed46
valent_extension_activate_action1
valent_extension_add_action322
valent_extension_change_action_state1
valent_extension_class_init67
valent_extension_destroy474
valent_extension_disconnect_action310
valent_extension_finalize268
valent_extension_get_context8
valent_extension_get_object638
valent_extension_get_property4
valent_extension_get_settings101
valent_extension_get_type2992
valent_extension_class_intern_init67
valent_extension_get_type2839
valent_extension_get_type_once86
valent_extension_init293
valent_extension_list_actions195
valent_extension_lookup_action420
valent_extension_plugin_state_changed496
valent_extension_plugin_state_check101
valent_extension_query_action2
valent_extension_remove_action1
valent_extension_set_object293
valent_extension_set_property879
valent_extension_toggle_actions237
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-extension.c.gcov.html b/coverage/src/libvalent/core/valent-extension.c.gcov.html new file mode 100644 index 00000000000..b3ea42597c2 --- /dev/null +++ b/coverage/src/libvalent/core/valent-extension.c.gcov.html @@ -0,0 +1,796 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-extension.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-extension.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.4 %237219
Test Date:2024-03-31 18:46:36Functions:100.0 %2828
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.0 %10670
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-extension"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : 
+      11                 :             : #include "valent-context.h"
+      12                 :             : #include "valent-core-enums.h"
+      13                 :             : #include "valent-extension.h"
+      14                 :             : #include "valent-object.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentExtension:
+      19                 :             :  *
+      20                 :             :  * An abstract base class for extensions.
+      21                 :             :  *
+      22                 :             :  * `ValentExtension` is a base class for extensions with conveniences for
+      23                 :             :  * [iface@Gio.Action], [class@Gio.Settings] backed by [class@Valent.Context].
+      24                 :             :  *
+      25                 :             :  * ## Plugin Actions
+      26                 :             :  *
+      27                 :             :  * `ValentExtension` implements the [iface@Gio.ActionGroup] and
+      28                 :             :  * [iface@Gio.ActionMap] interfaces, providing a simple way for plugins to
+      29                 :             :  * expose functions and states. Each [iface@Gio.Action] added to the action map
+      30                 :             :  * will be included in the object action group with the plugin's module name as
+      31                 :             :  * a prefix (eg. `share.uri`).
+      32                 :             :  *
+      33                 :             :  * ## `.plugin` File
+      34                 :             :  *
+      35                 :             :  * Implementations may define the extra fields in the `.plugin` file, to take
+      36                 :             :  * advantage of core features in the base class.
+      37                 :             :  *
+      38                 :             :  * The field names are inferred from the GType name of the implementation, with
+      39                 :             :  * `Valent` being stripped if present. For example `ValentDevicePlugin` becomes
+      40                 :             :  * `X-DevicePluginSettings`, while `NameDevicePlugin` would become
+      41                 :             :  * `X-NameDevicePluginSettings`.
+      42                 :             :  *
+      43                 :             :  * - Extension Category Field
+      44                 :             :  *
+      45                 :             :  *     A list of categories separated by semi-colons, serving as a hint for
+      46                 :             :  *     organizational purposes. This should be in the form `Main;Additional;`,
+      47                 :             :  *     with values from the freedesktop.org Desktop Menu Specification.
+      48                 :             :  *
+      49                 :             :  *     Field pattern: `X-<type name>Category`
+      50                 :             :  *
+      51                 :             :  * - [class@Gio.Settings] Schema Field
+      52                 :             :  *
+      53                 :             :  *     A [class@Gio.Settings] schema ID for the extensions's settings. See
+      54                 :             :  *     [method@Valent.Context.get_plugin_settings] for more information.
+      55                 :             :  *
+      56                 :             :  *     Field pattern: `X-<type name>Settings`
+      57                 :             :  *
+      58                 :             :  * Since: 1.0
+      59                 :             :  */
+      60                 :             : 
+      61                 :             : typedef struct
+      62                 :             : {
+      63                 :             :   GObject           *object;
+      64                 :             : 
+      65                 :             :   PeasPluginInfo    *plugin_info;
+      66                 :             :   ValentPluginState  plugin_state;
+      67                 :             :   GError            *plugin_error;
+      68                 :             : 
+      69                 :             :   GHashTable        *actions;
+      70                 :             :   ValentContext     *context;
+      71                 :             :   GSettings         *settings;
+      72                 :             : } ValentExtensionPrivate;
+      73                 :             : 
+      74                 :             : static void   g_action_group_iface_init (GActionGroupInterface *iface);
+      75                 :             : static void   g_action_map_iface_init   (GActionMapInterface   *iface);
+      76                 :             : 
+      77   [ +  +  +  - ]:        7726 : G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ValentExtension, valent_extension, VALENT_TYPE_OBJECT,
+      78                 :             :                                   G_ADD_PRIVATE (ValentExtension)
+      79                 :             :                                   G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_action_group_iface_init)
+      80                 :             :                                   G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, g_action_map_iface_init))
+      81                 :             : 
+      82                 :             : /**
+      83                 :             :  * ValentExtensionClass:
+      84                 :             :  *
+      85                 :             :  * The virtual function table for `ValentExtension`.
+      86                 :             :  */
+      87                 :             : 
+      88                 :             : enum {
+      89                 :             :   PROP_0,
+      90                 :             :   PROP_CONTEXT,
+      91                 :             :   PROP_OBJECT,
+      92                 :             :   PROP_PLUGIN_INFO,
+      93                 :             :   PROP_PLUGIN_STATE,
+      94                 :             :   PROP_SETTINGS,
+      95                 :             :   N_PROPERTIES
+      96                 :             : };
+      97                 :             : 
+      98                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      99                 :             : 
+     100                 :             : 
+     101                 :             : /*
+     102                 :             :  * GActionGroup
+     103                 :             :  */
+     104                 :             : static void
+     105                 :           1 : valent_extension_activate_action (GActionGroup *action_group,
+     106                 :             :                                   const char   *action_name,
+     107                 :             :                                   GVariant     *parameter)
+     108                 :             : {
+     109                 :           1 :   ValentExtension *self = VALENT_EXTENSION (action_group);
+     110                 :           1 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     111                 :           1 :   GAction *action;
+     112                 :             : 
+     113         [ +  - ]:           1 :   if ((action = g_hash_table_lookup (priv->actions, action_name)) != NULL)
+     114                 :           1 :     g_action_activate (action, parameter);
+     115                 :           1 : }
+     116                 :             : 
+     117                 :             : static void
+     118                 :           1 : valent_extension_change_action_state (GActionGroup *action_group,
+     119                 :             :                                       const char   *action_name,
+     120                 :             :                                       GVariant     *value)
+     121                 :             : {
+     122                 :           1 :   ValentExtension *self = VALENT_EXTENSION (action_group);
+     123                 :           1 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     124                 :           1 :   GAction *action;
+     125                 :             : 
+     126         [ +  - ]:           1 :   if ((action = g_hash_table_lookup (priv->actions, action_name)) != NULL)
+     127                 :           1 :     g_action_change_state (action, value);
+     128                 :           1 : }
+     129                 :             : 
+     130                 :             : static char **
+     131                 :         195 : valent_extension_list_actions (GActionGroup *action_group)
+     132                 :             : {
+     133                 :         195 :   ValentExtension *self = VALENT_EXTENSION (action_group);
+     134                 :         195 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     135                 :         390 :   g_auto (GStrv) actions = NULL;
+     136                 :         195 :   GHashTableIter iter;
+     137                 :         195 :   gpointer key;
+     138                 :         195 :   unsigned int i = 0;
+     139                 :             : 
+     140         [ -  + ]:         195 :   actions = g_new0 (char *, g_hash_table_size (priv->actions) + 1);
+     141                 :             : 
+     142                 :         195 :   g_hash_table_iter_init (&iter, priv->actions);
+     143                 :             : 
+     144         [ +  + ]:         515 :   while (g_hash_table_iter_next (&iter, &key, NULL))
+     145         [ -  + ]:         640 :     actions[i++] = g_strdup (key);
+     146                 :             : 
+     147                 :         195 :   return g_steal_pointer (&actions);
+     148                 :             : }
+     149                 :             : 
+     150                 :             : static gboolean
+     151                 :           2 : valent_extension_query_action (GActionGroup        *action_group,
+     152                 :             :                                const char          *action_name,
+     153                 :             :                                gboolean            *enabled,
+     154                 :             :                                const GVariantType **parameter_type,
+     155                 :             :                                const GVariantType **state_type,
+     156                 :             :                                GVariant           **state_hint,
+     157                 :             :                                GVariant           **state)
+     158                 :             : {
+     159                 :           2 :   ValentExtension *self = VALENT_EXTENSION (action_group);
+     160                 :           2 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     161                 :           2 :   GAction *action;
+     162                 :             : 
+     163         [ +  - ]:           2 :   if ((action = g_hash_table_lookup (priv->actions, action_name)) == NULL)
+     164                 :             :     return FALSE;
+     165                 :             : 
+     166         [ +  + ]:           2 :   if (enabled)
+     167                 :           1 :     *enabled = g_action_get_enabled (action);
+     168                 :             : 
+     169         [ +  + ]:           2 :   if (parameter_type)
+     170                 :           1 :     *parameter_type = g_action_get_parameter_type (action);
+     171                 :             : 
+     172         [ +  + ]:           2 :   if (state_type)
+     173                 :           1 :     *state_type = g_action_get_state_type (action);
+     174                 :             : 
+     175         [ +  + ]:           2 :   if (state_hint)
+     176                 :           1 :     *state_hint = g_action_get_state_hint (action);
+     177                 :             : 
+     178         [ +  - ]:           2 :   if (state)
+     179                 :           2 :     *state = g_action_get_state (action);
+     180                 :             : 
+     181                 :             :   return TRUE;
+     182                 :             : }
+     183                 :             : 
+     184                 :             : static void
+     185                 :          67 : g_action_group_iface_init (GActionGroupInterface *iface)
+     186                 :             : {
+     187                 :          67 :   iface->activate_action = valent_extension_activate_action;
+     188                 :          67 :   iface->change_action_state = valent_extension_change_action_state;
+     189                 :          67 :   iface->list_actions = valent_extension_list_actions;
+     190                 :          67 :   iface->query_action = valent_extension_query_action;
+     191                 :          67 : }
+     192                 :             : 
+     193                 :             : /*
+     194                 :             :  * GActionMap
+     195                 :             :  */
+     196                 :             : static void
+     197                 :         573 : on_action_enabled_changed (GAction      *action,
+     198                 :             :                            GParamSpec   *pspec,
+     199                 :             :                            GActionGroup *action_group)
+     200                 :             : {
+     201                 :         573 :   g_action_group_action_enabled_changed (action_group,
+     202                 :             :                                          g_action_get_name (action),
+     203                 :             :                                          g_action_get_enabled (action));
+     204                 :         573 : }
+     205                 :             : 
+     206                 :             : static void
+     207                 :          46 : on_action_state_changed (GAction      *action,
+     208                 :             :                          GParamSpec   *pspec,
+     209                 :             :                          GActionGroup *action_group)
+     210                 :             : {
+     211                 :          92 :   g_autoptr (GVariant) value = NULL;
+     212                 :             : 
+     213                 :          46 :   value = g_action_get_state (action);
+     214         [ +  - ]:          46 :   g_action_group_action_state_changed (action_group,
+     215                 :             :                                        g_action_get_name (action),
+     216                 :             :                                        value);
+     217                 :          46 : }
+     218                 :             : 
+     219                 :             : static void
+     220                 :         310 : valent_extension_disconnect_action (ValentExtension *self,
+     221                 :             :                                     GAction         *action)
+     222                 :             : {
+     223                 :         310 :   g_signal_handlers_disconnect_by_func (action, on_action_enabled_changed, self);
+     224                 :         310 :   g_signal_handlers_disconnect_by_func (action, on_action_state_changed, self);
+     225                 :         310 : }
+     226                 :             : 
+     227                 :             : static GAction *
+     228                 :         420 : valent_extension_lookup_action (GActionMap *action_map,
+     229                 :             :                                 const char *action_name)
+     230                 :             : {
+     231                 :         420 :   ValentExtension *self = VALENT_EXTENSION (action_map);
+     232                 :         420 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     233                 :             : 
+     234                 :         420 :   return g_hash_table_lookup (priv->actions, action_name);
+     235                 :             : }
+     236                 :             : 
+     237                 :             : static void
+     238                 :         322 : valent_extension_add_action (GActionMap *action_map,
+     239                 :             :                              GAction    *action)
+     240                 :             : {
+     241                 :         322 :   ValentExtension *self = VALENT_EXTENSION (action_map);
+     242                 :         322 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     243                 :         322 :   const char *action_name;
+     244                 :         322 :   GAction *replacing;
+     245                 :             : 
+     246                 :         322 :   action_name = g_action_get_name (action);
+     247                 :             : 
+     248         [ +  - ]:         322 :   if ((replacing = g_hash_table_lookup (priv->actions, action_name)) == action)
+     249                 :             :     return;
+     250                 :             : 
+     251         [ -  + ]:         322 :   if (replacing != NULL)
+     252                 :             :     {
+     253                 :           0 :       g_action_group_action_removed (G_ACTION_GROUP (action_map), action_name);
+     254                 :           0 :       valent_extension_disconnect_action (self, replacing);
+     255                 :             :     }
+     256                 :             : 
+     257                 :         322 :   g_signal_connect_object (action,
+     258                 :             :                            "notify::enabled",
+     259                 :             :                            G_CALLBACK (on_action_enabled_changed),
+     260                 :             :                            action_map, 0);
+     261                 :             : 
+     262         [ +  + ]:         322 :   if (g_action_get_state_type (action) != NULL)
+     263                 :          38 :     g_signal_connect_object (action,
+     264                 :             :                              "notify::state",
+     265                 :             :                              G_CALLBACK (on_action_state_changed),
+     266                 :             :                              action_map, 0);
+     267                 :             : 
+     268         [ -  + ]:         322 :   g_hash_table_replace (priv->actions,
+     269                 :         322 :                         g_strdup (action_name),
+     270                 :             :                         g_object_ref (action));
+     271                 :         322 :   g_action_group_action_added (G_ACTION_GROUP (action_map), action_name);
+     272                 :             : }
+     273                 :             : 
+     274                 :             : static void
+     275                 :           1 : valent_extension_remove_action (GActionMap *action_map,
+     276                 :             :                                 const char *action_name)
+     277                 :             : {
+     278                 :           1 :   ValentExtension *self = VALENT_EXTENSION (action_map);
+     279                 :           1 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     280                 :           1 :   GAction *action;
+     281                 :             : 
+     282         [ +  - ]:           1 :   if ((action = g_hash_table_lookup (priv->actions, action_name)) != NULL)
+     283                 :             :     {
+     284                 :           1 :       g_action_group_action_removed (G_ACTION_GROUP (action_map), action_name);
+     285                 :           1 :       valent_extension_disconnect_action (self, action);
+     286                 :           1 :       g_hash_table_remove (priv->actions, action_name);
+     287                 :             :     }
+     288                 :           1 : }
+     289                 :             : 
+     290                 :             : static void
+     291                 :          67 : g_action_map_iface_init (GActionMapInterface *iface)
+     292                 :             : {
+     293                 :          67 :   iface->add_action = valent_extension_add_action;
+     294                 :          67 :   iface->lookup_action = valent_extension_lookup_action;
+     295                 :          67 :   iface->remove_action = valent_extension_remove_action;
+     296                 :          67 : }
+     297                 :             : 
+     298                 :             : /*
+     299                 :             :  * ValentExtension
+     300                 :             :  */
+     301                 :             : static void
+     302                 :         293 : valent_extension_set_object (ValentExtension *self,
+     303                 :             :                              gpointer         object)
+     304                 :             : {
+     305                 :         293 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     306                 :             : 
+     307         [ +  - ]:         293 :   g_assert (VALENT_IS_EXTENSION (self));
+     308   [ +  +  -  + ]:         293 :   g_assert (object == NULL || G_IS_OBJECT (object));
+     309                 :             : 
+     310         [ +  + ]:         293 :   if (priv->object == object)
+     311                 :             :     return;
+     312                 :             : 
+     313                 :         262 :   priv->object = object;
+     314                 :         262 :   g_object_add_weak_pointer (G_OBJECT (priv->object), (gpointer *)&priv->object);
+     315                 :             : }
+     316                 :             : 
+     317                 :             : /*
+     318                 :             :  * ValentObject
+     319                 :             :  */
+     320                 :             : static void
+     321                 :         474 : valent_extension_destroy (ValentObject *object)
+     322                 :             : {
+     323                 :         474 :   ValentExtension *self = VALENT_EXTENSION (object);
+     324                 :         474 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     325                 :         474 :   GHashTableIter iter;
+     326                 :         474 :   const char *action_name;
+     327                 :         474 :   GAction *action;
+     328                 :             : 
+     329                 :         474 :   g_hash_table_iter_init (&iter, priv->actions);
+     330                 :             : 
+     331         [ +  + ]:         783 :   while (g_hash_table_iter_next (&iter, (void **)&action_name, (void **)&action))
+     332                 :             :     {
+     333                 :         309 :       g_action_group_action_removed (G_ACTION_GROUP (self), action_name);
+     334                 :         309 :       valent_extension_disconnect_action (self, action);
+     335                 :         309 :       g_hash_table_iter_remove (&iter);
+     336                 :             :     }
+     337                 :             : 
+     338                 :         474 :   valent_extension_plugin_state_changed (self, VALENT_PLUGIN_STATE_INACTIVE, NULL);
+     339                 :             : 
+     340                 :         474 :   VALENT_OBJECT_CLASS (valent_extension_parent_class)->destroy (object);
+     341                 :         474 : }
+     342                 :             : 
+     343                 :             : /*
+     344                 :             :  * GObject
+     345                 :             :  */
+     346                 :             : static void
+     347                 :         268 : valent_extension_finalize (GObject *object)
+     348                 :             : {
+     349                 :         268 :   ValentExtension *self = VALENT_EXTENSION (object);
+     350                 :         268 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     351                 :             : 
+     352                 :         268 :   g_clear_weak_pointer (&priv->object);
+     353                 :         268 :   g_clear_error (&priv->plugin_error);
+     354         [ +  - ]:         268 :   g_clear_pointer (&priv->actions, g_hash_table_unref);
+     355         [ +  + ]:         268 :   g_clear_object (&priv->context);
+     356         [ +  + ]:         268 :   g_clear_object (&priv->plugin_info);
+     357         [ +  + ]:         268 :   g_clear_object (&priv->settings);
+     358                 :             : 
+     359                 :         268 :   G_OBJECT_CLASS (valent_extension_parent_class)->finalize (object);
+     360                 :         268 : }
+     361                 :             : 
+     362                 :             : static void
+     363                 :           4 : valent_extension_get_property (GObject    *object,
+     364                 :             :                                guint       prop_id,
+     365                 :             :                                GValue     *value,
+     366                 :             :                                GParamSpec *pspec)
+     367                 :             : {
+     368                 :           4 :   ValentExtension *self = VALENT_EXTENSION (object);
+     369                 :           4 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     370                 :             : 
+     371   [ +  +  -  -  :           4 :   switch (prop_id)
+                   -  - ]
+     372                 :             :     {
+     373                 :           1 :     case PROP_CONTEXT:
+     374                 :           1 :       g_value_set_object (value, valent_extension_get_context (self));
+     375                 :           1 :       break;
+     376                 :             : 
+     377                 :           3 :     case PROP_OBJECT:
+     378                 :           3 :       g_value_set_object (value, priv->object);
+     379                 :           3 :       break;
+     380                 :             : 
+     381                 :           0 :     case PROP_PLUGIN_INFO:
+     382                 :           0 :       g_value_set_object (value, priv->plugin_info);
+     383                 :           0 :       break;
+     384                 :             : 
+     385                 :           0 :     case PROP_PLUGIN_STATE:
+     386                 :           0 :       g_value_set_enum (value, priv->plugin_state);
+     387                 :           0 :       break;
+     388                 :             : 
+     389                 :           0 :     case PROP_SETTINGS:
+     390                 :           0 :       g_value_set_object (value, valent_extension_get_settings (self));
+     391                 :           0 :       break;
+     392                 :             : 
+     393                 :           0 :     default:
+     394                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     395                 :             :     }
+     396                 :           4 : }
+     397                 :             : 
+     398                 :             : static void
+     399                 :         879 : valent_extension_set_property (GObject      *object,
+     400                 :             :                                guint         prop_id,
+     401                 :             :                                const GValue *value,
+     402                 :             :                                GParamSpec   *pspec)
+     403                 :             : {
+     404                 :         879 :   ValentExtension *self = VALENT_EXTENSION (object);
+     405                 :         879 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     406                 :             : 
+     407   [ +  +  +  - ]:         879 :   switch (prop_id)
+     408                 :             :     {
+     409                 :         293 :     case PROP_CONTEXT:
+     410                 :         293 :       priv->context = g_value_dup_object (value);
+     411                 :         293 :       break;
+     412                 :             : 
+     413                 :         293 :     case PROP_OBJECT:
+     414                 :         293 :       valent_extension_set_object (self, g_value_get_object (value));
+     415                 :         293 :       break;
+     416                 :             : 
+     417                 :         293 :     case PROP_PLUGIN_INFO:
+     418                 :         293 :       priv->plugin_info = g_value_dup_object (value);
+     419                 :         293 :       break;
+     420                 :             : 
+     421                 :           0 :     default:
+     422                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     423                 :             :     }
+     424                 :         879 : }
+     425                 :             : 
+     426                 :             : static void
+     427                 :          67 : valent_extension_class_init (ValentExtensionClass *klass)
+     428                 :             : {
+     429                 :          67 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     430                 :          67 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     431                 :             : 
+     432                 :          67 :   object_class->finalize = valent_extension_finalize;
+     433                 :          67 :   object_class->get_property = valent_extension_get_property;
+     434                 :          67 :   object_class->set_property = valent_extension_set_property;
+     435                 :             : 
+     436                 :          67 :   vobject_class->destroy = valent_extension_destroy;
+     437                 :             : 
+     438                 :             :   /**
+     439                 :             :    * ValentExtension:context: (getter get_context)
+     440                 :             :    *
+     441                 :             :    * The [class@Valent.Device] this plugin is bound to.
+     442                 :             :    *
+     443                 :             :    * Since: 1.0
+     444                 :             :    */
+     445                 :         134 :   properties [PROP_CONTEXT] =
+     446                 :          67 :     g_param_spec_object ("context", NULL, NULL,
+     447                 :             :                          VALENT_TYPE_CONTEXT,
+     448                 :             :                          (G_PARAM_READWRITE |
+     449                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     450                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     451                 :             :                           G_PARAM_STATIC_STRINGS));
+     452                 :             : 
+     453                 :             :   /**
+     454                 :             :    * ValentExtension:object: (getter get_object)
+     455                 :             :    *
+     456                 :             :    * The [class@GObject.Object] this plugin is bound to.
+     457                 :             :    *
+     458                 :             :    * Since: 1.0
+     459                 :             :    */
+     460                 :         134 :   properties [PROP_OBJECT] =
+     461                 :          67 :     g_param_spec_object ("object", NULL, NULL,
+     462                 :             :                          G_TYPE_OBJECT,
+     463                 :             :                          (G_PARAM_READWRITE |
+     464                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     465                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     466                 :             :                           G_PARAM_STATIC_STRINGS));
+     467                 :             : 
+     468                 :             :   /**
+     469                 :             :    * ValentExtension:plugin-info:
+     470                 :             :    *
+     471                 :             :    * The [class@Peas.PluginInfo] describing this plugin.
+     472                 :             :    *
+     473                 :             :    * Since: 1.0
+     474                 :             :    */
+     475                 :         134 :   properties [PROP_PLUGIN_INFO] =
+     476                 :          67 :     g_param_spec_object ("plugin-info", NULL, NULL,
+     477                 :             :                          PEAS_TYPE_PLUGIN_INFO,
+     478                 :             :                          (G_PARAM_READWRITE |
+     479                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     480                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     481                 :             :                           G_PARAM_STATIC_STRINGS));
+     482                 :             : 
+     483                 :             :   /**
+     484                 :             :    * ValentExtension:plugin-state:
+     485                 :             :    *
+     486                 :             :    * The [enum@Valent.PluginState] describing the state of the extension.
+     487                 :             :    *
+     488                 :             :    * Since: 1.0
+     489                 :             :    */
+     490                 :         134 :   properties [PROP_PLUGIN_STATE] =
+     491                 :          67 :     g_param_spec_enum ("plugin-state", NULL, NULL,
+     492                 :             :                        VALENT_TYPE_PLUGIN_STATE,
+     493                 :             :                        VALENT_PLUGIN_STATE_ACTIVE,
+     494                 :             :                        (G_PARAM_READABLE |
+     495                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     496                 :             :                         G_PARAM_STATIC_STRINGS));
+     497                 :             : 
+     498                 :             :   /**
+     499                 :             :    * ValentExtension:settings: (getter get_settings)
+     500                 :             :    *
+     501                 :             :    * The [class@Gio.Settings] for this plugin.
+     502                 :             :    *
+     503                 :             :    * Since: 1.0
+     504                 :             :    */
+     505                 :         134 :   properties [PROP_SETTINGS] =
+     506                 :          67 :     g_param_spec_object ("settings", NULL, NULL,
+     507                 :             :                          G_TYPE_SETTINGS,
+     508                 :             :                          (G_PARAM_READABLE |
+     509                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     510                 :             :                           G_PARAM_STATIC_STRINGS));
+     511                 :             : 
+     512                 :          67 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     513                 :          67 : }
+     514                 :             : 
+     515                 :             : static void
+     516                 :         293 : valent_extension_init (ValentExtension *self)
+     517                 :             : {
+     518                 :         293 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (self);
+     519                 :             : 
+     520                 :         293 :   priv->actions = g_hash_table_new_full (g_str_hash,
+     521                 :             :                                          g_str_equal,
+     522                 :             :                                          g_free,
+     523                 :             :                                          g_object_unref);
+     524                 :         293 : }
+     525                 :             : 
+     526                 :             : /**
+     527                 :             :  * valent_extension_get_context: (get-property context)
+     528                 :             :  * @extension: a `ValentExtension`
+     529                 :             :  *
+     530                 :             :  * Get the settings for this plugin.
+     531                 :             :  *
+     532                 :             :  * Returns: (transfer none) (nullable): a `ValentContext`
+     533                 :             :  *
+     534                 :             :  * Since: 1.0
+     535                 :             :  */
+     536                 :             : ValentContext *
+     537                 :           8 : valent_extension_get_context (ValentExtension *extension)
+     538                 :             : {
+     539                 :           8 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (extension);
+     540                 :             : 
+     541         [ +  - ]:           8 :   g_return_val_if_fail (VALENT_IS_EXTENSION (extension), NULL);
+     542                 :             : 
+     543         [ +  + ]:           8 :   if (priv->context == NULL)
+     544                 :             :     {
+     545                 :           2 :       ValentContext *context = NULL;
+     546                 :           2 :       const char *module_name = NULL;
+     547                 :             : 
+     548                 :             :       /* FIXME: context = valent_object_get_context (priv->object); */
+     549                 :           2 :       module_name = peas_plugin_info_get_module_name (priv->plugin_info);
+     550                 :           2 :       priv->context = valent_context_new (context, "plugin", module_name);
+     551                 :             :     }
+     552                 :             : 
+     553                 :           8 :   return priv->context;
+     554                 :             : }
+     555                 :             : 
+     556                 :             : /**
+     557                 :             :  * valent_extension_get_object: (get-property object)
+     558                 :             :  * @extension: a `ValentExtension`
+     559                 :             :  *
+     560                 :             :  * Get the object this plugin is bound to.
+     561                 :             :  *
+     562                 :             :  * Returns: (type GObject.Object) (transfer none) (nullable): a `GObject`
+     563                 :             :  *
+     564                 :             :  * Since: 1.0
+     565                 :             :  */
+     566                 :             : gpointer
+     567                 :         638 : valent_extension_get_object (ValentExtension *extension)
+     568                 :             : {
+     569                 :         638 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (extension);
+     570                 :             : 
+     571         [ +  - ]:         638 :   g_return_val_if_fail (VALENT_IS_EXTENSION (extension), NULL);
+     572                 :             : 
+     573                 :         638 :   return priv->object;
+     574                 :             : }
+     575                 :             : 
+     576                 :             : /**
+     577                 :             :  * valent_extension_get_settings: (get-property settings)
+     578                 :             :  * @extension: a `ValentExtension`
+     579                 :             :  *
+     580                 :             :  * Get the settings for this plugin.
+     581                 :             :  *
+     582                 :             :  * Returns: (transfer none) (nullable): a `GSettings`
+     583                 :             :  *
+     584                 :             :  * Since: 1.0
+     585                 :             :  */
+     586                 :             : GSettings *
+     587                 :         101 : valent_extension_get_settings (ValentExtension *extension)
+     588                 :             : {
+     589                 :         101 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (extension);
+     590                 :             : 
+     591         [ +  - ]:         101 :   g_return_val_if_fail (VALENT_IS_EXTENSION (extension), NULL);
+     592                 :             : 
+     593         [ +  + ]:         101 :   if (priv->settings == NULL)
+     594                 :             :     {
+     595                 :          28 :       GType type_base = g_type_parent (G_OBJECT_TYPE (extension));
+     596                 :          28 :       const char *type_name = g_type_name (type_base);
+     597                 :          28 :       g_autofree char *key = NULL;
+     598                 :             : 
+     599   [ +  -  +  -  :          28 :       if (g_str_has_prefix (type_name, "Valent"))
+                   +  - ]
+     600                 :          28 :         key = g_strdup_printf ("X-%sSettings", &type_name[strlen ("Valent")]);
+     601                 :             :       else
+     602                 :           0 :         key = g_strdup_printf ("X-%sSettings", type_name);
+     603                 :             : 
+     604                 :          28 :       priv->settings = valent_context_get_plugin_settings (priv->context,
+     605                 :             :                                                            priv->plugin_info,
+     606                 :             :                                                            key);
+     607                 :             :     }
+     608                 :             : 
+     609                 :         101 :   return priv->settings;
+     610                 :             : }
+     611                 :             : 
+     612                 :             : /**
+     613                 :             :  * valent_extension_plugin_state_check:
+     614                 :             :  * @extension: a `ValentExtension`
+     615                 :             :  * @error: (nullable): a `GError`
+     616                 :             :  *
+     617                 :             :  * Get the extension state, while propagating any errors that describe it.
+     618                 :             :  *
+     619                 :             :  * Returns: a `ValentPluginState`
+     620                 :             :  *
+     621                 :             :  * Since: 1.0
+     622                 :             :  */
+     623                 :             : ValentPluginState
+     624                 :         101 : valent_extension_plugin_state_check (ValentExtension  *extension,
+     625                 :             :                                      GError          **error)
+     626                 :             : {
+     627                 :         101 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (extension);
+     628                 :             : 
+     629         [ +  - ]:         101 :   g_return_val_if_fail (VALENT_IS_EXTENSION (extension), VALENT_PLUGIN_STATE_INACTIVE);
+     630   [ +  +  -  + ]:         101 :   g_return_val_if_fail (error == NULL || *error == NULL, VALENT_PLUGIN_STATE_INACTIVE);
+     631                 :             : 
+     632   [ -  +  -  - ]:         101 :   if (priv->plugin_error != NULL && error != NULL)
+     633                 :           0 :     *error = g_error_copy (priv->plugin_error);
+     634                 :             : 
+     635                 :         101 :   return priv->plugin_state;
+     636                 :             : }
+     637                 :             : 
+     638                 :             : /**
+     639                 :             :  * valent_extension_plugin_state_changed:
+     640                 :             :  * @extension: a `ValentExtension`
+     641                 :             :  * @state: a `ValentPluginState`
+     642                 :             :  * @error: (nullable): a `GError`
+     643                 :             :  *
+     644                 :             :  * Emits [signal@GObject.Object::notify] for
+     645                 :             :  * [property@Valent.Extension:plugin-state].
+     646                 :             :  *
+     647                 :             :  * Implementations should call this method to inform the managing object of
+     648                 :             :  * changes to the state of the extension, especially unrecoverable errors.
+     649                 :             :  *
+     650                 :             :  * Since: 1.0
+     651                 :             :  */
+     652                 :             : void
+     653                 :         496 : valent_extension_plugin_state_changed (ValentExtension   *extension,
+     654                 :             :                                        ValentPluginState  state,
+     655                 :             :                                        GError            *error)
+     656                 :             : {
+     657                 :         496 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (extension);
+     658                 :             : 
+     659         [ +  - ]:         496 :   g_return_if_fail (VALENT_IS_EXTENSION (extension));
+     660         [ -  + ]:         496 :   g_return_if_fail (state != VALENT_PLUGIN_STATE_ERROR || error != NULL);
+     661                 :             : 
+     662                 :         496 :   g_clear_error (&priv->plugin_error);
+     663                 :             : 
+     664         [ -  + ]:         496 :   if (state == VALENT_PLUGIN_STATE_ERROR && error != NULL)
+     665                 :           0 :     priv->plugin_error = g_error_copy (error);
+     666                 :             : 
+     667   [ +  +  -  + ]:         496 :   if (priv->plugin_state != state || priv->plugin_error != NULL)
+     668                 :             :     {
+     669                 :         286 :       priv->plugin_state = state;
+     670                 :         286 :       valent_object_notify_by_pspec (VALENT_OBJECT (extension),
+     671                 :             :                                      properties [PROP_PLUGIN_STATE]);
+     672                 :             :     }
+     673                 :             : }
+     674                 :             : 
+     675                 :             : /**
+     676                 :             :  * valent_extension_toggle_actions:
+     677                 :             :  * @extension: a `ValentExtension`
+     678                 :             :  * @enabled: boolean
+     679                 :             :  *
+     680                 :             :  * Enable or disable all actions.
+     681                 :             :  *
+     682                 :             :  * Set the [property@Gio.Action:enabled] property of the actions for @extension to
+     683                 :             :  * @enabled.
+     684                 :             :  *
+     685                 :             :  * Since: 1.0
+     686                 :             :  */
+     687                 :             : void
+     688                 :         237 : valent_extension_toggle_actions (ValentExtension *extension,
+     689                 :             :                                  gboolean         enabled)
+     690                 :             : {
+     691                 :         237 :   ValentExtensionPrivate *priv = valent_extension_get_instance_private (extension);
+     692                 :         237 :   GHashTableIter iter;
+     693                 :         237 :   GSimpleAction *action;
+     694                 :             : 
+     695         [ +  - ]:         237 :   g_return_if_fail (VALENT_IS_EXTENSION (extension));
+     696                 :             : 
+     697                 :         237 :   g_hash_table_iter_init (&iter, priv->actions);
+     698                 :             : 
+     699         [ +  + ]:         861 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&action))
+     700                 :         624 :     g_simple_action_set_enabled (action, enabled);
+     701                 :             : }
+     702                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-extension.h.func-c.html b/coverage/src/libvalent/core/valent-extension.h.func-c.html new file mode 100644 index 00000000000..5a045414934 --- /dev/null +++ b/coverage/src/libvalent/core/valent-extension.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-extension.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-extension.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_EXTENSION1893
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-extension.h.func.html b/coverage/src/libvalent/core/valent-extension.h.func.html new file mode 100644 index 00000000000..7983eac4d36 --- /dev/null +++ b/coverage/src/libvalent/core/valent-extension.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-extension.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-extension.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_EXTENSION1893
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-extension.h.gcov.html b/coverage/src/libvalent/core/valent-extension.h.gcov.html new file mode 100644 index 00000000000..2ce0797b9bb --- /dev/null +++ b/coverage/src/libvalent/core/valent-extension.h.gcov.html @@ -0,0 +1,155 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-extension.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-extension.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "valent-context.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentPluginState:
+      16                 :             :  * @VALENT_PLUGIN_STATE_ACTIVE: the plugin functionality is available
+      17                 :             :  * @VALENT_PLUGIN_STATE_INACTIVE: the plugin functionality is unavailable
+      18                 :             :  * @VALENT_PLUGIN_STATE_ERROR: the plugin encountered an unrecoverable error
+      19                 :             :  * Since: 1.0
+      20                 :             :  */
+      21                 :             : typedef enum
+      22                 :             : {
+      23                 :             :   VALENT_PLUGIN_STATE_ACTIVE,
+      24                 :             :   VALENT_PLUGIN_STATE_INACTIVE,
+      25                 :             :   VALENT_PLUGIN_STATE_ERROR,
+      26                 :             : } ValentPluginState;
+      27                 :             : 
+      28                 :             : 
+      29                 :             : #define VALENT_TYPE_EXTENSION (valent_extension_get_type ())
+      30                 :             : 
+      31                 :             : VALENT_AVAILABLE_IN_1_0
+      32   [ +  -  +  -  :        1901 : G_DECLARE_DERIVABLE_TYPE (ValentExtension, valent_extension, VALENT, EXTENSION, ValentObject)
+                   +  - ]
+      33                 :             : 
+      34                 :             : struct _ValentExtensionClass
+      35                 :             : {
+      36                 :             :   ValentObjectClass   parent_class;
+      37                 :             : 
+      38                 :             :   /* virtual functions */
+      39                 :             : 
+      40                 :             :   /*< private >*/
+      41                 :             :   gpointer            padding[8];
+      42                 :             : };
+      43                 :             : 
+      44                 :             : VALENT_AVAILABLE_IN_1_0
+      45                 :             : ValentContext     * valent_extension_get_context          (ValentExtension    *extension);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : gpointer            valent_extension_get_object           (ValentExtension    *extension);
+      48                 :             : VALENT_AVAILABLE_IN_1_0
+      49                 :             : GSettings         * valent_extension_get_settings         (ValentExtension    *extension);
+      50                 :             : VALENT_AVAILABLE_IN_1_0
+      51                 :             : ValentPluginState   valent_extension_plugin_state_check   (ValentExtension    *extension,
+      52                 :             :                                                            GError            **error);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : void                valent_extension_plugin_state_changed (ValentExtension    *extension,
+      55                 :             :                                                            ValentPluginState   state,
+      56                 :             :                                                            GError             *error);
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : void                valent_extension_toggle_actions       (ValentExtension    *extension,
+      59                 :             :                                                            gboolean            enabled);
+      60                 :             : 
+      61                 :             : G_END_DECLS
+      62                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-global.c.func-c.html b/coverage/src/libvalent/core/valent-global.c.func-c.html new file mode 100644 index 00000000000..4c46b815081 --- /dev/null +++ b/coverage/src/libvalent/core/valent-global.c.func-c.html @@ -0,0 +1,133 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-global.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-global.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.0 %5344
Test Date:2024-03-31 18:46:36Functions:100.0 %66
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %3417
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_get_user_directory12
valent_get_user_file13
valent_init_ctor86
valent_get_plugin_engine372
valent_get_main_thread3676
valent_timestamp_ms3734
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-global.c.func.html b/coverage/src/libvalent/core/valent-global.c.func.html new file mode 100644 index 00000000000..b39ba7c2804 --- /dev/null +++ b/coverage/src/libvalent/core/valent-global.c.func.html @@ -0,0 +1,133 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-global.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-global.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.0 %5344
Test Date:2024-03-31 18:46:36Functions:100.0 %66
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %3417
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_get_main_thread3676
valent_get_plugin_engine372
valent_get_user_directory12
valent_get_user_file13
valent_init_ctor86
valent_timestamp_ms3734
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-global.c.gcov.html b/coverage/src/libvalent/core/valent-global.c.gcov.html new file mode 100644 index 00000000000..2f78ee32ef8 --- /dev/null +++ b/coverage/src/libvalent/core/valent-global.c.gcov.html @@ -0,0 +1,319 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-global.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-global.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.0 %5344
Test Date:2024-03-31 18:46:36Functions:100.0 %66
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %3417
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-global"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <time.h>
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <libpeas.h>
+      12                 :             : #include <libportal/portal.h>
+      13                 :             : 
+      14                 :             : #include "valent-global.h"
+      15                 :             : #include "valent-version.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : static GThread *main_thread;
+      19                 :             : static PeasEngine *default_engine = NULL;
+      20                 :             : 
+      21                 :             : 
+      22                 :             : /*
+      23                 :             :  * libvalent Constructor
+      24                 :             :  */
+      25                 :             : #ifndef __has_attribute
+      26                 :             : # define __has_attribute(x) 0  /* Compatibility with non-clang compilers. */
+      27                 :             : #endif
+      28                 :             : #if __has_attribute(constructor)
+      29                 :             : static void __attribute__((constructor))
+      30                 :          86 : valent_init_ctor (void)
+      31                 :             : {
+      32                 :          86 :   main_thread = g_thread_self ();
+      33                 :          86 : }
+      34                 :             : #else
+      35                 :             : # error Your platform/compiler is missing constructor support
+      36                 :             : #endif
+      37                 :             : 
+      38                 :             : 
+      39                 :             : /**
+      40                 :             :  * valent_get_main_thread: (skip)
+      41                 :             :  *
+      42                 :             :  * Get the main thread.
+      43                 :             :  *
+      44                 :             :  * Use the macro `VALENT_IS_MAIN_THREAD()` to determine whether or not the code
+      45                 :             :  * is currently running on the main thread.
+      46                 :             :  *
+      47                 :             :  * Returns: (transfer none): a `GThread`
+      48                 :             :  *
+      49                 :             :  * Since: 1.0
+      50                 :             :  */
+      51                 :             : GThread *
+      52                 :        3676 : valent_get_main_thread (void)
+      53                 :             : {
+      54                 :        3676 :   return main_thread;
+      55                 :             : }
+      56                 :             : 
+      57                 :             : /**
+      58                 :             :  * valent_get_plugin_engine:
+      59                 :             :  *
+      60                 :             :  * Get the global `PeasEngine`.
+      61                 :             :  *
+      62                 :             :  * The first call to this function initializes the `PeasEngine` and adds
+      63                 :             :  * `resource:///plugins` to the search path, where embedded plugins should be
+      64                 :             :  * registered. If running in a Flatpak, `/app/extensions/lib/valent/plugins`
+      65                 :             :  * will also be added to the search path for Flatpak extensions.
+      66                 :             :  *
+      67                 :             :  * Returns: (transfer none): a `PeasEngine`
+      68                 :             :  *
+      69                 :             :  * Since: 1.0
+      70                 :             :  */
+      71                 :             : PeasEngine *
+      72                 :         372 : valent_get_plugin_engine (void)
+      73                 :             : {
+      74         [ +  + ]:         372 :   if (default_engine == NULL)
+      75                 :             :     {
+      76                 :          65 :       const char *loaders_env = NULL;
+      77                 :          65 :       unsigned int n_plugins = 0;
+      78                 :             : 
+      79                 :          65 :       default_engine = peas_engine_get_default ();
+      80                 :          65 :       g_object_add_weak_pointer (G_OBJECT (default_engine),
+      81                 :             :                                  (gpointer)&default_engine);
+      82                 :             : 
+      83                 :             :       /* Optional Loaders */
+      84                 :          65 :       loaders_env = g_getenv ("VALENT_PLUGIN_LOADERS");
+      85                 :             : 
+      86   [ -  +  -  - ]:          65 :       if (loaders_env != NULL && *loaders_env != '\0')
+      87                 :             :         {
+      88                 :          65 :           g_auto (GStrv) loaders = NULL;
+      89         [ #  # ]:           0 :           g_autoptr (GError) error = NULL;
+      90                 :             : 
+      91                 :           0 :           loaders = g_strsplit (loaders_env, ",", -1);
+      92                 :             : 
+      93         [ #  # ]:           0 :           if (g_strv_contains ((const char * const *)loaders, "python3"))
+      94                 :           0 :             peas_engine_enable_loader (default_engine, "python3");
+      95                 :             : 
+      96         [ #  # ]:           0 :           if (error != NULL)
+      97                 :             :             g_warning ("Disabling Python3 plugins: %s", error->message);
+      98                 :             :         }
+      99                 :             : 
+     100                 :             :       /* Default Paths */
+     101                 :          65 :       peas_engine_add_search_path (default_engine, "resource:///plugins", NULL);
+     102                 :             : 
+     103         [ -  + ]:          65 :       if (xdp_portal_running_under_flatpak ())
+     104                 :             :         {
+     105                 :           0 :           g_autofree char *flatpak_dir = NULL;
+     106                 :             : 
+     107                 :           0 :           flatpak_dir = g_build_filename ("/app", "extensions", "lib",
+     108                 :             :                                           "valent", "plugins", NULL);
+     109                 :           0 :           peas_engine_add_search_path (default_engine, flatpak_dir, NULL);
+     110                 :             :         }
+     111                 :             : 
+     112                 :             :       /* Load plugins in the default paths automatically */
+     113                 :          65 :       n_plugins = g_list_model_get_n_items (G_LIST_MODEL (default_engine));
+     114                 :             : 
+     115         [ +  + ]:         369 :       for (unsigned int i = 0; i < n_plugins; i++)
+     116                 :             :         {
+     117                 :         304 :           g_autoptr (PeasPluginInfo) info = NULL;
+     118                 :             : 
+     119                 :         304 :           info = g_list_model_get_item (G_LIST_MODEL (default_engine), i);
+     120         [ +  - ]:         304 :           peas_engine_load_plugin (default_engine, info);
+     121                 :             :         }
+     122                 :             :     }
+     123                 :             : 
+     124                 :         372 :   return default_engine;
+     125                 :             : }
+     126                 :             : 
+     127                 :             : /**
+     128                 :             :  * valent_get_user_directory:
+     129                 :             :  * @directory: a `GUserDirectory`
+     130                 :             :  *
+     131                 :             :  * Returns the full path of a special directory using its logical id.
+     132                 :             :  *
+     133                 :             :  * This function is a safe wrapper around [func@GLib.get_user_special_dir] that
+     134                 :             :  * always returns a valid path to an existing directory. The fallback path used
+     135                 :             :  * is the return value of [func@GLib.get_home_dir].
+     136                 :             :  *
+     137                 :             :  * Returns: (transfer none): the path to the specified special directory
+     138                 :             :  *
+     139                 :             :  * Since: 1.0
+     140                 :             :  */
+     141                 :             : const char *
+     142                 :          12 : valent_get_user_directory (GUserDirectory directory)
+     143                 :             : {
+     144                 :          12 :   const char *path = NULL;
+     145                 :             : 
+     146         [ +  - ]:          12 :   g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP &&
+     147                 :             :                         directory < G_USER_N_DIRECTORIES, NULL);
+     148                 :             : 
+     149         [ +  - ]:          12 :   if ((path = g_get_user_special_dir (directory)) == NULL)
+     150                 :          12 :     path = g_get_home_dir ();
+     151                 :             : 
+     152         [ -  + ]:          12 :   if (g_mkdir_with_parents (path, 0755) == -1)
+     153                 :           0 :     g_warning ("%s(): [%s]: %s", G_STRFUNC, path, g_strerror (errno));
+     154                 :             : 
+     155                 :             :   return path;
+     156                 :             : }
+     157                 :             : 
+     158                 :             : /**
+     159                 :             :  * valent_get_user_file:
+     160                 :             :  * @dirname: a directory path
+     161                 :             :  * @basename: (type filename): a file name
+     162                 :             :  * @unique: whether the resulting filepath should be unique
+     163                 :             :  *
+     164                 :             :  * A convenience for creating a [iface@Gio.File].
+     165                 :             :  *
+     166                 :             :  * If @unique is true, the returned file is guaranteed not to exist. If
+     167                 :             :  * @basename exists in @dirname, the resulting file's name will have a
+     168                 :             :  * parenthesized number appended to it (e.g. `image.png (2)`).
+     169                 :             :  *
+     170                 :             :  * Returns: (transfer full): a `GFile`
+     171                 :             :  *
+     172                 :             :  * Since: 1.0
+     173                 :             :  */
+     174                 :             : GFile *
+     175                 :          13 : valent_get_user_file (const char *dirname,
+     176                 :             :                       const char *basename,
+     177                 :             :                       gboolean    unique)
+     178                 :             : {
+     179                 :          26 :   g_autofree char *basepath = NULL;
+     180                 :          13 :   g_autofree char *filepath = NULL;
+     181                 :          13 :   unsigned int copy_num = 0;
+     182                 :             : 
+     183         [ +  - ]:          13 :   g_return_val_if_fail (dirname != NULL, NULL);
+     184         [ -  + ]:          13 :   g_return_val_if_fail (basename != NULL, NULL);
+     185                 :             : 
+     186                 :          13 :   basepath = g_build_filename (dirname, basename, NULL);
+     187         [ -  + ]:          13 :   filepath = g_strdup (basepath);
+     188                 :             : 
+     189                 :             :   /* If a unique path is requested, loop until we find a free name */
+     190   [ +  +  +  + ]:          19 :   while (unique && g_file_test (filepath, G_FILE_TEST_EXISTS))
+     191                 :             :     {
+     192                 :           6 :       g_free (filepath);
+     193                 :           6 :       filepath = g_strdup_printf ("%s (%d)", basepath, ++copy_num);
+     194                 :             :     }
+     195                 :             : 
+     196                 :          13 :   return g_file_new_for_path (filepath);
+     197                 :             : }
+     198                 :             : 
+     199                 :             : /**
+     200                 :             :  * valent_timestamp_ms:
+     201                 :             :  *
+     202                 :             :  * Get a current UNIX epoch timestamp in milliseconds.
+     203                 :             :  *
+     204                 :             :  * This timestamp format is used in several parts of the KDE Connect protocol.
+     205                 :             :  *
+     206                 :             :  * Returns: a 64-bit timestamp
+     207                 :             :  *
+     208                 :             :  * Since: 1.0
+     209                 :             :  */
+     210                 :             : int64_t
+     211                 :        3734 : valent_timestamp_ms (void)
+     212                 :             : {
+     213                 :             : #ifdef HAVE_CLOCK_GETTIME
+     214                 :        3734 :   struct timespec ts;
+     215                 :             : 
+     216                 :        3734 :   clock_gettime (CLOCK_REALTIME, &ts);
+     217                 :             : 
+     218                 :        3734 :   return (ts.tv_sec * 1000L) + ts.tv_nsec / 1000000L;
+     219                 :             : #else
+     220                 :             :   struct timeval tv;
+     221                 :             : 
+     222                 :             :   gettimeofday (&tv, NULL);
+     223                 :             : 
+     224                 :             :   return (tv.tv_sec * 1000L) + tv.tv_usec / 1000L;
+     225                 :             : #endif /* HAVE_CLOCK_GETTIME */
+     226                 :             : }
+     227                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-object.c.func-c.html b/coverage/src/libvalent/core/valent-object.c.func-c.html new file mode 100644 index 00000000000..15d53068338 --- /dev/null +++ b/coverage/src/libvalent/core/valent-object.c.func-c.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-object.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-object.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.7 %192176
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:59.8 %8249
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_object_get_property1
valent_object_notify1
valent_object_notify_main1
valent_object_finalizer_source_dispatch3
valent_object_in_destruction43
valent_object_class_init74
valent_object_chain_cancellable80
valent_object_ref_cancellable166
valent_object_destroy209
valent_object_notify_by_pspec387
valent_object_finalize1271
valent_object_constructed1383
valent_object_init1383
valent_object_set_property1383
valent_object_real_destroy1488
valent_object_dispose1489
valent_object_lock14254
valent_object_unlock14254
valent_object_get_type33316
valent_object_class_intern_init74
valent_object_get_type_once86
valent_object_get_type33156
valent_object_finalizer_source_check5505538
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-object.c.func.html b/coverage/src/libvalent/core/valent-object.c.func.html new file mode 100644 index 00000000000..e50ff77cc9c --- /dev/null +++ b/coverage/src/libvalent/core/valent-object.c.func.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-object.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-object.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.7 %192176
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:59.8 %8249
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_object_chain_cancellable80
valent_object_class_init74
valent_object_constructed1383
valent_object_destroy209
valent_object_dispose1489
valent_object_finalize1271
valent_object_finalizer_source_check5505538
valent_object_finalizer_source_dispatch3
valent_object_get_property1
valent_object_get_type33316
valent_object_class_intern_init74
valent_object_get_type33156
valent_object_get_type_once86
valent_object_in_destruction43
valent_object_init1383
valent_object_lock14254
valent_object_notify1
valent_object_notify_by_pspec387
valent_object_notify_main1
valent_object_real_destroy1488
valent_object_ref_cancellable166
valent_object_set_property1383
valent_object_unlock14254
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-object.c.gcov.html b/coverage/src/libvalent/core/valent-object.c.gcov.html new file mode 100644 index 00000000000..3581f179428 --- /dev/null +++ b/coverage/src/libvalent/core/valent-object.c.gcov.html @@ -0,0 +1,684 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-object.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-object.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.7 %192176
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:59.8 %8249
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: 2014-2019 Christian Hergert <chergert@redhat.com>
+       3                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       4                 :             : 
+       5                 :             : #define G_LOG_DOMAIN "valent-object"
+       6                 :             : 
+       7                 :             : #include "config.h"
+       8                 :             : 
+       9                 :             : #include "valent-debug.h"
+      10                 :             : #include "valent-macros.h"
+      11                 :             : #include "valent-object.h"
+      12                 :             : 
+      13                 :             : /**
+      14                 :             :  * ValentObject:
+      15                 :             :  *
+      16                 :             :  * A base class for objects.
+      17                 :             :  *
+      18                 :             :  * `ValentObject` is a specialized `GObject` class, based on GNOME Builder's
+      19                 :             :  * `IdeObject`. It provides a simple base class with helpers for working in
+      20                 :             :  * threads.
+      21                 :             :  *
+      22                 :             :  * Instances have a `GRecMutex` and a `GCancellable` that is created on demand by
+      23                 :             :  * valent_object_ref_cancellable() is called. When the object is destroyed, the
+      24                 :             :  * `GCancellable`::cancel signal is emitted.
+      25                 :             :  *
+      26                 :             :  * Since: 1.0
+      27                 :             :  */
+      28                 :             : 
+      29                 :             : typedef struct
+      30                 :             : {
+      31                 :             :   GRecMutex     mutex;
+      32                 :             :   GCancellable *cancellable;
+      33                 :             :   unsigned int  in_destruction : 1;
+      34                 :             :   unsigned int  destroyed : 1;
+      35                 :             : } ValentObjectPrivate;
+      36                 :             : 
+      37   [ +  +  +  - ]:       69336 : G_DEFINE_TYPE_WITH_PRIVATE (ValentObject, valent_object, G_TYPE_OBJECT)
+      38                 :             : 
+      39                 :             : enum {
+      40                 :             :   PROP_0,
+      41                 :             :   PROP_CANCELLABLE,
+      42                 :             :   N_PROPERTIES
+      43                 :             : };
+      44                 :             : 
+      45                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      46                 :             : 
+      47                 :             : enum {
+      48                 :             :   DESTROY,
+      49                 :             :   N_SIGNALS
+      50                 :             : };
+      51                 :             : 
+      52                 :             : static guint signals[N_SIGNALS] = { 0, };
+      53                 :             : 
+      54                 :             : 
+      55                 :             : static GQueue finalizer_queue = G_QUEUE_INIT;
+      56                 :             : static GMutex finalizer_mutex;
+      57                 :             : static GSource *finalizer_source;
+      58                 :             : 
+      59                 :             : static gboolean
+      60                 :     5505538 : valent_object_finalizer_source_check (GSource *source)
+      61                 :             : {
+      62                 :     5505538 :   return finalizer_queue.length > 0;
+      63                 :             : }
+      64                 :             : 
+      65                 :             : static gboolean
+      66                 :           3 : valent_object_finalizer_source_dispatch (GSource     *source,
+      67                 :             :                                          GSourceFunc  callback,
+      68                 :             :                                          gpointer     user_data)
+      69                 :             : {
+      70                 :           3 :   while (finalizer_queue.length)
+      71                 :             :     {
+      72         [ +  + ]:           6 :       g_autoptr (GObject) object = g_queue_pop_head (&finalizer_queue);
+      73         [ -  + ]:           3 :       g_object_run_dispose (object);
+      74                 :             :     }
+      75                 :             : 
+      76                 :           3 :   return G_SOURCE_CONTINUE;
+      77                 :             : }
+      78                 :             : 
+      79                 :             : static GSourceFuncs finalizer_source_funcs = {
+      80                 :             :   .check = valent_object_finalizer_source_check,
+      81                 :             :   .dispatch = valent_object_finalizer_source_dispatch,
+      82                 :             : };
+      83                 :             : 
+      84                 :             : 
+      85                 :             : static inline void
+      86                 :       16197 : valent_object_private_lock (ValentObjectPrivate *priv)
+      87                 :             : {
+      88                 :       16197 :   g_rec_mutex_lock (&priv->mutex);
+      89                 :       14254 : }
+      90                 :             : 
+      91                 :             : static inline void
+      92                 :       16197 : valent_object_private_unlock (ValentObjectPrivate *priv)
+      93                 :             : {
+      94                 :       16197 :   g_rec_mutex_unlock (&priv->mutex);
+      95                 :       14254 : }
+      96                 :             : 
+      97                 :             : /*
+      98                 :             :  * GObject.Object::notify
+      99                 :             :  */
+     100                 :             : typedef struct
+     101                 :             : {
+     102                 :             :   GRecMutex   mutex;
+     103                 :             :   GWeakRef    object;
+     104                 :             :   GParamSpec *pspec;
+     105                 :             :   char       *property_name;
+     106                 :             : } NotifyEmission;
+     107                 :             : 
+     108                 :             : static gboolean
+     109                 :           1 : valent_object_notify_main (gpointer data)
+     110                 :             : {
+     111                 :           1 :   NotifyEmission *emission = data;
+     112                 :           2 :   g_autoptr (GObject) object = NULL;
+     113                 :             : 
+     114         [ +  - ]:           1 :   g_assert (emission != NULL);
+     115                 :             : 
+     116                 :           1 :   g_rec_mutex_lock (&emission->mutex);
+     117         [ +  - ]:           1 :   if ((object = g_weak_ref_get (&emission->object)) != NULL)
+     118                 :             :     {
+     119         [ -  + ]:           1 :       if (emission->pspec != NULL)
+     120                 :           0 :         g_object_notify_by_pspec (object, emission->pspec);
+     121                 :             :       else
+     122                 :           1 :         g_object_notify (object, emission->property_name);
+     123                 :             :     }
+     124                 :             : 
+     125                 :           1 :   g_weak_ref_clear (&emission->object);
+     126         [ +  - ]:           1 :   g_clear_pointer (&emission->property_name, g_free);
+     127         [ -  + ]:           1 :   g_clear_pointer (&emission->pspec, g_param_spec_unref);
+     128                 :           1 :   g_rec_mutex_unlock (&emission->mutex);
+     129                 :           1 :   g_rec_mutex_clear (&emission->mutex);
+     130                 :           1 :   g_clear_pointer (&emission, g_free);
+     131                 :             : 
+     132         [ +  - ]:           1 :   return G_SOURCE_REMOVE;
+     133                 :             : }
+     134                 :             : 
+     135                 :             : /*
+     136                 :             :  * ValentObject
+     137                 :             :  */
+     138                 :             : static void
+     139                 :        1488 : valent_object_real_destroy (ValentObject *self)
+     140                 :             : {
+     141                 :        1488 :   ValentObjectPrivate *priv = valent_object_get_instance_private (self);
+     142                 :             : 
+     143         [ +  - ]:        1488 :   g_assert (VALENT_IS_OBJECT (self));
+     144                 :             : 
+     145                 :        1488 :   g_cancellable_cancel (priv->cancellable);
+     146                 :        1488 :   priv->destroyed = TRUE;
+     147                 :        1488 : }
+     148                 :             : 
+     149                 :             : /*
+     150                 :             :  * GObject
+     151                 :             :  */
+     152                 :             : static void
+     153                 :        1489 : valent_object_dispose (GObject *object)
+     154                 :             : {
+     155                 :        1489 :   ValentObject *self = VALENT_OBJECT (object);
+     156                 :        1489 :   ValentObjectPrivate *priv = valent_object_get_instance_private (self);
+     157                 :             : 
+     158         [ +  + ]:        1489 :   if (!VALENT_IS_MAIN_THREAD ())
+     159                 :             :     {
+     160                 :           1 :       g_mutex_lock (&finalizer_mutex);
+     161                 :           1 :       g_queue_push_tail (&finalizer_queue, g_object_ref (self));
+     162                 :           1 :       g_mutex_unlock (&finalizer_mutex);
+     163                 :           1 :       g_main_context_wakeup (NULL);
+     164                 :           1 :       return;
+     165                 :             :     }
+     166                 :             : 
+     167         [ +  - ]:        1488 :   g_assert (VALENT_IS_OBJECT (object));
+     168         [ -  + ]:        1488 :   g_assert (VALENT_IS_MAIN_THREAD ());
+     169                 :             : 
+     170                 :        1488 :   valent_object_private_lock (priv);
+     171         [ +  - ]:        1488 :   if (!priv->in_destruction)
+     172                 :             :     {
+     173                 :        1488 :       priv->in_destruction = TRUE;
+     174                 :        1488 :       g_signal_emit (self, signals [DESTROY], 0);
+     175                 :        1488 :       priv->in_destruction = FALSE;
+     176                 :             :     }
+     177                 :        1488 :   valent_object_private_unlock (priv);
+     178                 :             : 
+     179                 :        1488 :   G_OBJECT_CLASS (valent_object_parent_class)->dispose (object);
+     180                 :             : }
+     181                 :             : 
+     182                 :             : static void
+     183                 :        1383 : valent_object_constructed (GObject *object)
+     184                 :             : {
+     185         [ -  + ]:        1383 :   if G_UNLIKELY (G_OBJECT_GET_CLASS (object)->dispose != valent_object_dispose)
+     186                 :             :     {
+     187                 :           0 :       V_GNUC_BEGIN_IGNORE_INFINITE_LOOP;
+     188                 :           0 :       g_error ("%s overrides GObject.Object.dispose() instead of "
+     189                 :             :                "Valent.Object.destroy(), which is not thread safe",
+     190                 :             :                G_OBJECT_TYPE_NAME (object));
+     191                 :        1383 :       V_GNUC_END_IGNORE_INFINITE_LOOP;
+     192                 :             :     }
+     193                 :             : 
+     194                 :        1383 :   G_OBJECT_CLASS (valent_object_parent_class)->constructed (object);
+     195                 :        1383 : }
+     196                 :             : 
+     197                 :             : static void
+     198                 :        1271 : valent_object_finalize (GObject *object)
+     199                 :             : {
+     200                 :        1271 :   ValentObject *self = VALENT_OBJECT (object);
+     201                 :        1271 :   ValentObjectPrivate *priv = valent_object_get_instance_private (self);
+     202                 :             : 
+     203         [ +  + ]:        1271 :   g_clear_object (&priv->cancellable);
+     204                 :        1271 :   g_rec_mutex_clear (&priv->mutex);
+     205                 :             : 
+     206                 :        1271 :   G_OBJECT_CLASS (valent_object_parent_class)->finalize (object);
+     207                 :        1271 : }
+     208                 :             : 
+     209                 :             : static void
+     210                 :           1 : valent_object_get_property (GObject    *object,
+     211                 :             :                             guint       prop_id,
+     212                 :             :                             GValue     *value,
+     213                 :             :                             GParamSpec *pspec)
+     214                 :             : {
+     215                 :           1 :   ValentObject *self = VALENT_OBJECT (object);
+     216                 :             : 
+     217         [ +  - ]:           1 :   switch (prop_id)
+     218                 :             :     {
+     219                 :           1 :     case PROP_CANCELLABLE:
+     220                 :           1 :       g_value_take_object (value, valent_object_ref_cancellable (self));
+     221                 :           1 :       break;
+     222                 :             : 
+     223                 :           0 :     default:
+     224                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     225                 :             :     }
+     226                 :           1 : }
+     227                 :             : 
+     228                 :             : static void
+     229                 :        1383 : valent_object_set_property (GObject      *object,
+     230                 :             :                             guint         prop_id,
+     231                 :             :                             const GValue *value,
+     232                 :             :                             GParamSpec   *pspec)
+     233                 :             : {
+     234                 :        1383 :   ValentObject *self = VALENT_OBJECT (object);
+     235                 :        1383 :   ValentObjectPrivate *priv = valent_object_get_instance_private (self);
+     236                 :             : 
+     237         [ +  - ]:        1383 :   switch (prop_id)
+     238                 :             :     {
+     239                 :        1383 :     case PROP_CANCELLABLE:
+     240                 :        1383 :       priv->cancellable = g_value_dup_object (value);
+     241                 :        1383 :       break;
+     242                 :             : 
+     243                 :           0 :     default:
+     244                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     245                 :             :     }
+     246                 :        1383 : }
+     247                 :             : 
+     248                 :             : static void
+     249                 :          74 : valent_object_class_init (ValentObjectClass *klass)
+     250                 :             : {
+     251                 :          74 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     252                 :             : 
+     253                 :          74 :   object_class->constructed = valent_object_constructed;
+     254                 :          74 :   object_class->dispose = valent_object_dispose;
+     255                 :          74 :   object_class->finalize = valent_object_finalize;
+     256                 :          74 :   object_class->get_property = valent_object_get_property;
+     257                 :          74 :   object_class->set_property = valent_object_set_property;
+     258                 :             : 
+     259                 :          74 :   klass->destroy = valent_object_real_destroy;
+     260                 :             : 
+     261                 :             :   /**
+     262                 :             :    * ValentObject:cancellable: (getter ref_cancellable)
+     263                 :             :    *
+     264                 :             :    * The object [class@Gio.Cancellable].
+     265                 :             :    *
+     266                 :             :    * A `GCancellable` that can be used by operations that should be cancelled
+     267                 :             :    * when the object is destroyed (i.e. enters disposal).
+     268                 :             :    *
+     269                 :             :    * Since: 1.0
+     270                 :             :    */
+     271                 :         148 :   properties [PROP_CANCELLABLE] =
+     272                 :          74 :     g_param_spec_object ("cancellable", NULL, NULL,
+     273                 :             :                          G_TYPE_CANCELLABLE,
+     274                 :             :                          (G_PARAM_READWRITE |
+     275                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     276                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     277                 :             :                           G_PARAM_STATIC_STRINGS));
+     278                 :             : 
+     279                 :          74 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     280                 :             : 
+     281                 :             :   /**
+     282                 :             :    * ValentObject::destroy:
+     283                 :             :    *
+     284                 :             :    * Emitted when the object is being destroyed.
+     285                 :             :    *
+     286                 :             :    * This signal is emitted when the object enters disposal and always on the
+     287                 :             :    * main thread, with the object lock acquired. Note that you must still drop
+     288                 :             :    * any references you hold to avoid leaking memory.
+     289                 :             :    *
+     290                 :             :    * Implementations must override [vfunc@Valent.Object.destroy] instead of
+     291                 :             :    * [vfunc@GObject.Object.dispose] to ensure the instance is finalized on the
+     292                 :             :    * main thread.
+     293                 :             :    *
+     294                 :             :    * Since: 1.0
+     295                 :             :    */
+     296                 :         148 :   signals [DESTROY] =
+     297                 :          74 :     g_signal_new ("destroy",
+     298                 :             :                   G_TYPE_FROM_CLASS (klass),
+     299                 :             :                   (G_SIGNAL_RUN_CLEANUP |
+     300                 :             :                    G_SIGNAL_NO_RECURSE |
+     301                 :             :                    G_SIGNAL_NO_HOOKS),
+     302                 :             :                   G_STRUCT_OFFSET (ValentObjectClass, destroy),
+     303                 :             :                   NULL, NULL,
+     304                 :             :                   g_cclosure_marshal_VOID__VOID,
+     305                 :             :                   G_TYPE_NONE, 0);
+     306                 :          74 :   g_signal_set_va_marshaller (signals [DESTROY],
+     307                 :             :                               G_TYPE_FROM_CLASS (klass),
+     308                 :             :                               g_cclosure_marshal_VOID__VOIDv);
+     309                 :             : 
+     310                 :             :   /* Setup the finalizer in main thread to receive off-thread objects */
+     311                 :          74 :   finalizer_source = g_source_new (&finalizer_source_funcs, sizeof (GSource));
+     312                 :          74 :   g_source_set_static_name (finalizer_source, "[valent-object-finalizer]");
+     313                 :          74 :   g_source_set_priority (finalizer_source, G_MAXINT);
+     314                 :          74 :   g_source_attach (finalizer_source, NULL);
+     315                 :          74 : }
+     316                 :             : 
+     317                 :             : static void
+     318                 :        1383 : valent_object_init (ValentObject *self)
+     319                 :             : {
+     320                 :        1383 :   ValentObjectPrivate *priv = valent_object_get_instance_private (self);
+     321                 :             : 
+     322                 :        1383 :   g_rec_mutex_init (&priv->mutex);
+     323                 :        1383 : }
+     324                 :             : 
+     325                 :             : /**
+     326                 :             :  * valent_object_lock:
+     327                 :             :  * @object: a `ValentObject`
+     328                 :             :  *
+     329                 :             :  * Acquire a lock on @object.
+     330                 :             :  *
+     331                 :             :  * Call [method@Valent.Object.unlock] to release the lock.
+     332                 :             :  *
+     333                 :             :  * Since: 1.0
+     334                 :             :  */
+     335                 :             : void
+     336                 :       14254 : valent_object_lock (ValentObject *object)
+     337                 :             : {
+     338                 :       14254 :   ValentObjectPrivate *priv = valent_object_get_instance_private (object);
+     339                 :             : 
+     340         [ +  - ]:       14254 :   g_return_if_fail (VALENT_IS_OBJECT (object));
+     341                 :             : 
+     342                 :       14254 :   valent_object_private_lock (priv);
+     343                 :             : }
+     344                 :             : 
+     345                 :             : /**
+     346                 :             :  * valent_object_unlock:
+     347                 :             :  * @object: a `ValentObject`
+     348                 :             :  *
+     349                 :             :  * Release a lock on @object.
+     350                 :             :  *
+     351                 :             :  * The lock must have previously been acquired by [method@Valent.Object.lock].
+     352                 :             :  *
+     353                 :             :  * Since: 1.0
+     354                 :             :  */
+     355                 :             : void
+     356                 :       14254 : valent_object_unlock (ValentObject *object)
+     357                 :             : {
+     358                 :       14254 :   ValentObjectPrivate *priv = valent_object_get_instance_private (object);
+     359                 :             : 
+     360         [ +  - ]:       14254 :   g_return_if_fail (VALENT_IS_OBJECT (object));
+     361                 :             : 
+     362                 :       14254 :   valent_object_private_unlock (priv);
+     363                 :             : }
+     364                 :             : 
+     365                 :             : /**
+     366                 :             :  * valent_object_ref_cancellable:
+     367                 :             :  * @object: a `ValentObject`
+     368                 :             :  *
+     369                 :             :  * Get a [class@Gio.Cancellable] for the object.
+     370                 :             :  *
+     371                 :             :  * Returns: (transfer full) (not nullable): @object's `GCancellable`
+     372                 :             :  *
+     373                 :             :  * Since: 1.0
+     374                 :             :  */
+     375                 :             : GCancellable *
+     376                 :         166 : valent_object_ref_cancellable (ValentObject *object)
+     377                 :             : {
+     378                 :         166 :   ValentObjectPrivate *priv = valent_object_get_instance_private (object);
+     379                 :         166 :   GCancellable *ret;
+     380                 :             : 
+     381         [ +  - ]:         166 :   g_return_val_if_fail (VALENT_IS_OBJECT (object), NULL);
+     382                 :             : 
+     383                 :         166 :   valent_object_private_lock (priv);
+     384         [ +  + ]:         166 :   if (priv->cancellable == NULL)
+     385                 :          57 :     priv->cancellable = g_cancellable_new ();
+     386                 :         166 :   ret = g_object_ref (priv->cancellable);
+     387                 :         166 :   valent_object_private_unlock (priv);
+     388                 :             : 
+     389                 :         166 :   return g_steal_pointer (&ret);
+     390                 :             : }
+     391                 :             : 
+     392                 :             : /**
+     393                 :             :  * valent_object_chain_cancellable:
+     394                 :             :  * @object: a `ValentObject`
+     395                 :             :  * @cancellable: (nullable): a `GCancellable`
+     396                 :             :  *
+     397                 :             :  * Chain a cancellable to the object's cancellable.
+     398                 :             :  *
+     399                 :             :  * This connects @cancellable to @objects's [signal@Gio.Cancellable::cancelled]
+     400                 :             :  * so that if @object is destroyed, @cancellable will be cancelled. If
+     401                 :             :  * @cancellable is %NULL, this method will return a new reference to
+     402                 :             :  * [property@Valent.Object:cancellable], otherwise it returns a new reference to
+     403                 :             :  * @cancellable.
+     404                 :             :  *
+     405                 :             :  * Typically the returned [class@Gio.Cancellable] is passed to an internal
+     406                 :             :  * asynchronous operation, to ensure it is cancelled if @cancellable is
+     407                 :             :  * triggered or @object is destroyed.
+     408                 :             :  *
+     409                 :             :  * Returns: (transfer full) (not nullable): a `GCancellable`
+     410                 :             :  *
+     411                 :             :  * Since: 1.0
+     412                 :             :  */
+     413                 :             : GCancellable *
+     414                 :          80 : valent_object_chain_cancellable (ValentObject *object,
+     415                 :             :                                  GCancellable *cancellable)
+     416                 :             : {
+     417                 :          80 :   ValentObjectPrivate *priv = valent_object_get_instance_private (object);
+     418                 :          80 :   GCancellable *ret;
+     419                 :             : 
+     420         [ +  - ]:          80 :   g_return_val_if_fail (VALENT_IS_OBJECT (object), NULL);
+     421   [ +  +  +  -  :          80 :   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
+             -  +  -  - ]
+     422                 :             : 
+     423                 :          80 :   valent_object_private_lock (priv);
+     424         [ +  + ]:          80 :   if (priv->cancellable == NULL)
+     425                 :          76 :     priv->cancellable = g_cancellable_new ();
+     426                 :             : 
+     427         [ +  + ]:          80 :   if (cancellable != NULL)
+     428                 :             :     {
+     429                 :          59 :       g_signal_connect_object (priv->cancellable,
+     430                 :             :                                "cancelled",
+     431                 :             :                                G_CALLBACK (g_cancellable_cancel),
+     432                 :             :                                cancellable,
+     433                 :             :                                G_CONNECT_SWAPPED);
+     434                 :          59 :       ret = g_object_ref (cancellable);
+     435                 :             :     }
+     436                 :             :   else
+     437                 :             :     {
+     438                 :          21 :       ret = g_object_ref (priv->cancellable);
+     439                 :             :     }
+     440                 :          80 :   valent_object_private_unlock (priv);
+     441                 :             : 
+     442                 :          80 :   return g_steal_pointer (&ret);
+     443                 :             : }
+     444                 :             : 
+     445                 :             : /**
+     446                 :             :  * valent_object_destroy:
+     447                 :             :  * @object: a `ValentObject`
+     448                 :             :  *
+     449                 :             :  * Destroy the object.
+     450                 :             :  *
+     451                 :             :  * If called from the main thread, it calls [method@GObject.Object.run_dispose],
+     452                 :             :  * which activates the object [class@Gio.Cancellable] and emits
+     453                 :             :  * [signal@Valent.Object::destroy].
+     454                 :             :  *
+     455                 :             :  * If called from another thread, an idle source will be added to invoke it on
+     456                 :             :  * the main thread.
+     457                 :             :  *
+     458                 :             :  * Since: 1.0
+     459                 :             :  */
+     460                 :             : void
+     461                 :         209 : valent_object_destroy (ValentObject *object)
+     462                 :             : {
+     463                 :         209 :   ValentObjectPrivate *priv = valent_object_get_instance_private (object);
+     464                 :             : 
+     465         [ +  - ]:         209 :   g_return_if_fail (VALENT_IS_OBJECT (object));
+     466                 :             : 
+     467                 :         209 :   g_object_ref (object);
+     468                 :         209 :   valent_object_private_lock (priv);
+     469                 :             : 
+     470         [ +  + ]:         209 :   if (VALENT_IS_MAIN_THREAD ())
+     471                 :             :     {
+     472                 :         207 :       g_cancellable_cancel (priv->cancellable);
+     473                 :             : 
+     474         [ +  - ]:         207 :       if (!priv->in_destruction && !priv->destroyed)
+     475                 :         207 :         g_object_run_dispose (G_OBJECT (object));
+     476                 :             :     }
+     477                 :             :   else
+     478                 :             :     {
+     479                 :           2 :       g_mutex_lock (&finalizer_mutex);
+     480                 :           2 :       g_queue_push_tail (&finalizer_queue, g_object_ref (object));
+     481                 :           2 :       g_mutex_unlock (&finalizer_mutex);
+     482                 :             :     }
+     483                 :             : 
+     484                 :         209 :   valent_object_private_unlock (priv);
+     485                 :         209 :   g_object_unref (object);
+     486                 :             : }
+     487                 :             : 
+     488                 :             : /**
+     489                 :             :  * valent_object_in_destruction:
+     490                 :             :  * @object: a `ValentObject`
+     491                 :             :  *
+     492                 :             :  * Get whether the object is destroyed or in destruction.
+     493                 :             :  *
+     494                 :             :  * Returns: %TRUE if destroyed, or %FALSE if not
+     495                 :             :  *
+     496                 :             :  * Since: 1.0
+     497                 :             :  */
+     498                 :             : gboolean
+     499                 :          43 : valent_object_in_destruction (ValentObject *object)
+     500                 :             : {
+     501                 :          43 :   ValentObjectPrivate *priv = valent_object_get_instance_private (object);
+     502                 :          43 :   gboolean ret;
+     503                 :             : 
+     504         [ +  - ]:          43 :   g_return_val_if_fail (VALENT_IS_OBJECT (object), FALSE);
+     505                 :             : 
+     506                 :          43 :   valent_object_lock (object);
+     507                 :          43 :   ret = priv->in_destruction || priv->destroyed;
+     508                 :          43 :   valent_object_unlock (object);
+     509                 :             : 
+     510                 :          43 :   return ret;
+     511                 :             : }
+     512                 :             : 
+     513                 :             : /**
+     514                 :             :  * valent_object_notify:
+     515                 :             :  * @object: a `ValentObject`
+     516                 :             :  * @property_name: a property name
+     517                 :             :  *
+     518                 :             :  * Emit [signal@GObject.Object::notify] on @object, on the main thread.
+     519                 :             :  *
+     520                 :             :  * Like [method@GObject.Object.notify] if the caller is in the main thread,
+     521                 :             :  * otherwise the invocation is deferred to the main thread.
+     522                 :             :  *
+     523                 :             :  * Since: 1.0
+     524                 :             :  */
+     525                 :             : void
+     526                 :           1 : valent_object_notify (ValentObject *object,
+     527                 :             :                       const char   *property_name)
+     528                 :             : {
+     529                 :           1 :   NotifyEmission *emission = NULL;
+     530                 :             : 
+     531         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_OBJECT (object));
+     532         [ -  + ]:           1 :   g_return_if_fail (property_name != NULL);
+     533                 :             : 
+     534         [ +  - ]:           1 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+     535                 :             :     {
+     536                 :           0 :       g_object_notify (G_OBJECT (object), property_name);
+     537                 :           0 :       return;
+     538                 :             :     }
+     539                 :             : 
+     540                 :           1 :   emission = g_new0 (NotifyEmission, 1);
+     541                 :           1 :   g_rec_mutex_init (&emission->mutex);
+     542                 :           1 :   g_rec_mutex_lock (&emission->mutex);
+     543                 :           1 :   g_weak_ref_init (&emission->object, object);
+     544         [ -  + ]:           1 :   emission->property_name = g_strdup (property_name);
+     545                 :           1 :   g_rec_mutex_unlock (&emission->mutex);
+     546                 :             : 
+     547                 :           1 :   g_idle_add_full (G_PRIORITY_DEFAULT,
+     548                 :             :                    valent_object_notify_main,
+     549                 :             :                    g_steal_pointer (&emission),
+     550                 :             :                    NULL);
+     551                 :             : }
+     552                 :             : 
+     553                 :             : /**
+     554                 :             :  * valent_object_notify_by_pspec:
+     555                 :             :  * @object: a `ValentObject`
+     556                 :             :  * @pspec: a `GParamSpec`
+     557                 :             :  *
+     558                 :             :  * Emit [signal@GObject.Object::notify] on @object, on the main thread.
+     559                 :             :  *
+     560                 :             :  * Like [method@GObject.Object.notify_by_pspec] if the caller is in the main
+     561                 :             :  * thread, otherwise the invocation is deferred to the main thread.
+     562                 :             :  *
+     563                 :             :  * Since: 1.0
+     564                 :             :  */
+     565                 :             : void
+     566                 :         387 : valent_object_notify_by_pspec (ValentObject *object,
+     567                 :             :                                GParamSpec   *pspec)
+     568                 :             : {
+     569                 :         387 :   NotifyEmission *emission = NULL;
+     570                 :             : 
+     571         [ +  - ]:         387 :   g_return_if_fail (VALENT_IS_OBJECT (object));
+     572         [ -  + ]:         387 :   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+     573                 :             : 
+     574         [ -  + ]:         387 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+     575                 :             :     {
+     576                 :         387 :       g_object_notify_by_pspec (G_OBJECT (object), pspec);
+     577                 :         387 :       return;
+     578                 :             :     }
+     579                 :             : 
+     580                 :           0 :   emission = g_new0 (NotifyEmission, 1);
+     581                 :           0 :   g_rec_mutex_init (&emission->mutex);
+     582                 :           0 :   g_rec_mutex_lock (&emission->mutex);
+     583                 :           0 :   g_weak_ref_init (&emission->object, object);
+     584                 :           0 :   emission->pspec = g_param_spec_ref (pspec);
+     585                 :           0 :   g_rec_mutex_unlock (&emission->mutex);
+     586                 :             : 
+     587                 :           0 :   g_idle_add_full (G_PRIORITY_DEFAULT,
+     588                 :             :                    valent_object_notify_main,
+     589                 :             :                    g_steal_pointer (&emission),
+     590                 :             :                    NULL);
+     591                 :             : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-object.h.func-c.html b/coverage/src/libvalent/core/valent-object.h.func-c.html new file mode 100644 index 00000000000..40705a56249 --- /dev/null +++ b/coverage/src/libvalent/core/valent-object.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-object.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-object.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_OBJECT32370
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-object.h.func.html b/coverage/src/libvalent/core/valent-object.h.func.html new file mode 100644 index 00000000000..b74f3d10394 --- /dev/null +++ b/coverage/src/libvalent/core/valent-object.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-object.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-object.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_OBJECT32370
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-object.h.gcov.html b/coverage/src/libvalent/core/valent-object.h.gcov.html new file mode 100644 index 00000000000..bdb369a6c42 --- /dev/null +++ b/coverage/src/libvalent/core/valent-object.h.gcov.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-object.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-object.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: 2014-2019 Christian Hergert <chergert@redhat.com>
+       3                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       4                 :             : 
+       5                 :             : #pragma once
+       6                 :             : 
+       7                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       8                 :             : # error "Only <valent.h> can be included directly."
+       9                 :             : #endif
+      10                 :             : 
+      11                 :             : #include <gio/gio.h>
+      12                 :             : 
+      13                 :             : #include "valent-version.h"
+      14                 :             : 
+      15                 :             : G_BEGIN_DECLS
+      16                 :             : 
+      17                 :             : #define VALENT_TYPE_OBJECT (valent_object_get_type())
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20   [ +  -  +  -  :       32843 : G_DECLARE_DERIVABLE_TYPE (ValentObject, valent_object, VALENT, OBJECT, GObject)
+                   +  + ]
+      21                 :             : 
+      22                 :             : struct _ValentObjectClass
+      23                 :             : {
+      24                 :             :   GObjectClass   parent_class;
+      25                 :             : 
+      26                 :             :   /* signals */
+      27                 :             :   void           (*destroy)     (ValentObject *object);
+      28                 :             : 
+      29                 :             :   /*< private >*/
+      30                 :             :   gpointer       padding[8];
+      31                 :             : };
+      32                 :             : 
+      33                 :             : VALENT_AVAILABLE_IN_1_0
+      34                 :             : void           valent_object_lock              (ValentObject *object);
+      35                 :             : VALENT_AVAILABLE_IN_1_0
+      36                 :             : void           valent_object_unlock            (ValentObject *object);
+      37                 :             : VALENT_AVAILABLE_IN_1_0
+      38                 :             : GCancellable * valent_object_ref_cancellable   (ValentObject *object);
+      39                 :             : VALENT_AVAILABLE_IN_1_0
+      40                 :             : GCancellable * valent_object_chain_cancellable (ValentObject *object,
+      41                 :             :                                                 GCancellable *cancellable);
+      42                 :             : VALENT_AVAILABLE_IN_1_0
+      43                 :             : void           valent_object_destroy           (ValentObject *object);
+      44                 :             : VALENT_AVAILABLE_IN_1_0
+      45                 :             : gboolean       valent_object_in_destruction    (ValentObject *object);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : void           valent_object_notify            (ValentObject *object,
+      48                 :             :                                                 const char   *property_name);
+      49                 :             : VALENT_AVAILABLE_IN_1_0
+      50                 :             : void           valent_object_notify_by_pspec   (ValentObject *object,
+      51                 :             :                                                 GParamSpec   *pspec);
+      52                 :             : 
+      53                 :             : G_END_DECLS
+      54                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-transfer.c.func-c.html b/coverage/src/libvalent/core/valent-transfer.c.func-c.html new file mode 100644 index 00000000000..bc5a5687f47 --- /dev/null +++ b/coverage/src/libvalent/core/valent-transfer.c.func-c.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-transfer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-transfer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:72.8 %158115
Test Date:2024-03-31 18:46:36Functions:82.4 %1714
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.4 %8536
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_transfer_cancel0
valent_transfer_check_status0
valent_transfer_get_progress0
valent_transfer_class_init7
valent_transfer_finalize30
valent_transfer_get_state30
valent_transfer_execute_cb33
valent_transfer_execute_finish33
valent_transfer_set_progress33
valent_transfer_execute34
valent_transfer_init34
valent_transfer_set_property34
valent_transfer_dup_id38
valent_transfer_get_property40
valent_transfer_get_type543
valent_transfer_class_intern_init7
valent_transfer_get_type_once86
valent_transfer_get_type450
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-transfer.c.func.html b/coverage/src/libvalent/core/valent-transfer.c.func.html new file mode 100644 index 00000000000..47ad0a7c3be --- /dev/null +++ b/coverage/src/libvalent/core/valent-transfer.c.func.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-transfer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-transfer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:72.8 %158115
Test Date:2024-03-31 18:46:36Functions:82.4 %1714
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.4 %8536
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_transfer_cancel0
valent_transfer_check_status0
valent_transfer_class_init7
valent_transfer_dup_id38
valent_transfer_execute34
valent_transfer_execute_cb33
valent_transfer_execute_finish33
valent_transfer_finalize30
valent_transfer_get_progress0
valent_transfer_get_property40
valent_transfer_get_state30
valent_transfer_get_type543
valent_transfer_class_intern_init7
valent_transfer_get_type450
valent_transfer_get_type_once86
valent_transfer_init34
valent_transfer_set_progress33
valent_transfer_set_property34
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-transfer.c.gcov.html b/coverage/src/libvalent/core/valent-transfer.c.gcov.html new file mode 100644 index 00000000000..6f38c98fbb9 --- /dev/null +++ b/coverage/src/libvalent/core/valent-transfer.c.gcov.html @@ -0,0 +1,635 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-transfer.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-transfer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:72.8 %158115
Test Date:2024-03-31 18:46:36Functions:82.4 %1714
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.4 %8536
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-transfer"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : 
+      10                 :             : #include "valent-core-enums.h"
+      11                 :             : #include "valent-debug.h"
+      12                 :             : #include "valent-macros.h"
+      13                 :             : #include "valent-object.h"
+      14                 :             : #include "valent-transfer.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentTransfer:
+      19                 :             :  *
+      20                 :             :  * An abstract base class for data transfers.
+      21                 :             :  *
+      22                 :             :  * `ValentTransfer` is a generic class for transfers.
+      23                 :             :  *
+      24                 :             :  * Since: 1.0
+      25                 :             :  */
+      26                 :             : 
+      27                 :             : typedef struct
+      28                 :             : {
+      29                 :             :   GError              *error;
+      30                 :             :   char                *id;
+      31                 :             :   double               progress;
+      32                 :             :   ValentTransferState  state;
+      33                 :             : } ValentTransferPrivate;
+      34                 :             : 
+      35   [ +  +  +  - ]:         775 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentTransfer, valent_transfer, VALENT_TYPE_OBJECT)
+      36                 :             : 
+      37                 :             : 
+      38                 :             : enum {
+      39                 :             :   PROP_0,
+      40                 :             :   PROP_ID,
+      41                 :             :   PROP_PROGRESS,
+      42                 :             :   PROP_STATE,
+      43                 :             :   N_PROPERTIES
+      44                 :             : };
+      45                 :             : 
+      46                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      47                 :             : 
+      48                 :             : 
+      49                 :             : /* LCOV_EXCL_START */
+      50                 :             : static void
+      51                 :             : valent_transfer_real_execute (ValentTransfer      *transfer,
+      52                 :             :                               GCancellable        *cancellable,
+      53                 :             :                               GAsyncReadyCallback  callback,
+      54                 :             :                               gpointer             user_data)
+      55                 :             : {
+      56                 :             :   g_assert (VALENT_IS_TRANSFER (transfer));
+      57                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+      58                 :             : 
+      59                 :             :   g_task_report_new_error (transfer, callback, user_data,
+      60                 :             :                            valent_transfer_real_execute,
+      61                 :             :                            G_IO_ERROR,
+      62                 :             :                            G_IO_ERROR_NOT_SUPPORTED,
+      63                 :             :                            "%s does not implement execute()",
+      64                 :             :                            G_OBJECT_TYPE_NAME (transfer));
+      65                 :             : }
+      66                 :             : 
+      67                 :             : static gboolean
+      68                 :             : valent_transfer_real_execute_finish (ValentTransfer  *transfer,
+      69                 :             :                                      GAsyncResult    *result,
+      70                 :             :                                      GError         **error)
+      71                 :             : {
+      72                 :             :   g_assert (VALENT_IS_TRANSFER (transfer));
+      73                 :             :   g_assert (g_task_is_valid (result, transfer));
+      74                 :             :   g_assert (error == NULL || *error == NULL);
+      75                 :             : 
+      76                 :             :   return g_task_propagate_boolean (G_TASK (result), error);
+      77                 :             : }
+      78                 :             : /* LCOV_EXCL_STOP */
+      79                 :             : 
+      80                 :             : /*
+      81                 :             :  * GObject
+      82                 :             :  */
+      83                 :             : static void
+      84                 :          30 : valent_transfer_finalize (GObject *object)
+      85                 :             : {
+      86                 :          30 :   ValentTransfer *self = VALENT_TRANSFER (object);
+      87                 :          30 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (self);
+      88                 :             : 
+      89                 :          30 :   valent_object_lock (VALENT_OBJECT (self));
+      90                 :          30 :   g_clear_error (&priv->error);
+      91         [ +  + ]:          30 :   g_clear_pointer (&priv->id, g_free);
+      92                 :          30 :   valent_object_unlock (VALENT_OBJECT (self));
+      93                 :             : 
+      94                 :          30 :   G_OBJECT_CLASS (valent_transfer_parent_class)->finalize (object);
+      95                 :          30 : }
+      96                 :             : 
+      97                 :             : static void
+      98                 :          40 : valent_transfer_get_property (GObject    *object,
+      99                 :             :                               guint       prop_id,
+     100                 :             :                               GValue     *value,
+     101                 :             :                               GParamSpec *pspec)
+     102                 :             : {
+     103                 :          40 :   ValentTransfer *self = VALENT_TRANSFER (object);
+     104                 :             : 
+     105   [ +  -  +  - ]:          40 :   switch (prop_id)
+     106                 :             :     {
+     107                 :          20 :     case PROP_ID:
+     108                 :          20 :       g_value_take_string (value, valent_transfer_dup_id (self));
+     109                 :          20 :       break;
+     110                 :             : 
+     111                 :           0 :     case PROP_PROGRESS:
+     112                 :           0 :       g_value_set_double (value, valent_transfer_get_progress (self));
+     113                 :           0 :       break;
+     114                 :             : 
+     115                 :          20 :     case PROP_STATE:
+     116                 :          20 :       g_value_set_enum (value, valent_transfer_get_state (self));
+     117                 :          20 :       break;
+     118                 :             : 
+     119                 :           0 :     default:
+     120                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     121                 :             :     }
+     122                 :          40 : }
+     123                 :             : 
+     124                 :             : static void
+     125                 :          34 : valent_transfer_set_property (GObject      *object,
+     126                 :             :                               guint         prop_id,
+     127                 :             :                               const GValue *value,
+     128                 :             :                               GParamSpec   *pspec)
+     129                 :             : {
+     130                 :          34 :   ValentTransfer *self = VALENT_TRANSFER (object);
+     131                 :          34 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (self);
+     132                 :             : 
+     133      [ +  -  - ]:          34 :   switch (prop_id)
+     134                 :             :     {
+     135                 :             :     case PROP_ID:
+     136                 :          34 :       valent_object_lock (VALENT_OBJECT (self));
+     137                 :          34 :       priv->id = g_value_dup_string (value);
+     138                 :          34 :       valent_object_unlock (VALENT_OBJECT (self));
+     139                 :          34 :       break;
+     140                 :             : 
+     141                 :           0 :     case PROP_PROGRESS:
+     142                 :           0 :       valent_transfer_set_progress (self, g_value_get_double (value));
+     143                 :           0 :       break;
+     144                 :             : 
+     145                 :           0 :     default:
+     146                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     147                 :             :     }
+     148                 :          34 : }
+     149                 :             : 
+     150                 :             : static void
+     151                 :           7 : valent_transfer_class_init (ValentTransferClass *klass)
+     152                 :             : {
+     153                 :           7 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     154                 :             : 
+     155                 :           7 :   object_class->finalize = valent_transfer_finalize;
+     156                 :           7 :   object_class->get_property = valent_transfer_get_property;
+     157                 :           7 :   object_class->set_property = valent_transfer_set_property;
+     158                 :             : 
+     159                 :           7 :   klass->execute = valent_transfer_real_execute;
+     160                 :           7 :   klass->execute_finish = valent_transfer_real_execute_finish;
+     161                 :             : 
+     162                 :             :   /**
+     163                 :             :    * ValentTransfer:id: (getter ref_id)
+     164                 :             :    *
+     165                 :             :    * A unique identifier for the transfer.
+     166                 :             :    *
+     167                 :             :    * If not specified at construction, a random UUID will be generated on-demand
+     168                 :             :    * with [func@GLib.uuid_string_random].
+     169                 :             :    *
+     170                 :             :    * This property is thread-safe. Emissions of [signal@GObject.Object::notify]
+     171                 :             :    * are guaranteed to happen in the main thread.
+     172                 :             :    *
+     173                 :             :    * Since: 1.0
+     174                 :             :    */
+     175                 :          14 :   properties [PROP_ID] =
+     176                 :           7 :     g_param_spec_string ("id", NULL, NULL,
+     177                 :             :                          NULL,
+     178                 :             :                          (G_PARAM_READWRITE |
+     179                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     180                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     181                 :             :                           G_PARAM_STATIC_STRINGS));
+     182                 :             : 
+     183                 :             :   /**
+     184                 :             :    * ValentTransfer:progress: (getter get_progress) (setter set_progress)
+     185                 :             :    *
+     186                 :             :    * The progress of the transfer.
+     187                 :             :    *
+     188                 :             :    * This value will change from `0.0` to `1.0` during the course of the
+     189                 :             :    * operation. It is guaranteed to change to `1.0` when the transfer operation
+     190                 :             :    * completes, but not guaranteed to change before that unless set by an
+     191                 :             :    * implementation.
+     192                 :             :    *
+     193                 :             :    * This property is thread-safe. Emissions of [signal@GObject.Object::notify]
+     194                 :             :    * are guaranteed to happen in the main thread.
+     195                 :             :    *
+     196                 :             :    * Since: 1.0
+     197                 :             :    */
+     198                 :          14 :   properties [PROP_PROGRESS] =
+     199                 :           7 :     g_param_spec_double ("progress", NULL, NULL,
+     200                 :             :                          0.0, 1.0,
+     201                 :             :                          0.0,
+     202                 :             :                          (G_PARAM_READWRITE |
+     203                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     204                 :             :                           G_PARAM_STATIC_STRINGS));
+     205                 :             : 
+     206                 :             :   /**
+     207                 :             :    * ValentTransfer:state: (getter get_state)
+     208                 :             :    *
+     209                 :             :    * The [enum@Valent.TransferState] of the transfer.
+     210                 :             :    *
+     211                 :             :    * The value will change from %VALENT_TRANSFER_STATE_PENDING to
+     212                 :             :    * %VALENT_TRANSFER_STATE_ACTIVE when [method@Valent.Transfer.execute] is
+     213                 :             :    * called. When the operation completes it will change to either
+     214                 :             :    * %VALENT_TRANSFER_STATE_COMPLETE or %VALENT_TRANSFER_STATE_FAILED.
+     215                 :             :    *
+     216                 :             :    * This property is thread-safe. Emissions of [signal@GObject.Object::notify]
+     217                 :             :    * are guaranteed to happen in the main thread.
+     218                 :             :    *
+     219                 :             :    * Since: 1.0
+     220                 :             :    */
+     221                 :          14 :   properties [PROP_STATE] =
+     222                 :           7 :     g_param_spec_enum ("state", NULL, NULL,
+     223                 :             :                        VALENT_TYPE_TRANSFER_STATE,
+     224                 :             :                        VALENT_TRANSFER_STATE_PENDING,
+     225                 :             :                        (G_PARAM_READABLE |
+     226                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     227                 :             :                         G_PARAM_STATIC_STRINGS));
+     228                 :             : 
+     229                 :           7 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     230                 :           7 : }
+     231                 :             : 
+     232                 :             : static void
+     233                 :          34 : valent_transfer_init (ValentTransfer *self)
+     234                 :             : {
+     235                 :          34 : }
+     236                 :             : 
+     237                 :             : /**
+     238                 :             :  * valent_transfer_dup_id: (get-property id)
+     239                 :             :  * @transfer: a `ValentTransfer`
+     240                 :             :  *
+     241                 :             :  * Get the transfer ID.
+     242                 :             :  *
+     243                 :             :  * Returns: (transfer full) (not nullable): a unique ID
+     244                 :             :  *
+     245                 :             :  * Since: 1.0
+     246                 :             :  */
+     247                 :             : char *
+     248                 :          38 : valent_transfer_dup_id (ValentTransfer *transfer)
+     249                 :             : {
+     250                 :          38 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (transfer);
+     251                 :          76 :   g_autofree char *ret = NULL;
+     252                 :             : 
+     253         [ +  - ]:          38 :   g_return_val_if_fail (VALENT_IS_TRANSFER (transfer), NULL);
+     254                 :             : 
+     255                 :          38 :   valent_object_lock (VALENT_OBJECT (transfer));
+     256         [ +  + ]:          38 :   if (priv->id == NULL)
+     257                 :          10 :     priv->id = g_uuid_string_random ();
+     258         [ -  + ]:          38 :   ret = g_strdup (priv->id);
+     259                 :          38 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     260                 :             : 
+     261                 :          38 :   return g_steal_pointer (&ret);
+     262                 :             : }
+     263                 :             : 
+     264                 :             : /**
+     265                 :             :  * valent_transfer_get_progress: (get-property progress)
+     266                 :             :  * @transfer: a `ValentTransfer`
+     267                 :             :  *
+     268                 :             :  * Get the transfer progress.
+     269                 :             :  *
+     270                 :             :  * Returns: a number from `0.0` to `1.0`
+     271                 :             :  *
+     272                 :             :  * Since: 1.0
+     273                 :             :  */
+     274                 :             : double
+     275                 :           0 : valent_transfer_get_progress (ValentTransfer *transfer)
+     276                 :             : {
+     277                 :           0 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (transfer);
+     278                 :           0 :   double ret;
+     279                 :             : 
+     280         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_TRANSFER (transfer), 0.0);
+     281                 :             : 
+     282                 :           0 :   valent_object_lock (VALENT_OBJECT (transfer));
+     283                 :           0 :   ret = priv->progress;
+     284                 :           0 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     285                 :             : 
+     286                 :           0 :   return ret;
+     287                 :             : }
+     288                 :             : 
+     289                 :             : /**
+     290                 :             :  * valent_transfer_set_progress: (set-property progress)
+     291                 :             :  * @transfer: a `ValentTransfer`
+     292                 :             :  * @progress: a number from `0.0` to `1.0`
+     293                 :             :  *
+     294                 :             :  * Set the transfer progress.
+     295                 :             :  *
+     296                 :             :  * This method should only be called by implementations of
+     297                 :             :  * [class@Valent.Transfer].
+     298                 :             :  *
+     299                 :             :  * Since: 1.0
+     300                 :             :  */
+     301                 :             : void
+     302                 :          33 : valent_transfer_set_progress (ValentTransfer *transfer,
+     303                 :             :                               double          progress)
+     304                 :             : {
+     305                 :          33 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (transfer);
+     306                 :             : 
+     307         [ +  - ]:          33 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+     308   [ +  -  -  + ]:          33 :   g_return_if_fail (progress >= 0.0 && progress <= 1.0);
+     309                 :             : 
+     310                 :          33 :   valent_object_lock (VALENT_OBJECT (transfer));
+     311   [ -  +  +  - ]:          33 :   if (!G_APPROX_VALUE (priv->progress, progress, 0.01))
+     312                 :             :     {
+     313                 :          33 :       priv->progress = progress;
+     314                 :          33 :       valent_object_notify_by_pspec (VALENT_OBJECT (transfer),
+     315                 :             :                                      properties [PROP_PROGRESS]);
+     316                 :             :     }
+     317                 :          33 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     318                 :             : }
+     319                 :             : 
+     320                 :             : /**
+     321                 :             :  * valent_transfer_get_state: (get-property state)
+     322                 :             :  * @transfer: a `ValentTransfer`
+     323                 :             :  *
+     324                 :             :  * Get the transfer state.
+     325                 :             :  *
+     326                 :             :  * Returns: a `ValentTransferState`
+     327                 :             :  *
+     328                 :             :  * Since: 1.0
+     329                 :             :  */
+     330                 :             : ValentTransferState
+     331                 :          30 : valent_transfer_get_state (ValentTransfer *transfer)
+     332                 :             : {
+     333                 :          30 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (transfer);
+     334                 :          30 :   ValentTransferState ret = VALENT_TRANSFER_STATE_PENDING;
+     335                 :             : 
+     336         [ +  - ]:          30 :   g_return_val_if_fail (VALENT_IS_TRANSFER (transfer), FALSE);
+     337                 :             : 
+     338                 :          30 :   valent_object_lock (VALENT_OBJECT (transfer));
+     339                 :          30 :   ret = priv->state;
+     340                 :          30 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     341                 :             : 
+     342                 :          30 :   return ret;
+     343                 :             : }
+     344                 :             : 
+     345                 :             : static void
+     346                 :          33 : valent_transfer_execute_cb (GObject      *object,
+     347                 :             :                             GAsyncResult *result,
+     348                 :             :                             gpointer      user_data)
+     349                 :             : {
+     350                 :          33 :   ValentTransfer *self = VALENT_TRANSFER (object);
+     351                 :          33 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (self);
+     352                 :          66 :   g_autoptr (GTask) task = G_TASK (user_data);
+     353                 :             : 
+     354                 :          33 :   VALENT_ENTRY;
+     355                 :             : 
+     356         [ +  - ]:          33 :   g_assert (VALENT_IS_TRANSFER (self));
+     357         [ -  + ]:          33 :   g_assert (g_task_is_valid (result, self));
+     358   [ +  -  +  -  :          33 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     359                 :             : 
+     360                 :          33 :   valent_transfer_set_progress (self, 1.0);
+     361                 :             : 
+     362                 :          33 :   valent_object_lock (VALENT_OBJECT (self));
+     363         [ +  - ]:          33 :   if (g_task_propagate_boolean (G_TASK (result), &priv->error))
+     364                 :             :     {
+     365                 :          33 :       priv->state = VALENT_TRANSFER_STATE_COMPLETE;
+     366                 :          33 :       valent_object_unlock (VALENT_OBJECT (self));
+     367                 :             : 
+     368                 :          33 :       g_task_return_boolean (task, TRUE);
+     369                 :             :     }
+     370                 :             :   else
+     371                 :             :     {
+     372                 :           0 :       priv->state = VALENT_TRANSFER_STATE_FAILED;
+     373                 :           0 :       valent_object_unlock (VALENT_OBJECT (self));
+     374                 :             : 
+     375                 :           0 :       g_task_return_error (task, g_error_copy (priv->error));
+     376                 :             :     }
+     377                 :             : 
+     378                 :          33 :   valent_object_notify_by_pspec (VALENT_OBJECT (self), properties [PROP_STATE]);
+     379                 :             : 
+     380                 :          33 :   VALENT_EXIT;
+     381                 :             : }
+     382                 :             : 
+     383                 :             : /**
+     384                 :             :  * valent_transfer_execute: (virtual execute)
+     385                 :             :  * @transfer: a `ValentTransfer`
+     386                 :             :  * @cancellable: (nullable): a `GCancellable`
+     387                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     388                 :             :  * @user_data: (closure): user supplied data
+     389                 :             :  *
+     390                 :             :  * Start the transfer operation.
+     391                 :             :  *
+     392                 :             :  * Get the result with [method@Valent.Transfer.execute_finish].
+     393                 :             :  *
+     394                 :             :  * If the transfer operation has already started, this call will fail and
+     395                 :             :  * [method@Valent.Transfer.execute_finish] will return %G_IO_ERROR_PENDING.
+     396                 :             :  *
+     397                 :             :  * Since: 1.0
+     398                 :             :  */
+     399                 :             : void
+     400                 :          34 : valent_transfer_execute (ValentTransfer      *transfer,
+     401                 :             :                          GCancellable        *cancellable,
+     402                 :             :                          GAsyncReadyCallback  callback,
+     403                 :             :                          gpointer             user_data)
+     404                 :             : {
+     405                 :          34 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (transfer);
+     406                 :          68 :   g_autoptr (GTask) task = NULL;
+     407                 :          68 :   g_autoptr (GCancellable) destroy = NULL;
+     408                 :             : 
+     409                 :          34 :   VALENT_ENTRY;
+     410                 :             : 
+     411         [ +  - ]:          34 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+     412   [ +  +  +  -  :          34 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     413                 :             : 
+     414                 :          34 :   valent_object_lock (VALENT_OBJECT (transfer));
+     415         [ -  + ]:          34 :   if (priv->state != VALENT_TRANSFER_STATE_PENDING)
+     416                 :             :     {
+     417                 :           0 :       g_task_report_new_error (transfer, callback, user_data,
+     418                 :             :                                valent_transfer_execute,
+     419                 :             :                                G_IO_ERROR,
+     420                 :             :                                G_IO_ERROR_PENDING,
+     421                 :             :                                "%s is already in progress",
+     422                 :           0 :                                G_OBJECT_TYPE_NAME (transfer));
+     423                 :           0 :       valent_object_unlock (VALENT_OBJECT (transfer));
+     424                 :          34 :       VALENT_EXIT;
+     425                 :             :     }
+     426                 :             : 
+     427                 :          34 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (transfer),
+     428                 :             :                                              cancellable);
+     429                 :             : 
+     430                 :          34 :   task = g_task_new (transfer, destroy, callback, user_data);
+     431         [ +  - ]:          34 :   g_task_set_source_tag (task, valent_transfer_execute);
+     432                 :             : 
+     433                 :          34 :   VALENT_TRANSFER_GET_CLASS (transfer)->execute (transfer,
+     434                 :             :                                                  destroy,
+     435                 :             :                                                  valent_transfer_execute_cb,
+     436                 :             :                                                  g_steal_pointer (&task));
+     437                 :             : 
+     438                 :          34 :   priv->state = VALENT_TRANSFER_STATE_ACTIVE;
+     439                 :          34 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     440                 :             : 
+     441                 :          34 :   valent_object_notify_by_pspec (VALENT_OBJECT (transfer), properties [PROP_STATE]);
+     442                 :             : 
+     443         [ +  - ]:          34 :   VALENT_EXIT;
+     444                 :             : }
+     445                 :             : 
+     446                 :             : /**
+     447                 :             :  * valent_transfer_execute_finish: (virtual execute_finish)
+     448                 :             :  * @transfer: a `ValentTransfer`
+     449                 :             :  * @result: a `GAsyncResult`
+     450                 :             :  * @error: (nullable): a `GError`
+     451                 :             :  *
+     452                 :             :  * Finish an operation started by [method@Valent.Transfer.execute].
+     453                 :             :  *
+     454                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     455                 :             :  *
+     456                 :             :  * Since: 1.0
+     457                 :             :  */
+     458                 :             : gboolean
+     459                 :          33 : valent_transfer_execute_finish (ValentTransfer  *transfer,
+     460                 :             :                                 GAsyncResult    *result,
+     461                 :             :                                 GError         **error)
+     462                 :             : {
+     463                 :          33 :   gboolean ret;
+     464                 :             : 
+     465                 :          33 :   VALENT_ENTRY;
+     466                 :             : 
+     467         [ +  - ]:          33 :   g_return_val_if_fail (VALENT_IS_TRANSFER (transfer), FALSE);
+     468         [ -  + ]:          33 :   g_return_val_if_fail (g_task_is_valid (result, transfer), FALSE);
+     469   [ +  -  -  + ]:          33 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     470                 :             : 
+     471                 :          33 :   ret = VALENT_TRANSFER_GET_CLASS (transfer)->execute_finish (transfer,
+     472                 :             :                                                               result,
+     473                 :             :                                                               error);
+     474                 :             : 
+     475                 :          33 :   VALENT_RETURN (ret);
+     476                 :             : }
+     477                 :             : 
+     478                 :             : /**
+     479                 :             :  * valent_transfer_cancel:
+     480                 :             :  * @transfer: a `ValentTransfer`
+     481                 :             :  *
+     482                 :             :  * Cancel the transfer operation.
+     483                 :             :  *
+     484                 :             :  * If this is called before [method@Valent.Transfer.execute] the transfer will
+     485                 :             :  * fail unconditionally.
+     486                 :             :  *
+     487                 :             :  * Since: 1.0
+     488                 :             :  */
+     489                 :             : void
+     490                 :           0 : valent_transfer_cancel (ValentTransfer *transfer)
+     491                 :             : {
+     492                 :           0 :   g_autoptr (GCancellable) cancellable = NULL;
+     493                 :             : 
+     494                 :           0 :   VALENT_ENTRY;
+     495                 :             : 
+     496         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+     497                 :             : 
+     498                 :           0 :   cancellable = valent_object_ref_cancellable (VALENT_OBJECT (transfer));
+     499                 :           0 :   g_cancellable_cancel (cancellable);
+     500                 :             : 
+     501         [ #  # ]:           0 :   VALENT_EXIT;
+     502                 :             : }
+     503                 :             : 
+     504                 :             : /**
+     505                 :             :  * valent_transfer_check_status:
+     506                 :             :  * @transfer: a `ValentTransfer`
+     507                 :             :  * @error: (nullable): a `GError`
+     508                 :             :  *
+     509                 :             :  * Check the transfer status.
+     510                 :             :  *
+     511                 :             :  * Returns %TRUE if the transfer operation is in progress or completed
+     512                 :             :  * successfully. Returns %FALSE with @error set if the transfer failed.
+     513                 :             :  *
+     514                 :             :  * Returns: %TRUE, or %FALSE with @error set
+     515                 :             :  *
+     516                 :             :  * Since: 1.0
+     517                 :             :  */
+     518                 :             : gboolean
+     519                 :           0 : valent_transfer_check_status (ValentTransfer  *transfer,
+     520                 :             :                               GError         **error)
+     521                 :             : {
+     522                 :           0 :   ValentTransferPrivate *priv = valent_transfer_get_instance_private (transfer);
+     523                 :           0 :   gboolean ret = TRUE;
+     524                 :             : 
+     525                 :           0 :   VALENT_ENTRY;
+     526                 :             : 
+     527         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_TRANSFER (transfer), FALSE);
+     528   [ #  #  #  # ]:           0 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     529                 :             : 
+     530                 :           0 :   valent_object_lock (VALENT_OBJECT (transfer));
+     531         [ #  # ]:           0 :   if (priv->error != NULL)
+     532                 :             :     {
+     533         [ #  # ]:           0 :       if (error != NULL)
+     534                 :           0 :         *error = g_error_copy (priv->error);
+     535                 :             :       ret = FALSE;
+     536                 :             :     }
+     537                 :           0 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     538                 :             : 
+     539                 :           0 :   VALENT_RETURN (ret);
+     540                 :             : }
+     541                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-transfer.h.func-c.html b/coverage/src/libvalent/core/valent-transfer.h.func-c.html new file mode 100644 index 00000000000..7032084400c --- /dev/null +++ b/coverage/src/libvalent/core/valent-transfer.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-transfer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-transfer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %168
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_TRANSFER271
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-transfer.h.func.html b/coverage/src/libvalent/core/valent-transfer.h.func.html new file mode 100644 index 00000000000..45303520f73 --- /dev/null +++ b/coverage/src/libvalent/core/valent-transfer.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-transfer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-transfer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %168
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_TRANSFER271
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-transfer.h.gcov.html b/coverage/src/libvalent/core/valent-transfer.h.gcov.html new file mode 100644 index 00000000000..ed832fc3c16 --- /dev/null +++ b/coverage/src/libvalent/core/valent-transfer.h.gcov.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-transfer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-transfer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %168
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "valent-object.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentTransferState:
+      16                 :             :  * @VALENT_TRANSFER_STATE_PENDING: The transfer is pending
+      17                 :             :  * @VALENT_TRANSFER_STATE_ACTIVE: The transfer is in progress
+      18                 :             :  * @VALENT_TRANSFER_STATE_COMPLETE: The transfer succeeded
+      19                 :             :  * @VALENT_TRANSFER_STATE_FAILED: The transfer failed
+      20                 :             :  *
+      21                 :             :  * Enumeration of transfer states.
+      22                 :             :  *
+      23                 :             :  * Since: 1.0
+      24                 :             :  */
+      25                 :             : typedef enum
+      26                 :             : {
+      27                 :             :   VALENT_TRANSFER_STATE_PENDING,
+      28                 :             :   VALENT_TRANSFER_STATE_ACTIVE,
+      29                 :             :   VALENT_TRANSFER_STATE_COMPLETE,
+      30                 :             :   VALENT_TRANSFER_STATE_FAILED,
+      31                 :             : } ValentTransferState;
+      32                 :             : 
+      33                 :             : #define VALENT_TYPE_TRANSFER (valent_transfer_get_type())
+      34                 :             : 
+      35                 :             : VALENT_AVAILABLE_IN_1_0
+      36   [ +  -  +  -  :         396 : G_DECLARE_DERIVABLE_TYPE (ValentTransfer, valent_transfer, VALENT, TRANSFER, ValentObject)
+          +  -  +  -  +  
+          -  +  -  +  -  
+                   +  - ]
+      37                 :             : 
+      38                 :             : struct _ValentTransferClass
+      39                 :             : {
+      40                 :             :   ValentObjectClass   parent_class;
+      41                 :             : 
+      42                 :             :   /* virtual functions */
+      43                 :             :   void                (*execute)        (ValentTransfer       *transfer,
+      44                 :             :                                          GCancellable         *cancellable,
+      45                 :             :                                          GAsyncReadyCallback   callback,
+      46                 :             :                                          gpointer              user_data);
+      47                 :             :   gboolean            (*execute_finish) (ValentTransfer       *transfer,
+      48                 :             :                                          GAsyncResult         *result,
+      49                 :             :                                          GError              **error);
+      50                 :             : 
+      51                 :             :   /*< private >*/
+      52                 :             :   gpointer            padding[8];
+      53                 :             : };
+      54                 :             : 
+      55                 :             : VALENT_AVAILABLE_IN_1_0
+      56                 :             : char                * valent_transfer_dup_id         (ValentTransfer       *transfer);
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : double                valent_transfer_get_progress   (ValentTransfer       *transfer);
+      59                 :             : VALENT_AVAILABLE_IN_1_0
+      60                 :             : void                  valent_transfer_set_progress   (ValentTransfer       *transfer,
+      61                 :             :                                                       double                progress);
+      62                 :             : VALENT_AVAILABLE_IN_1_0
+      63                 :             : ValentTransferState   valent_transfer_get_state      (ValentTransfer       *transfer);
+      64                 :             : VALENT_AVAILABLE_IN_1_0
+      65                 :             : void                  valent_transfer_execute        (ValentTransfer       *transfer,
+      66                 :             :                                                       GCancellable         *cancellable,
+      67                 :             :                                                       GAsyncReadyCallback   callback,
+      68                 :             :                                                       gpointer              user_data);
+      69                 :             : VALENT_AVAILABLE_IN_1_0
+      70                 :             : gboolean              valent_transfer_execute_finish (ValentTransfer       *transfer,
+      71                 :             :                                                       GAsyncResult         *result,
+      72                 :             :                                                       GError              **error);
+      73                 :             : VALENT_AVAILABLE_IN_1_0
+      74                 :             : void                  valent_transfer_cancel         (ValentTransfer       *transfer);
+      75                 :             : VALENT_AVAILABLE_IN_1_0
+      76                 :             : gboolean              valent_transfer_check_status   (ValentTransfer       *transfer,
+      77                 :             :                                                       GError              **error);
+      78                 :             : 
+      79                 :             : G_END_DECLS
+      80                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-version.c.func-c.html b/coverage/src/libvalent/core/valent-version.c.func-c.html new file mode 100644 index 00000000000..ca85d50c98c --- /dev/null +++ b/coverage/src/libvalent/core/valent-version.c.func-c.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-version.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-version.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1010
Test Date:2024-03-31 18:46:36Functions:100.0 %44
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_get_major_version1
valent_get_micro_version1
valent_get_minor_version1
valent_check_version3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-version.c.func.html b/coverage/src/libvalent/core/valent-version.c.func.html new file mode 100644 index 00000000000..78ffe1ef239 --- /dev/null +++ b/coverage/src/libvalent/core/valent-version.c.func.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-version.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-version.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1010
Test Date:2024-03-31 18:46:36Functions:100.0 %44
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_check_version3
valent_get_major_version1
valent_get_micro_version1
valent_get_minor_version1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/core/valent-version.c.gcov.html b/coverage/src/libvalent/core/valent-version.c.gcov.html new file mode 100644 index 00000000000..cfc2a32d6f9 --- /dev/null +++ b/coverage/src/libvalent/core/valent-version.c.gcov.html @@ -0,0 +1,180 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/core/valent-version.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/core - valent-version.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1010
Test Date:2024-03-31 18:46:36Functions:100.0 %44
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <glib.h>
+       7                 :             : 
+       8                 :             : #include "valent-version.h"
+       9                 :             : 
+      10                 :             : 
+      11                 :             : /**
+      12                 :             :  * valent_check_version:
+      13                 :             :  * @major: required major version
+      14                 :             :  * @minor: required minor version
+      15                 :             :  *
+      16                 :             :  * Run-time version check.
+      17                 :             :  *
+      18                 :             :  * Evaluates to %TRUE if the API version of libvalent is greater than or equal
+      19                 :             :  * to the required one.
+      20                 :             :  *
+      21                 :             :  * Returns: %TRUE if the requirement is met, or %FALSE if not
+      22                 :             :  *
+      23                 :             :  * Since: 1.0
+      24                 :             :  */
+      25                 :             : gboolean
+      26                 :           3 : valent_check_version (unsigned int major,
+      27                 :             :                       unsigned int minor)
+      28                 :             : {
+      29         [ +  - ]:           3 :   if (VALENT_MAJOR_VERSION > major)
+      30                 :             :     return TRUE;
+      31                 :             : 
+      32         [ +  + ]:           3 :   if (VALENT_MAJOR_VERSION == major && VALENT_MINOR_VERSION >= minor)
+      33                 :           1 :     return TRUE;
+      34                 :             : 
+      35                 :             :   return FALSE;
+      36                 :             : }
+      37                 :             : 
+      38                 :             : /**
+      39                 :             :  * valent_get_major_version:
+      40                 :             :  *
+      41                 :             :  * Get the major version component of the Valent library.
+      42                 :             :  *
+      43                 :             :  * For example, if the version `1.2` this is `1`.
+      44                 :             :  *
+      45                 :             :  * Returns: the major version component of libvalent
+      46                 :             :  *
+      47                 :             :  * Since: 1.0
+      48                 :             :  */
+      49                 :             : unsigned int
+      50                 :           1 : valent_get_major_version (void)
+      51                 :             : {
+      52                 :           1 :   return VALENT_MAJOR_VERSION;
+      53                 :             : }
+      54                 :             : 
+      55                 :             : /**
+      56                 :             :  * valent_get_minor_version:
+      57                 :             :  *
+      58                 :             :  * Get the minor version component of the Valent library.
+      59                 :             :  *
+      60                 :             :  * For example, if the version `1.2` this is `2`.
+      61                 :             :  *
+      62                 :             :  * Returns: the minor version component of libvalent
+      63                 :             :  *
+      64                 :             :  * Since: 1.0
+      65                 :             :  */
+      66                 :             : unsigned int
+      67                 :           1 : valent_get_minor_version (void)
+      68                 :             : {
+      69                 :           1 :   return VALENT_MINOR_VERSION;
+      70                 :             : }
+      71                 :             : 
+      72                 :             : /**
+      73                 :             :  * valent_get_micro_version:
+      74                 :             :  *
+      75                 :             :  * Get the micro version component of the Valent library.
+      76                 :             :  *
+      77                 :             :  * For example, if the version `1.2.3` this is `3`.
+      78                 :             :  *
+      79                 :             :  * Returns: the micro version component of libvalent
+      80                 :             :  *
+      81                 :             :  * Since: 1.0
+      82                 :             :  */
+      83                 :             : unsigned int
+      84                 :           1 : valent_get_micro_version (void)
+      85                 :             : {
+      86                 :           1 :   return VALENT_MICRO_VERSION;
+      87                 :             : }
+      88                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-detail-sort-b.html b/coverage/src/libvalent/device/index-detail-sort-b.html new file mode 100644 index 00000000000..86820b47fb3 --- /dev/null +++ b/coverage/src/libvalent/device/index-detail-sort-b.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-detail-sort-f.html b/coverage/src/libvalent/device/index-detail-sort-f.html new file mode 100644 index 00000000000..a08c4d6c026 --- /dev/null +++ b/coverage/src/libvalent/device/index-detail-sort-f.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-detail-sort-l.html b/coverage/src/libvalent/device/index-detail-sort-l.html new file mode 100644 index 00000000000..b55d37e3858 --- /dev/null +++ b/coverage/src/libvalent/device/index-detail-sort-l.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-detail.html b/coverage/src/libvalent/device/index-detail.html new file mode 100644 index 00000000000..53deeccaf28 --- /dev/null +++ b/coverage/src/libvalent/device/index-detail.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-sort-b.html b/coverage/src/libvalent/device/index-sort-b.html new file mode 100644 index 00000000000..86820b47fb3 --- /dev/null +++ b/coverage/src/libvalent/device/index-sort-b.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-sort-f.html b/coverage/src/libvalent/device/index-sort-f.html new file mode 100644 index 00000000000..a08c4d6c026 --- /dev/null +++ b/coverage/src/libvalent/device/index-sort-f.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index-sort-l.html b/coverage/src/libvalent/device/index-sort-l.html new file mode 100644 index 00000000000..b55d37e3858 --- /dev/null +++ b/coverage/src/libvalent/device/index-sort-l.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/index.html b/coverage/src/libvalent/device/index.html new file mode 100644 index 00000000000..53deeccaf28 --- /dev/null +++ b/coverage/src/libvalent/device/index.html @@ -0,0 +1,383 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/deviceCoverageTotalHit
Test:Code CoverageLines:90.8 %25712334
Test Date:2024-03-31 18:46:36Functions:96.7 %241233
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.3 %19111095
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
libvalent-device.c +
100.0%
+
100.0 %33-100.0 %11
valent-certificate.c +
86.1%86.1%
+
86.1 %16514249.1 %11657100.0 %88
valent-channel-service.c +
87.3%87.3%
+
87.3 %21218558.1 %9354100.0 %2020
valent-channel-service.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-channel.c +
97.0%97.0%
+
97.0 %30329449.2 %258127100.0 %3232
valent-channel.h +
100.0%
+
100.0 %1150.0 %105100.0 %11
valent-device-impl.c +
79.2%79.2%
+
79.2 %15912652.1 %482580.0 %2016
valent-device-impl.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-manager.c +
89.2%89.2%
+
89.2 %43739054.5 %31016990.5 %4238
valent-device-manager.h +
100.0%
+
100.0 %1166.7 %64100.0 %11
valent-device-plugin.c +
92.3%92.3%
+
92.3 %11710850.6 %15880100.0 %1515
valent-device-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-transfer.c +
88.8%88.8%
+
88.8 %19717549.1 %11456100.0 %1515
valent-device-transfer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device.c +
93.0%93.0%
+
93.0 %62658267.5 %388262100.0 %5353
valent-device.h +
100.0%
+
100.0 %1175.0 %1612100.0 %11
valent-packet.c +
93.1%93.1%
+
93.1 %33130861.1 %342209100.0 %2727
valent-packet.h +
100.0%
+
100.0 %141484.6 %2622100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/libvalent-device.c.func-c.html b/coverage/src/libvalent/device/libvalent-device.c.func-c.html new file mode 100644 index 00000000000..135a1d4f6f2 --- /dev/null +++ b/coverage/src/libvalent/device/libvalent-device.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/libvalent-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - libvalent-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
libvalent_device_register_types65
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/libvalent-device.c.func.html b/coverage/src/libvalent/device/libvalent-device.c.func.html new file mode 100644 index 00000000000..60471320408 --- /dev/null +++ b/coverage/src/libvalent/device/libvalent-device.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/libvalent-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - libvalent-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
libvalent_device_register_types65
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/libvalent-device.c.gcov.html b/coverage/src/libvalent/device/libvalent-device.c.gcov.html new file mode 100644 index 00000000000..597bf647f8b --- /dev/null +++ b/coverage/src/libvalent/device/libvalent-device.c.gcov.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/libvalent-device.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - libvalent-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : #include <libpeas.h>
+       8                 :             : 
+       9                 :             : #include "valent-device-manager.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :          65 : libvalent_device_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :          65 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_APPLICATION_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_DEVICE_MANAGER);
+      18                 :          65 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-certificate.c.func-c.html b/coverage/src/libvalent/device/valent-certificate.c.func-c.html new file mode 100644 index 00000000000..2fdae84a3f5 --- /dev/null +++ b/coverage/src/libvalent/device/valent-certificate.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-certificate.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-certificate.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.1 %165142
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.1 %11657
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_certificate_get_fingerprint1
valent_certificate_new1
valent_certificate_new_finish1
valent_certificate_new_task1
valent_certificate_get_public_key5
valent_certificate_generate24
valent_certificate_new_sync24
valent_certificate_get_common_name49
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-certificate.c.func.html b/coverage/src/libvalent/device/valent-certificate.c.func.html new file mode 100644 index 00000000000..36f8c239d3f --- /dev/null +++ b/coverage/src/libvalent/device/valent-certificate.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-certificate.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-certificate.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.1 %165142
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.1 %11657
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_certificate_generate24
valent_certificate_get_common_name49
valent_certificate_get_fingerprint1
valent_certificate_get_public_key5
valent_certificate_new1
valent_certificate_new_finish1
valent_certificate_new_sync24
valent_certificate_new_task1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-certificate.c.gcov.html b/coverage/src/libvalent/device/valent-certificate.c.gcov.html new file mode 100644 index 00000000000..ec9ca00e31f --- /dev/null +++ b/coverage/src/libvalent/device/valent-certificate.c.gcov.html @@ -0,0 +1,576 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-certificate.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-certificate.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.1 %165142
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.1 %11657
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-certificate"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <time.h>
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <gnutls/gnutls.h>
+      12                 :             : #include <gnutls/abstract.h>
+      13                 :             : #include <gnutls/x509.h>
+      14                 :             : 
+      15                 :             : #include "libvalent-core.h"
+      16                 :             : #include "valent-certificate.h"
+      17                 :             : 
+      18                 :             : #define DEFAULT_EXPIRATION (60L*60L*24L*10L*365L)
+      19                 :             : #define DEFAULT_KEY_SIZE   4096
+      20                 :             : 
+      21                 :             : #define SHA256_HEX_LEN 64
+      22                 :             : #define SHA256_STR_LEN 96
+      23                 :             : 
+      24                 :             : 
+      25                 :             : /**
+      26                 :             :  * valent_certificate_generate:
+      27                 :             :  * @cert_path: (type filename): file path to the certificate
+      28                 :             :  * @key_path: (type filename): file path to the private key
+      29                 :             :  * @common_name: common name for the certificate
+      30                 :             :  * @error: (nullable): a `GError`
+      31                 :             :  *
+      32                 :             :  * Generate a private key and certificate for @common_name, saving them at
+      33                 :             :  * @key_path and @cert_path respectively.
+      34                 :             :  *
+      35                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+      36                 :             :  *
+      37                 :             :  * Since: 1.0
+      38                 :             :  */
+      39                 :             : static gboolean
+      40                 :          24 : valent_certificate_generate (const char  *cert_path,
+      41                 :             :                              const char  *key_path,
+      42                 :             :                              const char  *common_name,
+      43                 :             :                              GError     **error)
+      44                 :             : {
+      45                 :          48 :   g_autofree char *dn = NULL;
+      46                 :          24 :   gnutls_x509_privkey_t privkey = NULL;
+      47                 :          24 :   gnutls_x509_crt_t crt = NULL;
+      48                 :          24 :   gnutls_datum_t out;
+      49                 :          24 :   time_t timestamp;
+      50                 :          24 :   unsigned int serial;
+      51                 :          24 :   int rc;
+      52                 :          24 :   gboolean ret = FALSE;
+      53                 :             : 
+      54                 :          24 :   VALENT_ENTRY;
+      55                 :             : 
+      56                 :             :   /*
+      57                 :             :    * Private Key
+      58                 :             :    */
+      59         [ +  - ]:          24 :   if ((rc = gnutls_x509_privkey_init (&privkey)) != GNUTLS_E_SUCCESS ||
+      60         [ +  - ]:          24 :       (rc = gnutls_x509_privkey_generate (privkey,
+      61                 :             :                                           GNUTLS_PK_RSA,
+      62                 :             :                                           DEFAULT_KEY_SIZE,
+      63                 :          24 :                                           0)) != GNUTLS_E_SUCCESS ||
+      64         [ -  + ]:          24 :       (rc = gnutls_x509_privkey_export2 (privkey,
+      65                 :             :                                          GNUTLS_X509_FMT_PEM,
+      66                 :             :                                          &out)) != GNUTLS_E_SUCCESS)
+      67                 :             :     {
+      68                 :           0 :       g_set_error (error,
+      69                 :             :                    G_IO_ERROR,
+      70                 :             :                    G_IO_ERROR_FAILED,
+      71                 :             :                    "Generating private key: %s",
+      72                 :             :                    gnutls_strerror (rc));
+      73                 :           0 :       VALENT_GOTO (out);
+      74                 :             :     }
+      75                 :             : 
+      76                 :             :   /* Output the private key PEM to file */
+      77                 :          48 :   ret = g_file_set_contents_full (key_path,
+      78                 :          24 :                                   (const char *)out.data,
+      79                 :          24 :                                   out.size,
+      80                 :             :                                   G_FILE_SET_CONTENTS_DURABLE,
+      81                 :             :                                   0600,
+      82                 :             :                                   error);
+      83                 :          24 :   gnutls_free (out.data);
+      84                 :             : 
+      85         [ -  + ]:          24 :   if (!ret)
+      86                 :           0 :     VALENT_GOTO (out);
+      87                 :             : 
+      88                 :             :   /*
+      89                 :             :    * TLS Certificate
+      90                 :             :    */
+      91         [ +  - ]:          24 :   if ((rc = gnutls_x509_crt_init (&crt)) != GNUTLS_E_SUCCESS ||
+      92         [ +  - ]:          24 :       (rc = gnutls_x509_crt_set_key (crt, privkey)) != GNUTLS_E_SUCCESS ||
+      93         [ -  + ]:          24 :       (rc = gnutls_x509_crt_set_version (crt, 3)) != GNUTLS_E_SUCCESS)
+      94                 :             :     {
+      95                 :           0 :       g_set_error (error,
+      96                 :             :                    G_IO_ERROR,
+      97                 :             :                    G_IO_ERROR_FAILED,
+      98                 :             :                    "Generating certificate: %s",
+      99                 :             :                    gnutls_strerror (rc));
+     100                 :           0 :       VALENT_GOTO (out);
+     101                 :             :     }
+     102                 :             : 
+     103                 :             :   /* Expiry (10 years) */
+     104                 :          24 :   timestamp = time (NULL);
+     105                 :             : 
+     106         [ +  - ]:          24 :   if ((rc = gnutls_x509_crt_set_activation_time (crt, timestamp)) != GNUTLS_E_SUCCESS ||
+     107         [ -  + ]:          24 :       (rc = gnutls_x509_crt_set_expiration_time (crt, timestamp + DEFAULT_EXPIRATION)) != GNUTLS_E_SUCCESS)
+     108                 :             :     {
+     109                 :           0 :       g_set_error (error,
+     110                 :             :                    G_IO_ERROR,
+     111                 :             :                    G_IO_ERROR_FAILED,
+     112                 :             :                    "Generating certificate: %s",
+     113                 :             :                    gnutls_strerror (rc));
+     114                 :           0 :       VALENT_GOTO (out);
+     115                 :             :     }
+     116                 :             : 
+     117                 :             :   /* Serial Number */
+     118                 :          24 :   serial = GUINT32_TO_BE (10);
+     119                 :          24 :   gnutls_x509_crt_set_serial (crt, &serial, sizeof (unsigned int));
+     120                 :             : 
+     121                 :             :   /* Distinguished Name (RFC4514) */
+     122                 :          24 :   dn = g_strdup_printf ("O=%s,OU=%s,CN=%s", "Valent", "Valent", common_name);
+     123                 :             : 
+     124         [ -  + ]:          24 :   if ((rc = gnutls_x509_crt_set_dn (crt, dn, NULL)) != GNUTLS_E_SUCCESS)
+     125                 :             :     {
+     126                 :           0 :       g_set_error (error,
+     127                 :             :                    G_IO_ERROR,
+     128                 :             :                    G_IO_ERROR_FAILED,
+     129                 :             :                    "Generating certificate: %s",
+     130                 :             :                    gnutls_strerror (rc));
+     131                 :           0 :       VALENT_GOTO (out);
+     132                 :             :     }
+     133                 :             : 
+     134                 :             :   /* Sign and export the certificate */
+     135         [ +  - ]:          24 :   if ((rc = gnutls_x509_crt_sign2 (crt, crt, privkey, GNUTLS_DIG_SHA256, 0)) != GNUTLS_E_SUCCESS ||
+     136         [ -  + ]:          24 :       (rc = gnutls_x509_crt_export2 (crt, GNUTLS_X509_FMT_PEM, &out)) != GNUTLS_E_SUCCESS)
+     137                 :             :     {
+     138                 :           0 :       g_set_error (error,
+     139                 :             :                    G_IO_ERROR,
+     140                 :             :                    G_IO_ERROR_FAILED,
+     141                 :             :                    "Signing certificate: %s",
+     142                 :             :                    gnutls_strerror (rc));
+     143                 :           0 :       VALENT_GOTO (out);
+     144                 :             :     }
+     145                 :             : 
+     146                 :             :   /* Output the certificate PEM to file */
+     147                 :          48 :   ret = g_file_set_contents_full (cert_path,
+     148                 :          24 :                                   (const char *)out.data,
+     149                 :          24 :                                   out.size,
+     150                 :             :                                   G_FILE_SET_CONTENTS_DURABLE,
+     151                 :             :                                   0600,
+     152                 :             :                                   error);
+     153                 :          24 :   gnutls_free (out.data);
+     154                 :             : 
+     155                 :          24 :   out:
+     156                 :          24 :     gnutls_x509_crt_deinit (crt);
+     157                 :          24 :     gnutls_x509_privkey_deinit (privkey);
+     158                 :             : 
+     159                 :          24 :   VALENT_RETURN (ret);
+     160                 :             : }
+     161                 :             : 
+     162                 :             : static void
+     163                 :           1 : valent_certificate_new_task (GTask        *task,
+     164                 :             :                              gpointer      source_object,
+     165                 :             :                              gpointer      task_data,
+     166                 :             :                              GCancellable *cancellable)
+     167                 :             : {
+     168                 :           1 :   g_autoptr (GTlsCertificate) certificate = NULL;
+     169                 :           1 :   const char *path = task_data;
+     170                 :           1 :   GError *error = NULL;
+     171                 :             : 
+     172         [ -  + ]:           1 :   if ((certificate = valent_certificate_new_sync (path, &error)) == NULL)
+     173                 :           0 :     return g_task_return_error (task, error);
+     174                 :             : 
+     175                 :           1 :   g_task_return_pointer (task, g_steal_pointer (&certificate), g_object_unref);
+     176                 :             : }
+     177                 :             : 
+     178                 :             : /**
+     179                 :             :  * valent_certificate_new:
+     180                 :             :  * @path: (type filename): a directory path
+     181                 :             :  * @cancellable: (nullable): `GCancellable`
+     182                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     183                 :             :  * @user_data: (closure): user supplied data
+     184                 :             :  *
+     185                 :             :  * Get a TLS certificate and private key pair.
+     186                 :             :  *
+     187                 :             :  * This ensures a TLS certificate with the filename `certificate.pem` and
+     188                 :             :  * private key with filename `private.pem` exist in a directory at @path.
+     189                 :             :  *
+     190                 :             :  * If either one doesn't exist, a new certificate and private key pair will be
+     191                 :             :  * generated. The common name will be set to a string returned by
+     192                 :             :  * [func@GLib.uuid_string_random].
+     193                 :             :  *
+     194                 :             :  * Get the result with [func@Valent.certificate_new_finish].
+     195                 :             :  *
+     196                 :             :  * Since: 1.0
+     197                 :             :  */
+     198                 :             : void
+     199                 :           1 : valent_certificate_new (const char          *path,
+     200                 :             :                         GCancellable        *cancellable,
+     201                 :             :                         GAsyncReadyCallback  callback,
+     202                 :             :                         gpointer             user_data)
+     203                 :             : {
+     204                 :           2 :   g_autoptr (GTask) task = NULL;
+     205                 :             : 
+     206   [ +  -  +  - ]:           1 :   g_return_if_fail (path != NULL && *path != '\0');
+     207   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     208                 :             : 
+     209                 :           1 :   task = g_task_new (NULL, cancellable, callback, user_data);
+     210         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_certificate_new);
+     211         [ -  + ]:           2 :   g_task_set_task_data (task, g_strdup (path), g_free);
+     212         [ +  - ]:           1 :   g_task_run_in_thread (task, valent_certificate_new_task);
+     213                 :             : }
+     214                 :             : 
+     215                 :             : /**
+     216                 :             :  * valent_certificate_new_finish:
+     217                 :             :  * @result: a `GAsyncResult` provided to callback
+     218                 :             :  * @error: (nullable): a `GError`
+     219                 :             :  *
+     220                 :             :  * Finish an operation started by [func@Valent.certificate_new].
+     221                 :             :  *
+     222                 :             :  * If either generating or loading the certificate failed, %NULL will be
+     223                 :             :  * returned with @error set.
+     224                 :             :  *
+     225                 :             :  * Returns: (transfer full) (nullable): a `GTlsCertificate`
+     226                 :             :  *
+     227                 :             :  * Since: 1.0
+     228                 :             :  */
+     229                 :             : GTlsCertificate *
+     230                 :           1 : valent_certificate_new_finish (GAsyncResult  *result,
+     231                 :             :                                GError       **error)
+     232                 :             : {
+     233         [ +  - ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, NULL), NULL);
+     234                 :             : 
+     235                 :           1 :   return g_task_propagate_pointer (G_TASK (result), error);
+     236                 :             : }
+     237                 :             : 
+     238                 :             : /**
+     239                 :             :  * valent_certificate_new_sync:
+     240                 :             :  * @path: (type filename): a directory path
+     241                 :             :  * @error: (nullable): a `GError`
+     242                 :             :  *
+     243                 :             :  * Get a TLS certificate and private key pair.
+     244                 :             :  *
+     245                 :             :  * This ensures a TLS certificate with the filename `certificate.pem` and
+     246                 :             :  * private key with filename `private.pem` exist in a directory at @path.
+     247                 :             :  *
+     248                 :             :  * If either one doesn't exist, a new certificate and private key pair will be
+     249                 :             :  * generated. The common name will be set to a string returned by
+     250                 :             :  * [func@GLib.uuid_string_random].
+     251                 :             :  *
+     252                 :             :  * If either generating or loading the certificate fails, %NULL will be returned
+     253                 :             :  * with @error set.
+     254                 :             :  *
+     255                 :             :  * Returns: (transfer full) (nullable): a `GTlsCertificate`
+     256                 :             :  *
+     257                 :             :  * Since: 1.0
+     258                 :             :  */
+     259                 :             : GTlsCertificate *
+     260                 :          24 : valent_certificate_new_sync (const char  *path,
+     261                 :             :                              GError     **error)
+     262                 :             : {
+     263                 :          48 :   g_autofree char *cert_path = NULL;
+     264                 :          24 :   g_autofree char *key_path = NULL;
+     265                 :             : 
+     266   [ +  -  +  - ]:          24 :   g_return_val_if_fail (path != NULL && *path != '\0', NULL);
+     267   [ +  +  -  + ]:          24 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     268                 :             : 
+     269                 :          24 :   cert_path = g_build_filename (path, "certificate.pem", NULL);
+     270                 :          24 :   key_path = g_build_filename (path, "private.pem", NULL);
+     271                 :             : 
+     272   [ -  +  -  - ]:          24 :   if (!g_file_test (cert_path, G_FILE_TEST_IS_REGULAR) ||
+     273                 :           0 :       !g_file_test (key_path, G_FILE_TEST_IS_REGULAR))
+     274                 :             :     {
+     275                 :          24 :       g_autofree char *cn = NULL;
+     276                 :             : 
+     277                 :          24 :       cn = g_uuid_string_random ();
+     278                 :             : 
+     279         [ -  + ]:          24 :       if (!valent_certificate_generate (cert_path, key_path, cn, error))
+     280                 :           0 :         return FALSE;
+     281                 :             :     }
+     282                 :             : 
+     283                 :          24 :   return g_tls_certificate_new_from_files (cert_path, key_path, error);
+     284                 :             : }
+     285                 :             : 
+     286                 :             : /**
+     287                 :             :  * valent_certificate_get_common_name:
+     288                 :             :  * @certificate: a `GTlsCertificate`
+     289                 :             :  *
+     290                 :             :  * Get the common name from @certificate, which by convention in KDE Connect is
+     291                 :             :  * the single source of truth for a device's ID.
+     292                 :             :  *
+     293                 :             :  * Returns: (transfer none) (nullable): the certificate ID
+     294                 :             :  *
+     295                 :             :  * Since: 1.0
+     296                 :             :  */
+     297                 :             : const char *
+     298                 :          49 : valent_certificate_get_common_name (GTlsCertificate *certificate)
+     299                 :             : {
+     300                 :          98 :   g_autoptr (GByteArray) certificate_der = NULL;
+     301                 :          49 :   gnutls_x509_crt_t crt;
+     302                 :          49 :   gnutls_datum_t crt_der;
+     303                 :          49 :   char buf[64] = { 0, };
+     304                 :          49 :   size_t buf_size = 64;
+     305                 :          49 :   const char *device_id;
+     306                 :          49 :   int rc;
+     307                 :             : 
+     308   [ +  -  +  -  :          49 :   g_return_val_if_fail (G_IS_TLS_CERTIFICATE (certificate), NULL);
+             +  -  -  + ]
+     309                 :             : 
+     310                 :             :   /* Check */
+     311                 :          49 :   device_id = g_object_get_data (G_OBJECT (certificate),
+     312                 :             :                                  "valent-certificate-cn");
+     313                 :             : 
+     314         [ +  + ]:          49 :   if G_LIKELY (device_id != NULL)
+     315                 :             :     return device_id;
+     316                 :             : 
+     317                 :             :   /* Extract the common name */
+     318                 :          29 :   g_object_get (certificate, "certificate", &certificate_der, NULL);
+     319                 :          29 :   crt_der.data = certificate_der->data;
+     320                 :          29 :   crt_der.size = certificate_der->len;
+     321                 :             : 
+     322         [ +  - ]:          29 :   if ((rc = gnutls_x509_crt_init (&crt)) != GNUTLS_E_SUCCESS ||
+     323         [ +  - ]:          29 :       (rc = gnutls_x509_crt_import (crt, &crt_der, 0)) != GNUTLS_E_SUCCESS ||
+     324         [ -  + ]:          29 :       (rc = gnutls_x509_crt_get_dn_by_oid (crt,
+     325                 :             :                                            GNUTLS_OID_X520_COMMON_NAME,
+     326                 :             :                                            0,
+     327                 :             :                                            0,
+     328                 :             :                                            &buf,
+     329                 :             :                                            &buf_size)) != GNUTLS_E_SUCCESS)
+     330                 :             :     {
+     331                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, gnutls_strerror (rc));
+     332                 :           0 :       gnutls_x509_crt_deinit (crt);
+     333                 :             : 
+     334                 :           0 :       return NULL;
+     335                 :             :     }
+     336                 :             : 
+     337                 :          29 :   gnutls_x509_crt_deinit (crt);
+     338                 :             : 
+     339                 :             :   /* Intern the id as private data */
+     340                 :          29 :   g_object_set_data_full (G_OBJECT (certificate),
+     341                 :             :                           "valent-certificate-cn",
+     342                 :          29 :                           g_strndup (buf, buf_size),
+     343                 :             :                           g_free);
+     344                 :             : 
+     345                 :          29 :   return g_object_get_data (G_OBJECT (certificate), "valent-certificate-cn");
+     346                 :             : }
+     347                 :             : 
+     348                 :             : /**
+     349                 :             :  * valent_certificate_get_fingerprint:
+     350                 :             :  * @certificate: a `GTlsCertificate`
+     351                 :             :  *
+     352                 :             :  * Get a SHA256 fingerprint hash of @certificate.
+     353                 :             :  *
+     354                 :             :  * Returns: (transfer none): a SHA256 hash
+     355                 :             :  *
+     356                 :             :  * Since: 1.0
+     357                 :             :  */
+     358                 :             : const char *
+     359                 :           1 : valent_certificate_get_fingerprint (GTlsCertificate *certificate)
+     360                 :             : {
+     361                 :           2 :   g_autoptr (GByteArray) certificate_der = NULL;
+     362         [ +  - ]:           1 :   g_autoptr (GChecksum) checksum = NULL;
+     363                 :           1 :   const char *check;
+     364                 :           1 :   const char *fingerprint;
+     365                 :           1 :   char buf[SHA256_STR_LEN] = { 0, };
+     366                 :           1 :   unsigned int i = 0;
+     367                 :           1 :   unsigned int o = 0;
+     368                 :             : 
+     369   [ +  -  +  -  :           1 :   g_return_val_if_fail (G_IS_TLS_CERTIFICATE (certificate), NULL);
+             +  -  -  + ]
+     370                 :             : 
+     371                 :           1 :   fingerprint = g_object_get_data (G_OBJECT (certificate),
+     372                 :             :                                    "valent-certificate-fp");
+     373                 :             : 
+     374         [ +  - ]:           1 :   if G_LIKELY (fingerprint != NULL)
+     375                 :             :     return fingerprint;
+     376                 :             : 
+     377                 :           1 :   g_object_get (certificate, "certificate", &certificate_der, NULL);
+     378                 :           1 :   checksum = g_checksum_new (G_CHECKSUM_SHA256);
+     379                 :           1 :   g_checksum_update (checksum, certificate_der->data, certificate_der->len);
+     380                 :             : 
+     381                 :           1 :   check = g_checksum_get_string (checksum);
+     382                 :             : 
+     383         [ +  + ]:          33 :   while (i < SHA256_HEX_LEN)
+     384                 :             :     {
+     385                 :          32 :       buf[o++] = check[i++];
+     386                 :          32 :       buf[o++] = check[i++];
+     387                 :          32 :       buf[o++] = ':';
+     388                 :             :     }
+     389                 :           1 :   buf[SHA256_STR_LEN - 1] = '\0';
+     390                 :             : 
+     391                 :             :   /* Intern the hash as private data */
+     392         [ -  + ]:           1 :   g_object_set_data_full (G_OBJECT (certificate),
+     393                 :             :                           "valent-certificate-fp",
+     394                 :           1 :                           g_strdup (buf),
+     395                 :             :                           g_free);
+     396                 :             : 
+     397                 :           1 :   return g_object_get_data (G_OBJECT (certificate), "valent-certificate-fp");
+     398                 :             : }
+     399                 :             : 
+     400                 :             : /**
+     401                 :             :  * valent_certificate_get_public_key:
+     402                 :             :  * @certificate: a `GTlsCertificate`
+     403                 :             :  *
+     404                 :             :  * Get the public key of @certificate.
+     405                 :             :  *
+     406                 :             :  * Returns: (transfer none): a DER-encoded publickey
+     407                 :             :  *
+     408                 :             :  * Since: 1.0
+     409                 :             :  */
+     410                 :             : GByteArray *
+     411                 :           5 : valent_certificate_get_public_key (GTlsCertificate *certificate)
+     412                 :             : {
+     413                 :          10 :   g_autoptr (GByteArray) certificate_der = NULL;
+     414         [ +  - ]:           5 :   g_autoptr (GByteArray) pubkey = NULL;
+     415                 :           5 :   size_t size;
+     416                 :           5 :   gnutls_x509_crt_t crt = NULL;
+     417                 :           5 :   gnutls_datum_t crt_der;
+     418                 :           5 :   gnutls_pubkey_t crt_pk = NULL;
+     419                 :           5 :   int rc;
+     420                 :             : 
+     421   [ +  -  +  -  :           5 :   g_return_val_if_fail (G_IS_TLS_CERTIFICATE (certificate), NULL);
+             +  -  -  + ]
+     422                 :             : 
+     423                 :           5 :   pubkey = g_object_get_data (G_OBJECT (certificate),
+     424                 :             :                               "valent-certificate-pk");
+     425                 :             : 
+     426         [ +  - ]:           5 :   if (pubkey != NULL)
+     427                 :             :     return g_steal_pointer (&pubkey);
+     428                 :             : 
+     429                 :           5 :   g_object_get (certificate, "certificate", &certificate_der, NULL);
+     430                 :           5 :   crt_der.data = certificate_der->data;
+     431                 :           5 :   crt_der.size = certificate_der->len;
+     432                 :             : 
+     433                 :             :   /* Load the certificate */
+     434         [ +  - ]:           5 :   if ((rc = gnutls_x509_crt_init (&crt)) != GNUTLS_E_SUCCESS ||
+     435         [ -  + ]:           5 :       (rc = gnutls_x509_crt_import (crt, &crt_der, GNUTLS_X509_FMT_DER)) != GNUTLS_E_SUCCESS)
+     436                 :             :     {
+     437                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, gnutls_strerror (rc));
+     438                 :           0 :       VALENT_GOTO (out);
+     439                 :             :     }
+     440                 :             : 
+     441                 :             :   /* Load the public key */
+     442         [ +  - ]:           5 :   if ((rc = gnutls_pubkey_init (&crt_pk)) != GNUTLS_E_SUCCESS ||
+     443         [ -  + ]:           5 :       (rc = gnutls_pubkey_import_x509 (crt_pk, crt, 0)) != GNUTLS_E_SUCCESS)
+     444                 :             :     {
+     445                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, gnutls_strerror (rc));
+     446                 :           0 :       VALENT_GOTO (out);
+     447                 :             :     }
+     448                 :             : 
+     449                 :             :   /* Read the public key */
+     450                 :           5 :   rc = gnutls_pubkey_export (crt_pk, GNUTLS_X509_FMT_DER, NULL, &size);
+     451                 :             : 
+     452         [ +  - ]:           5 :   if (rc == GNUTLS_E_SUCCESS || rc == GNUTLS_E_SHORT_MEMORY_BUFFER)
+     453                 :             :     {
+     454                 :           5 :       pubkey = g_byte_array_sized_new (size);
+     455                 :           5 :       pubkey->len = size;
+     456                 :          10 :       rc = gnutls_pubkey_export (crt_pk,
+     457                 :             :                                  GNUTLS_X509_FMT_DER,
+     458                 :           5 :                                  pubkey->data, &size);
+     459                 :             : 
+     460                 :             :       /* Intern the DER as private data */
+     461         [ +  - ]:           5 :       if (rc == GNUTLS_E_SUCCESS)
+     462                 :             :         {
+     463                 :           5 :           g_object_set_data_full (G_OBJECT (certificate),
+     464                 :             :                                   "valent-certificate-pk",
+     465                 :             :                                   g_steal_pointer (&pubkey),
+     466                 :             :                                   (GDestroyNotify)g_byte_array_unref);
+     467                 :             :         }
+     468                 :             :       else
+     469                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, gnutls_strerror (rc));
+     470                 :             :     }
+     471                 :             :   else
+     472                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, gnutls_strerror (rc));
+     473                 :             : 
+     474                 :           5 :   out:
+     475                 :           5 :     gnutls_x509_crt_deinit (crt);
+     476                 :           5 :     gnutls_pubkey_deinit (crt_pk);
+     477                 :             : 
+     478                 :           5 :   return g_object_get_data (G_OBJECT (certificate), "valent-certificate-pk");
+     479                 :             : }
+     480                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel-service.c.func-c.html b/coverage/src/libvalent/device/valent-channel-service.c.func-c.html new file mode 100644 index 00000000000..9782ddf10d0 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel-service.c.func-c.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel-service.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel-service.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.3 %212185
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.1 %9354
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_channel_service_get_name1
valent_channel_service_channel_main3
valent_channel_service_ref_certificate3
valent_channel_service_get_property6
valent_channel_service_identify7
valent_channel_service_channel12
valent_channel_service_dup_id18
valent_channel_service_constructed20
valent_channel_service_finalize20
valent_channel_service_init20
valent_channel_service_set_name20
get_chassis_type23
valent_channel_service_build_identity23
valent_channel_service_ref_identity27
valent_channel_service_set_property40
valent_channel_service_class_init66
collect_capabilities99
valent_channel_service_get_type583
valent_channel_service_class_intern_init66
valent_channel_service_get_type_once86
valent_channel_service_get_type431
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel-service.c.func.html b/coverage/src/libvalent/device/valent-channel-service.c.func.html new file mode 100644 index 00000000000..c06248c8332 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel-service.c.func.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel-service.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel-service.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.3 %212185
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.1 %9354
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
collect_capabilities99
get_chassis_type23
valent_channel_service_build_identity23
valent_channel_service_channel12
valent_channel_service_channel_main3
valent_channel_service_class_init66
valent_channel_service_constructed20
valent_channel_service_dup_id18
valent_channel_service_finalize20
valent_channel_service_get_name1
valent_channel_service_get_property6
valent_channel_service_get_type583
valent_channel_service_class_intern_init66
valent_channel_service_get_type431
valent_channel_service_get_type_once86
valent_channel_service_identify7
valent_channel_service_init20
valent_channel_service_ref_certificate3
valent_channel_service_ref_identity27
valent_channel_service_set_name20
valent_channel_service_set_property40
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel-service.c.gcov.html b/coverage/src/libvalent/device/valent-channel-service.c.gcov.html new file mode 100644 index 00000000000..61abb69e58d --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel-service.c.gcov.html @@ -0,0 +1,858 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel-service.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel-service.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.3 %212185
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.1 %9354
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-channel-service"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <libpeas.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : 
+      13                 :             : #include "valent-certificate.h"
+      14                 :             : #include "valent-channel.h"
+      15                 :             : #include "valent-channel-service.h"
+      16                 :             : #include "valent-packet.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : /**
+      20                 :             :  * ValentChannelService:
+      21                 :             :  *
+      22                 :             :  * An abstract base class for connection backends.
+      23                 :             :  *
+      24                 :             :  * `ValentChannelService` is a base class for plugins that implement an interface
+      25                 :             :  * to negotiate connections with other devices.
+      26                 :             :  *
+      27                 :             :  * ## Implementation Notes
+      28                 :             :  *
+      29                 :             :  * Implementations may safely invoke [method@Valent.ChannelService.channel] from
+      30                 :             :  * any thread; it is guaranteed to be emitted in the main thread.
+      31                 :             :  *
+      32                 :             :  * ## `.plugin` File
+      33                 :             :  *
+      34                 :             :  * Channel services have no special fields in the `.plugin` file.
+      35                 :             :  *
+      36                 :             :  * Since: 1.0
+      37                 :             :  */
+      38                 :             : 
+      39                 :             : typedef struct
+      40                 :             : {
+      41                 :             :   GTlsCertificate *certificate;
+      42                 :             :   const char      *id;
+      43                 :             :   JsonNode        *identity;
+      44                 :             :   char            *name;
+      45                 :             : } ValentChannelServicePrivate;
+      46                 :             : 
+      47   [ +  +  +  - ]:         761 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentChannelService, valent_channel_service, VALENT_TYPE_EXTENSION);
+      48                 :             : 
+      49                 :             : /**
+      50                 :             :  * ValentChannelServiceClass:
+      51                 :             :  * @build_identity: the virtual function pointer for valent_channel_service_build_identity()
+      52                 :             :  * @identify: the virtual function pointer for valent_channel_service_identify()
+      53                 :             :  * @channel: the class closure for `ValentChannelService`::channel
+      54                 :             :  *
+      55                 :             :  * The virtual function table for `ValentChannelService`.
+      56                 :             :  */
+      57                 :             : 
+      58                 :             : enum {
+      59                 :             :   PROP_0,
+      60                 :             :   PROP_CERTIFICATE,
+      61                 :             :   PROP_ID,
+      62                 :             :   PROP_IDENTITY,
+      63                 :             :   PROP_NAME,
+      64                 :             :   N_PROPERTIES
+      65                 :             : };
+      66                 :             : 
+      67                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      68                 :             : 
+      69                 :             : enum {
+      70                 :             :   CHANNEL,
+      71                 :             :   N_SIGNALS
+      72                 :             : };
+      73                 :             : 
+      74                 :             : static guint signals[N_SIGNALS] = { 0, };
+      75                 :             : 
+      76                 :             : 
+      77                 :             : typedef struct
+      78                 :             : {
+      79                 :             :   GRecMutex      lock;
+      80                 :             :   GWeakRef       service;
+      81                 :             :   ValentChannel *channel;
+      82                 :             : } ChannelEmission;
+      83                 :             : 
+      84                 :             : static gboolean
+      85                 :           3 : valent_channel_service_channel_main (gpointer data)
+      86                 :             : {
+      87                 :           3 :   ChannelEmission *emission = data;
+      88                 :           6 :   g_autoptr (ValentChannelService) service = NULL;
+      89                 :             : 
+      90         [ +  - ]:           3 :   g_assert (VALENT_IS_MAIN_THREAD ());
+      91                 :             : 
+      92                 :           3 :   g_rec_mutex_lock (&emission->lock);
+      93         [ +  - ]:           3 :   if ((service = g_weak_ref_get (&emission->service)) != NULL)
+      94                 :           3 :     valent_channel_service_channel (service, emission->channel);
+      95                 :             : 
+      96                 :           3 :   g_weak_ref_clear (&emission->service);
+      97         [ +  - ]:           3 :   g_clear_object (&emission->channel);
+      98                 :           3 :   g_rec_mutex_unlock (&emission->lock);
+      99                 :           3 :   g_rec_mutex_clear (&emission->lock);
+     100                 :           3 :   g_clear_pointer (&emission, g_free);
+     101                 :             : 
+     102         [ +  - ]:           3 :   return G_SOURCE_REMOVE;
+     103                 :             : }
+     104                 :             : 
+     105                 :             : /*
+     106                 :             :  * Identity Packet Helpers
+     107                 :             :  */
+     108                 :             : static const char *
+     109                 :          23 : get_chassis_type (void)
+     110                 :             : {
+     111                 :          23 :   static size_t guard = 0;
+     112                 :          23 :   static char *chassis = NULL;
+     113                 :             : 
+     114   [ +  +  +  - ]:          23 :   if (g_once_init_enter (&guard))
+     115                 :             :     {
+     116                 :           6 :       g_autoptr (GDBusConnection) connection = NULL;
+     117         [ +  + ]:           6 :       g_autoptr (GVariant) reply = NULL;
+     118         [ -  + ]:           6 :       g_autofree char *str = NULL;
+     119                 :           6 :       uint64_t type;
+     120                 :             : 
+     121                 :           6 :       connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
+     122                 :             : 
+     123         [ +  + ]:           6 :       if (connection == NULL)
+     124                 :           5 :         VALENT_GOTO (dmi_fallback);
+     125                 :             : 
+     126                 :           1 :       reply = g_dbus_connection_call_sync (connection,
+     127                 :             :                                            "org.freedesktop.hostname1",
+     128                 :             :                                            "/org/freedesktop/hostname1",
+     129                 :             :                                            "org.freedesktop.DBus.Properties",
+     130                 :             :                                            "Get",
+     131                 :             :                                            g_variant_new ("(ss)",
+     132                 :             :                                                           "org.freedesktop.hostname1",
+     133                 :             :                                                           "Chassis"),
+     134                 :             :                                            G_VARIANT_TYPE ("(v)"),
+     135                 :             :                                            G_DBUS_CALL_FLAGS_NONE,
+     136                 :             :                                            -1,
+     137                 :             :                                            NULL,
+     138                 :             :                                            NULL);
+     139                 :             : 
+     140         [ -  + ]:           1 :       if (reply != NULL)
+     141                 :             :         {
+     142                 :           0 :           g_autoptr (GVariant) value = NULL;
+     143                 :             : 
+     144                 :           0 :           g_variant_get (reply, "(v)", &value);
+     145                 :           0 :           g_variant_get (value, "s", &chassis);
+     146                 :             : 
+     147                 :             :           /* NOTE: "phone" is the KDE Connect deviceType */
+     148         [ #  # ]:           0 :           if (g_str_equal (chassis, "handset"))
+     149                 :           0 :             g_set_str (&chassis, "phone");
+     150                 :             : 
+     151         [ #  # ]:           0 :           VALENT_GOTO (leave);
+     152                 :             :         }
+     153                 :             : 
+     154                 :             :     /* Fallback to DMI. See the SMBIOS Specification 3.0 section 7.4.1:
+     155                 :             :      * https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
+     156                 :             :      */
+     157                 :           1 :     dmi_fallback:
+     158   [ +  -  +  - ]:          12 :       if (!g_file_get_contents ("/sys/class/dmi/id/chassis_type", &str, NULL, NULL) ||
+     159                 :           6 :           !g_ascii_string_to_unsigned (str, 10, 0, G_MAXUINT64, &type, NULL))
+     160                 :           6 :         type = 0x3;
+     161                 :             : 
+     162   [ +  -  -  -  :           6 :       switch (type)
+                      - ]
+     163                 :             :         {
+     164                 :           6 :         case 0x3: /* Desktop */
+     165                 :             :         case 0x4: /* Low Profile Desktop */
+     166                 :             :         case 0x6: /* Mini Tower */
+     167                 :             :         case 0x7: /* Tower */
+     168                 :           6 :           g_set_str (&chassis, "desktop");
+     169                 :           6 :           break;
+     170                 :             : 
+     171                 :           0 :         case 0x8: /* Portable */
+     172                 :             :         case 0x9: /* Laptop */
+     173                 :             :         case 0xA: /* Notebook */
+     174                 :             :         case 0xE: /* Sub Notebook */
+     175                 :           0 :           g_set_str (&chassis, "laptop");
+     176                 :           0 :           break;
+     177                 :             : 
+     178                 :           0 :         case 0xB: /* Hand Held */
+     179                 :           0 :           g_set_str (&chassis, "phone");
+     180                 :           0 :           break;
+     181                 :             : 
+     182                 :           0 :         case 0x1E: /* Tablet */
+     183                 :           0 :           g_set_str (&chassis, "tablet");
+     184                 :           0 :           break;
+     185                 :             : 
+     186                 :           0 :         default:
+     187                 :           0 :           g_set_str (&chassis, "desktop");
+     188                 :             :         }
+     189                 :             : 
+     190                 :           6 :     leave:
+     191                 :           6 :       g_once_init_leave (&guard, TRUE);
+     192                 :             :     }
+     193                 :             : 
+     194                 :          23 :   return chassis;
+     195                 :             : }
+     196                 :             : 
+     197                 :             : /**
+     198                 :             :  * collect_capabilities:
+     199                 :             :  * @info: a `PeasPluginInfo`
+     200                 :             :  * @incoming: a `GHashTable`
+     201                 :             :  * @outgoing: a `GHashTable`
+     202                 :             :  *
+     203                 :             :  * Collect the capabilities from @info and add them to @incoming and @outgoing,
+     204                 :             :  * using g_hash_table_add() to coalesce duplicates.
+     205                 :             :  */
+     206                 :             : static inline void
+     207                 :          99 : collect_capabilities (PeasPluginInfo *info,
+     208                 :             :                       GHashTable     *incoming,
+     209                 :             :                       GHashTable     *outgoing)
+     210                 :             : {
+     211                 :          99 :   const char *data = NULL;
+     212                 :             : 
+     213         [ +  + ]:          99 :   if ((data = peas_plugin_info_get_external_data (info, "DevicePluginIncoming")) != NULL)
+     214                 :             :     {
+     215                 :          24 :       g_autofree char **capabilities = NULL;
+     216                 :             : 
+     217                 :          24 :       capabilities = g_strsplit (data, ";", -1);
+     218                 :             : 
+     219         [ +  + ]:          72 :       for (unsigned int i = 0; capabilities[i] != NULL; i++)
+     220                 :          48 :         g_hash_table_add (incoming, g_steal_pointer (&capabilities[i]));
+     221                 :             :     }
+     222                 :             : 
+     223         [ +  + ]:          99 :   if ((data = peas_plugin_info_get_external_data (info, "DevicePluginOutgoing")) != NULL)
+     224                 :             :     {
+     225                 :          24 :       g_autofree char **capabilities = NULL;
+     226                 :             : 
+     227                 :          24 :       capabilities = g_strsplit (data, ";", -1);
+     228                 :             : 
+     229         [ +  + ]:          72 :       for (unsigned int i = 0; capabilities[i] != NULL; i++)
+     230                 :          48 :         g_hash_table_add (outgoing, g_steal_pointer (&capabilities[i]));
+     231                 :             :     }
+     232                 :          99 : }
+     233                 :             : 
+     234                 :             : /* LCOV_EXCL_START */
+     235                 :             : static void
+     236                 :             : valent_channel_service_real_build_identity (ValentChannelService *service)
+     237                 :             : {
+     238                 :             :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (service);
+     239                 :             :   PeasEngine *engine;
+     240                 :             :   g_autoptr (JsonBuilder) builder = NULL;
+     241                 :             :   g_autoptr (GHashTable) incoming = NULL;
+     242                 :             :   g_autoptr (GHashTable) outgoing = NULL;
+     243                 :             :   GHashTableIter in_iter, out_iter;
+     244                 :             :   const char *capability = NULL;
+     245                 :             :   unsigned int n_plugins = 0;
+     246                 :             : 
+     247                 :             :   g_assert (VALENT_IS_CHANNEL_SERVICE (service));
+     248                 :             : 
+     249                 :             :   /* Filter the supported plugins and collect their capabilities */
+     250                 :             :   incoming = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+     251                 :             :   outgoing = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+     252                 :             : 
+     253                 :             :   engine = valent_get_plugin_engine ();
+     254                 :             :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (engine));
+     255                 :             : 
+     256                 :             :   for (unsigned int i = 0; i < n_plugins; i++)
+     257                 :             :     {
+     258                 :             :       g_autoptr (PeasPluginInfo) info = NULL;
+     259                 :             : 
+     260                 :             :       info = g_list_model_get_item (G_LIST_MODEL (engine), i);
+     261                 :             :       collect_capabilities (info, incoming, outgoing);
+     262                 :             :     }
+     263                 :             : 
+     264                 :             :   /* Build the identity packet */
+     265                 :             :   builder = json_builder_new ();
+     266                 :             :   json_builder_begin_object (builder);
+     267                 :             : 
+     268                 :             :   /* Packet */
+     269                 :             :   json_builder_set_member_name (builder, "id");
+     270                 :             :   json_builder_add_int_value (builder, 0);
+     271                 :             :   json_builder_set_member_name (builder, "type");
+     272                 :             :   json_builder_add_string_value (builder, "kdeconnect.identity");
+     273                 :             : 
+     274                 :             :   /* Body */
+     275                 :             :   json_builder_set_member_name (builder, "body");
+     276                 :             :   json_builder_begin_object (builder);
+     277                 :             : 
+     278                 :             :   /* Metadata */
+     279                 :             :   json_builder_set_member_name (builder, "deviceId");
+     280                 :             :   json_builder_add_string_value (builder, priv->id);
+     281                 :             :   json_builder_set_member_name (builder, "deviceName");
+     282                 :             :   json_builder_add_string_value (builder, priv->name);
+     283                 :             :   json_builder_set_member_name (builder, "deviceType");
+     284                 :             :   json_builder_add_string_value (builder, get_chassis_type());
+     285                 :             :   json_builder_set_member_name (builder, "protocolVersion");
+     286                 :             :   json_builder_add_int_value (builder, 7);
+     287                 :             : 
+     288                 :             :   /* Incoming Capabilities */
+     289                 :             :   json_builder_set_member_name (builder, "incomingCapabilities");
+     290                 :             :   json_builder_begin_array (builder);
+     291                 :             : 
+     292                 :             :   g_hash_table_iter_init (&in_iter, incoming);
+     293                 :             : 
+     294                 :             :   while (g_hash_table_iter_next (&in_iter, (void **)&capability, NULL))
+     295                 :             :     json_builder_add_string_value (builder, capability);
+     296                 :             : 
+     297                 :             :   json_builder_end_array (builder);
+     298                 :             : 
+     299                 :             :   /* Outgoing Capabilities */
+     300                 :             :   json_builder_set_member_name (builder, "outgoingCapabilities");
+     301                 :             :   json_builder_begin_array (builder);
+     302                 :             : 
+     303                 :             :   g_hash_table_iter_init (&out_iter, outgoing);
+     304                 :             : 
+     305                 :             :   while (g_hash_table_iter_next (&out_iter, (void **)&capability, NULL))
+     306                 :             :     json_builder_add_string_value (builder, capability);
+     307                 :             : 
+     308                 :             :   json_builder_end_array (builder);
+     309                 :             : 
+     310                 :             :   /* End Body, Packet */
+     311                 :             :   json_builder_end_object (builder);
+     312                 :             :   json_builder_end_object (builder);
+     313                 :             : 
+     314                 :             : 
+     315                 :             :   /* Store the identity */
+     316                 :             :   valent_object_lock (VALENT_OBJECT (service));
+     317                 :             :   g_clear_pointer (&priv->identity, json_node_unref);
+     318                 :             :   priv->identity = json_builder_get_root (builder);
+     319                 :             :   valent_object_unlock (VALENT_OBJECT (service));
+     320                 :             : }
+     321                 :             : 
+     322                 :             : static void
+     323                 :             : valent_channel_service_real_identify (ValentChannelService *service,
+     324                 :             :                                       const char           *target)
+     325                 :             : {
+     326                 :             :   g_assert (VALENT_IS_CHANNEL_SERVICE (service));
+     327                 :             : }
+     328                 :             : /* LCOV_EXCL_STOP */
+     329                 :             : 
+     330                 :             : /*
+     331                 :             :  * GObject
+     332                 :             :  */
+     333                 :             : static void
+     334                 :          20 : valent_channel_service_constructed (GObject *object)
+     335                 :             : {
+     336                 :          20 :   ValentChannelService *self = VALENT_CHANNEL_SERVICE (object);
+     337                 :          20 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (self);
+     338                 :             : 
+     339         [ +  + ]:          20 :   if (priv->certificate == NULL)
+     340                 :             :     {
+     341                 :           6 :       ValentContext *context = NULL;
+     342                 :          26 :       g_autoptr (GFile) config = NULL;
+     343                 :             : 
+     344                 :           6 :       context = valent_extension_get_context (VALENT_EXTENSION (self));
+     345                 :           6 :       config = valent_context_get_config_file (context, ".");
+     346         [ +  - ]:           6 :       priv->certificate = valent_certificate_new_sync (g_file_peek_path (config),
+     347                 :             :                                                        NULL);
+     348                 :             :     }
+     349                 :             : 
+     350                 :          20 :   priv->id = valent_certificate_get_common_name (priv->certificate);
+     351                 :             : 
+     352                 :          20 :   valent_channel_service_build_identity (self);
+     353                 :             : 
+     354                 :          20 :   G_OBJECT_CLASS (valent_channel_service_parent_class)->constructed (object);
+     355                 :          20 : }
+     356                 :             : 
+     357                 :             : static void
+     358                 :          20 : valent_channel_service_finalize (GObject *object)
+     359                 :             : {
+     360                 :          20 :   ValentChannelService *self = VALENT_CHANNEL_SERVICE (object);
+     361                 :          20 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (self);
+     362                 :             : 
+     363         [ +  - ]:          20 :   g_clear_object (&priv->certificate);
+     364         [ +  - ]:          20 :   g_clear_pointer (&priv->identity, json_node_unref);
+     365         [ +  - ]:          20 :   g_clear_pointer (&priv->name, g_free);
+     366                 :             : 
+     367                 :          20 :   G_OBJECT_CLASS (valent_channel_service_parent_class)->finalize (object);
+     368                 :          20 : }
+     369                 :             : 
+     370                 :             : static void
+     371                 :           6 : valent_channel_service_get_property (GObject    *object,
+     372                 :             :                                      guint       prop_id,
+     373                 :             :                                      GValue     *value,
+     374                 :             :                                      GParamSpec *pspec)
+     375                 :             : {
+     376                 :           6 :   ValentChannelService *self = VALENT_CHANNEL_SERVICE (object);
+     377                 :           6 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (self);
+     378                 :             : 
+     379   [ -  +  +  +  :           6 :   switch (prop_id)
+                      - ]
+     380                 :             :     {
+     381                 :           0 :     case PROP_CERTIFICATE:
+     382                 :           0 :       g_value_take_object (value, valent_channel_service_ref_certificate (self));
+     383                 :           0 :       break;
+     384                 :             : 
+     385                 :           1 :     case PROP_ID:
+     386                 :           1 :       g_value_set_string (value, priv->id);
+     387                 :           1 :       break;
+     388                 :             : 
+     389                 :           4 :     case PROP_IDENTITY:
+     390                 :           4 :       g_value_take_boxed (value, valent_channel_service_ref_identity (self));
+     391                 :           4 :       break;
+     392                 :             : 
+     393                 :           1 :     case PROP_NAME:
+     394                 :           1 :       g_value_set_string (value, priv->name);
+     395                 :           1 :       break;
+     396                 :             : 
+     397                 :           0 :     default:
+     398                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     399                 :             :     }
+     400                 :           6 : }
+     401                 :             : 
+     402                 :             : static void
+     403                 :          40 : valent_channel_service_set_property (GObject      *object,
+     404                 :             :                                      guint         prop_id,
+     405                 :             :                                      const GValue *value,
+     406                 :             :                                      GParamSpec   *pspec)
+     407                 :             : {
+     408                 :          40 :   ValentChannelService *self = VALENT_CHANNEL_SERVICE (object);
+     409                 :          40 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (self);
+     410                 :             : 
+     411      [ +  +  - ]:          40 :   switch (prop_id)
+     412                 :             :     {
+     413                 :          20 :     case PROP_CERTIFICATE:
+     414                 :          20 :       priv->certificate = g_value_dup_object (value);
+     415                 :          20 :       break;
+     416                 :             : 
+     417                 :          20 :     case PROP_NAME:
+     418                 :          20 :       valent_channel_service_set_name (self, g_value_get_string (value));
+     419                 :          20 :       break;
+     420                 :             : 
+     421                 :           0 :     default:
+     422                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     423                 :             :     }
+     424                 :          40 : }
+     425                 :             : 
+     426                 :             : static void
+     427                 :          66 : valent_channel_service_class_init (ValentChannelServiceClass *klass)
+     428                 :             : {
+     429                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     430                 :          66 :   ValentChannelServiceClass *service_class = VALENT_CHANNEL_SERVICE_CLASS (klass);
+     431                 :             : 
+     432                 :          66 :   object_class->constructed = valent_channel_service_constructed;
+     433                 :          66 :   object_class->finalize = valent_channel_service_finalize;
+     434                 :          66 :   object_class->get_property = valent_channel_service_get_property;
+     435                 :          66 :   object_class->set_property = valent_channel_service_set_property;
+     436                 :             : 
+     437                 :          66 :   service_class->build_identity = valent_channel_service_real_build_identity;
+     438                 :          66 :   service_class->identify = valent_channel_service_real_identify;
+     439                 :             : 
+     440                 :             :   /**
+     441                 :             :    * ValentChannelService:certificate: (getter ref_certificate)
+     442                 :             :    *
+     443                 :             :    * The TLS certificate the service uses to authenticate with other devices.
+     444                 :             :    */
+     445                 :         132 :   properties [PROP_CERTIFICATE] =
+     446                 :          66 :     g_param_spec_object ("certificate", NULL, NULL,
+     447                 :             :                          G_TYPE_TLS_CERTIFICATE,
+     448                 :             :                          (G_PARAM_READWRITE |
+     449                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     450                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     451                 :             :                           G_PARAM_STATIC_STRINGS));
+     452                 :             : 
+     453                 :             :   /**
+     454                 :             :    * ValentChannelService:id: (getter dup_id)
+     455                 :             :    *
+     456                 :             :    * The local ID.
+     457                 :             :    *
+     458                 :             :    * This is the ID used to identify the local device, which should be unique
+     459                 :             :    * among devices in a given network.
+     460                 :             :    *
+     461                 :             :    * This property is thread-safe. Emissions of [signal@GObject.Object::notify]
+     462                 :             :    * are guaranteed to happen in the main thread.
+     463                 :             :    *
+     464                 :             :    * Since: 1.0
+     465                 :             :    */
+     466                 :         132 :   properties [PROP_ID] =
+     467                 :          66 :     g_param_spec_string ("id", NULL, NULL,
+     468                 :             :                          NULL,
+     469                 :             :                          (G_PARAM_READABLE |
+     470                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     471                 :             :                           G_PARAM_STATIC_STRINGS));
+     472                 :             : 
+     473                 :             :   /**
+     474                 :             :    * ValentChannelService:identity: (getter ref_identity)
+     475                 :             :    *
+     476                 :             :    * The local identity packet.
+     477                 :             :    *
+     478                 :             :    * This is the identity packet sent by the [class@Valent.ChannelService]
+     479                 :             :    * implementation to describe the local device.
+     480                 :             :    *
+     481                 :             :    * This property is thread-safe. Emissions of [signal@GObject.Object::notify]
+     482                 :             :    * are guaranteed to happen in the main thread.
+     483                 :             :    *
+     484                 :             :    * Since: 1.0
+     485                 :             :    */
+     486                 :         132 :   properties [PROP_IDENTITY] =
+     487                 :          66 :     g_param_spec_boxed ("identity", NULL, NULL,
+     488                 :             :                         JSON_TYPE_NODE,
+     489                 :             :                         (G_PARAM_READABLE |
+     490                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     491                 :             :                          G_PARAM_STATIC_STRINGS));
+     492                 :             : 
+     493                 :             :   /**
+     494                 :             :    * ValentChannelService:name: (getter get_name) (setter set_name)
+     495                 :             :    *
+     496                 :             :    * The local display name.
+     497                 :             :    *
+     498                 :             :    * This is the user-visible label packet used to identify the local device in
+     499                 :             :    * user interfaces.
+     500                 :             :    *
+     501                 :             :    * This property is thread-safe. Emissions of [signal@GObject.Object::notify]
+     502                 :             :    * are guaranteed to happen in the main thread.
+     503                 :             :    *
+     504                 :             :    * Since: 1.0
+     505                 :             :    */
+     506                 :         132 :   properties [PROP_NAME] =
+     507                 :          66 :     g_param_spec_string ("name", NULL, NULL,
+     508                 :             :                          "Valent",
+     509                 :             :                          (G_PARAM_READWRITE |
+     510                 :             :                           G_PARAM_CONSTRUCT |
+     511                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     512                 :             :                           G_PARAM_STATIC_STRINGS));
+     513                 :             : 
+     514                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     515                 :             : 
+     516                 :             :   /**
+     517                 :             :    * ValentChannelService::channel:
+     518                 :             :    * @service: a `ValentChannelService`
+     519                 :             :    * @channel: a `ValentChannel`
+     520                 :             :    *
+     521                 :             :    * Emitted when a new channel has been negotiated.
+     522                 :             :    *
+     523                 :             :    * In practice, when this is emitted a [class@Valent.DeviceManager] will
+     524                 :             :    * ensure a [class@Valent.Device] exists to take ownership of @channel.
+     525                 :             :    *
+     526                 :             :    * Since: 1.0
+     527                 :             :    */
+     528                 :         132 :   signals [CHANNEL] =
+     529                 :          66 :     g_signal_new ("channel",
+     530                 :             :                   G_TYPE_FROM_CLASS (klass),
+     531                 :             :                   G_SIGNAL_RUN_LAST,
+     532                 :             :                   G_STRUCT_OFFSET (ValentChannelServiceClass, channel),
+     533                 :             :                   NULL, NULL,
+     534                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     535                 :             :                   G_TYPE_NONE, 1, VALENT_TYPE_CHANNEL);
+     536                 :          66 :   g_signal_set_va_marshaller (signals [CHANNEL],
+     537                 :             :                               G_TYPE_FROM_CLASS (klass),
+     538                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     539                 :          66 : }
+     540                 :             : 
+     541                 :             : static void
+     542                 :          20 : valent_channel_service_init (ValentChannelService *self)
+     543                 :             : {
+     544                 :          20 : }
+     545                 :             : 
+     546                 :             : /**
+     547                 :             :  * valent_channel_service_ref_certificate: (get-property certificate)
+     548                 :             :  * @self: a `ValentChannelService`
+     549                 :             :  *
+     550                 :             :  * Get the TLS certificate for the service.
+     551                 :             :  *
+     552                 :             :  * Returns: (transfer full) (not nullable): the service TLS certificate
+     553                 :             :  */
+     554                 :             : GTlsCertificate *
+     555                 :           3 : valent_channel_service_ref_certificate (ValentChannelService *service)
+     556                 :             : {
+     557                 :           3 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (service);
+     558                 :           3 :   GTlsCertificate *ret = NULL;
+     559                 :             : 
+     560         [ +  - ]:           3 :   g_return_val_if_fail (VALENT_IS_CHANNEL_SERVICE (service), NULL);
+     561                 :             : 
+     562                 :           3 :   valent_object_lock (VALENT_OBJECT (service));
+     563                 :           3 :   ret = g_object_ref (priv->certificate);
+     564                 :           3 :   valent_object_unlock (VALENT_OBJECT (service));
+     565                 :             : 
+     566                 :           3 :   return g_steal_pointer (&ret);
+     567                 :             : }
+     568                 :             : 
+     569                 :             : /**
+     570                 :             :  * valent_channel_service_dup_id: (get-property id)
+     571                 :             :  * @service: a `ValentChannelService`
+     572                 :             :  *
+     573                 :             :  * Get the local ID.
+     574                 :             :  *
+     575                 :             :  * Returns: (transfer full) (not nullable): the service ID
+     576                 :             :  *
+     577                 :             :  * Since: 1.0
+     578                 :             :  */
+     579                 :             : char *
+     580                 :          18 : valent_channel_service_dup_id (ValentChannelService *service)
+     581                 :             : {
+     582                 :          18 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (service);
+     583                 :          18 :   char *ret;
+     584                 :             : 
+     585         [ +  - ]:          18 :   g_return_val_if_fail (VALENT_IS_CHANNEL_SERVICE (service), NULL);
+     586                 :             : 
+     587                 :          18 :   valent_object_lock (VALENT_OBJECT (service));
+     588         [ -  + ]:          18 :   ret = g_strdup (priv->id);
+     589                 :          18 :   valent_object_unlock (VALENT_OBJECT (service));
+     590                 :             : 
+     591                 :          18 :   return g_steal_pointer (&ret);
+     592                 :             : }
+     593                 :             : 
+     594                 :             : /**
+     595                 :             :  * valent_channel_service_ref_identity: (get-property identity)
+     596                 :             :  * @service: a `ValentChannelService`
+     597                 :             :  *
+     598                 :             :  * Get the local identity packet.
+     599                 :             :  *
+     600                 :             :  * Returns: (transfer full): a KDE Connect packet
+     601                 :             :  *
+     602                 :             :  * Since: 1.0
+     603                 :             :  */
+     604                 :             : JsonNode *
+     605                 :          27 : valent_channel_service_ref_identity (ValentChannelService *service)
+     606                 :             : {
+     607                 :          27 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (service);
+     608                 :          27 :   JsonNode *ret;
+     609                 :             : 
+     610         [ +  - ]:          27 :   g_return_val_if_fail (VALENT_IS_CHANNEL_SERVICE (service), NULL);
+     611                 :             : 
+     612                 :          27 :   valent_object_lock (VALENT_OBJECT (service));
+     613                 :          27 :   ret = json_node_ref (priv->identity);
+     614                 :          27 :   valent_object_unlock (VALENT_OBJECT (service));
+     615                 :             : 
+     616                 :          27 :   return g_steal_pointer (&ret);
+     617                 :             : }
+     618                 :             : 
+     619                 :             : /**
+     620                 :             :  * valent_channel_service_get_name: (get-property name)
+     621                 :             :  * @service: a `ValentChannelService`
+     622                 :             :  *
+     623                 :             :  * Get the local display name.
+     624                 :             :  *
+     625                 :             :  * Returns: (transfer none): the local display name
+     626                 :             :  *
+     627                 :             :  * Since: 1.0
+     628                 :             :  */
+     629                 :             : const char *
+     630                 :           1 : valent_channel_service_get_name (ValentChannelService *service)
+     631                 :             : {
+     632                 :           1 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (service);
+     633                 :             : 
+     634         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CHANNEL_SERVICE (service), NULL);
+     635                 :             : 
+     636                 :           1 :   return priv->name;
+     637                 :             : }
+     638                 :             : 
+     639                 :             : /**
+     640                 :             :  * valent_channel_service_set_name: (set-property name)
+     641                 :             :  * @service: a `ValentChannelService`
+     642                 :             :  * @name: (not nullable): a display name
+     643                 :             :  *
+     644                 :             :  * Set the local display name.
+     645                 :             :  *
+     646                 :             :  * Since: 1.0
+     647                 :             :  */
+     648                 :             : void
+     649                 :          20 : valent_channel_service_set_name (ValentChannelService *service,
+     650                 :             :                                  const char           *name)
+     651                 :             : {
+     652                 :          20 :   ValentChannelServicePrivate *priv = valent_channel_service_get_instance_private (service);
+     653                 :          20 :   JsonObject *body;
+     654                 :             : 
+     655         [ +  - ]:          20 :   g_return_if_fail (VALENT_IS_CHANNEL_SERVICE (service));
+     656   [ +  -  -  + ]:          20 :   g_return_if_fail (name != NULL && *name != '\0');
+     657                 :             : 
+     658         [ +  - ]:          20 :   if (g_set_str (&priv->name, name))
+     659                 :          20 :     g_object_notify_by_pspec (G_OBJECT (service), properties [PROP_NAME]);
+     660                 :             : 
+     661                 :          20 :   valent_object_lock (VALENT_OBJECT (service));
+     662         [ -  + ]:          20 :   if (priv->identity)
+     663                 :             :     {
+     664                 :           0 :       body = valent_packet_get_body (priv->identity);
+     665                 :           0 :       json_object_set_string_member (body, "deviceName", priv->name);
+     666                 :           0 :       g_object_notify_by_pspec (G_OBJECT (service), properties [PROP_IDENTITY]);
+     667                 :             :     }
+     668                 :          20 :   valent_object_unlock (VALENT_OBJECT (service));
+     669                 :             : }
+     670                 :             : 
+     671                 :             : /**
+     672                 :             :  * valent_channel_service_build_identity: (virtual build_identity)
+     673                 :             :  * @service: a `ValentChannelService`
+     674                 :             :  *
+     675                 :             :  * Rebuild the local KDE Connect identity packet.
+     676                 :             :  *
+     677                 :             :  * This method is called to rebuild the identity packet used to identify the
+     678                 :             :  * host device to remote devices.
+     679                 :             :  *
+     680                 :             :  * Implementations that override [vfunc@Valent.ChannelService.build_identity]
+     681                 :             :  * should chain-up first, then call [method@Valent.ChannelService.ref_identity]
+     682                 :             :  * and modify that.
+     683                 :             :  *
+     684                 :             :  * Since: 1.0
+     685                 :             :  */
+     686                 :             : void
+     687                 :          23 : valent_channel_service_build_identity (ValentChannelService *service)
+     688                 :             : {
+     689                 :          23 :   VALENT_ENTRY;
+     690                 :             : 
+     691         [ +  - ]:          23 :   g_return_if_fail (VALENT_IS_CHANNEL_SERVICE (service));
+     692                 :             : 
+     693                 :          23 :   valent_object_lock (VALENT_OBJECT (service));
+     694                 :          23 :   VALENT_CHANNEL_SERVICE_GET_CLASS (service)->build_identity (service);
+     695                 :          23 :   valent_object_unlock (VALENT_OBJECT (service));
+     696                 :             : 
+     697                 :          23 :   VALENT_EXIT;
+     698                 :             : }
+     699                 :             : 
+     700                 :             : /**
+     701                 :             :  * valent_channel_service_identify: (virtual identify)
+     702                 :             :  * @service: a `ValentChannelService`
+     703                 :             :  * @target: (nullable): a target string
+     704                 :             :  *
+     705                 :             :  * Identify the host device to the network.
+     706                 :             :  *
+     707                 :             :  * This method is called to announce the availability of the host device to
+     708                 :             :  * other devices.
+     709                 :             :  *
+     710                 :             :  * Implementations that override [vfunc@Valent.ChannelService.identify] may
+     711                 :             :  * ignore @target or use it to address a particular device.
+     712                 :             :  *
+     713                 :             :  * Since: 1.0
+     714                 :             :  */
+     715                 :             : void
+     716                 :           7 : valent_channel_service_identify (ValentChannelService *service,
+     717                 :             :                                  const char           *target)
+     718                 :             : {
+     719                 :           7 :   VALENT_ENTRY;
+     720                 :             : 
+     721         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_CHANNEL_SERVICE (service));
+     722                 :             : 
+     723                 :           7 :   VALENT_CHANNEL_SERVICE_GET_CLASS (service)->identify (service, target);
+     724                 :             : 
+     725                 :           7 :   VALENT_EXIT;
+     726                 :             : }
+     727                 :             : 
+     728                 :             : /**
+     729                 :             :  * valent_channel_service_channel:
+     730                 :             :  * @service: a `ValentChannelService`
+     731                 :             :  * @channel: a `ValentChannel`
+     732                 :             :  *
+     733                 :             :  * Emit [signal@Valent.ChannelService::channel] on @service.
+     734                 :             :  *
+     735                 :             :  * This method should only be called by implementations of
+     736                 :             :  * [class@Valent.ChannelService].
+     737                 :             :  *
+     738                 :             :  * Since: 1.0
+     739                 :             :  */
+     740                 :             : void
+     741                 :          12 : valent_channel_service_channel (ValentChannelService *service,
+     742                 :             :                                 ValentChannel        *channel)
+     743                 :             : {
+     744                 :          12 :   ChannelEmission *emission;
+     745                 :             : 
+     746         [ +  - ]:          12 :   g_return_if_fail (VALENT_IS_CHANNEL_SERVICE (service));
+     747         [ -  + ]:          12 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+     748                 :             : 
+     749         [ +  + ]:          12 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+     750                 :             :     {
+     751                 :           9 :       g_signal_emit (G_OBJECT (service), signals [CHANNEL], 0, channel);
+     752                 :           9 :       return;
+     753                 :             :     }
+     754                 :             : 
+     755                 :           3 :   emission = g_new0 (ChannelEmission, 1);
+     756                 :           3 :   g_rec_mutex_init (&emission->lock);
+     757                 :           3 :   g_rec_mutex_lock (&emission->lock);
+     758                 :           3 :   g_weak_ref_init (&emission->service, service);
+     759                 :           3 :   emission->channel = g_object_ref (channel);
+     760                 :           3 :   g_rec_mutex_unlock (&emission->lock);
+     761                 :             : 
+     762                 :           3 :   g_timeout_add (0, valent_channel_service_channel_main, emission);
+     763                 :             : }
+     764                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel-service.h.func-c.html b/coverage/src/libvalent/device/valent-channel-service.h.func-c.html new file mode 100644 index 00000000000..d43a3f46997 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel-service.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel-service.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel-service.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CHANNEL_SERVICE144
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel-service.h.func.html b/coverage/src/libvalent/device/valent-channel-service.h.func.html new file mode 100644 index 00000000000..cc5600fc08c --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel-service.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel-service.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel-service.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CHANNEL_SERVICE144
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel-service.h.gcov.html b/coverage/src/libvalent/device/valent-channel-service.h.gcov.html new file mode 100644 index 00000000000..7dafbc86740 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel-service.h.gcov.html @@ -0,0 +1,151 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel-service.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel-service.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : #include "valent-channel.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_CHANNEL_SERVICE (valent_channel_service_get_type())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :         178 : G_DECLARE_DERIVABLE_TYPE (ValentChannelService, valent_channel_service, VALENT, CHANNEL_SERVICE, ValentExtension)
+             +  -  +  - ]
+      19                 :             : 
+      20                 :             : struct _ValentChannelServiceClass
+      21                 :             : {
+      22                 :             :   ValentExtensionClass   parent_class;
+      23                 :             : 
+      24                 :             :   /* virtual functions */
+      25                 :             :   void                   (*build_identity) (ValentChannelService  *service);
+      26                 :             :   void                   (*identify)       (ValentChannelService  *service,
+      27                 :             :                                             const char            *target);
+      28                 :             : 
+      29                 :             :   /* signals */
+      30                 :             :   void                   (*channel)        (ValentChannelService  *service,
+      31                 :             :                                             ValentChannel         *channel);
+      32                 :             : 
+      33                 :             :   /*< private >*/
+      34                 :             :   gpointer               padding[8];
+      35                 :             : };
+      36                 :             : 
+      37                 :             : VALENT_AVAILABLE_IN_1_0
+      38                 :             : void              valent_channel_service_channel         (ValentChannelService *service,
+      39                 :             :                                                           ValentChannel        *channel);
+      40                 :             : VALENT_AVAILABLE_IN_1_0
+      41                 :             : GTlsCertificate * valent_channel_service_ref_certificate (ValentChannelService *self);
+      42                 :             : VALENT_AVAILABLE_IN_1_0
+      43                 :             : char            * valent_channel_service_dup_id          (ValentChannelService *service);
+      44                 :             : VALENT_AVAILABLE_IN_1_0
+      45                 :             : JsonNode        * valent_channel_service_ref_identity    (ValentChannelService *service);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : const char      * valent_channel_service_get_name        (ValentChannelService *service);
+      48                 :             : VALENT_AVAILABLE_IN_1_0
+      49                 :             : void              valent_channel_service_set_name        (ValentChannelService *service,
+      50                 :             :                                                           const char           *name);
+      51                 :             : VALENT_AVAILABLE_IN_1_0
+      52                 :             : void              valent_channel_service_build_identity  (ValentChannelService *service);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : void              valent_channel_service_identify        (ValentChannelService *service,
+      55                 :             :                                                           const char           *target);
+      56                 :             : 
+      57                 :             : G_END_DECLS
+      58                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel.c.func-c.html b/coverage/src/libvalent/device/valent-channel.c.func-c.html new file mode 100644 index 00000000000..df4a5d12cbe --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel.c.func-c.html @@ -0,0 +1,322 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.0 %303294
Test Date:2024-03-31 18:46:36Functions:100.0 %3232
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.2 %258127
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_channel_close_finish1
valent_channel_download_async1
valent_channel_download_finish1
valent_channel_get_identity1
valent_channel_upload_async1
valent_channel_upload_finish1
valent_channel_get_property3
valent_channel_get_verification_key4
valent_channel_store_data5
valent_channel_ref_base_stream18
valent_channel_download28
valent_channel_upload28
valent_channel_class_init34
valent_channel_get_peer_identity85
valent_channel_close_async91
valent_channel_close_task91
valent_channel_finalize188
valent_channel_init188
valent_channel_set_base_stream188
valent_channel_write_packet_worker188
valent_channel_close255
valent_channel_set_property564
valent_channel_write_packet_finish3628
valent_channel_write_packet_func3663
valent_channel_write_packet3664
valent_channel_read_packet3728
valent_channel_read_packet_finish3728
valent_channel_read_packet_task3728
valent_channel_return_error_if_closed11055
valent_channel_get_type23203
valent_channel_class_intern_init34
valent_channel_get_type_once86
valent_channel_get_type23083
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel.c.func.html b/coverage/src/libvalent/device/valent-channel.c.func.html new file mode 100644 index 00000000000..df8bf1e8c39 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel.c.func.html @@ -0,0 +1,322 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.0 %303294
Test Date:2024-03-31 18:46:36Functions:100.0 %3232
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.2 %258127
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_channel_class_init34
valent_channel_close255
valent_channel_close_async91
valent_channel_close_finish1
valent_channel_close_task91
valent_channel_download28
valent_channel_download_async1
valent_channel_download_finish1
valent_channel_finalize188
valent_channel_get_identity1
valent_channel_get_peer_identity85
valent_channel_get_property3
valent_channel_get_type23203
valent_channel_class_intern_init34
valent_channel_get_type23083
valent_channel_get_type_once86
valent_channel_get_verification_key4
valent_channel_init188
valent_channel_read_packet3728
valent_channel_read_packet_finish3728
valent_channel_read_packet_task3728
valent_channel_ref_base_stream18
valent_channel_return_error_if_closed11055
valent_channel_set_base_stream188
valent_channel_set_property564
valent_channel_store_data5
valent_channel_upload28
valent_channel_upload_async1
valent_channel_upload_finish1
valent_channel_write_packet3664
valent_channel_write_packet_finish3628
valent_channel_write_packet_func3663
valent_channel_write_packet_worker188
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel.c.gcov.html b/coverage/src/libvalent/device/valent-channel.c.gcov.html new file mode 100644 index 00000000000..b0bc2bcbf71 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel.c.gcov.html @@ -0,0 +1,1278 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.0 %303294
Test Date:2024-03-31 18:46:36Functions:100.0 %3232
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.2 %258127
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-channel"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <time.h>
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <json-glib/json-glib.h>
+      12                 :             : #include <libvalent-core.h>
+      13                 :             : 
+      14                 :             : #include "valent-channel.h"
+      15                 :             : #include "valent-packet.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : /**
+      19                 :             :  * ValentChannel:
+      20                 :             :  *
+      21                 :             :  * A base class for device connections.
+      22                 :             :  *
+      23                 :             :  * `ValentChannel` is a base class for the primary communication channel in
+      24                 :             :  * Valent. It is effectively an abstraction layer around a [class@Gio.IOStream].
+      25                 :             :  *
+      26                 :             :  * ## Packet Exchange
+      27                 :             :  *
+      28                 :             :  * The core of the KDE Connect protocol is built on the exchange of JSON
+      29                 :             :  * packets, similar to JSON-RPC. Packets can be queued concurrently from
+      30                 :             :  * different threads with [method@Valent.Channel.write_packet] and read
+      31                 :             :  * sequentially with [method@Valent.Channel.read_packet].
+      32                 :             :  *
+      33                 :             :  * Packets may contain payload information, allowing devices to negotiate
+      34                 :             :  * auxiliary connections. Incoming connections can be accepted by passing the
+      35                 :             :  * packet to [method@Valent.Channel.download], or opened by passing the packet
+      36                 :             :  * to [method@Valent.Channel.upload].
+      37                 :             :  *
+      38                 :             :  * ## Implementation Notes
+      39                 :             :  *
+      40                 :             :  * Implementations should override [vfunc@Valent.Channel.download] and
+      41                 :             :  * [vfunc@Valent.Channel.upload] to support accepting and opening auxiliary
+      42                 :             :  * connections, respectively. If pairing involves exchanging a key, override
+      43                 :             :  * [vfunc@Valent.Channel.get_verification_key]. To know when to store persistent
+      44                 :             :  * data related to the connection, override [vfunc@Valent.Channel.store_data].
+      45                 :             :  *
+      46                 :             :  * Since: 1.0
+      47                 :             :  */
+      48                 :             : 
+      49                 :             : typedef struct
+      50                 :             : {
+      51                 :             :   GIOStream        *base_stream;
+      52                 :             :   JsonNode         *identity;
+      53                 :             :   JsonNode         *peer_identity;
+      54                 :             : 
+      55                 :             :   /* Packet Buffer */
+      56                 :             :   GDataInputStream *input_buffer;
+      57                 :             :   GMainLoop        *output_buffer;
+      58                 :             : } ValentChannelPrivate;
+      59                 :             : 
+      60   [ +  +  +  - ]:       46615 : G_DEFINE_TYPE_WITH_PRIVATE (ValentChannel, valent_channel, VALENT_TYPE_OBJECT)
+      61                 :             : 
+      62                 :             : /**
+      63                 :             :  * ValentChannelClass:
+      64                 :             :  * @get_verification_key: the virtual function pointer for valent_channel_get_verification_key()
+      65                 :             :  * @download: the virtual function pointer for valent_channel_download()
+      66                 :             :  * @upload: the virtual function pointer for valent_channel_upload()
+      67                 :             :  * @store_data: the virtual function pointer for valent_channel_store_data()
+      68                 :             :  *
+      69                 :             :  * The virtual function table for `ValentChannel`.
+      70                 :             :  */
+      71                 :             : 
+      72                 :             : enum {
+      73                 :             :   PROP_0,
+      74                 :             :   PROP_BASE_STREAM,
+      75                 :             :   PROP_IDENTITY,
+      76                 :             :   PROP_PEER_IDENTITY,
+      77                 :             :   N_PROPERTIES
+      78                 :             : };
+      79                 :             : 
+      80                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      81                 :             : 
+      82                 :             : 
+      83                 :             : /* LCOV_EXCL_START */
+      84                 :             : static const char *
+      85                 :             : valent_channel_real_get_verification_key (ValentChannel *channel)
+      86                 :             : {
+      87                 :             :   return NULL;
+      88                 :             : }
+      89                 :             : 
+      90                 :             : static GIOStream *
+      91                 :             : valent_channel_real_download (ValentChannel  *channel,
+      92                 :             :                               JsonNode       *packet,
+      93                 :             :                               GCancellable   *cancellable,
+      94                 :             :                               GError        **error)
+      95                 :             : {
+      96                 :             :   g_set_error (error,
+      97                 :             :                G_IO_ERROR,
+      98                 :             :                G_IO_ERROR_NOT_SUPPORTED,
+      99                 :             :                "%s does not implement download()",
+     100                 :             :                G_OBJECT_TYPE_NAME (channel));
+     101                 :             :   return NULL;
+     102                 :             : }
+     103                 :             : 
+     104                 :             : static void
+     105                 :             : valent_channel_real_download_task (GTask        *task,
+     106                 :             :                                    gpointer      source_object,
+     107                 :             :                                    gpointer      task_data,
+     108                 :             :                                    GCancellable *cancellable)
+     109                 :             : {
+     110                 :             :   ValentChannel *self = source_object;
+     111                 :             :   JsonNode *packet = task_data;
+     112                 :             :   g_autoptr (GIOStream) stream = NULL;
+     113                 :             :   GError *error = NULL;
+     114                 :             : 
+     115                 :             :   if (g_task_return_error_if_cancelled (task))
+     116                 :             :     return;
+     117                 :             : 
+     118                 :             :   stream = VALENT_CHANNEL_GET_CLASS (self)->download (self,
+     119                 :             :                                                       packet,
+     120                 :             :                                                       cancellable,
+     121                 :             :                                                       &error);
+     122                 :             : 
+     123                 :             :   if (stream == NULL)
+     124                 :             :     return g_task_return_error (task, error);
+     125                 :             : 
+     126                 :             :   g_task_return_pointer (task, g_steal_pointer (&stream), g_object_unref);
+     127                 :             : }
+     128                 :             : 
+     129                 :             : static void
+     130                 :             : valent_channel_real_download_async (ValentChannel       *channel,
+     131                 :             :                                     JsonNode            *packet,
+     132                 :             :                                     GCancellable        *cancellable,
+     133                 :             :                                     GAsyncReadyCallback  callback,
+     134                 :             :                                     gpointer             user_data)
+     135                 :             : {
+     136                 :             :   g_autoptr (GTask) task = NULL;
+     137                 :             : 
+     138                 :             :   g_assert (VALENT_IS_CHANNEL (channel));
+     139                 :             :   g_assert (VALENT_IS_PACKET (packet));
+     140                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     141                 :             : 
+     142                 :             :   task = g_task_new (channel, cancellable, callback, user_data);
+     143                 :             :   g_task_set_source_tag (task, valent_channel_real_download_async);
+     144                 :             :   g_task_set_task_data (task,
+     145                 :             :                         json_node_ref (packet),
+     146                 :             :                         (GDestroyNotify)json_node_unref);
+     147                 :             :   g_task_run_in_thread (task, valent_channel_real_download_task);
+     148                 :             : }
+     149                 :             : 
+     150                 :             : static GIOStream *
+     151                 :             : valent_channel_real_download_finish (ValentChannel  *channel,
+     152                 :             :                                      GAsyncResult   *result,
+     153                 :             :                                      GError        **error)
+     154                 :             : {
+     155                 :             :   g_assert (VALENT_IS_CHANNEL (channel));
+     156                 :             :   g_assert (g_task_is_valid (result, channel));
+     157                 :             :   g_assert (error == NULL || *error == NULL);
+     158                 :             : 
+     159                 :             :   return g_task_propagate_pointer (G_TASK (result), error);
+     160                 :             : }
+     161                 :             : 
+     162                 :             : static GIOStream *
+     163                 :             : valent_channel_real_upload (ValentChannel  *channel,
+     164                 :             :                             JsonNode       *packet,
+     165                 :             :                             GCancellable   *cancellable,
+     166                 :             :                             GError        **error)
+     167                 :             : {
+     168                 :             :   g_set_error (error,
+     169                 :             :                G_IO_ERROR,
+     170                 :             :                G_IO_ERROR_NOT_SUPPORTED,
+     171                 :             :                "%s does not implement upload()",
+     172                 :             :                G_OBJECT_TYPE_NAME (channel));
+     173                 :             :   return NULL;
+     174                 :             : }
+     175                 :             : 
+     176                 :             : static void
+     177                 :             : valent_channel_upload_task (GTask        *task,
+     178                 :             :                             gpointer      source_object,
+     179                 :             :                             gpointer      task_data,
+     180                 :             :                             GCancellable *cancellable)
+     181                 :             : {
+     182                 :             :   ValentChannel *self = source_object;
+     183                 :             :   JsonNode *packet = task_data;
+     184                 :             :   g_autoptr (GIOStream) stream = NULL;
+     185                 :             :   GError *error = NULL;
+     186                 :             : 
+     187                 :             :   if (g_task_return_error_if_cancelled (task))
+     188                 :             :     return;
+     189                 :             : 
+     190                 :             :   stream = VALENT_CHANNEL_GET_CLASS (self)->upload (self,
+     191                 :             :                                                     packet,
+     192                 :             :                                                     cancellable,
+     193                 :             :                                                     &error);
+     194                 :             : 
+     195                 :             :   if (stream == NULL)
+     196                 :             :     return g_task_return_error (task, error);
+     197                 :             : 
+     198                 :             :   g_task_return_pointer (task, g_steal_pointer (&stream), g_object_unref);
+     199                 :             : }
+     200                 :             : 
+     201                 :             : static void
+     202                 :             : valent_channel_real_upload_async (ValentChannel       *channel,
+     203                 :             :                                   JsonNode            *packet,
+     204                 :             :                                   GCancellable        *cancellable,
+     205                 :             :                                   GAsyncReadyCallback  callback,
+     206                 :             :                                   gpointer             user_data)
+     207                 :             : {
+     208                 :             :   g_autoptr (GTask) task = NULL;
+     209                 :             : 
+     210                 :             :   g_assert (VALENT_IS_CHANNEL (channel));
+     211                 :             :   g_assert (VALENT_IS_PACKET (packet));
+     212                 :             :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     213                 :             : 
+     214                 :             :   task = g_task_new (channel, cancellable, callback, user_data);
+     215                 :             :   g_task_set_source_tag (task, valent_channel_real_upload_async);
+     216                 :             :   g_task_set_task_data (task,
+     217                 :             :                         json_node_ref (packet),
+     218                 :             :                         (GDestroyNotify)json_node_unref);
+     219                 :             :   g_task_run_in_thread (task, valent_channel_upload_task);
+     220                 :             : }
+     221                 :             : 
+     222                 :             : static GIOStream *
+     223                 :             : valent_channel_real_upload_finish (ValentChannel  *channel,
+     224                 :             :                                    GAsyncResult   *result,
+     225                 :             :                                    GError        **error)
+     226                 :             : {
+     227                 :             :   g_assert (VALENT_IS_CHANNEL (channel));
+     228                 :             :   g_assert (g_task_is_valid (result, channel));
+     229                 :             :   g_assert (error == NULL || *error == NULL);
+     230                 :             : 
+     231                 :             :   return g_task_propagate_pointer (G_TASK (result), error);
+     232                 :             : }
+     233                 :             : 
+     234                 :             : static void
+     235                 :             : valent_channel_real_store_data (ValentChannel *channel,
+     236                 :             :                                 ValentContext *context)
+     237                 :             : {
+     238                 :             :   g_assert (VALENT_IS_CHANNEL (channel));
+     239                 :             :   g_assert (VALENT_IS_CONTEXT (context));
+     240                 :             : }
+     241                 :             : /* LCOV_EXCL_STOP */
+     242                 :             : 
+     243                 :             : 
+     244                 :             : /*
+     245                 :             :  * ValentChannel
+     246                 :             :  */
+     247                 :             : static inline gboolean
+     248                 :       11055 : valent_channel_return_error_if_closed (ValentChannel *self,
+     249                 :             :                                        GTask         *task)
+     250                 :             : {
+     251                 :       11055 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     252                 :             : 
+     253         [ -  + ]:       11055 :   if (g_task_return_error_if_cancelled (task))
+     254                 :             :     return TRUE;
+     255                 :             : 
+     256                 :       11055 :   valent_object_lock (VALENT_OBJECT (self));
+     257   [ +  -  +  + ]:       11055 :   if (priv->base_stream == NULL || g_io_stream_is_closed (priv->base_stream))
+     258                 :             :     {
+     259         [ -  + ]:          20 :       if (priv->output_buffer != NULL)
+     260                 :           0 :         g_main_loop_quit (priv->output_buffer);
+     261         [ -  + ]:          20 :       g_clear_pointer (&priv->output_buffer, g_main_loop_unref);
+     262         [ -  + ]:          20 :       g_clear_object (&priv->input_buffer);
+     263                 :          20 :       valent_object_unlock (VALENT_OBJECT (self));
+     264                 :             : 
+     265                 :          20 :       g_task_return_new_error (task,
+     266                 :             :                                G_IO_ERROR,
+     267                 :             :                                G_IO_ERROR_CONNECTION_CLOSED,
+     268                 :             :                                "Channel is closed");
+     269                 :          20 :       return TRUE;
+     270                 :             :     }
+     271                 :             : 
+     272                 :             :   return FALSE;
+     273                 :             : }
+     274                 :             : 
+     275                 :             : static gpointer
+     276                 :         188 : valent_channel_write_packet_worker (gpointer data)
+     277                 :             : {
+     278                 :         367 :   g_autoptr (GMainLoop) loop = (GMainLoop *)data;
+     279                 :         188 :   GMainContext *context = g_main_loop_get_context (loop);
+     280                 :             : 
+     281                 :             :   /* The loop quits when the channel is closed, then the context is drained to
+     282                 :             :    * ensure all tasks return. */
+     283                 :         188 :   g_main_context_push_thread_default (context);
+     284                 :             : 
+     285                 :         188 :   g_main_loop_run (loop);
+     286                 :             : 
+     287         [ -  + ]:         188 :   while (g_main_context_pending (context))
+     288                 :           0 :     g_main_context_iteration (NULL, FALSE);
+     289                 :             : 
+     290                 :         179 :   g_main_context_pop_thread_default (context);
+     291                 :             : 
+     292         [ +  - ]:         179 :   return NULL;
+     293                 :             : }
+     294                 :             : 
+     295                 :             : static void
+     296                 :         188 : valent_channel_set_base_stream (ValentChannel *self,
+     297                 :             :                                 GIOStream     *base_stream)
+     298                 :             : {
+     299                 :         188 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     300                 :             : 
+     301         [ +  - ]:         188 :   g_assert (VALENT_IS_CHANNEL (self));
+     302                 :             : 
+     303         [ +  - ]:         188 :   if (base_stream != NULL)
+     304                 :             :     {
+     305                 :         376 :       g_autoptr (GMainContext) context = NULL;
+     306                 :         188 :       GInputStream *input_stream;
+     307                 :         188 :       GThread *thread;
+     308                 :             : 
+     309                 :         188 :       valent_object_lock (VALENT_OBJECT (self));
+     310                 :         188 :       input_stream = g_io_stream_get_input_stream (base_stream);
+     311                 :             : 
+     312                 :         188 :       priv->base_stream = g_object_ref (base_stream);
+     313                 :         188 :       priv->input_buffer = g_object_new (G_TYPE_DATA_INPUT_STREAM,
+     314                 :             :                                          "base-stream",       input_stream,
+     315                 :             :                                          "close-base-stream", FALSE,
+     316                 :             :                                          NULL);
+     317                 :             : 
+     318                 :         188 :       context = g_main_context_new ();
+     319                 :         188 :       priv->output_buffer = g_main_loop_new (context, FALSE);
+     320                 :         188 :       thread = g_thread_new ("valent-channel",
+     321                 :             :                              valent_channel_write_packet_worker,
+     322                 :         188 :                              g_main_loop_ref (priv->output_buffer));
+     323         [ +  - ]:         188 :       g_clear_pointer (&thread, g_thread_unref);
+     324         [ +  - ]:         188 :       valent_object_unlock (VALENT_OBJECT (self));
+     325                 :             :     }
+     326                 :         188 : }
+     327                 :             : 
+     328                 :             : 
+     329                 :             : /*
+     330                 :             :  * GObject
+     331                 :             :  */
+     332                 :             : static void
+     333                 :         188 : valent_channel_finalize (GObject *object)
+     334                 :             : {
+     335                 :         188 :   ValentChannel *self = VALENT_CHANNEL (object);
+     336                 :         188 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     337                 :             : 
+     338                 :         188 :   valent_object_lock (VALENT_OBJECT (self));
+     339         [ +  + ]:         188 :   g_clear_pointer (&priv->output_buffer, g_main_loop_unref);
+     340         [ +  + ]:         188 :   g_clear_object (&priv->input_buffer);
+     341         [ +  - ]:         188 :   g_clear_object (&priv->base_stream);
+     342         [ +  - ]:         188 :   g_clear_pointer (&priv->identity, json_node_unref);
+     343         [ +  - ]:         188 :   g_clear_pointer (&priv->peer_identity, json_node_unref);
+     344                 :         188 :   valent_object_unlock (VALENT_OBJECT (self));
+     345                 :             : 
+     346                 :         188 :   G_OBJECT_CLASS (valent_channel_parent_class)->finalize (object);
+     347                 :         188 : }
+     348                 :             : 
+     349                 :             : static void
+     350                 :           3 : valent_channel_get_property (GObject    *object,
+     351                 :             :                              guint       prop_id,
+     352                 :             :                              GValue     *value,
+     353                 :             :                              GParamSpec *pspec)
+     354                 :             : {
+     355                 :           3 :   ValentChannel *self = VALENT_CHANNEL (object);
+     356                 :           3 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     357                 :             : 
+     358   [ +  +  +  - ]:           3 :   switch (prop_id)
+     359                 :             :     {
+     360                 :           1 :     case PROP_BASE_STREAM:
+     361                 :           1 :       g_value_take_object (value, valent_channel_ref_base_stream (self));
+     362                 :           1 :       break;
+     363                 :             : 
+     364                 :           1 :     case PROP_IDENTITY:
+     365                 :           1 :       g_value_set_boxed (value, priv->identity);
+     366                 :           1 :       break;
+     367                 :             : 
+     368                 :           1 :     case PROP_PEER_IDENTITY:
+     369                 :           1 :       g_value_set_boxed (value, priv->peer_identity);
+     370                 :           1 :       break;
+     371                 :             : 
+     372                 :           0 :     default:
+     373                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     374                 :             :     }
+     375                 :           3 : }
+     376                 :             : 
+     377                 :             : static void
+     378                 :         564 : valent_channel_set_property (GObject      *object,
+     379                 :             :                              guint         prop_id,
+     380                 :             :                              const GValue *value,
+     381                 :             :                              GParamSpec   *pspec)
+     382                 :             : {
+     383                 :         564 :   ValentChannel *self = VALENT_CHANNEL (object);
+     384                 :         564 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     385                 :             : 
+     386   [ +  +  +  - ]:         564 :   switch (prop_id)
+     387                 :             :     {
+     388                 :         188 :     case PROP_BASE_STREAM:
+     389                 :         188 :       valent_channel_set_base_stream (self, g_value_get_object (value));
+     390                 :         188 :       break;
+     391                 :             : 
+     392                 :         188 :     case PROP_IDENTITY:
+     393                 :         188 :       priv->identity = g_value_dup_boxed (value);
+     394                 :         188 :       break;
+     395                 :             : 
+     396                 :         188 :     case PROP_PEER_IDENTITY:
+     397                 :         188 :       priv->peer_identity = g_value_dup_boxed (value);
+     398                 :         188 :       break;
+     399                 :             : 
+     400                 :           0 :     default:
+     401                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     402                 :             :     }
+     403                 :         564 : }
+     404                 :             : 
+     405                 :             : static void
+     406                 :          34 : valent_channel_class_init (ValentChannelClass *klass)
+     407                 :             : {
+     408                 :          34 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     409                 :             : 
+     410                 :          34 :   object_class->finalize = valent_channel_finalize;
+     411                 :          34 :   object_class->get_property = valent_channel_get_property;
+     412                 :          34 :   object_class->set_property = valent_channel_set_property;
+     413                 :             : 
+     414                 :          34 :   klass->get_verification_key = valent_channel_real_get_verification_key;
+     415                 :          34 :   klass->download = valent_channel_real_download;
+     416                 :          34 :   klass->download_async = valent_channel_real_download_async;
+     417                 :          34 :   klass->download_finish = valent_channel_real_download_finish;
+     418                 :          34 :   klass->upload = valent_channel_real_upload;
+     419                 :          34 :   klass->upload_async = valent_channel_real_upload_async;
+     420                 :          34 :   klass->upload_finish = valent_channel_real_upload_finish;
+     421                 :          34 :   klass->store_data = valent_channel_real_store_data;
+     422                 :             : 
+     423                 :             :   /**
+     424                 :             :    * ValentChannel:base-stream: (getter ref_base_stream)
+     425                 :             :    *
+     426                 :             :    * The base [class@Gio.IOStream] for the channel.
+     427                 :             :    *
+     428                 :             :    * Implementations of [class@Valent.ChannelService] must set this property
+     429                 :             :    * during construction.
+     430                 :             :    *
+     431                 :             :    * Since: 1.0
+     432                 :             :    */
+     433                 :          68 :   properties [PROP_BASE_STREAM] =
+     434                 :          34 :     g_param_spec_object ("base-stream", NULL, NULL,
+     435                 :             :                          G_TYPE_IO_STREAM,
+     436                 :             :                          (G_PARAM_READWRITE |
+     437                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     438                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     439                 :             :                           G_PARAM_STATIC_STRINGS));
+     440                 :             : 
+     441                 :             :   /**
+     442                 :             :    * ValentChannel:identity: (getter get_identity)
+     443                 :             :    *
+     444                 :             :    * The local identity packet.
+     445                 :             :    *
+     446                 :             :    * This is the identity packet sent by the [class@Valent.ChannelService]
+     447                 :             :    * implementation to identify the host system.
+     448                 :             :    *
+     449                 :             :    * Implementations of [class@Valent.ChannelService] must set this property
+     450                 :             :    * during construction.
+     451                 :             :    *
+     452                 :             :    * Since: 1.0
+     453                 :             :    */
+     454                 :          68 :   properties [PROP_IDENTITY] =
+     455                 :          34 :     g_param_spec_boxed ("identity", NULL, NULL,
+     456                 :             :                         JSON_TYPE_NODE,
+     457                 :             :                         (G_PARAM_READWRITE |
+     458                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     459                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     460                 :             :                          G_PARAM_STATIC_STRINGS));
+     461                 :             : 
+     462                 :             :   /**
+     463                 :             :    * ValentChannel:peer-identity: (getter get_peer_identity)
+     464                 :             :    *
+     465                 :             :    * The peer identity packet.
+     466                 :             :    *
+     467                 :             :    * This is the identity packet sent by the peer to identify itself.
+     468                 :             :    *
+     469                 :             :    * Implementations of [class@Valent.ChannelService] must set this property
+     470                 :             :    * during construction.
+     471                 :             :    *
+     472                 :             :    * Since: 1.0
+     473                 :             :    */
+     474                 :          68 :   properties [PROP_PEER_IDENTITY] =
+     475                 :          34 :     g_param_spec_boxed ("peer-identity", NULL, NULL,
+     476                 :             :                         JSON_TYPE_NODE,
+     477                 :             :                         (G_PARAM_READWRITE |
+     478                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     479                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     480                 :             :                          G_PARAM_STATIC_STRINGS));
+     481                 :             : 
+     482                 :          34 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     483                 :          34 : }
+     484                 :             : 
+     485                 :             : static void
+     486                 :         188 : valent_channel_init (ValentChannel *self)
+     487                 :             : {
+     488                 :         188 : }
+     489                 :             : 
+     490                 :             : /**
+     491                 :             :  * valent_channel_ref_base_stream: (get-property base-stream)
+     492                 :             :  * @channel: a `ValentChannel`
+     493                 :             :  *
+     494                 :             :  * Get the base [class@Gio.IOStream].
+     495                 :             :  *
+     496                 :             :  * Returns: (transfer full) (nullable): the base stream
+     497                 :             :  *
+     498                 :             :  * Since: 1.0
+     499                 :             :  */
+     500                 :             : GIOStream *
+     501                 :          18 : valent_channel_ref_base_stream (ValentChannel *channel)
+     502                 :             : {
+     503                 :          18 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (channel);
+     504                 :          18 :   GIOStream *ret = NULL;
+     505                 :             : 
+     506         [ +  - ]:          18 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+     507                 :             : 
+     508                 :          18 :   valent_object_lock (VALENT_OBJECT (channel));
+     509         [ +  - ]:          18 :   if (priv->base_stream != NULL)
+     510                 :          18 :     ret = g_object_ref (priv->base_stream);
+     511                 :          18 :   valent_object_unlock (VALENT_OBJECT (channel));
+     512                 :             : 
+     513                 :          18 :   return g_steal_pointer (&ret);
+     514                 :             : }
+     515                 :             : 
+     516                 :             : /**
+     517                 :             :  * valent_channel_get_identity: (get-property identity)
+     518                 :             :  * @channel: A `ValentChannel`
+     519                 :             :  *
+     520                 :             :  * Get the local identity packet.
+     521                 :             :  *
+     522                 :             :  * Returns: (transfer none): a KDE Connect packet
+     523                 :             :  *
+     524                 :             :  * Since: 1.0
+     525                 :             :  */
+     526                 :             : JsonNode *
+     527                 :           1 : valent_channel_get_identity (ValentChannel *channel)
+     528                 :             : {
+     529                 :           1 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (channel);
+     530                 :             : 
+     531         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+     532                 :             : 
+     533                 :           1 :   return priv->identity;
+     534                 :             : }
+     535                 :             : 
+     536                 :             : /**
+     537                 :             :  * valent_channel_get_peer_identity: (get-property peer-identity)
+     538                 :             :  * @channel: A `ValentChannel`
+     539                 :             :  *
+     540                 :             :  * Get the peer identity packet.
+     541                 :             :  *
+     542                 :             :  * Returns: (transfer none): a KDE Connect packet
+     543                 :             :  *
+     544                 :             :  * Since: 1.0
+     545                 :             :  */
+     546                 :             : JsonNode *
+     547                 :          85 : valent_channel_get_peer_identity (ValentChannel *channel)
+     548                 :             : {
+     549                 :          85 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (channel);
+     550                 :             : 
+     551         [ +  - ]:          85 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+     552                 :             : 
+     553                 :          85 :   return priv->peer_identity;
+     554                 :             : }
+     555                 :             : 
+     556                 :             : /**
+     557                 :             :  * valent_channel_get_verification_key: (virtual get_verification_key)
+     558                 :             :  * @channel: a `ValentChannel`
+     559                 :             :  *
+     560                 :             :  * Get a verification key for the connection.
+     561                 :             :  *
+     562                 :             :  * Implementations that involve exchanging a key should return a string for the
+     563                 :             :  * user to authenticate the connection, similar to a Bluetooth PIN.
+     564                 :             :  *
+     565                 :             :  * Returns: (transfer none): a verification key
+     566                 :             :  *
+     567                 :             :  * Since: 1.0
+     568                 :             :  */
+     569                 :             : const char *
+     570                 :           4 : valent_channel_get_verification_key (ValentChannel *channel)
+     571                 :             : {
+     572                 :           4 :   const char *ret;
+     573                 :             : 
+     574                 :           4 :   VALENT_ENTRY;
+     575                 :             : 
+     576         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+     577                 :             : 
+     578                 :           4 :   ret = VALENT_CHANNEL_GET_CLASS (channel)->get_verification_key (channel);
+     579                 :             : 
+     580                 :           4 :   VALENT_RETURN (ret);
+     581                 :             : }
+     582                 :             : 
+     583                 :             : /**
+     584                 :             :  * valent_channel_close:
+     585                 :             :  * @channel: a `ValentChannel`
+     586                 :             :  * @cancellable: (nullable): a `GCancellable`
+     587                 :             :  * @error: (nullable): a `GError`
+     588                 :             :  *
+     589                 :             :  * Close the channel.
+     590                 :             :  *
+     591                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     592                 :             :  */
+     593                 :             : gboolean
+     594                 :         255 : valent_channel_close (ValentChannel  *channel,
+     595                 :             :                       GCancellable   *cancellable,
+     596                 :             :                       GError        **error)
+     597                 :             : {
+     598                 :         255 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (channel);
+     599                 :         255 :   gboolean ret = TRUE;
+     600                 :             : 
+     601                 :         255 :   VALENT_ENTRY;
+     602                 :             : 
+     603         [ +  - ]:         255 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), FALSE);
+     604   [ -  +  -  -  :         255 :   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+             -  -  -  - ]
+     605   [ +  +  -  + ]:         255 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     606                 :             : 
+     607                 :         255 :   valent_object_lock (VALENT_OBJECT (channel));
+     608   [ -  +  +  + ]:         255 :   if (priv->base_stream != NULL && !g_io_stream_is_closed (priv->base_stream))
+     609                 :             :     {
+     610                 :         180 :       ret = g_io_stream_close (priv->base_stream, cancellable, error);
+     611                 :             : 
+     612         [ +  - ]:         180 :       if (priv->output_buffer != NULL)
+     613                 :         180 :         g_main_loop_quit (priv->output_buffer);
+     614         [ +  - ]:         180 :       g_clear_pointer (&priv->output_buffer, g_main_loop_unref);
+     615         [ -  + ]:         180 :       g_clear_object (&priv->input_buffer);
+     616                 :             :     }
+     617                 :         255 :   valent_object_unlock (VALENT_OBJECT (channel));
+     618                 :             : 
+     619                 :         255 :   VALENT_RETURN (ret);
+     620                 :             : }
+     621                 :             : 
+     622                 :             : static void
+     623                 :          91 : valent_channel_close_task (GTask        *task,
+     624                 :             :                            gpointer      source_object,
+     625                 :             :                            gpointer      task_data,
+     626                 :             :                            GCancellable *cancellable)
+     627                 :             : {
+     628                 :          91 :   ValentChannel *self = source_object;
+     629                 :          91 :   GError *error = NULL;
+     630                 :             : 
+     631         [ -  + ]:          91 :   if (g_task_return_error_if_cancelled (task))
+     632                 :           0 :     return;
+     633                 :             : 
+     634         [ +  - ]:          91 :   if (valent_channel_close (self, cancellable, &error))
+     635                 :          91 :     g_task_return_boolean (task, TRUE);
+     636                 :             :   else
+     637                 :           0 :     g_task_return_error (task, error);
+     638                 :             : }
+     639                 :             : 
+     640                 :             : /**
+     641                 :             :  * valent_channel_close_async:
+     642                 :             :  * @channel: a `ValentChannel`
+     643                 :             :  * @cancellable: (nullable): a `GCancellable`
+     644                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     645                 :             :  * @user_data: (closure): user supplied data
+     646                 :             :  *
+     647                 :             :  * Close the channel asynchronously.
+     648                 :             :  *
+     649                 :             :  * Call [method@Valent.Channel.close_finish] to get the result.
+     650                 :             :  *
+     651                 :             :  * Since: 1.0
+     652                 :             :  */
+     653                 :             : void
+     654                 :          91 : valent_channel_close_async (ValentChannel       *channel,
+     655                 :             :                             GCancellable        *cancellable,
+     656                 :             :                             GAsyncReadyCallback  callback,
+     657                 :             :                             gpointer             user_data)
+     658                 :             : {
+     659                 :         182 :   g_autoptr (GTask) task = NULL;
+     660                 :             : 
+     661                 :          91 :   VALENT_ENTRY;
+     662                 :             : 
+     663         [ +  - ]:          91 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+     664   [ -  +  -  -  :          91 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     665                 :             : 
+     666                 :          91 :   task = g_task_new (channel, cancellable, callback, user_data);
+     667         [ +  - ]:          91 :   g_task_set_source_tag (task, valent_channel_close_async);
+     668                 :          91 :   g_task_run_in_thread (task, valent_channel_close_task);
+     669                 :             : 
+     670         [ +  - ]:          91 :   VALENT_EXIT;
+     671                 :             : }
+     672                 :             : 
+     673                 :             : /**
+     674                 :             :  * valent_channel_close_finish:
+     675                 :             :  * @channel: a `ValentChannel`
+     676                 :             :  * @result: a `GAsyncResult`
+     677                 :             :  * @error: (nullable): a `GError`
+     678                 :             :  *
+     679                 :             :  * Finish an operation started by [method@Valent.Channel.close_async].
+     680                 :             :  *
+     681                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     682                 :             :  *
+     683                 :             :  * Since: 1.0
+     684                 :             :  */
+     685                 :             : gboolean
+     686                 :           1 : valent_channel_close_finish (ValentChannel  *channel,
+     687                 :             :                              GAsyncResult   *result,
+     688                 :             :                              GError        **error)
+     689                 :             : {
+     690                 :           1 :   gboolean ret;
+     691                 :             : 
+     692                 :           1 :   VALENT_ENTRY;
+     693                 :             : 
+     694         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), FALSE);
+     695         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, channel), FALSE);
+     696   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     697                 :             : 
+     698                 :           1 :   ret = g_task_propagate_boolean (G_TASK (result), error);
+     699                 :             : 
+     700                 :           1 :   VALENT_RETURN (ret);
+     701                 :             : }
+     702                 :             : 
+     703                 :             : static void
+     704                 :        3728 : valent_channel_read_packet_task (GTask        *task,
+     705                 :             :                                  gpointer      source_object,
+     706                 :             :                                  gpointer      task_data,
+     707                 :             :                                  GCancellable *cancellable)
+     708                 :             : {
+     709                 :        3728 :   ValentChannel *self = VALENT_CHANNEL (source_object);
+     710                 :        3728 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     711                 :        3728 :   g_autoptr (GDataInputStream) stream = NULL;
+     712   [ +  -  +  + ]:        3728 :   g_autofree char *line = NULL;
+     713                 :        3728 :   JsonNode *packet = NULL;
+     714                 :        3728 :   GError *error = NULL;
+     715                 :             : 
+     716         [ +  + ]:        3728 :   if (valent_channel_return_error_if_closed (self, task))
+     717                 :             :       return;
+     718                 :             : 
+     719                 :        3709 :   stream = g_object_ref (priv->input_buffer);
+     720                 :        3709 :   valent_object_unlock (VALENT_OBJECT (self));
+     721                 :             : 
+     722                 :        3709 :   line = g_data_input_stream_read_line_utf8 (stream, NULL, cancellable, &error);
+     723                 :             : 
+     724         [ +  + ]:        3709 :   if (error != NULL)
+     725                 :           9 :     return g_task_return_error (task, error);
+     726                 :             : 
+     727         [ +  + ]:        3700 :   if (line == NULL)
+     728                 :          50 :     return g_task_return_new_error (task,
+     729                 :             :                                     G_IO_ERROR,
+     730                 :             :                                     G_IO_ERROR_CONNECTION_CLOSED,
+     731                 :             :                                     "Channel is closed");
+     732                 :             : 
+     733         [ -  + ]:        3650 :   if ((packet = valent_packet_deserialize (line, &error)) == NULL)
+     734                 :           0 :     return g_task_return_error (task, error);
+     735                 :             : 
+     736                 :        3650 :   g_task_return_pointer (task, packet, (GDestroyNotify)json_node_unref);
+     737                 :             : }
+     738                 :             : 
+     739                 :             : /**
+     740                 :             :  * valent_channel_read_packet:
+     741                 :             :  * @channel: a `ValentChannel`
+     742                 :             :  * @cancellable: (nullable): a `GCancellable`
+     743                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     744                 :             :  * @user_data: (closure): user supplied data
+     745                 :             :  *
+     746                 :             :  * Read the next KDE Connect packet from @channel.
+     747                 :             :  *
+     748                 :             :  * Call [method@Valent.Channel.read_packet_finish] to get the result.
+     749                 :             :  *
+     750                 :             :  * Since: 1.0
+     751                 :             :  */
+     752                 :             : void
+     753                 :        3728 : valent_channel_read_packet (ValentChannel       *channel,
+     754                 :             :                             GCancellable        *cancellable,
+     755                 :             :                             GAsyncReadyCallback  callback,
+     756                 :             :                             gpointer             user_data)
+     757                 :             : {
+     758                 :        7456 :   g_autoptr (GTask) task = NULL;
+     759                 :             : 
+     760                 :        3728 :   VALENT_ENTRY;
+     761                 :             : 
+     762         [ +  - ]:        3728 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+     763   [ -  +  -  -  :        3728 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     764                 :             : 
+     765                 :        3728 :   task = g_task_new (channel, cancellable, callback, user_data);
+     766         [ +  - ]:        3728 :   g_task_set_source_tag (task, valent_channel_read_packet);
+     767                 :        3728 :   g_task_run_in_thread (task, valent_channel_read_packet_task);
+     768                 :             : 
+     769         [ +  - ]:        3728 :   VALENT_EXIT;
+     770                 :             : }
+     771                 :             : 
+     772                 :             : /**
+     773                 :             :  * valent_channel_read_packet_finish:
+     774                 :             :  * @channel: a `ValentChannel`
+     775                 :             :  * @result: a `GAsyncResult`
+     776                 :             :  * @error: (nullable): a `GError`
+     777                 :             :  *
+     778                 :             :  * Finish an operation started by [method@Valent.Channel.read_packet].
+     779                 :             :  *
+     780                 :             :  * Returns: (transfer full): a KDE Connect packet, or %NULL with @error set
+     781                 :             :  *
+     782                 :             :  * Since: 1.0
+     783                 :             :  */
+     784                 :             : JsonNode *
+     785                 :        3728 : valent_channel_read_packet_finish (ValentChannel  *channel,
+     786                 :             :                                    GAsyncResult   *result,
+     787                 :             :                                    GError        **error)
+     788                 :             : {
+     789                 :        3728 :   JsonNode *ret;
+     790                 :             : 
+     791                 :        3728 :   VALENT_ENTRY;
+     792                 :             : 
+     793         [ +  - ]:        3728 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+     794         [ -  + ]:        3728 :   g_return_val_if_fail (g_task_is_valid (result, channel), NULL);
+     795   [ +  -  -  + ]:        3728 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     796                 :             : 
+     797                 :        3728 :   ret = g_task_propagate_pointer (G_TASK (result), error);
+     798                 :             : 
+     799                 :        3728 :   VALENT_RETURN (ret);
+     800                 :             : }
+     801                 :             : 
+     802                 :             : static gboolean
+     803                 :        3663 : valent_channel_write_packet_func (gpointer data)
+     804                 :             : {
+     805                 :        3663 :   GTask *task = G_TASK (data);
+     806                 :        3663 :   ValentChannel *self = g_task_get_source_object (task);
+     807                 :        3663 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (self);
+     808                 :        7326 :   g_autoptr (GOutputStream) stream = NULL;
+     809                 :        3663 :   JsonNode *packet = NULL;
+     810                 :        3663 :   GCancellable *cancellable = NULL;
+     811                 :        3663 :   GError *error = NULL;
+     812                 :             : 
+     813   [ +  -  +  -  :        3663 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     814         [ -  + ]:        3663 :   g_assert (VALENT_IS_CHANNEL (self));
+     815                 :             : 
+     816         [ +  - ]:        3663 :   if (valent_channel_return_error_if_closed (self, task))
+     817                 :             :     return G_SOURCE_REMOVE;
+     818                 :             : 
+     819                 :        3663 :   stream = g_object_ref (g_io_stream_get_output_stream (priv->base_stream));
+     820                 :        3663 :   valent_object_unlock (VALENT_OBJECT (self));
+     821                 :             : 
+     822                 :        3663 :   packet = g_task_get_task_data (task);
+     823                 :        3663 :   cancellable = g_task_get_cancellable (task);
+     824                 :             : 
+     825         [ +  + ]:        3663 :   if (valent_packet_to_stream (stream, packet, cancellable, &error))
+     826                 :        3662 :     g_task_return_boolean (task, TRUE);
+     827                 :             :   else
+     828                 :           1 :     g_task_return_error (task, error);
+     829                 :             : 
+     830         [ +  - ]:        3663 :   return G_SOURCE_REMOVE;
+     831                 :             : }
+     832                 :             : 
+     833                 :             : /**
+     834                 :             :  * valent_channel_write_packet:
+     835                 :             :  * @channel: a `ValentChannel`
+     836                 :             :  * @packet: a KDE Connect packet
+     837                 :             :  * @cancellable: (nullable): a `GCancellable`
+     838                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     839                 :             :  * @user_data: (closure): user supplied data
+     840                 :             :  *
+     841                 :             :  * Send a packet over the channel.
+     842                 :             :  *
+     843                 :             :  * Internally [class@Valent.Channel] uses an outgoing packet buffer, so
+     844                 :             :  * multiple requests can be started safely from any thread.
+     845                 :             :  *
+     846                 :             :  * Call [method@Valent.Channel.write_packet_finish] to get the result.
+     847                 :             :  *
+     848                 :             :  * Since: 1.0
+     849                 :             :  */
+     850                 :             : void
+     851                 :        3664 : valent_channel_write_packet (ValentChannel       *channel,
+     852                 :             :                              JsonNode            *packet,
+     853                 :             :                              GCancellable        *cancellable,
+     854                 :             :                              GAsyncReadyCallback  callback,
+     855                 :             :                              gpointer             user_data)
+     856                 :             : {
+     857                 :        3664 :   ValentChannelPrivate *priv = valent_channel_get_instance_private (channel);
+     858                 :        7328 :   g_autoptr (GTask) task = NULL;
+     859                 :             : 
+     860                 :        3664 :   VALENT_ENTRY;
+     861                 :             : 
+     862         [ +  - ]:        3664 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+     863         [ -  + ]:        3664 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     864   [ +  +  +  -  :        3664 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     865                 :             : 
+     866                 :        3664 :   task = g_task_new (channel, cancellable, callback, user_data);
+     867         [ +  - ]:        3664 :   g_task_set_source_tag (task, valent_channel_write_packet);
+     868                 :        3664 :   g_task_set_task_data (task,
+     869                 :        3664 :                         json_node_ref (packet),
+     870                 :             :                         (GDestroyNotify)json_node_unref);
+     871                 :             : 
+     872         [ +  + ]:        3664 :   if (valent_channel_return_error_if_closed (channel, task))
+     873                 :        3663 :     VALENT_EXIT;
+     874                 :             : 
+     875                 :        3663 :   g_main_context_invoke_full (g_main_loop_get_context (priv->output_buffer),
+     876                 :             :                               g_task_get_priority (task),
+     877                 :             :                               valent_channel_write_packet_func,
+     878                 :             :                               g_object_ref (task),
+     879                 :             :                               g_object_unref);
+     880                 :             : 
+     881                 :        3663 :   valent_object_unlock (VALENT_OBJECT (channel));
+     882                 :             : 
+     883         [ +  - ]:        7327 :   VALENT_EXIT;
+     884                 :             : }
+     885                 :             : 
+     886                 :             : /**
+     887                 :             :  * valent_channel_write_packet_finish:
+     888                 :             :  * @channel: a `ValentChannel`
+     889                 :             :  * @result: a `GAsyncResult`
+     890                 :             :  * @error: (nullable): a `GError`
+     891                 :             :  *
+     892                 :             :  * Finish an operation started by [method@Valent.Channel.write_packet].
+     893                 :             :  *
+     894                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     895                 :             :  *
+     896                 :             :  * Since: 1.0
+     897                 :             :  */
+     898                 :             : gboolean
+     899                 :        3628 : valent_channel_write_packet_finish (ValentChannel  *channel,
+     900                 :             :                                     GAsyncResult   *result,
+     901                 :             :                                     GError        **error)
+     902                 :             : {
+     903                 :        3628 :   gboolean ret;
+     904                 :             : 
+     905                 :        3628 :   VALENT_ENTRY;
+     906                 :             : 
+     907         [ +  - ]:        3628 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), FALSE);
+     908         [ -  + ]:        3628 :   g_return_val_if_fail (g_task_is_valid (result, channel), FALSE);
+     909   [ +  -  -  + ]:        3628 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     910                 :             : 
+     911                 :        3628 :   ret = g_task_propagate_boolean (G_TASK (result), error);
+     912                 :             : 
+     913                 :        3628 :   VALENT_RETURN (ret);
+     914                 :             : }
+     915                 :             : 
+     916                 :             : /**
+     917                 :             :  * valent_channel_store_data: (virtual store_data)
+     918                 :             :  * @channel: a `ValentChannel`
+     919                 :             :  * @context: a `ValentContext`
+     920                 :             :  *
+     921                 :             :  * Store channel metadata.
+     922                 :             :  *
+     923                 :             :  * This method is called to store channel specific data. Implementations can
+     924                 :             :  * override this method to store extra data (eg. TLS Certificate).
+     925                 :             :  *
+     926                 :             :  * Implementations that override [vfunc@Valent.Channel.store_data] must
+     927                 :             :  * chain-up.
+     928                 :             :  *
+     929                 :             :  * Since: 1.0
+     930                 :             :  */
+     931                 :             : void
+     932                 :           5 : valent_channel_store_data (ValentChannel *channel,
+     933                 :             :                            ValentContext  *context)
+     934                 :             : {
+     935                 :           5 :   VALENT_ENTRY;
+     936                 :             : 
+     937         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+     938         [ -  + ]:           5 :   g_return_if_fail (VALENT_IS_CONTEXT (context));
+     939                 :             : 
+     940                 :           5 :   VALENT_CHANNEL_GET_CLASS (channel)->store_data (channel, context);
+     941                 :             : 
+     942                 :           5 :   VALENT_EXIT;
+     943                 :             : }
+     944                 :             : 
+     945                 :             : /**
+     946                 :             :  * valent_channel_download: (virtual download)
+     947                 :             :  * @channel: a `ValentChannel`
+     948                 :             :  * @packet: a KDE Connect packet
+     949                 :             :  * @cancellable: (nullable): a `GCancellable`
+     950                 :             :  * @error: (nullable): a `GError`
+     951                 :             :  *
+     952                 :             :  * Open an auxiliary connection, usually to download data.
+     953                 :             :  *
+     954                 :             :  * Implementations should use information from the `payloadTransferInfo` field
+     955                 :             :  * to open a connection and wait for it to be accepted. In most cases the remote
+     956                 :             :  * device will write data to the stream and then close it when finished.
+     957                 :             :  *
+     958                 :             :  * For example, a TCP-based implementation could connect to a port in the
+     959                 :             :  * `payloadTransferInfo` dictionary on the same host as the channel. When the
+     960                 :             :  * connection is accepted the caller can perform operations on it as required.
+     961                 :             :  *
+     962                 :             :  * Returns: (transfer full) (nullable): a `GIOStream`
+     963                 :             :  *
+     964                 :             :  * Since: 1.0
+     965                 :             :  */
+     966                 :             : GIOStream *
+     967                 :          28 : valent_channel_download (ValentChannel  *channel,
+     968                 :             :                          JsonNode       *packet,
+     969                 :             :                          GCancellable   *cancellable,
+     970                 :             :                          GError        **error)
+     971                 :             : {
+     972                 :          28 :   GIOStream *ret;
+     973                 :             : 
+     974                 :          28 :   VALENT_ENTRY;
+     975                 :             : 
+     976         [ +  - ]:          28 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+     977         [ -  + ]:          28 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), NULL);
+     978   [ +  +  +  -  :          28 :   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
+             -  +  -  - ]
+     979   [ +  -  -  + ]:          28 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     980                 :             : 
+     981                 :          28 :   ret = VALENT_CHANNEL_GET_CLASS (channel)->download (channel,
+     982                 :             :                                                       packet,
+     983                 :             :                                                       cancellable,
+     984                 :             :                                                       error);
+     985                 :             : 
+     986                 :          28 :   VALENT_RETURN (ret);
+     987                 :             : }
+     988                 :             : 
+     989                 :             : /**
+     990                 :             :  * valent_channel_download_async: (virtual download_async)
+     991                 :             :  * @channel: a `ValentChannel`
+     992                 :             :  * @packet: a KDE Connect packet
+     993                 :             :  * @cancellable: (nullable): a `GCancellable`
+     994                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     995                 :             :  * @user_data: (closure): user supplied data
+     996                 :             :  *
+     997                 :             :  * Open an auxiliary connection, usually to download data.
+     998                 :             :  *
+     999                 :             :  * This is a non-blocking variant of [method@Valent.Channel.download]. Call
+    1000                 :             :  * [method@Valent.Channel.download_finish] to get the result.
+    1001                 :             :  *
+    1002                 :             :  * The default implementation of this method invokes
+    1003                 :             :  * [vfunc@Valent.Channel.download] in a thread.
+    1004                 :             :  *
+    1005                 :             :  * Since: 1.0
+    1006                 :             :  */
+    1007                 :             : void
+    1008                 :           1 : valent_channel_download_async (ValentChannel       *channel,
+    1009                 :             :                                JsonNode            *packet,
+    1010                 :             :                                GCancellable        *cancellable,
+    1011                 :             :                                GAsyncReadyCallback  callback,
+    1012                 :             :                                gpointer             user_data)
+    1013                 :             : {
+    1014                 :           1 :   VALENT_ENTRY;
+    1015                 :             : 
+    1016         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+    1017         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+    1018   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+    1019                 :             : 
+    1020                 :           1 :   VALENT_CHANNEL_GET_CLASS (channel)->download_async (channel,
+    1021                 :             :                                                       packet,
+    1022                 :             :                                                       cancellable,
+    1023                 :             :                                                       callback,
+    1024                 :             :                                                       user_data);
+    1025                 :             : 
+    1026                 :           1 :   VALENT_EXIT;
+    1027                 :             : }
+    1028                 :             : 
+    1029                 :             : /**
+    1030                 :             :  * valent_channel_download_finish: (virtual download_finish)
+    1031                 :             :  * @channel: a `ValentChannel`
+    1032                 :             :  * @result: a `GAsyncResult`
+    1033                 :             :  * @error: (nullable): a `GError`
+    1034                 :             :  *
+    1035                 :             :  * Finish an operation started with [method@Valent.Channel.download_async].
+    1036                 :             :  *
+    1037                 :             :  * Returns: (transfer full) (nullable): a `GIOStream`
+    1038                 :             :  *
+    1039                 :             :  * Since: 1.0
+    1040                 :             :  */
+    1041                 :             : GIOStream *
+    1042                 :           1 : valent_channel_download_finish (ValentChannel  *channel,
+    1043                 :             :                                 GAsyncResult   *result,
+    1044                 :             :                                 GError        **error)
+    1045                 :             : {
+    1046                 :           1 :   GIOStream *ret;
+    1047                 :             : 
+    1048                 :           1 :   VALENT_ENTRY;
+    1049                 :             : 
+    1050         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+    1051         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, channel), NULL);
+    1052   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+    1053                 :             : 
+    1054                 :           1 :   ret = VALENT_CHANNEL_GET_CLASS (channel)->download_finish (channel,
+    1055                 :             :                                                              result,
+    1056                 :             :                                                              error);
+    1057                 :             : 
+    1058                 :           1 :   VALENT_RETURN (ret);
+    1059                 :             : }
+    1060                 :             : 
+    1061                 :             : /**
+    1062                 :             :  * valent_channel_upload: (virtual upload)
+    1063                 :             :  * @channel: a `ValentChannel`
+    1064                 :             :  * @packet: a KDE Connect packet
+    1065                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1066                 :             :  * @error: (nullable): a `GError`
+    1067                 :             :  *
+    1068                 :             :  * Accept an auxiliary connection, usually to upload data.
+    1069                 :             :  *
+    1070                 :             :  * Implementations should set the `payloadTransferInfo` field with information
+    1071                 :             :  * the peer can use to open a connection and wait to accept that connection. In
+    1072                 :             :  * most cases the remote device with expect the caller to write to the stream
+    1073                 :             :  * and then close it when finished.
+    1074                 :             :  *
+    1075                 :             :  * For example, a TCP-based implementation could start listening on a port then
+    1076                 :             :  * send the packet with that port in the `payloadTransferInfo` dictionary. When
+    1077                 :             :  * a connection is accepted the caller can perform operations on it as required.
+    1078                 :             :  *
+    1079                 :             :  * Returns: (transfer full) (nullable): a `GIOStream`
+    1080                 :             :  *
+    1081                 :             :  * Since: 1.0
+    1082                 :             :  */
+    1083                 :             : GIOStream *
+    1084                 :          28 : valent_channel_upload (ValentChannel  *channel,
+    1085                 :             :                        JsonNode       *packet,
+    1086                 :             :                        GCancellable   *cancellable,
+    1087                 :             :                        GError        **error)
+    1088                 :             : {
+    1089                 :          28 :   GIOStream *ret;
+    1090                 :             : 
+    1091                 :          28 :   VALENT_ENTRY;
+    1092                 :             : 
+    1093         [ +  - ]:          28 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+    1094         [ -  + ]:          28 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), NULL);
+    1095   [ +  +  +  -  :          28 :   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
+             -  +  -  - ]
+    1096   [ +  -  -  + ]:          28 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+    1097                 :             : 
+    1098                 :          28 :   ret = VALENT_CHANNEL_GET_CLASS (channel)->upload (channel,
+    1099                 :             :                                                     packet,
+    1100                 :             :                                                     cancellable,
+    1101                 :             :                                                     error);
+    1102                 :             : 
+    1103                 :          28 :   VALENT_RETURN (ret);
+    1104                 :             : }
+    1105                 :             : 
+    1106                 :             : /**
+    1107                 :             :  * valent_channel_upload_async: (virtual upload_async)
+    1108                 :             :  * @channel: a `ValentChannel`
+    1109                 :             :  * @packet: a KDE Connect packet
+    1110                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1111                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1112                 :             :  * @user_data: (closure): user supplied data
+    1113                 :             :  *
+    1114                 :             :  * Accept an auxiliary connection, usually to upload data.
+    1115                 :             :  *
+    1116                 :             :  * This is a non-blocking variant of [method@Valent.Channel.upload]. Call
+    1117                 :             :  * [method@Valent.Channel.upload_finish] to get the result.
+    1118                 :             :  *
+    1119                 :             :  * The default implementation of this method invokes
+    1120                 :             :  * [vfunc@Valent.Channel.upload] in a thread.
+    1121                 :             :  *
+    1122                 :             :  * Since: 1.0
+    1123                 :             :  */
+    1124                 :             : void
+    1125                 :           1 : valent_channel_upload_async (ValentChannel       *channel,
+    1126                 :             :                              JsonNode            *packet,
+    1127                 :             :                              GCancellable        *cancellable,
+    1128                 :             :                              GAsyncReadyCallback  callback,
+    1129                 :             :                              gpointer             user_data)
+    1130                 :             : {
+    1131                 :           1 :   VALENT_ENTRY;
+    1132                 :             : 
+    1133         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CHANNEL (channel));
+    1134         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+    1135   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+    1136                 :             : 
+    1137                 :           1 :   VALENT_CHANNEL_GET_CLASS (channel)->upload_async (channel,
+    1138                 :             :                                                     packet,
+    1139                 :             :                                                     cancellable,
+    1140                 :             :                                                     callback,
+    1141                 :             :                                                     user_data);
+    1142                 :             : 
+    1143                 :           1 :   VALENT_EXIT;
+    1144                 :             : }
+    1145                 :             : 
+    1146                 :             : /**
+    1147                 :             :  * valent_channel_upload_finish: (virtual upload_finish)
+    1148                 :             :  * @channel: a `ValentChannel`
+    1149                 :             :  * @result: a `GAsyncResult`
+    1150                 :             :  * @error: (nullable): a `GError`
+    1151                 :             :  *
+    1152                 :             :  * Finish an operation started with [method@Valent.Channel.upload_async].
+    1153                 :             :  *
+    1154                 :             :  * Returns: (transfer full) (nullable): a `GIOStream`
+    1155                 :             :  *
+    1156                 :             :  * Since: 1.0
+    1157                 :             :  */
+    1158                 :             : GIOStream *
+    1159                 :           1 : valent_channel_upload_finish (ValentChannel  *channel,
+    1160                 :             :                               GAsyncResult   *result,
+    1161                 :             :                               GError        **error)
+    1162                 :             : {
+    1163                 :           1 :   GIOStream *ret;
+    1164                 :             : 
+    1165                 :           1 :   VALENT_ENTRY;
+    1166                 :             : 
+    1167         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CHANNEL (channel), NULL);
+    1168         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, channel), NULL);
+    1169   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+    1170                 :             : 
+    1171                 :           1 :   ret = VALENT_CHANNEL_GET_CLASS (channel)->upload_finish (channel,
+    1172                 :             :                                                            result,
+    1173                 :             :                                                            error);
+    1174                 :             : 
+    1175                 :           1 :   VALENT_RETURN (ret);
+    1176                 :             : }
+    1177                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel.h.func-c.html b/coverage/src/libvalent/device/valent-channel.h.func-c.html new file mode 100644 index 00000000000..20183e48566 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %105
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CHANNEL22898
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel.h.func.html b/coverage/src/libvalent/device/valent-channel.h.func.html new file mode 100644 index 00000000000..1211feab44b --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %105
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CHANNEL22898
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-channel.h.gcov.html b/coverage/src/libvalent/device/valent-channel.h.gcov.html new file mode 100644 index 00000000000..950b29e6eb9 --- /dev/null +++ b/coverage/src/libvalent/device/valent-channel.h.gcov.html @@ -0,0 +1,228 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-channel.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-channel.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %105
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : 
+      12                 :             : #include "../core/valent-context.h"
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : #define VALENT_TYPE_CHANNEL (valent_channel_get_type())
+      17                 :             : 
+      18                 :             : VALENT_AVAILABLE_IN_1_0
+      19   [ +  -  +  -  :       23008 : G_DECLARE_DERIVABLE_TYPE (ValentChannel, valent_channel, VALENT, CHANNEL, ValentObject)
+          +  -  +  -  +  
+                      - ]
+      20                 :             : 
+      21                 :             : struct _ValentChannelClass
+      22                 :             : {
+      23                 :             :   ValentObjectClass   parent_class;
+      24                 :             : 
+      25                 :             :   /* virtual functions */
+      26                 :             :   const char        * (*get_verification_key) (ValentChannel        *channel);
+      27                 :             :   GIOStream         * (*download)             (ValentChannel        *channel,
+      28                 :             :                                                JsonNode             *packet,
+      29                 :             :                                                GCancellable         *cancellable,
+      30                 :             :                                                GError              **error);
+      31                 :             :   void                (*download_async)       (ValentChannel        *channel,
+      32                 :             :                                                JsonNode             *packet,
+      33                 :             :                                                GCancellable         *cancellable,
+      34                 :             :                                                GAsyncReadyCallback   callback,
+      35                 :             :                                                gpointer              user_data);
+      36                 :             :   GIOStream         * (*download_finish)      (ValentChannel        *channel,
+      37                 :             :                                                GAsyncResult         *result,
+      38                 :             :                                                GError              **error);
+      39                 :             :   GIOStream         * (*upload)               (ValentChannel        *channel,
+      40                 :             :                                                JsonNode             *packet,
+      41                 :             :                                                GCancellable         *cancellable,
+      42                 :             :                                                GError              **error);
+      43                 :             :   void                (*upload_async)         (ValentChannel        *channel,
+      44                 :             :                                                JsonNode             *packet,
+      45                 :             :                                                GCancellable         *cancellable,
+      46                 :             :                                                GAsyncReadyCallback   callback,
+      47                 :             :                                                gpointer              user_data);
+      48                 :             :   GIOStream         * (*upload_finish)        (ValentChannel        *channel,
+      49                 :             :                                                GAsyncResult         *result,
+      50                 :             :                                                GError              **error);
+      51                 :             :   void                (*store_data)           (ValentChannel        *channel,
+      52                 :             :                                                ValentContext        *context);
+      53                 :             : 
+      54                 :             :   /*< private >*/
+      55                 :             :   gpointer            padding[8];
+      56                 :             : };
+      57                 :             : 
+      58                 :             : 
+      59                 :             : VALENT_AVAILABLE_IN_1_0
+      60                 :             : GIOStream  * valent_channel_ref_base_stream      (ValentChannel        *channel);
+      61                 :             : VALENT_AVAILABLE_IN_1_0
+      62                 :             : JsonNode   * valent_channel_get_identity         (ValentChannel        *channel);
+      63                 :             : VALENT_AVAILABLE_IN_1_0
+      64                 :             : JsonNode   * valent_channel_get_peer_identity    (ValentChannel        *channel);
+      65                 :             : VALENT_AVAILABLE_IN_1_0
+      66                 :             : const char * valent_channel_get_verification_key (ValentChannel        *channel);
+      67                 :             : VALENT_AVAILABLE_IN_1_0
+      68                 :             : GIOStream  * valent_channel_download             (ValentChannel        *channel,
+      69                 :             :                                                   JsonNode             *packet,
+      70                 :             :                                                   GCancellable         *cancellable,
+      71                 :             :                                                   GError              **error);
+      72                 :             : VALENT_AVAILABLE_IN_1_0
+      73                 :             : void         valent_channel_download_async       (ValentChannel        *channel,
+      74                 :             :                                                   JsonNode             *packet,
+      75                 :             :                                                   GCancellable         *cancellable,
+      76                 :             :                                                   GAsyncReadyCallback   callback,
+      77                 :             :                                                   gpointer              user_data);
+      78                 :             : VALENT_AVAILABLE_IN_1_0
+      79                 :             : GIOStream  * valent_channel_download_finish      (ValentChannel        *channel,
+      80                 :             :                                                   GAsyncResult         *result,
+      81                 :             :                                                   GError              **error);
+      82                 :             : VALENT_AVAILABLE_IN_1_0
+      83                 :             : GIOStream  * valent_channel_upload               (ValentChannel        *channel,
+      84                 :             :                                                   JsonNode             *packet,
+      85                 :             :                                                   GCancellable         *cancellable,
+      86                 :             :                                                   GError              **error);
+      87                 :             : VALENT_AVAILABLE_IN_1_0
+      88                 :             : void         valent_channel_upload_async         (ValentChannel        *channel,
+      89                 :             :                                                   JsonNode             *packet,
+      90                 :             :                                                   GCancellable         *cancellable,
+      91                 :             :                                                   GAsyncReadyCallback   callback,
+      92                 :             :                                                   gpointer              user_data);
+      93                 :             : VALENT_AVAILABLE_IN_1_0
+      94                 :             : GIOStream  * valent_channel_upload_finish        (ValentChannel        *channel,
+      95                 :             :                                                   GAsyncResult         *result,
+      96                 :             :                                                   GError              **error);
+      97                 :             : VALENT_AVAILABLE_IN_1_0
+      98                 :             : void         valent_channel_store_data           (ValentChannel        *channel,
+      99                 :             :                                                   ValentContext        *context);
+     100                 :             : VALENT_AVAILABLE_IN_1_0
+     101                 :             : void         valent_channel_read_packet          (ValentChannel        *channel,
+     102                 :             :                                                   GCancellable         *cancellable,
+     103                 :             :                                                   GAsyncReadyCallback   callback,
+     104                 :             :                                                   gpointer              user_data);
+     105                 :             : VALENT_AVAILABLE_IN_1_0
+     106                 :             : JsonNode   * valent_channel_read_packet_finish   (ValentChannel        *channel,
+     107                 :             :                                                   GAsyncResult         *result,
+     108                 :             :                                                   GError              **error);
+     109                 :             : VALENT_AVAILABLE_IN_1_0
+     110                 :             : void         valent_channel_write_packet         (ValentChannel        *channel,
+     111                 :             :                                                   JsonNode             *packet,
+     112                 :             :                                                   GCancellable         *cancellable,
+     113                 :             :                                                   GAsyncReadyCallback   callback,
+     114                 :             :                                                   gpointer              user_data);
+     115                 :             : VALENT_AVAILABLE_IN_1_0
+     116                 :             : gboolean     valent_channel_write_packet_finish  (ValentChannel        *channel,
+     117                 :             :                                                   GAsyncResult         *result,
+     118                 :             :                                                   GError              **error);
+     119                 :             : VALENT_AVAILABLE_IN_1_0
+     120                 :             : gboolean     valent_channel_close                (ValentChannel        *channel,
+     121                 :             :                                                   GCancellable         *cancellable,
+     122                 :             :                                                   GError              **error);
+     123                 :             : VALENT_AVAILABLE_IN_1_0
+     124                 :             : void         valent_channel_close_async          (ValentChannel        *channel,
+     125                 :             :                                                   GCancellable         *cancellable,
+     126                 :             :                                                   GAsyncReadyCallback   callback,
+     127                 :             :                                                   gpointer              user_data);
+     128                 :             : VALENT_AVAILABLE_IN_1_0
+     129                 :             : gboolean     valent_channel_close_finish         (ValentChannel        *channel,
+     130                 :             :                                                   GAsyncResult         *result,
+     131                 :             :                                                   GError              **error);
+     132                 :             : 
+     133                 :             : G_END_DECLS
+     134                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-impl.c.func-c.html b/coverage/src/libvalent/device/valent-device-impl.c.func-c.html new file mode 100644 index 00000000000..5721b3e1237 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-impl.c.func-c.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-impl.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-impl.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.2 %159126
Test Date:2024-03-31 18:46:36Functions:80.0 %2016
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:52.1 %4825
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_impl_get_property0
valent_device_impl_method_call0
valent_device_impl_property_get0
valent_device_impl_property_set0
flush_idle1
on_property_changed1
valent_device_impl_class_init1
valent_device_impl_constructed1
valent_device_impl_dispose1
valent_device_impl_finalize1
valent_device_impl_flush1
valent_device_impl_get_vtable1
valent_device_impl_init1
valent_device_impl_new1
valent_device_impl_set_property1
valent_device_impl_get_properties2
valent_device_impl_get_type4
valent_device_impl_class_intern_init1
valent_device_impl_get_type_once1
valent_device_impl_get_type2
valent_device_impl_get_info5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-impl.c.func.html b/coverage/src/libvalent/device/valent-device-impl.c.func.html new file mode 100644 index 00000000000..560874ce5d0 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-impl.c.func.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-impl.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-impl.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.2 %159126
Test Date:2024-03-31 18:46:36Functions:80.0 %2016
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:52.1 %4825
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
flush_idle1
on_property_changed1
valent_device_impl_class_init1
valent_device_impl_constructed1
valent_device_impl_dispose1
valent_device_impl_finalize1
valent_device_impl_flush1
valent_device_impl_get_info5
valent_device_impl_get_properties2
valent_device_impl_get_property0
valent_device_impl_get_type4
valent_device_impl_class_intern_init1
valent_device_impl_get_type2
valent_device_impl_get_type_once1
valent_device_impl_get_vtable1
valent_device_impl_init1
valent_device_impl_method_call0
valent_device_impl_new1
valent_device_impl_property_get0
valent_device_impl_property_set0
valent_device_impl_set_property1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-impl.c.gcov.html b/coverage/src/libvalent/device/valent-device-impl.c.gcov.html new file mode 100644 index 00000000000..0b4cdede642 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-impl.c.gcov.html @@ -0,0 +1,541 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-impl.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-impl.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.2 %159126
Test Date:2024-03-31 18:46:36Functions:80.0 %2016
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:52.1 %4825
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include <gio/gio.h>
+       5                 :             : #include <glib.h>
+       6                 :             : #include <glib-object.h>
+       7                 :             : 
+       8                 :             : #include "valent-device.h"
+       9                 :             : #include "valent-device-impl.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : struct _ValentDeviceImpl
+      13                 :             : {
+      14                 :             :   GDBusInterfaceSkeleton  parent_instance;
+      15                 :             : 
+      16                 :             :   ValentDevice           *device;
+      17                 :             :   GHashTable             *cache;
+      18                 :             :   GHashTable             *pending;
+      19                 :             :   unsigned int            flush_id;
+      20                 :             : };
+      21                 :             : 
+      22   [ +  +  +  - ]:           4 : G_DEFINE_FINAL_TYPE (ValentDeviceImpl, valent_device_impl, G_TYPE_DBUS_INTERFACE_SKELETON);
+      23                 :             : 
+      24                 :             : enum {
+      25                 :             :   PROP_0,
+      26                 :             :   PROP_DEVICE,
+      27                 :             :   N_PROPERTIES,
+      28                 :             : };
+      29                 :             : 
+      30                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      31                 :             : 
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * ca.andyholmes.Valent.Device Interface
+      35                 :             :  */
+      36                 :             : static const GDBusPropertyInfo * const iface_properties[] = {
+      37                 :             :   &((const GDBusPropertyInfo){
+      38                 :             :     -1,
+      39                 :             :     "IconName",
+      40                 :             :     "s",
+      41                 :             :     G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+      42                 :             :     NULL
+      43                 :             :   }),
+      44                 :             :   &((const GDBusPropertyInfo){
+      45                 :             :     -1,
+      46                 :             :     "Id",
+      47                 :             :     "s",
+      48                 :             :     G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+      49                 :             :     NULL
+      50                 :             :   }),
+      51                 :             :   &((const GDBusPropertyInfo){
+      52                 :             :     -1,
+      53                 :             :     "Name",
+      54                 :             :     "s",
+      55                 :             :     G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+      56                 :             :     NULL
+      57                 :             :   }),
+      58                 :             :   &((const GDBusPropertyInfo){
+      59                 :             :     -1,
+      60                 :             :     "State",
+      61                 :             :     "u",
+      62                 :             :     G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+      63                 :             :     NULL
+      64                 :             :   }),
+      65                 :             :   NULL,
+      66                 :             : };
+      67                 :             : 
+      68                 :             : static const GDBusInterfaceInfo iface_info = {
+      69                 :             :   -1,
+      70                 :             :   "ca.andyholmes.Valent.Device",
+      71                 :             :   NULL,
+      72                 :             :   NULL,
+      73                 :             :   (GDBusPropertyInfo **)&iface_properties,
+      74                 :             :   NULL
+      75                 :             : };
+      76                 :             : 
+      77                 :             : 
+      78                 :             : /*
+      79                 :             :  * Helper Functions
+      80                 :             :  */
+      81                 :             : static gboolean
+      82                 :           1 : flush_idle (gpointer data)
+      83                 :             : {
+      84                 :           1 :   g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (data));
+      85                 :             : 
+      86                 :           1 :   return G_SOURCE_REMOVE;
+      87                 :             : }
+      88                 :             : 
+      89                 :             : static void
+      90                 :           1 : on_property_changed (GObject          *object,
+      91                 :             :                      GParamSpec       *pspec,
+      92                 :             :                      ValentDeviceImpl *self)
+      93                 :             : {
+      94                 :           1 :   GVariant *value = NULL;
+      95                 :           1 :   const char *name;
+      96                 :             : 
+      97         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE_IMPL (self));
+      98                 :             : 
+      99                 :             :   /* Retrieve the property */
+     100                 :           1 :   name = g_param_spec_get_name (pspec);
+     101                 :             : 
+     102         [ -  + ]:           1 :   if (g_str_equal (name, "state"))
+     103                 :             :     {
+     104                 :           0 :       name = "State";
+     105                 :           0 :       value = g_variant_new_uint32 (valent_device_get_state (self->device));
+     106                 :             :     }
+     107         [ -  + ]:           1 :   else if (g_str_equal (name, "name"))
+     108                 :             :     {
+     109                 :           0 :       name = "Name";
+     110                 :           0 :       value = g_variant_new_string (valent_device_get_name (self->device));
+     111                 :             :     }
+     112         [ +  - ]:           1 :   else if (g_str_equal (name, "icon-name"))
+     113                 :             :     {
+     114                 :           1 :       name = "IconName";
+     115                 :           1 :       value = g_variant_new_string (valent_device_get_icon_name (self->device));
+     116                 :             :     }
+     117         [ #  # ]:           0 :   else if (g_str_equal (name, "id"))
+     118                 :             :     {
+     119                 :           0 :       name = "Id";
+     120                 :           0 :       value = g_variant_new_string (valent_device_get_id (self->device));
+     121                 :             :     }
+     122                 :             : 
+     123                 :           2 :   g_hash_table_replace (self->cache,
+     124                 :           1 :                         g_strdup (name),
+     125         [ -  + ]:           1 :                         g_variant_ref_sink (value));
+     126                 :           2 :   g_hash_table_replace (self->pending,
+     127                 :           1 :                         g_strdup (name),
+     128         [ -  + ]:           1 :                         g_variant_ref_sink (value));
+     129                 :             : 
+     130         [ +  - ]:           1 :   if (self->flush_id == 0)
+     131                 :           1 :     self->flush_id = g_idle_add (flush_idle, self);
+     132                 :           1 : }
+     133                 :             : 
+     134                 :             : 
+     135                 :             : /*
+     136                 :             :  * GDBusInterfaceVTable
+     137                 :             :  */
+     138                 :             : static void
+     139                 :           0 : valent_device_impl_method_call (GDBusConnection       *connection,
+     140                 :             :                                 const char            *sender,
+     141                 :             :                                 const char            *object_path,
+     142                 :             :                                 const char            *interface_name,
+     143                 :             :                                 const char            *method_name,
+     144                 :             :                                 GVariant              *parameters,
+     145                 :             :                                 GDBusMethodInvocation *invocation,
+     146                 :             :                                 void                  *user_data)
+     147                 :             : {
+     148                 :           0 :   g_dbus_method_invocation_return_error (invocation,
+     149                 :             :                                          G_DBUS_ERROR,
+     150                 :             :                                          G_DBUS_ERROR_UNKNOWN_METHOD,
+     151                 :             :                                          "Unknown method %s on %s",
+     152                 :             :                                          method_name,
+     153                 :             :                                          interface_name);
+     154                 :           0 : }
+     155                 :             : 
+     156                 :             : static GVariant *
+     157                 :           0 : valent_device_impl_property_get (GDBusConnection  *connection,
+     158                 :             :                                  const char       *sender,
+     159                 :             :                                  const char       *object_path,
+     160                 :             :                                  const char       *interface_name,
+     161                 :             :                                  const char       *property_name,
+     162                 :             :                                  GError          **error,
+     163                 :             :                                  void             *user_data)
+     164                 :             : {
+     165                 :           0 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (user_data);
+     166                 :           0 :   GVariant *value;
+     167                 :             : 
+     168         [ #  # ]:           0 :   if ((value = g_hash_table_lookup (self->cache, property_name)) != NULL)
+     169                 :           0 :     return g_variant_ref (value);
+     170                 :             : 
+     171                 :           0 :   g_set_error (error,
+     172                 :             :                G_DBUS_ERROR,
+     173                 :             :                G_DBUS_ERROR_FAILED,
+     174                 :             :                "Failed to read %s property on %s",
+     175                 :             :                property_name,
+     176                 :             :                interface_name);
+     177                 :             : 
+     178                 :           0 :   return NULL;
+     179                 :             : }
+     180                 :             : 
+     181                 :             : static gboolean
+     182                 :           0 : valent_device_impl_property_set (GDBusConnection  *connection,
+     183                 :             :                                  const char       *sender,
+     184                 :             :                                  const char       *object_path,
+     185                 :             :                                  const char       *interface_name,
+     186                 :             :                                  const char       *property_name,
+     187                 :             :                                  GVariant         *value,
+     188                 :             :                                  GError          **error,
+     189                 :             :                                  void             *user_data)
+     190                 :             : {
+     191                 :           0 :   g_set_error (error,
+     192                 :             :                G_DBUS_ERROR,
+     193                 :             :                G_DBUS_ERROR_PROPERTY_READ_ONLY,
+     194                 :             :                "Read-only property %s on %s",
+     195                 :             :                property_name,
+     196                 :             :                interface_name);
+     197                 :             : 
+     198                 :           0 :   return FALSE;
+     199                 :             : }
+     200                 :             : 
+     201                 :             : static const GDBusInterfaceVTable iface_vtable = {
+     202                 :             :   valent_device_impl_method_call,
+     203                 :             :   valent_device_impl_property_get,
+     204                 :             :   valent_device_impl_property_set,
+     205                 :             : };
+     206                 :             : 
+     207                 :             : 
+     208                 :             : /*
+     209                 :             :  * GDBusInterfaceSkeleton
+     210                 :             :  */
+     211                 :             : static void
+     212                 :           1 : valent_device_impl_flush (GDBusInterfaceSkeleton *skeleton)
+     213                 :             : {
+     214                 :           1 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (skeleton);
+     215                 :           2 :   g_autolist (GDBusConnection) connections = NULL;
+     216                 :           1 :   g_autoptr (GVariant) parameters = NULL;
+     217                 :           1 :   const char *object_path;
+     218                 :           1 :   GVariantBuilder changed_properties;
+     219                 :           1 :   GVariantBuilder invalidated_properties;
+     220                 :           1 :   GHashTableIter pending_properties;
+     221                 :           1 :   gpointer key, value;
+     222                 :             : 
+     223                 :             :   /* Sort the pending property changes into "changed" and "invalidated" */
+     224                 :           1 :   g_hash_table_iter_init (&pending_properties, self->pending);
+     225                 :           1 :   g_variant_builder_init (&changed_properties, G_VARIANT_TYPE_VARDICT);
+     226                 :           1 :   g_variant_builder_init (&invalidated_properties, G_VARIANT_TYPE_STRING_ARRAY);
+     227                 :             : 
+     228         [ +  + ]:           2 :   while (g_hash_table_iter_next (&pending_properties, &key, &value))
+     229                 :             :     {
+     230         [ +  - ]:           1 :       if (value)
+     231                 :           1 :         g_variant_builder_add (&changed_properties, "{sv}", key, value);
+     232                 :             :       else
+     233                 :           0 :         g_variant_builder_add (&invalidated_properties, "s", key);
+     234                 :             : 
+     235                 :           1 :       g_hash_table_iter_remove (&pending_properties);
+     236                 :             :     }
+     237                 :             : 
+     238                 :           1 :   parameters = g_variant_new ("(s@a{sv}@as)",
+     239                 :             :                               iface_info.name,
+     240                 :             :                               g_variant_builder_end (&changed_properties),
+     241                 :             :                               g_variant_builder_end (&invalidated_properties));
+     242                 :           1 :   g_variant_ref_sink (parameters);
+     243                 :             : 
+     244                 :             :   /* Emit "PropertiesChanged" on each connection */
+     245                 :           1 :   connections = g_dbus_interface_skeleton_get_connections (skeleton);
+     246                 :           1 :   object_path = g_dbus_interface_skeleton_get_object_path (skeleton);
+     247                 :             : 
+     248         [ +  + ]:           2 :   for (const GList *iter = connections; iter; iter = iter->next)
+     249                 :             :     {
+     250                 :           1 :       g_autoptr (GError) error = NULL;
+     251                 :             : 
+     252                 :           1 :       g_dbus_connection_emit_signal (G_DBUS_CONNECTION (iter->data),
+     253                 :             :                                      NULL,
+     254                 :             :                                      object_path,
+     255                 :             :                                      "org.freedesktop.DBus.Properties",
+     256                 :             :                                      "PropertiesChanged",
+     257                 :             :                                      parameters,
+     258                 :             :                                      &error);
+     259                 :             : 
+     260         [ -  + ]:           1 :       if (error != NULL)
+     261                 :           0 :         g_debug ("%s(): %s", G_STRFUNC, error->message);
+     262                 :             :     }
+     263                 :             : 
+     264   [ +  -  +  - ]:           1 :   g_clear_handle_id (&self->flush_id, g_source_remove);
+     265                 :           1 : }
+     266                 :             : 
+     267                 :             : static GVariant *
+     268                 :           2 : valent_device_impl_get_properties (GDBusInterfaceSkeleton *skeleton)
+     269                 :             : {
+     270                 :           2 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (skeleton);
+     271                 :           2 :   GVariantBuilder builder;
+     272                 :           2 :   GHashTableIter iter;
+     273                 :           2 :   gpointer key, value;
+     274                 :             : 
+     275                 :           2 :   g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+     276                 :           2 :   g_hash_table_iter_init (&iter, self->cache);
+     277                 :             : 
+     278         [ +  + ]:          10 :   while (g_hash_table_iter_next (&iter, &key, &value))
+     279                 :           8 :     g_variant_builder_add (&builder, "{sv}", key, value);
+     280                 :             : 
+     281                 :           2 :   return g_variant_builder_end (&builder);
+     282                 :             : }
+     283                 :             : 
+     284                 :             : static GDBusInterfaceInfo *
+     285                 :           5 : valent_device_impl_get_info (GDBusInterfaceSkeleton *skeleton)
+     286                 :             : {
+     287                 :           5 :   return (GDBusInterfaceInfo *)&iface_info;
+     288                 :             : }
+     289                 :             : 
+     290                 :             : static GDBusInterfaceVTable *
+     291                 :           1 : valent_device_impl_get_vtable (GDBusInterfaceSkeleton *skeleton)
+     292                 :             : {
+     293                 :           1 :   return (GDBusInterfaceVTable *)&iface_vtable;
+     294                 :             : }
+     295                 :             : 
+     296                 :             : 
+     297                 :             : /*
+     298                 :             :  * GObject
+     299                 :             :  */
+     300                 :             : static void
+     301                 :           1 : valent_device_impl_constructed (GObject *object)
+     302                 :             : {
+     303                 :           1 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (object);
+     304                 :           1 :   GVariant *value = NULL;
+     305                 :             : 
+     306         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE (self->device));
+     307                 :             : 
+     308                 :           1 :   value = g_variant_new_string (valent_device_get_icon_name (self->device));
+     309                 :           2 :   g_hash_table_insert (self->cache,
+     310                 :           1 :                        g_strdup ("IconName"),
+     311                 :           1 :                        g_variant_ref_sink (value));
+     312                 :           1 :   value = g_variant_new_string (valent_device_get_id (self->device));
+     313                 :           2 :   g_hash_table_insert (self->cache,
+     314                 :           1 :                        g_strdup ("Id"),
+     315                 :           1 :                        g_variant_ref_sink (value));
+     316                 :           1 :   value = g_variant_new_string (valent_device_get_name (self->device));
+     317                 :           1 :   g_hash_table_insert (self->cache,
+     318                 :             :                        g_strdup ("Name"),
+     319                 :           1 :                        g_variant_ref_sink (value));
+     320                 :           1 :   value = g_variant_new_uint32 (valent_device_get_state (self->device));
+     321                 :           2 :   g_hash_table_insert (self->cache,
+     322                 :           1 :                        g_strdup ("State"),
+     323                 :           1 :                        g_variant_ref_sink (value));
+     324                 :             : 
+     325                 :           1 :   g_signal_connect_object (self->device,
+     326                 :             :                            "notify",
+     327                 :             :                            G_CALLBACK (on_property_changed),
+     328                 :             :                            self, 0);
+     329                 :             : 
+     330                 :           1 :   G_OBJECT_CLASS (valent_device_impl_parent_class)->constructed (object);
+     331                 :           1 : }
+     332                 :             : 
+     333                 :             : static void
+     334                 :           1 : valent_device_impl_dispose (GObject *object)
+     335                 :             : {
+     336                 :           1 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (object);
+     337                 :             : 
+     338                 :           1 :   g_signal_handlers_disconnect_by_data (self->device, self);
+     339         [ -  + ]:           1 :   g_clear_handle_id (&self->flush_id, g_source_remove);
+     340                 :             : 
+     341                 :           1 :   G_OBJECT_CLASS (valent_device_impl_parent_class)->dispose (object);
+     342                 :           1 : }
+     343                 :             : 
+     344                 :             : static void
+     345                 :           1 : valent_device_impl_finalize (GObject *object)
+     346                 :             : {
+     347                 :           1 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (object);
+     348                 :             : 
+     349         [ +  - ]:           1 :   g_clear_pointer (&self->cache, g_hash_table_unref);
+     350         [ +  - ]:           1 :   g_clear_pointer (&self->pending, g_hash_table_unref);
+     351                 :             : 
+     352                 :           1 :   G_OBJECT_CLASS (valent_device_impl_parent_class)->finalize (object);
+     353                 :           1 : }
+     354                 :             : 
+     355                 :             : static void
+     356                 :           0 : valent_device_impl_get_property (GObject    *object,
+     357                 :             :                                  guint       prop_id,
+     358                 :             :                                  GValue     *value,
+     359                 :             :                                  GParamSpec *pspec)
+     360                 :             : {
+     361                 :           0 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (object);
+     362                 :             : 
+     363         [ #  # ]:           0 :   switch (prop_id)
+     364                 :             :     {
+     365                 :           0 :     case PROP_DEVICE:
+     366                 :           0 :       g_value_set_object (value, self->device);
+     367                 :           0 :       break;
+     368                 :             : 
+     369                 :           0 :     default:
+     370                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     371                 :             :     }
+     372                 :           0 : }
+     373                 :             : 
+     374                 :             : static void
+     375                 :           1 : valent_device_impl_set_property (GObject      *object,
+     376                 :             :                                  guint         prop_id,
+     377                 :             :                                  const GValue *value,
+     378                 :             :                                  GParamSpec   *pspec)
+     379                 :             : {
+     380                 :           1 :   ValentDeviceImpl *self = VALENT_DEVICE_IMPL (object);
+     381                 :             : 
+     382         [ +  - ]:           1 :   switch (prop_id)
+     383                 :             :     {
+     384                 :           1 :     case PROP_DEVICE:
+     385                 :           1 :       self->device = g_value_get_object (value);
+     386                 :           1 :       break;
+     387                 :             : 
+     388                 :           0 :     default:
+     389                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     390                 :             :     }
+     391                 :           1 : }
+     392                 :             : 
+     393                 :             : void
+     394                 :           1 : valent_device_impl_class_init (ValentDeviceImplClass *klass)
+     395                 :             : {
+     396                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     397                 :           1 :   GDBusInterfaceSkeletonClass *skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+     398                 :             : 
+     399                 :           1 :   object_class->constructed = valent_device_impl_constructed;
+     400                 :           1 :   object_class->dispose = valent_device_impl_dispose;
+     401                 :           1 :   object_class->finalize = valent_device_impl_finalize;
+     402                 :           1 :   object_class->get_property = valent_device_impl_get_property;
+     403                 :           1 :   object_class->set_property = valent_device_impl_set_property;
+     404                 :             : 
+     405                 :           1 :   skeleton_class->get_info = valent_device_impl_get_info;
+     406                 :           1 :   skeleton_class->get_vtable = valent_device_impl_get_vtable;
+     407                 :           1 :   skeleton_class->get_properties = valent_device_impl_get_properties;
+     408                 :           1 :   skeleton_class->flush = valent_device_impl_flush;
+     409                 :             : 
+     410                 :           2 :   properties[PROP_DEVICE] =
+     411                 :           1 :     g_param_spec_object ("device", NULL, NULL,
+     412                 :             :                          VALENT_TYPE_DEVICE,
+     413                 :             :                          (G_PARAM_READWRITE |
+     414                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     415                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     416                 :             :                           G_PARAM_STATIC_STRINGS));
+     417                 :             : 
+     418                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     419                 :           1 : }
+     420                 :             : 
+     421                 :             : static void
+     422                 :           1 : valent_device_impl_init (ValentDeviceImpl *self)
+     423                 :             : {
+     424                 :           1 :   self->cache = g_hash_table_new_full (g_str_hash,
+     425                 :             :                                        g_str_equal,
+     426                 :             :                                        g_free,
+     427                 :             :                                        (GDestroyNotify)g_variant_unref);
+     428                 :           1 :   self->pending = g_hash_table_new_full (g_str_hash,
+     429                 :             :                                          g_str_equal,
+     430                 :             :                                          g_free,
+     431                 :             :                                          (GDestroyNotify)g_variant_unref);
+     432                 :           1 : }
+     433                 :             : 
+     434                 :             : /**
+     435                 :             :  * valent_device_impl_new:
+     436                 :             :  * @device: a `ValentDevice`
+     437                 :             :  *
+     438                 :             :  * Create a new `ValentDeviceImpl`.
+     439                 :             :  *
+     440                 :             :  * Returns: (transfer full): a `GDBusInterfaceSkeleton`
+     441                 :             :  */
+     442                 :             : GDBusInterfaceSkeleton *
+     443                 :           1 : valent_device_impl_new (ValentDevice *device)
+     444                 :             : {
+     445                 :           1 :   return g_object_new (VALENT_TYPE_DEVICE_IMPL,
+     446                 :             :                        "device", device,
+     447                 :             :                        NULL);
+     448                 :             : }
+     449                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-impl.h.func-c.html b/coverage/src/libvalent/device/valent-device-impl.h.func-c.html new file mode 100644 index 00000000000..a98edcf9ff5 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-impl.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-impl.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-impl.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_IMPL1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-impl.h.func.html b/coverage/src/libvalent/device/valent-device-impl.h.func.html new file mode 100644 index 00000000000..2d9fe0c3834 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-impl.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-impl.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-impl.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_IMPL1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-impl.h.gcov.html b/coverage/src/libvalent/device/valent-device-impl.h.gcov.html new file mode 100644 index 00000000000..6f4075e0b0d --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-impl.h.gcov.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-impl.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-impl.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include "valent-device.h"
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_DEVICE_IMPL (valent_device_impl_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           1 : G_DECLARE_FINAL_TYPE (ValentDeviceImpl, valent_device_impl, VALENT, DEVICE_IMPL, GDBusInterfaceSkeleton)
+                   -  + ]
+      13                 :             : 
+      14                 :             : GDBusInterfaceSkeleton * valent_device_impl_new (ValentDevice *device);
+      15                 :             : 
+      16                 :             : G_END_DECLS
+      17                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-manager.c.func-c.html b/coverage/src/libvalent/device/valent-device-manager.c.func-c.html new file mode 100644 index 00000000000..2a9864c9e15 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-manager.c.func-c.html @@ -0,0 +1,392 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-manager.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-manager.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.2 %437390
Test Date:2024-03-31 18:46:36Functions:90.5 %4238
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.5 %310169
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
device_action0
g_async_initable_init_async_cb0
valent_device_manager_get_item_type0
valent_device_manager_get_name0
valent_device_manager_disable_plugin1
valent_device_manager_export_device1
valent_device_manager_get_device_object_path1
valent_device_manager_get_property1
on_plugin_enabled_changed2
on_unload_service2
valent_device_manager_remove_device3
valent_device_manager_remove_device_main3
on_channel4
valent_device_manager_check_device4
valent_device_manager_dbus_register4
valent_device_manager_dbus_unregister4
valent_device_manager_unexport_device4
valent_device_manager_refresh5
valent_device_manager_add_device7
valent_device_manager_ensure_device7
valent_device_manager_get_item10
valent_device_manager_get_n_items10
on_device_state11
valent_device_manager_get_default11
valent_device_manager_load_state11
valent_device_manager_save_state11
valent_device_manager_startup11
manager_plugin_free13
valent_device_manager_constructed13
valent_device_manager_finalize13
valent_device_manager_init13
valent_device_manager_shutdown13
valent_device_manager_enable_plugin14
valent_device_manager_lookup14
valent_device_manager_set_property24
valent_device_manager_set_name35
on_load_service47
g_list_model_iface_init66
valent_device_manager_class_init66
valent_device_manager_get_type548
valent_device_manager_class_intern_init66
valent_device_manager_get_type_once86
valent_device_manager_get_type396
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-manager.c.func.html b/coverage/src/libvalent/device/valent-device-manager.c.func.html new file mode 100644 index 00000000000..9ac94817752 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-manager.c.func.html @@ -0,0 +1,392 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-manager.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-manager.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.2 %437390
Test Date:2024-03-31 18:46:36Functions:90.5 %4238
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.5 %310169
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
device_action0
g_async_initable_init_async_cb0
g_list_model_iface_init66
manager_plugin_free13
on_channel4
on_device_state11
on_load_service47
on_plugin_enabled_changed2
on_unload_service2
valent_device_manager_add_device7
valent_device_manager_check_device4
valent_device_manager_class_init66
valent_device_manager_constructed13
valent_device_manager_dbus_register4
valent_device_manager_dbus_unregister4
valent_device_manager_disable_plugin1
valent_device_manager_enable_plugin14
valent_device_manager_ensure_device7
valent_device_manager_export_device1
valent_device_manager_finalize13
valent_device_manager_get_default11
valent_device_manager_get_device_object_path1
valent_device_manager_get_item10
valent_device_manager_get_item_type0
valent_device_manager_get_n_items10
valent_device_manager_get_name0
valent_device_manager_get_property1
valent_device_manager_get_type548
valent_device_manager_class_intern_init66
valent_device_manager_get_type396
valent_device_manager_get_type_once86
valent_device_manager_init13
valent_device_manager_load_state11
valent_device_manager_lookup14
valent_device_manager_refresh5
valent_device_manager_remove_device3
valent_device_manager_remove_device_main3
valent_device_manager_save_state11
valent_device_manager_set_name35
valent_device_manager_set_property24
valent_device_manager_shutdown13
valent_device_manager_startup11
valent_device_manager_unexport_device4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-manager.c.gcov.html b/coverage/src/libvalent/device/valent-device-manager.c.gcov.html new file mode 100644 index 00000000000..1735588c832 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-manager.c.gcov.html @@ -0,0 +1,1194 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-manager.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-manager.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.2 %437390
Test Date:2024-03-31 18:46:36Functions:90.5 %4238
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.5 %310169
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device-manager"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "../core/valent-component-private.h"
+      12                 :             : #include "valent-certificate.h"
+      13                 :             : #include "valent-channel.h"
+      14                 :             : #include "valent-channel-service.h"
+      15                 :             : #include "valent-device.h"
+      16                 :             : #include "valent-device-impl.h"
+      17                 :             : #include "valent-device-manager.h"
+      18                 :             : #include "valent-device-private.h"
+      19                 :             : #include "valent-packet.h"
+      20                 :             : 
+      21                 :             : #define DEVICE_UNPAIRED_MAX (10)
+      22                 :             : 
+      23                 :             : 
+      24                 :             : /**
+      25                 :             :  * ValentDeviceManager:
+      26                 :             :  *
+      27                 :             :  * A class for discovering and managing devices.
+      28                 :             :  *
+      29                 :             :  * `ValentDeviceManager` manages the available [class@Valent.Device] objects,
+      30                 :             :  * connecting them when [signal@Valent.ChannelService::channel] is emitted by an
+      31                 :             :  * enabled implementation, exporting them on D-Bus and removing them when they
+      32                 :             :  * become unavailable.
+      33                 :             :  *
+      34                 :             :  * Since: 1.0
+      35                 :             :  */
+      36                 :             : 
+      37                 :             : struct _ValentDeviceManager
+      38                 :             : {
+      39                 :             :   ValentApplicationPlugin   parent_instance;
+      40                 :             : 
+      41                 :             :   GCancellable             *cancellable;
+      42                 :             :   ValentContext            *context;
+      43                 :             :   GSettings                *settings;
+      44                 :             :   GTlsCertificate          *certificate;
+      45                 :             :   const char               *id;
+      46                 :             :   char                     *name;
+      47                 :             : 
+      48                 :             :   GPtrArray                *devices;
+      49                 :             :   GHashTable               *plugins;
+      50                 :             :   ValentContext            *plugins_context;
+      51                 :             :   JsonNode                 *state;
+      52                 :             : 
+      53                 :             :   GDBusObjectManagerServer *dbus;
+      54                 :             :   GHashTable               *exported;
+      55                 :             : };
+      56                 :             : 
+      57                 :             : static void           valent_device_manager_add_device    (ValentDeviceManager *manager,
+      58                 :             :                                                            ValentDevice        *device);
+      59                 :             : static void           valent_device_manager_remove_device (ValentDeviceManager *manager,
+      60                 :             :                                                            ValentDevice        *device);
+      61                 :             : static ValentDevice * valent_device_manager_ensure_device (ValentDeviceManager *manager,
+      62                 :             :                                                            JsonNode            *identity);
+      63                 :             : 
+      64                 :             : static void   g_list_model_iface_init     (GListModelInterface *iface);
+      65                 :             : 
+      66   [ +  +  +  - ]:         548 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentDeviceManager, valent_device_manager, VALENT_TYPE_APPLICATION_PLUGIN,
+      67                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      68                 :             : 
+      69                 :             : enum {
+      70                 :             :   PROP_0,
+      71                 :             :   PROP_NAME,
+      72                 :             :   N_PROPERTIES
+      73                 :             : };
+      74                 :             : 
+      75                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      76                 :             : 
+      77                 :             : static ValentDeviceManager *default_manager = NULL;
+      78                 :             : 
+      79                 :             : 
+      80                 :             : /*
+      81                 :             :  * GListModel
+      82                 :             :  */
+      83                 :             : static gpointer
+      84                 :          10 : valent_device_manager_get_item (GListModel   *list,
+      85                 :             :                                 unsigned int  position)
+      86                 :             : {
+      87                 :          10 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (list);
+      88                 :             : 
+      89         [ +  - ]:          10 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+      90                 :             : 
+      91         [ +  - ]:          10 :   if G_UNLIKELY (position >= self->devices->len)
+      92                 :             :     return NULL;
+      93                 :             : 
+      94                 :          10 :   return g_object_ref (g_ptr_array_index (self->devices, position));
+      95                 :             : }
+      96                 :             : 
+      97                 :             : static GType
+      98                 :           0 : valent_device_manager_get_item_type (GListModel *list)
+      99                 :             : {
+     100                 :           0 :   return VALENT_TYPE_DEVICE;
+     101                 :             : }
+     102                 :             : 
+     103                 :             : static unsigned int
+     104                 :          10 : valent_device_manager_get_n_items (GListModel *list)
+     105                 :             : {
+     106                 :          10 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (list);
+     107                 :             : 
+     108         [ +  - ]:          10 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     109                 :             : 
+     110                 :          10 :   return self->devices->len;
+     111                 :             : }
+     112                 :             : 
+     113                 :             : static void
+     114                 :          66 : g_list_model_iface_init (GListModelInterface *iface)
+     115                 :             : {
+     116                 :          66 :   iface->get_item = valent_device_manager_get_item;
+     117                 :          66 :   iface->get_item_type = valent_device_manager_get_item_type;
+     118                 :          66 :   iface->get_n_items = valent_device_manager_get_n_items;
+     119                 :          66 : }
+     120                 :             : 
+     121                 :             : /*
+     122                 :             :  * DBus
+     123                 :             :  */
+     124                 :             : typedef struct
+     125                 :             : {
+     126                 :             :   GDBusConnection *connection;
+     127                 :             :   char            *object_path;
+     128                 :             :   unsigned int     actions_id;
+     129                 :             :   unsigned int     menu_id;
+     130                 :             : } ExportedDevice;
+     131                 :             : 
+     132                 :             : static char *
+     133                 :           1 : valent_device_manager_get_device_object_path (ValentDeviceManager *self,
+     134                 :             :                                               ValentDevice        *device)
+     135                 :             : {
+     136                 :           1 :   GDBusObjectManager *object_manager;
+     137                 :           1 :   GString *object_path = NULL;
+     138                 :           1 :   const char *base_path = NULL;
+     139                 :           1 :   const char *id = NULL;
+     140                 :             : 
+     141         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     142         [ -  + ]:           1 :   g_assert (VALENT_IS_DEVICE (device));
+     143                 :             : 
+     144                 :           1 :   object_manager = G_DBUS_OBJECT_MANAGER (self->dbus);
+     145                 :           1 :   base_path = g_dbus_object_manager_get_object_path (object_manager);
+     146                 :             : 
+     147                 :           1 :   object_path = g_string_new (base_path);
+     148         [ -  + ]:           1 :   g_string_append (object_path, "/Device/");
+     149                 :             : 
+     150                 :           1 :   id = valent_device_get_id (device);
+     151                 :             : 
+     152         [ +  + ]:          12 :   while (*id)
+     153                 :             :     {
+     154         [ +  + ]:          11 :       if G_LIKELY (g_ascii_isalnum (*id))
+     155         [ +  - ]:          10 :         g_string_append_c (object_path, *id);
+     156                 :             :       else
+     157         [ +  - ]:           1 :         g_string_append_c (object_path, '_');
+     158                 :             : 
+     159                 :          11 :       id++;
+     160                 :             :     }
+     161                 :             : 
+     162                 :           1 :   return g_string_free (object_path, FALSE);
+     163                 :             : }
+     164                 :             : 
+     165                 :             : static void
+     166                 :           1 : valent_device_manager_export_device (ValentDeviceManager *self,
+     167                 :             :                                      ValentDevice        *device)
+     168                 :             : {
+     169                 :           2 :   g_autoptr (GDBusObjectSkeleton) object = NULL;
+     170         [ +  - ]:           1 :   g_autoptr (GDBusInterfaceSkeleton) iface = NULL;
+     171                 :           1 :   ExportedDevice *info;
+     172                 :           1 :   GActionGroup *action_group;
+     173                 :           1 :   GMenuModel *menu_model;
+     174                 :             : 
+     175                 :           1 :   VALENT_ENTRY;
+     176                 :             : 
+     177         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     178         [ -  + ]:           1 :   g_assert (VALENT_IS_DEVICE (device));
+     179                 :             : 
+     180         [ +  - ]:           1 :   if (g_hash_table_contains (self->exported, device))
+     181                 :           1 :     VALENT_EXIT;
+     182                 :             : 
+     183                 :           1 :   info = g_new0 (ExportedDevice, 1);
+     184                 :           1 :   info->connection = g_dbus_object_manager_server_get_connection (self->dbus);
+     185                 :           1 :   info->object_path = valent_device_manager_get_device_object_path (self,
+     186                 :             :                                                                     device);
+     187                 :             : 
+     188                 :             :   /* Export the ValentDevice, GActionGroup and GMenuModel interfaces on the same
+     189                 :             :    * connection and path */
+     190                 :           1 :   object = g_dbus_object_skeleton_new (info->object_path);
+     191                 :           1 :   iface = valent_device_impl_new (device);
+     192                 :           1 :   g_dbus_object_skeleton_add_interface (object, iface);
+     193                 :             : 
+     194                 :           1 :   action_group = G_ACTION_GROUP (device);
+     195                 :           2 :   info->actions_id = g_dbus_connection_export_action_group (info->connection,
+     196                 :           1 :                                                             info->object_path,
+     197                 :             :                                                             action_group,
+     198                 :             :                                                             NULL);
+     199                 :             : 
+     200                 :           1 :   menu_model = valent_device_get_menu (device);
+     201                 :           2 :   info->menu_id = g_dbus_connection_export_menu_model (info->connection,
+     202                 :           1 :                                                        info->object_path,
+     203                 :             :                                                        menu_model,
+     204                 :             :                                                        NULL);
+     205                 :             : 
+     206                 :           1 :   g_dbus_object_manager_server_export (self->dbus, object);
+     207                 :           1 :   g_hash_table_insert (self->exported, device, info);
+     208                 :             : 
+     209   [ -  +  +  - ]:           2 :   VALENT_EXIT;
+     210                 :             : }
+     211                 :             : 
+     212                 :             : static void
+     213                 :           4 : valent_device_manager_unexport_device (ValentDeviceManager *self,
+     214                 :             :                                        ValentDevice        *device)
+     215                 :             : {
+     216                 :           4 :   gpointer data;
+     217                 :           4 :   ExportedDevice *info = NULL;
+     218                 :             : 
+     219                 :           4 :   VALENT_ENTRY;
+     220                 :             : 
+     221         [ +  - ]:           4 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     222         [ -  + ]:           4 :   g_assert (VALENT_IS_DEVICE (device));
+     223                 :             : 
+     224         [ +  + ]:           4 :   if (!g_hash_table_steal_extended (self->exported, device, NULL, &data))
+     225                 :           1 :     VALENT_EXIT;
+     226                 :             : 
+     227                 :           1 :   info = (ExportedDevice *)data;
+     228                 :             : 
+     229                 :           1 :   g_dbus_object_manager_server_unexport (self->dbus, info->object_path);
+     230                 :           1 :   g_dbus_connection_unexport_action_group (info->connection, info->actions_id);
+     231                 :           1 :   g_dbus_connection_unexport_menu_model (info->connection, info->menu_id);
+     232                 :             : 
+     233         [ +  - ]:           1 :   g_clear_pointer (&info->object_path, g_free);
+     234         [ +  - ]:           1 :   g_clear_object (&info->connection);
+     235                 :           1 :   g_free (info);
+     236                 :             : 
+     237                 :           1 :   VALENT_EXIT;
+     238                 :             : }
+     239                 :             : 
+     240                 :             : /*
+     241                 :             :  * Channel Services
+     242                 :             :  */
+     243                 :             : static void
+     244                 :          13 : manager_plugin_free (gpointer data)
+     245                 :             : {
+     246                 :          13 :   ValentPlugin *plugin = data;
+     247                 :             : 
+     248         [ +  - ]:          13 :   if (plugin->extension != NULL)
+     249                 :             :     {
+     250                 :          13 :       g_signal_handlers_disconnect_by_data (plugin->extension, plugin->parent);
+     251                 :          13 :       valent_object_destroy (VALENT_OBJECT (plugin->extension));
+     252                 :             :     }
+     253                 :             : 
+     254                 :          13 :   g_clear_pointer (&plugin, valent_plugin_free);
+     255                 :          13 : }
+     256                 :             : 
+     257                 :             : static gboolean
+     258                 :           4 : valent_device_manager_check_device (ValentDeviceManager *self,
+     259                 :             :                                     ValentDevice        *device)
+     260                 :             : {
+     261                 :           4 :   unsigned int n_unpaired = 0;
+     262                 :             : 
+     263         [ +  + ]:           4 :   if ((valent_device_get_state (device) & VALENT_DEVICE_STATE_PAIRED) != 0)
+     264                 :             :     return TRUE;
+     265                 :             : 
+     266         [ +  + ]:           6 :   for (unsigned int i = 0, len = self->devices->len; i < len; i++)
+     267                 :             :     {
+     268                 :           3 :       ValentDevice *check = g_ptr_array_index (self->devices, i);
+     269                 :             : 
+     270         [ +  - ]:           3 :       if ((valent_device_get_state (check) & VALENT_DEVICE_STATE_PAIRED) == 0)
+     271                 :           3 :         n_unpaired++;
+     272                 :             :     }
+     273                 :             : 
+     274         [ +  - ]:           3 :   if (n_unpaired >= DEVICE_UNPAIRED_MAX)
+     275                 :             :     {
+     276                 :           0 :       g_warning ("%s(): too many unpaired devices", G_STRFUNC);
+     277                 :           0 :       return FALSE;
+     278                 :             :     }
+     279                 :             : 
+     280                 :             :   return TRUE;
+     281                 :             : }
+     282                 :             : 
+     283                 :             : static void
+     284                 :           4 : on_channel (ValentChannelService *service,
+     285                 :             :             ValentChannel        *channel,
+     286                 :             :             ValentDeviceManager  *self)
+     287                 :             : {
+     288                 :           4 :   JsonNode *identity;
+     289                 :           4 :   ValentDevice *device;
+     290                 :             : 
+     291                 :           4 :   VALENT_ENTRY;
+     292                 :             : 
+     293         [ +  - ]:           4 :   g_assert (VALENT_IS_CHANNEL_SERVICE (service));
+     294         [ -  + ]:           4 :   g_assert (VALENT_IS_CHANNEL (channel));
+     295         [ -  + ]:           4 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     296                 :             : 
+     297         [ -  + ]:           4 :   if ((identity = valent_channel_get_peer_identity (channel)) == NULL)
+     298                 :             :     {
+     299                 :           0 :       g_warning ("%s(): %s missing peer identity",
+     300                 :             :                  G_STRFUNC,
+     301                 :             :                  G_OBJECT_TYPE_NAME (channel));
+     302                 :           0 :       VALENT_EXIT;
+     303                 :             :     }
+     304                 :             : 
+     305         [ +  - ]:           4 :   if ((device = valent_device_manager_ensure_device (self, identity)) == NULL)
+     306                 :           4 :     VALENT_EXIT;
+     307                 :             : 
+     308         [ +  - ]:           4 :   if (!valent_device_manager_check_device (self, device))
+     309                 :           4 :     VALENT_EXIT;
+     310                 :             : 
+     311                 :           4 :   valent_device_set_channel (device, channel);
+     312                 :             : 
+     313                 :           4 :   VALENT_EXIT;
+     314                 :             : }
+     315                 :             : 
+     316                 :             : static void
+     317                 :           0 : g_async_initable_init_async_cb (GAsyncInitable *initable,
+     318                 :             :                                 GAsyncResult   *result,
+     319                 :             :                                 gpointer        user_data)
+     320                 :             : {
+     321                 :           0 :   g_autoptr (GError) error = NULL;
+     322                 :             : 
+     323                 :           0 :   VALENT_ENTRY;
+     324                 :             : 
+     325         [ #  # ]:           0 :   g_assert (VALENT_IS_CHANNEL_SERVICE (initable));
+     326                 :             : 
+     327   [ #  #  #  # ]:           0 :   if (!g_async_initable_init_finish (initable, result, &error) &&
+     328                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     329                 :           0 :     g_warning ("%s: %s", G_OBJECT_TYPE_NAME (initable), error->message);
+     330                 :             : 
+     331         [ #  # ]:           0 :   VALENT_EXIT;
+     332                 :             : }
+     333                 :             : 
+     334                 :             : static inline void
+     335                 :          14 : valent_device_manager_enable_plugin (ValentDeviceManager *self,
+     336                 :             :                                      ValentPlugin        *plugin)
+     337                 :             : {
+     338         [ +  - ]:          14 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     339         [ -  + ]:          14 :   g_assert (plugin != NULL);
+     340                 :             : 
+     341                 :          14 :   plugin->extension = peas_engine_create_extension (valent_get_plugin_engine (),
+     342                 :             :                                                     plugin->info,
+     343                 :             :                                                     VALENT_TYPE_CHANNEL_SERVICE,
+     344                 :             :                                                     "context",     plugin->context,
+     345                 :             :                                                     "certificate", self->certificate,
+     346                 :             :                                                     "name",        self->name,
+     347                 :             :                                                     NULL);
+     348         [ -  + ]:          14 :   g_return_if_fail (G_IS_OBJECT (plugin->extension));
+     349                 :             : 
+     350                 :          14 :   g_object_bind_property (self,              "name",
+     351                 :             :                           plugin->extension, "name",
+     352                 :             :                           G_BINDING_DEFAULT);
+     353                 :             : 
+     354                 :          14 :   g_signal_connect_object (plugin->extension,
+     355                 :             :                            "channel",
+     356                 :             :                            G_CALLBACK (on_channel),
+     357                 :             :                            self, 0);
+     358                 :             : 
+     359   [ +  -  +  -  :          14 :   if (G_IS_ASYNC_INITABLE (plugin->extension))
+             +  -  -  + ]
+     360                 :             :     {
+     361                 :          14 :       g_autoptr (GCancellable) destroy = NULL;
+     362                 :             : 
+     363                 :             :       /* Use a cancellable in case the plugin is unloaded before the operation
+     364                 :             :        * completes. Chain to the manager in case it's destroyed. */
+     365                 :           0 :       plugin->cancellable = g_cancellable_new ();
+     366                 :           0 :       destroy = valent_object_chain_cancellable (VALENT_OBJECT (self),
+     367                 :             :                                                  plugin->cancellable);
+     368                 :             : 
+     369         [ #  # ]:           0 :       g_async_initable_init_async (G_ASYNC_INITABLE (plugin->extension),
+     370                 :             :                                    G_PRIORITY_DEFAULT,
+     371                 :             :                                    destroy,
+     372                 :             :                                    (GAsyncReadyCallback)g_async_initable_init_async_cb,
+     373                 :             :                                    NULL);
+     374                 :             :     }
+     375                 :             : }
+     376                 :             : 
+     377                 :             : static inline void
+     378                 :           1 : valent_device_manager_disable_plugin (ValentDeviceManager *self,
+     379                 :             :                                       ValentPlugin        *plugin)
+     380                 :             : {
+     381         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     382         [ -  + ]:           1 :   g_assert (plugin != NULL);
+     383         [ -  + ]:           1 :   g_return_if_fail (G_IS_OBJECT (plugin->extension));
+     384                 :             : 
+     385         [ +  - ]:           1 :   if (plugin->extension != NULL)
+     386                 :             :     {
+     387                 :           1 :       g_signal_handlers_disconnect_by_data (plugin->extension, self);
+     388                 :           1 :       valent_object_destroy (VALENT_OBJECT (plugin->extension));
+     389         [ +  - ]:           1 :       g_clear_object (&plugin->extension);
+     390                 :             :     }
+     391                 :             : }
+     392                 :             : 
+     393                 :             : static void
+     394                 :           2 : on_plugin_enabled_changed (ValentPlugin *plugin)
+     395                 :             : {
+     396         [ +  - ]:           2 :   g_assert (plugin != NULL);
+     397         [ -  + ]:           2 :   g_assert (VALENT_IS_DEVICE_MANAGER (plugin->parent));
+     398                 :             : 
+     399         [ +  + ]:           2 :   if (valent_plugin_get_enabled (plugin))
+     400                 :           1 :     valent_device_manager_enable_plugin (plugin->parent, plugin);
+     401                 :             :   else
+     402                 :           1 :     valent_device_manager_disable_plugin (plugin->parent, plugin);
+     403                 :           2 : }
+     404                 :             : 
+     405                 :             : static void
+     406                 :          47 : on_load_service (PeasEngine          *engine,
+     407                 :             :                  PeasPluginInfo      *info,
+     408                 :             :                  ValentDeviceManager *self)
+     409                 :             : {
+     410                 :          47 :   ValentPlugin *plugin;
+     411                 :             : 
+     412         [ +  - ]:          47 :   g_assert (PEAS_IS_ENGINE (engine));
+     413         [ -  + ]:          47 :   g_assert (info != NULL);
+     414         [ -  + ]:          47 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     415                 :             : 
+     416                 :             :   /* We're only interested in one GType */
+     417         [ +  + ]:          47 :   if (!peas_engine_provides_extension (engine, info, VALENT_TYPE_CHANNEL_SERVICE))
+     418                 :             :     return;
+     419                 :             : 
+     420                 :          13 :   VALENT_NOTE ("%s: %s",
+     421                 :             :                g_type_name (VALENT_TYPE_CHANNEL_SERVICE),
+     422                 :             :                peas_plugin_info_get_module_name (info));
+     423                 :             : 
+     424                 :          13 :   plugin = valent_plugin_new (self, self->plugins_context, info,
+     425                 :             :                               G_CALLBACK (on_plugin_enabled_changed));
+     426                 :          13 :   g_hash_table_insert (self->plugins, info, plugin);
+     427                 :             : 
+     428         [ +  - ]:          13 :   if (valent_plugin_get_enabled (plugin))
+     429                 :          13 :     valent_device_manager_enable_plugin (self, plugin);
+     430                 :             : }
+     431                 :             : 
+     432                 :             : static void
+     433                 :           2 : on_unload_service (PeasEngine          *engine,
+     434                 :             :                    PeasPluginInfo      *info,
+     435                 :             :                    ValentDeviceManager *self)
+     436                 :             : {
+     437         [ +  - ]:           2 :   g_assert (PEAS_IS_ENGINE (engine));
+     438         [ -  + ]:           2 :   g_assert (info != NULL);
+     439         [ -  + ]:           2 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     440                 :             : 
+     441                 :             :   /* We're only interested in one GType */
+     442         [ +  - ]:           2 :   if (!peas_engine_provides_extension (engine, info, VALENT_TYPE_CHANNEL_SERVICE))
+     443                 :             :     return;
+     444                 :             : 
+     445                 :           2 :   VALENT_NOTE ("%s: %s",
+     446                 :             :                g_type_name (VALENT_TYPE_CHANNEL_SERVICE),
+     447                 :             :                peas_plugin_info_get_module_name (info));
+     448                 :             : 
+     449                 :           2 :   g_hash_table_remove (self->plugins, info);
+     450                 :             : }
+     451                 :             : 
+     452                 :             : /*
+     453                 :             :  * Device Management
+     454                 :             :  */
+     455                 :             : static gboolean
+     456                 :           3 : valent_device_manager_remove_device_main (gpointer data)
+     457                 :             : {
+     458                 :           3 :   g_object_unref (VALENT_DEVICE (data));
+     459                 :             : 
+     460                 :           3 :   return G_SOURCE_REMOVE;
+     461                 :             : }
+     462                 :             : 
+     463                 :             : static void
+     464                 :          11 : on_device_state (ValentDevice        *device,
+     465                 :             :                  GParamSpec          *pspec,
+     466                 :             :                  ValentDeviceManager *self)
+     467                 :             : {
+     468                 :          11 :   ValentDeviceState state = valent_device_get_state (device);
+     469                 :             : 
+     470                 :             :   /* Devices that become connected and paired are remembered */
+     471         [ +  + ]:          11 :   if ((state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     472                 :             :       (state & VALENT_DEVICE_STATE_PAIRED) != 0)
+     473                 :             :     {
+     474                 :           2 :       g_autoptr (ValentChannel) channel = NULL;
+     475                 :           2 :       JsonNode *identity = NULL;
+     476                 :             : 
+     477         [ +  - ]:           2 :       if ((channel = valent_device_ref_channel (device)) == NULL)
+     478                 :             :         return;
+     479                 :             : 
+     480                 :           2 :       identity = valent_channel_get_peer_identity (channel);
+     481                 :             : 
+     482                 :           4 :       json_object_set_object_member (json_node_get_object (self->state),
+     483                 :           2 :                                      valent_device_get_id (device),
+     484                 :             :                                      json_node_dup_object (identity));
+     485                 :             :     }
+     486                 :             : 
+     487                 :             :   /* Devices that become disconnected and unpaired are forgotten */
+     488         [ +  + ]:          11 :   if ((state & VALENT_DEVICE_STATE_CONNECTED) == 0 &&
+     489                 :             :       (state & VALENT_DEVICE_STATE_PAIRED) == 0)
+     490                 :             :     {
+     491                 :           3 :       json_object_remove_member (json_node_get_object (self->state),
+     492                 :           3 :                                  valent_device_get_id (device));
+     493                 :           3 :       valent_device_manager_remove_device (self, device);
+     494                 :             :     }
+     495                 :             : }
+     496                 :             : 
+     497                 :             : static ValentDevice *
+     498                 :          14 : valent_device_manager_lookup (ValentDeviceManager *manager,
+     499                 :             :                               const char          *id)
+     500                 :             : {
+     501         [ +  - ]:          14 :   g_assert (VALENT_IS_DEVICE_MANAGER (manager));
+     502         [ -  + ]:          14 :   g_assert (id != NULL);
+     503                 :             : 
+     504         [ +  + ]:          14 :   for (unsigned int i = 0, len = manager->devices->len; i < len; i++)
+     505                 :             :     {
+     506                 :           7 :       ValentDevice *device = g_ptr_array_index (manager->devices, i);
+     507                 :             : 
+     508         [ -  + ]:           7 :       if (g_str_equal (id, valent_device_get_id (device)))
+     509                 :             :         return device;
+     510                 :             :     }
+     511                 :             : 
+     512                 :             :   return NULL;
+     513                 :             : }
+     514                 :             : 
+     515                 :             : static void
+     516                 :           7 : valent_device_manager_add_device (ValentDeviceManager *self,
+     517                 :             :                                   ValentDevice        *device)
+     518                 :             : {
+     519                 :           7 :   unsigned int position = 0;
+     520                 :             : 
+     521                 :           7 :   VALENT_ENTRY;
+     522                 :             : 
+     523         [ +  - ]:           7 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     524         [ -  + ]:           7 :   g_assert (VALENT_IS_DEVICE (device));
+     525                 :             : 
+     526         [ +  - ]:           7 :   if (g_ptr_array_find (self->devices, device, NULL))
+     527                 :           7 :     VALENT_EXIT;
+     528                 :             : 
+     529                 :           7 :   g_signal_connect_object (device,
+     530                 :             :                            "notify::state",
+     531                 :             :                            G_CALLBACK (on_device_state),
+     532                 :             :                            self,
+     533                 :             :                            0);
+     534                 :             : 
+     535                 :           7 :   position = self->devices->len;
+     536                 :           7 :   g_ptr_array_add (self->devices, g_object_ref (device));
+     537                 :           7 :   g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
+     538                 :             : 
+     539         [ -  + ]:           7 :   if (self->dbus != NULL)
+     540                 :           0 :     valent_device_manager_export_device (self, device);
+     541                 :             : 
+     542                 :           7 :   VALENT_EXIT;
+     543                 :             : }
+     544                 :             : 
+     545                 :             : static void
+     546                 :           3 : valent_device_manager_remove_device (ValentDeviceManager *manager,
+     547                 :             :                                      ValentDevice        *device)
+     548                 :             : {
+     549                 :           3 :   unsigned int position = 0;
+     550                 :             : 
+     551                 :           3 :   VALENT_ENTRY;
+     552                 :             : 
+     553         [ +  - ]:           3 :   g_assert (VALENT_IS_DEVICE_MANAGER (manager));
+     554         [ -  + ]:           3 :   g_assert (VALENT_IS_DEVICE (device));
+     555                 :             : 
+     556                 :           3 :   g_object_ref (device);
+     557                 :             : 
+     558         [ +  - ]:           3 :   if (g_ptr_array_find (manager->devices, device, &position))
+     559                 :             :     {
+     560                 :           3 :       valent_device_manager_unexport_device (manager, device);
+     561                 :           3 :       g_signal_handlers_disconnect_by_data (device, manager);
+     562                 :           3 :       g_ptr_array_remove_index (manager->devices, position);
+     563                 :           3 :       g_list_model_items_changed (G_LIST_MODEL (manager), position, 1, 0);
+     564                 :             : 
+     565                 :             :       // HACK: we are in a signal handler of a device's `notify::state`
+     566                 :             :       //       emission, so if we drop the last reference the emitting object
+     567                 :             :       //       and other handlers may be setup for a use-after-free error.
+     568                 :           3 :       g_idle_add (valent_device_manager_remove_device_main, g_object_ref (device));
+     569                 :             :     }
+     570                 :             : 
+     571                 :           3 :   g_object_unref (device);
+     572                 :             : 
+     573                 :           3 :   VALENT_EXIT;
+     574                 :             : }
+     575                 :             : 
+     576                 :             : static ValentDevice *
+     577                 :           7 : valent_device_manager_ensure_device (ValentDeviceManager *manager,
+     578                 :             :                                      JsonNode            *identity)
+     579                 :             : {
+     580                 :           7 :   const char *device_id;
+     581                 :             : 
+     582         [ +  - ]:           7 :   g_assert (VALENT_IS_DEVICE_MANAGER (manager));
+     583         [ -  + ]:           7 :   g_assert (VALENT_IS_PACKET (identity));
+     584                 :             : 
+     585         [ -  + ]:           7 :   if (!valent_packet_get_string (identity, "deviceId", &device_id))
+     586                 :             :     {
+     587                 :           0 :       g_debug ("%s(): expected \"deviceId\" field holding a string",
+     588                 :             :                G_STRFUNC);
+     589                 :           0 :       return NULL;
+     590                 :             :     }
+     591                 :             : 
+     592         [ +  - ]:           7 :   if (valent_device_manager_lookup (manager, device_id) == NULL)
+     593                 :             :     {
+     594                 :          14 :       g_autoptr (ValentContext) context = NULL;
+     595         [ +  - ]:           7 :       g_autoptr (ValentDevice) device = NULL;
+     596                 :             : 
+     597                 :           7 :       context = valent_context_new (manager->context, "device", device_id);
+     598                 :           7 :       device = valent_device_new_full (identity, context);
+     599                 :             : 
+     600         [ +  - ]:           7 :       valent_device_manager_add_device (manager, device);
+     601                 :             :     }
+     602                 :             : 
+     603                 :           7 :   return valent_device_manager_lookup (manager, device_id);
+     604                 :             : }
+     605                 :             : 
+     606                 :             : static void
+     607                 :          11 : valent_device_manager_load_state (ValentDeviceManager *self)
+     608                 :             : {
+     609                 :          11 :   JsonObjectIter iter;
+     610                 :          11 :   const char *device_id;
+     611                 :          11 :   JsonNode *identity;
+     612                 :             : 
+     613         [ +  - ]:          11 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     614                 :             : 
+     615         [ +  - ]:          11 :   if (self->state == NULL)
+     616                 :             :     {
+     617                 :          22 :       g_autoptr (JsonParser) parser = NULL;
+     618         [ +  - ]:          11 :       g_autoptr (GFile) file = NULL;
+     619                 :             : 
+     620                 :          11 :       file = valent_context_get_cache_file (self->context, "devices.json");
+     621                 :             : 
+     622                 :             :       /* Try to load the state file */
+     623                 :          11 :       parser = json_parser_new ();
+     624                 :             : 
+     625         [ +  + ]:          11 :       if (json_parser_load_from_file (parser, g_file_peek_path (file), NULL))
+     626                 :           3 :         self->state = json_parser_steal_root (parser);
+     627                 :             : 
+     628   [ +  +  -  + ]:          11 :       if (self->state == NULL || !JSON_NODE_HOLDS_OBJECT (self->state))
+     629                 :             :         {
+     630         [ -  + ]:           8 :           g_clear_pointer (&self->state, json_node_unref);
+     631                 :           8 :           self->state = json_node_new (JSON_NODE_OBJECT);
+     632                 :           8 :           json_node_take_object (self->state, json_object_new ());
+     633                 :             :         }
+     634                 :             :     }
+     635                 :             : 
+     636                 :             :   /* Load devices */
+     637                 :          11 :   json_object_iter_init (&iter, json_node_get_object (self->state));
+     638                 :             : 
+     639         [ +  + ]:          14 :   while (json_object_iter_next (&iter, &device_id, &identity))
+     640                 :           3 :     valent_device_manager_ensure_device (self, identity);
+     641                 :          11 : }
+     642                 :             : 
+     643                 :             : static void
+     644                 :          11 : valent_device_manager_save_state (ValentDeviceManager *self)
+     645                 :             : {
+     646                 :          22 :   g_autoptr (JsonGenerator) generator = NULL;
+     647         [ +  - ]:          11 :   g_autoptr (GFile) file = NULL;
+     648         [ +  - ]:          11 :   g_autoptr (GError) error = NULL;
+     649                 :             : 
+     650         [ +  - ]:          11 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     651                 :             : 
+     652                 :          11 :   generator = g_object_new (JSON_TYPE_GENERATOR,
+     653                 :             :                             "pretty", TRUE,
+     654                 :             :                             "root",   self->state,
+     655                 :             :                             NULL);
+     656                 :             : 
+     657                 :          11 :   file = valent_context_get_cache_file (self->context, "devices.json");
+     658                 :             : 
+     659         [ -  + ]:          11 :   if (!json_generator_to_file (generator, g_file_peek_path (file), &error))
+     660                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     661                 :          11 : }
+     662                 :             : 
+     663                 :             : /*
+     664                 :             :  * GActions
+     665                 :             :  */
+     666                 :             : static void
+     667                 :           0 : device_action (GSimpleAction *action,
+     668                 :             :                GVariant      *parameter,
+     669                 :             :                gpointer       user_data)
+     670                 :             : {
+     671                 :           0 :   ValentDeviceManager *manager = valent_device_manager_get_default ();
+     672                 :           0 :   const char *device_id;
+     673                 :           0 :   const char *name;
+     674                 :           0 :   g_autoptr (GVariantIter) targetv = NULL;
+     675         [ #  # ]:           0 :   g_autoptr (GVariant) target = NULL;
+     676                 :             : 
+     677         [ #  # ]:           0 :   g_assert (VALENT_IS_DEVICE_MANAGER (manager));
+     678                 :             : 
+     679                 :             :   /* (<Valent.Device:id>, <Gio.Action:name>, [<GLib.Variant>]) */
+     680                 :           0 :   g_variant_get (parameter, "(&s&sav)", &device_id, &name, &targetv);
+     681                 :           0 :   g_variant_iter_next (targetv, "v", &target);
+     682                 :             : 
+     683         [ #  # ]:           0 :   for (unsigned int i = 0, len = manager->devices->len; i < len; i++)
+     684                 :             :     {
+     685                 :           0 :       ValentDevice *device = g_ptr_array_index (manager->devices, i);
+     686                 :             : 
+     687         [ #  # ]:           0 :       if (g_strcmp0 (device_id, valent_device_get_id (device)) == 0)
+     688                 :             :         {
+     689                 :           0 :           g_action_group_activate_action (G_ACTION_GROUP (device), name, target);
+     690                 :           0 :           break;
+     691                 :             :         }
+     692                 :             :     }
+     693                 :           0 : }
+     694                 :             : 
+     695                 :             : static const GActionEntry app_actions[] = {
+     696                 :             :   { "device",  device_action, "(ssav)", NULL, NULL },
+     697                 :             : };
+     698                 :             : 
+     699                 :             : /*
+     700                 :             :  * ValentApplicationPlugin
+     701                 :             :  */
+     702                 :             : static gboolean
+     703                 :           4 : valent_device_manager_dbus_register (ValentApplicationPlugin  *plugin,
+     704                 :             :                                      GDBusConnection          *connection,
+     705                 :             :                                      const char               *object_path,
+     706                 :             :                                      GError                  **error)
+     707                 :             : {
+     708                 :           4 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (plugin);
+     709                 :             : 
+     710         [ +  - ]:           4 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     711   [ +  -  +  -  :           4 :   g_assert (G_IS_DBUS_CONNECTION (connection));
+             -  +  -  - ]
+     712         [ -  + ]:           4 :   g_assert (g_variant_is_object_path (object_path));
+     713                 :             : 
+     714         [ +  - ]:           4 :   if (self->dbus != NULL)
+     715                 :             :     return TRUE;
+     716                 :             : 
+     717                 :           4 :   self->dbus = g_dbus_object_manager_server_new (object_path);
+     718                 :           4 :   g_dbus_object_manager_server_set_connection (self->dbus, connection);
+     719                 :             : 
+     720         [ +  + ]:           5 :   for (unsigned int i = 0, len = self->devices->len; i < len; i++)
+     721                 :             :     {
+     722                 :           1 :       ValentDevice *device = g_ptr_array_index (self->devices, i);
+     723                 :             : 
+     724                 :           1 :       valent_device_manager_export_device (self, device);
+     725                 :             :     }
+     726                 :             : 
+     727                 :             :   return TRUE;
+     728                 :             : }
+     729                 :             : 
+     730                 :             : static void
+     731                 :           4 : valent_device_manager_dbus_unregister (ValentApplicationPlugin *plugin,
+     732                 :             :                                        GDBusConnection         *connection,
+     733                 :             :                                        const char              *object_path)
+     734                 :             : {
+     735                 :           4 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (plugin);
+     736                 :             : 
+     737         [ +  - ]:           4 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     738   [ +  -  +  -  :           4 :   g_assert (G_IS_DBUS_CONNECTION (connection));
+             -  +  -  - ]
+     739         [ -  + ]:           4 :   g_assert (g_variant_is_object_path (object_path));
+     740                 :             : 
+     741         [ +  - ]:           4 :   if (self->dbus == NULL)
+     742                 :             :     return;
+     743                 :             : 
+     744         [ +  + ]:           5 :   for (unsigned int i = 0, len = self->devices->len; i < len; i++)
+     745                 :             :     {
+     746                 :           1 :       ValentDevice *device = g_ptr_array_index (self->devices, i);
+     747                 :             : 
+     748                 :           1 :       valent_device_manager_unexport_device (self, device);
+     749                 :             :     }
+     750                 :             : 
+     751                 :           4 :   g_dbus_object_manager_server_set_connection (self->dbus, NULL);
+     752         [ +  - ]:           4 :   g_clear_object (&self->dbus);
+     753                 :             : }
+     754                 :             : 
+     755                 :             : static void
+     756                 :          13 : valent_device_manager_shutdown (ValentApplicationPlugin *plugin)
+     757                 :             : {
+     758                 :          13 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (plugin);
+     759                 :          13 :   PeasEngine *engine = NULL;
+     760                 :          13 :   unsigned int n_devices = 0;
+     761                 :             : 
+     762         [ +  - ]:          13 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     763                 :             : 
+     764                 :             :   /* We're already stopped */
+     765         [ +  + ]:          13 :   if (self->cancellable == NULL)
+     766                 :             :     return;
+     767                 :             : 
+     768                 :             :   /* Cancel any running operations */
+     769                 :          11 :   g_cancellable_cancel (self->cancellable);
+     770         [ +  - ]:          11 :   g_clear_object (&self->cancellable);
+     771                 :             : 
+     772                 :             :   /* Stop and remove services */
+     773                 :          11 :   engine = valent_get_plugin_engine ();
+     774                 :          11 :   g_signal_handlers_disconnect_by_data (engine, self);
+     775                 :          11 :   g_hash_table_remove_all (self->plugins);
+     776                 :             : 
+     777                 :             :   /* Remove any devices */
+     778                 :          11 :   n_devices = self->devices->len;
+     779                 :             : 
+     780         [ +  + ]:          15 :   for (unsigned int i = 0; i < n_devices; i++)
+     781                 :             :     {
+     782                 :           4 :       ValentDevice *device = g_ptr_array_index (self->devices, i);
+     783                 :           4 :       g_signal_handlers_disconnect_by_data (device, self);
+     784                 :             :     }
+     785                 :             : 
+     786                 :          11 :   g_ptr_array_remove_range (self->devices, 0, n_devices);
+     787                 :          11 :   g_list_model_items_changed (G_LIST_MODEL (self), 0, n_devices, 0);
+     788                 :             : 
+     789                 :          11 :   valent_device_manager_save_state (self);
+     790         [ +  - ]:          11 :   g_clear_object (&self->settings);
+     791                 :             : 
+     792                 :             :   /* Remove actions from the `app` group, if available */
+     793         [ +  - ]:          11 :   if (self == default_manager)
+     794                 :             :     {
+     795                 :          11 :       GApplication *application = g_application_get_default ();
+     796                 :             : 
+     797         [ +  + ]:          11 :       if (application != NULL)
+     798                 :             :         {
+     799         [ +  + ]:           6 :           for (size_t i = 0; i < G_N_ELEMENTS (app_actions); i++)
+     800                 :           3 :             g_action_map_remove_action (G_ACTION_MAP (application),
+     801                 :             :                                         app_actions[i].name);
+     802                 :             : 
+     803                 :             :         }
+     804                 :             :     }
+     805                 :             : }
+     806                 :             : 
+     807                 :             : static void
+     808                 :          11 : valent_device_manager_startup (ValentApplicationPlugin *plugin)
+     809                 :             : {
+     810                 :          11 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (plugin);
+     811                 :          11 :   PeasEngine *engine = NULL;
+     812                 :          11 :   g_autofree char *name = NULL;
+     813                 :          11 :   unsigned int n_plugins = 0;
+     814                 :             : 
+     815         [ +  - ]:          11 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     816                 :             : 
+     817                 :             :   /* We're already started */
+     818         [ -  + ]:          11 :   if (self->cancellable != NULL)
+     819                 :           0 :     return;
+     820                 :             : 
+     821                 :             :   /* Setup Manager */
+     822                 :          11 :   self->cancellable = g_cancellable_new ();
+     823                 :          11 :   self->settings = g_settings_new ("ca.andyholmes.Valent");
+     824                 :          11 :   g_settings_bind (self->settings, "name",
+     825                 :             :                    self,           "name",
+     826                 :             :                    G_SETTINGS_BIND_DEFAULT);
+     827                 :          11 :   name = g_settings_get_string (self->settings, "name");
+     828                 :          11 :   valent_device_manager_set_name (self, name);
+     829                 :          11 :   valent_device_manager_load_state (self);
+     830                 :             : 
+     831                 :             :   /* Setup services */
+     832                 :          11 :   engine = valent_get_plugin_engine ();
+     833                 :          11 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (engine));
+     834                 :             : 
+     835         [ +  + ]:          56 :   for (unsigned int i = 0; i < n_plugins; i++)
+     836                 :             :     {
+     837                 :          45 :       g_autoptr (PeasPluginInfo) info = NULL;
+     838                 :             : 
+     839                 :          45 :       info = g_list_model_get_item (G_LIST_MODEL (engine), i);
+     840                 :             : 
+     841         [ +  - ]:          45 :       if (peas_plugin_info_is_loaded (info))
+     842                 :          45 :         on_load_service (engine, info, self);
+     843                 :             :     }
+     844                 :             : 
+     845                 :          11 :   g_signal_connect_object (engine,
+     846                 :             :                            "load-plugin",
+     847                 :             :                            G_CALLBACK (on_load_service),
+     848                 :             :                            self,
+     849                 :             :                            G_CONNECT_AFTER);
+     850                 :             : 
+     851                 :          11 :   g_signal_connect_object (engine,
+     852                 :             :                            "unload-plugin",
+     853                 :             :                            G_CALLBACK (on_unload_service),
+     854                 :             :                            self,
+     855                 :             :                            0);
+     856                 :             : 
+     857                 :             :   /* Add actions to the `app` group, if available */
+     858         [ +  - ]:          11 :   if (self == default_manager)
+     859                 :             :     {
+     860                 :          11 :       GApplication *application = g_application_get_default ();
+     861                 :             : 
+     862         [ +  + ]:          11 :       if (application != NULL)
+     863                 :             :         {
+     864                 :           3 :           g_action_map_add_action_entries (G_ACTION_MAP (application),
+     865                 :             :                                            app_actions,
+     866                 :             :                                            G_N_ELEMENTS (app_actions),
+     867                 :             :                                            application);
+     868                 :             :         }
+     869                 :             :     }
+     870                 :             : }
+     871                 :             : 
+     872                 :             : /*
+     873                 :             :  * GObject
+     874                 :             :  */
+     875                 :             : static void
+     876                 :          13 : valent_device_manager_constructed (GObject *object)
+     877                 :             : {
+     878                 :          13 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (object);
+     879                 :          26 :   g_autoptr (GFile) file = NULL;
+     880         [ +  - ]:          13 :   g_autoptr (GError) error = NULL;
+     881                 :          13 :   const char *path = NULL;
+     882                 :             : 
+     883         [ +  - ]:          13 :   g_assert (VALENT_IS_DEVICE_MANAGER (self));
+     884                 :             : 
+     885                 :             :   /* Generate certificate */
+     886                 :          13 :   file = valent_context_get_config_file (self->context, ".");
+     887                 :          13 :   path = g_file_peek_path (file);
+     888                 :             : 
+     889         [ +  - ]:          13 :   if ((self->certificate = valent_certificate_new_sync (path, &error)) != NULL)
+     890                 :          13 :     self->id = valent_certificate_get_common_name (self->certificate);
+     891                 :             : 
+     892         [ -  + ]:          13 :   if (self->id == NULL)
+     893                 :             :     {
+     894                 :           0 :       self->id = g_uuid_string_random ();
+     895                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     896                 :             :     }
+     897                 :             : 
+     898                 :             :   /* ... */
+     899         [ +  - ]:          13 :   if (default_manager == NULL)
+     900                 :             :     {
+     901                 :          13 :       default_manager = self;
+     902                 :          13 :       g_object_add_weak_pointer (G_OBJECT (default_manager),
+     903                 :             :                                  (gpointer)&default_manager);
+     904                 :             :     }
+     905                 :             : 
+     906         [ -  + ]:          13 :   G_OBJECT_CLASS (valent_device_manager_parent_class)->constructed (object);
+     907                 :          13 : }
+     908                 :             : 
+     909                 :             : static void
+     910                 :          13 : valent_device_manager_finalize (GObject *object)
+     911                 :             : {
+     912                 :          13 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (object);
+     913                 :             : 
+     914         [ +  - ]:          13 :   g_clear_pointer (&self->exported, g_hash_table_unref);
+     915         [ +  - ]:          13 :   g_clear_pointer (&self->plugins, g_hash_table_unref);
+     916         [ +  - ]:          13 :   g_clear_pointer (&self->plugins_context, g_object_unref);
+     917         [ +  - ]:          13 :   g_clear_pointer (&self->devices, g_ptr_array_unref);
+     918         [ +  + ]:          13 :   g_clear_pointer (&self->state, json_node_unref);
+     919                 :             : 
+     920         [ +  - ]:          13 :   g_clear_object (&self->certificate);
+     921         [ +  - ]:          13 :   g_clear_object (&self->context);
+     922         [ +  - ]:          13 :   g_clear_pointer (&self->name, g_free);
+     923                 :             : 
+     924                 :          13 :   G_OBJECT_CLASS (valent_device_manager_parent_class)->finalize (object);
+     925                 :          13 : }
+     926                 :             : 
+     927                 :             : static void
+     928                 :           1 : valent_device_manager_get_property (GObject    *object,
+     929                 :             :                                     guint       prop_id,
+     930                 :             :                                     GValue     *value,
+     931                 :             :                                     GParamSpec *pspec)
+     932                 :             : {
+     933                 :           1 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (object);
+     934                 :             : 
+     935         [ +  - ]:           1 :   switch (prop_id)
+     936                 :             :     {
+     937                 :           1 :     case PROP_NAME:
+     938                 :           1 :       g_value_set_string (value, self->name);
+     939                 :           1 :       break;
+     940                 :             : 
+     941                 :           0 :     default:
+     942                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     943                 :             :     }
+     944                 :           1 : }
+     945                 :             : 
+     946                 :             : static void
+     947                 :          24 : valent_device_manager_set_property (GObject      *object,
+     948                 :             :                                     guint         prop_id,
+     949                 :             :                                     const GValue *value,
+     950                 :             :                                     GParamSpec   *pspec)
+     951                 :             : {
+     952                 :          24 :   ValentDeviceManager *self = VALENT_DEVICE_MANAGER (object);
+     953                 :             : 
+     954         [ +  - ]:          24 :   switch (prop_id)
+     955                 :             :     {
+     956                 :          24 :     case PROP_NAME:
+     957                 :          24 :       valent_device_manager_set_name (self, g_value_get_string (value));
+     958                 :          24 :       break;
+     959                 :             : 
+     960                 :           0 :     default:
+     961                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     962                 :             :     }
+     963                 :          24 : }
+     964                 :             : 
+     965                 :             : static void
+     966                 :          66 : valent_device_manager_class_init (ValentDeviceManagerClass *klass)
+     967                 :             : {
+     968                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     969                 :          66 :   ValentApplicationPluginClass *plugin_class = VALENT_APPLICATION_PLUGIN_CLASS (klass);
+     970                 :             : 
+     971                 :          66 :   object_class->constructed = valent_device_manager_constructed;
+     972                 :          66 :   object_class->finalize = valent_device_manager_finalize;
+     973                 :          66 :   object_class->get_property = valent_device_manager_get_property;
+     974                 :          66 :   object_class->set_property = valent_device_manager_set_property;
+     975                 :             : 
+     976                 :          66 :   plugin_class->dbus_register = valent_device_manager_dbus_register;
+     977                 :          66 :   plugin_class->dbus_unregister = valent_device_manager_dbus_unregister;
+     978                 :          66 :   plugin_class->shutdown = valent_device_manager_shutdown;
+     979                 :          66 :   plugin_class->startup = valent_device_manager_startup;
+     980                 :             : 
+     981                 :             :   /**
+     982                 :             :    * ValentDeviceManager:name: (getter get_name) (setter set_name)
+     983                 :             :    *
+     984                 :             :    * The display name of the local device.
+     985                 :             :    *
+     986                 :             :    * Since: 1.0
+     987                 :             :    */
+     988                 :         132 :   properties [PROP_NAME] =
+     989                 :          66 :     g_param_spec_string ("name", NULL, NULL,
+     990                 :             :                          "Valent",
+     991                 :             :                          (G_PARAM_READWRITE |
+     992                 :             :                           G_PARAM_CONSTRUCT |
+     993                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     994                 :             :                           G_PARAM_STATIC_STRINGS));
+     995                 :             : 
+     996                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     997                 :          66 : }
+     998                 :             : 
+     999                 :             : static void
+    1000                 :          13 : valent_device_manager_init (ValentDeviceManager *self)
+    1001                 :             : {
+    1002                 :          13 :   self->context = valent_context_new (NULL, NULL, NULL);
+    1003                 :          13 :   self->devices = g_ptr_array_new_with_free_func (g_object_unref);
+    1004                 :          13 :   self->exported = g_hash_table_new (NULL, NULL);
+    1005                 :          13 :   self->plugins = g_hash_table_new_full (NULL, NULL, NULL, manager_plugin_free);
+    1006                 :          13 :   self->plugins_context = valent_context_new (self->context, "network", NULL);
+    1007                 :          13 : }
+    1008                 :             : 
+    1009                 :             : /**
+    1010                 :             :  * valent_device_manager_get_default:
+    1011                 :             :  *
+    1012                 :             :  * Get the default [class@Valent.DeviceManager].
+    1013                 :             :  *
+    1014                 :             :  * Returns: (transfer none) (not nullable): a `ValentDeviceManager`
+    1015                 :             :  *
+    1016                 :             :  * Since: 1.0
+    1017                 :             :  */
+    1018                 :             : ValentDeviceManager *
+    1019                 :          11 : valent_device_manager_get_default (void)
+    1020                 :             : {
+    1021         [ +  + ]:          11 :   if (default_manager == NULL)
+    1022                 :          10 :     return g_object_new (VALENT_TYPE_DEVICE_MANAGER, NULL);
+    1023                 :             : 
+    1024                 :             :   return default_manager;
+    1025                 :             : }
+    1026                 :             : 
+    1027                 :             : /**
+    1028                 :             :  * valent_device_manager_get_name: (get-property name)
+    1029                 :             :  * @manager: a `ValentDeviceManager`
+    1030                 :             :  *
+    1031                 :             :  * Get the display name of the local device.
+    1032                 :             :  *
+    1033                 :             :  * Returns: (transfer none): the local display name
+    1034                 :             :  *
+    1035                 :             :  * Since: 1.0
+    1036                 :             :  */
+    1037                 :             : const char *
+    1038                 :           0 : valent_device_manager_get_name (ValentDeviceManager *manager)
+    1039                 :             : {
+    1040         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_DEVICE_MANAGER (manager), NULL);
+    1041                 :             : 
+    1042                 :           0 :   return manager->name;
+    1043                 :             : }
+    1044                 :             : 
+    1045                 :             : /**
+    1046                 :             :  * valent_device_manager_set_name: (set-property name)
+    1047                 :             :  * @manager: a `ValentDeviceManager`
+    1048                 :             :  * @name: (not nullable): a display name
+    1049                 :             :  *
+    1050                 :             :  * Set the display name of the local device to @name.
+    1051                 :             :  *
+    1052                 :             :  * Since: 1.0
+    1053                 :             :  */
+    1054                 :             : void
+    1055                 :          35 : valent_device_manager_set_name (ValentDeviceManager *manager,
+    1056                 :             :                                 const char          *name)
+    1057                 :             : {
+    1058         [ +  - ]:          35 :   g_return_if_fail (VALENT_IS_DEVICE_MANAGER (manager));
+    1059   [ +  -  -  + ]:          35 :   g_return_if_fail (name != NULL && *name != '\0');
+    1060                 :             : 
+    1061         [ +  + ]:          35 :   if (g_set_str (&manager->name, name))
+    1062                 :          13 :     g_object_notify_by_pspec (G_OBJECT (manager), properties [PROP_NAME]);
+    1063                 :             : }
+    1064                 :             : 
+    1065                 :             : /**
+    1066                 :             :  * valent_device_manager_refresh:
+    1067                 :             :  * @manager: a `ValentDeviceManager`
+    1068                 :             :  *
+    1069                 :             :  * Refresh the available devices.
+    1070                 :             :  *
+    1071                 :             :  * This method calls [method@Valent.ChannelService.identify] for each enabled
+    1072                 :             :  * service, requesting it to announce itself on its respective network.
+    1073                 :             :  *
+    1074                 :             :  * Since: 1.0
+    1075                 :             :  */
+    1076                 :             : void
+    1077                 :           5 : valent_device_manager_refresh (ValentDeviceManager *manager)
+    1078                 :             : {
+    1079                 :           5 :   GHashTableIter iter;
+    1080                 :           5 :   ValentPlugin *plugin;
+    1081                 :             : 
+    1082                 :           5 :   VALENT_ENTRY;
+    1083                 :             : 
+    1084         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_DEVICE_MANAGER (manager));
+    1085                 :             : 
+    1086                 :           5 :   g_hash_table_iter_init (&iter, manager->plugins);
+    1087                 :             : 
+    1088         [ +  + ]:           9 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+    1089                 :             :     {
+    1090         [ -  + ]:           4 :       if (plugin->extension == NULL)
+    1091                 :           0 :         continue;
+    1092                 :             : 
+    1093                 :           4 :       valent_channel_service_identify (VALENT_CHANNEL_SERVICE (plugin->extension),
+    1094                 :             :                                        NULL);
+    1095                 :             :     }
+    1096                 :             : 
+    1097                 :           5 :   VALENT_EXIT;
+    1098                 :             : }
+    1099                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-manager.h.func-c.html b/coverage/src/libvalent/device/valent-device-manager.h.func-c.html new file mode 100644 index 00000000000..3d52dcc0393 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-manager.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-manager.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-manager.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_MANAGER234
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-manager.h.func.html b/coverage/src/libvalent/device/valent-device-manager.h.func.html new file mode 100644 index 00000000000..29bdc787e5f --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-manager.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-manager.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-manager.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_MANAGER234
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-manager.h.gcov.html b/coverage/src/libvalent/device/valent-device-manager.h.gcov.html new file mode 100644 index 00000000000..911d9b0ceed --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-manager.h.gcov.html @@ -0,0 +1,123 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-manager.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-manager.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-application-plugin.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_DEVICE_MANAGER (valent_device_manager_get_type())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  +  +  -  :         236 : G_DECLARE_FINAL_TYPE (ValentDeviceManager, valent_device_manager, VALENT, DEVICE_MANAGER, ValentApplicationPlugin)
+                   -  + ]
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20                 :             : ValentDeviceManager * valent_device_manager_get_default (void);
+      21                 :             : 
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : const char          * valent_device_manager_get_name    (ValentDeviceManager  *manager);
+      24                 :             : VALENT_AVAILABLE_IN_1_0
+      25                 :             : void                  valent_device_manager_set_name    (ValentDeviceManager  *manager,
+      26                 :             :                                                          const char           *name);
+      27                 :             : VALENT_AVAILABLE_IN_1_0
+      28                 :             : void                  valent_device_manager_refresh     (ValentDeviceManager  *manager);
+      29                 :             : 
+      30                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-plugin.c.func-c.html b/coverage/src/libvalent/device/valent-device-plugin.c.func-c.html new file mode 100644 index 00000000000..f47c54e69aa --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-plugin.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.3 %117108
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.6 %15880
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notification_set_device_action1
valent_notification_add_device_button28
valent_device_plugin_hide_notification30
valent_device_plugin_show_notification38
valent_device_plugin_queue_packet115
valent_device_send_packet_cb115
valent_device_plugin_handle_packet127
valent_device_plugin_set_menu_action152
valent_device_plugin_init195
_g_menu_find_action443
valent_device_plugin_set_menu_item445
valent_device_plugin_update_state584
valent_device_plugin_get_type4183
valent_device_plugin_class_intern_init66
valent_device_plugin_get_type_once86
valent_device_plugin_get_type4031
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-plugin.c.func.html b/coverage/src/libvalent/device/valent-device-plugin.c.func.html new file mode 100644 index 00000000000..d189bd717b3 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-plugin.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.3 %117108
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.6 %15880
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_g_menu_find_action443
valent_device_plugin_get_type4183
valent_device_plugin_class_intern_init66
valent_device_plugin_get_type4031
valent_device_plugin_get_type_once86
valent_device_plugin_handle_packet127
valent_device_plugin_hide_notification30
valent_device_plugin_init195
valent_device_plugin_queue_packet115
valent_device_plugin_set_menu_action152
valent_device_plugin_set_menu_item445
valent_device_plugin_show_notification38
valent_device_plugin_update_state584
valent_device_send_packet_cb115
valent_notification_add_device_button28
valent_notification_set_device_action1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-plugin.c.gcov.html b/coverage/src/libvalent/device/valent-device-plugin.c.gcov.html new file mode 100644 index 00000000000..77c5ea9f0b7 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-plugin.c.gcov.html @@ -0,0 +1,626 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.3 %117108
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.6 %15880
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <libpeas.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : 
+      13                 :             : #include "valent-device.h"
+      14                 :             : #include "valent-device-plugin.h"
+      15                 :             : #include "valent-packet.h"
+      16                 :             : 
+      17                 :             : #define PLUGIN_SETTINGS_KEY "X-DevicePluginSettings"
+      18                 :             : 
+      19                 :             : 
+      20                 :             : /**
+      21                 :             :  * ValentDevicePlugin:
+      22                 :             :  *
+      23                 :             :  * An abstract base class for device plugins.
+      24                 :             :  *
+      25                 :             :  * `ValentDevicePlugin` is a base class for plugins that operate in the scope of
+      26                 :             :  * a single device. This usually means communicating with other devices, however
+      27                 :             :  * plugins aren't required to be packet based.
+      28                 :             :  *
+      29                 :             :  * ## Plugin Requirements
+      30                 :             :  *
+      31                 :             :  * Device plugins essentially have two sets of dependent conditions for being
+      32                 :             :  * enabled. Plugins become available (i.e. can be enabled) when any of the
+      33                 :             :  * following are true:
+      34                 :             :  *
+      35                 :             :  * - any of the device's outgoing capabilities match any of the plugin's
+      36                 :             :  *   incoming capabilities
+      37                 :             :  * - any of the device's incoming capabilities match any of the plugin's
+      38                 :             :  *   outgoing capabilities
+      39                 :             :  * - the plugin doesn't list any capabilities (eg. a non-packet based plugin)
+      40                 :             :  *
+      41                 :             :  * When a plugin becomes available it may be enabled, disabled and configured.
+      42                 :             :  *
+      43                 :             :  * ## Plugin Actions
+      44                 :             :  *
+      45                 :             :  * `ValentDevicePlugin` implements the [iface@Gio.ActionGroup] and
+      46                 :             :  * [iface@Gio.ActionMap] interfaces, providing a simple way for plugins to
+      47                 :             :  * expose functions and states. Each [iface@Gio.Action] added to the action map
+      48                 :             :  * will be included in the device action group with the plugin's module name as
+      49                 :             :  * a prefix (eg. `share.uri`).
+      50                 :             :  *
+      51                 :             :  * If the [class@Valent.DeviceManager] is exported on D-Bus, the actions will be
+      52                 :             :  * exported along with the [class@Valent.Device].
+      53                 :             :  *
+      54                 :             :  * ## Implementation Notes
+      55                 :             :  *
+      56                 :             :  * Implementations that define `X-DevicePluginIncoming` in the `.plugin` file
+      57                 :             :  * must override [vfunc@Valent.DevicePlugin.handle_packet] to handle incoming
+      58                 :             :  * packets. Implementations that depend on the device state, especially those
+      59                 :             :  * that define `X-DevicePluginOutgoing` in the `.plugin` file, should override
+      60                 :             :  * [vfunc@Valent.DevicePlugin.update_state].
+      61                 :             :  *
+      62                 :             :  * For device plugin preferences see [class@Valent.DevicePreferencesGroup].
+      63                 :             :  *
+      64                 :             :  * ## `.plugin` File
+      65                 :             :  *
+      66                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      67                 :             :  *
+      68                 :             :  * - `X-DevicePluginCategory`
+      69                 :             :  *
+      70                 :             :  *     A list of categories separated by semi-colons, serving as a hint for
+      71                 :             :  *     organizational purposes. This should be in the form `Main;Additional;`,
+      72                 :             :  *     with values from the freedesktop.org Desktop Menu Specification.
+      73                 :             :  *
+      74                 :             :  * - `X-DevicePluginIncoming`
+      75                 :             :  *
+      76                 :             :  *     A list of packet types (eg. `kdeconnect.ping`) separated by semi-colons
+      77                 :             :  *     indicating the packets that the plugin can handle.
+      78                 :             :  *
+      79                 :             :  * - `X-DevicePluginOutgoing`
+      80                 :             :  *
+      81                 :             :  *     A list of packet types (eg. `kdeconnect.share.request`) separated by
+      82                 :             :  *     semi-colons indicating the packets that the plugin may send.
+      83                 :             :  *
+      84                 :             :  * - `X-DevicePluginSettings`
+      85                 :             :  *
+      86                 :             :  *     A [class@Gio.Settings] schema ID for the plugin's settings. See
+      87                 :             :  *     [method@Valent.Context.get_plugin_settings] for more information.
+      88                 :             :  *
+      89                 :             :  * Since: 1.0
+      90                 :             :  */
+      91                 :             : 
+      92                 :             : typedef struct
+      93                 :             : {
+      94                 :             :   gpointer  reserved[1];
+      95                 :             : } ValentDevicePluginPrivate;
+      96                 :             : 
+      97   [ +  +  +  - ]:        4183 : G_DEFINE_ABSTRACT_TYPE (ValentDevicePlugin, valent_device_plugin, VALENT_TYPE_EXTENSION)
+      98                 :             : 
+      99                 :             : /**
+     100                 :             :  * ValentDevicePluginClass:
+     101                 :             :  * @handle_packet: the virtual function pointer for valent_device_plugin_handle_packet()
+     102                 :             :  * @update_state: the virtual function pointer for valent_device_plugin_update_state()
+     103                 :             :  *
+     104                 :             :  * The virtual function table for `ValentDevicePlugin`.
+     105                 :             :  */
+     106                 :             : 
+     107                 :             : 
+     108                 :             : /* LCOV_EXCL_START */
+     109                 :             : static void
+     110                 :             : valent_device_plugin_real_handle_packet (ValentDevicePlugin *plugin,
+     111                 :             :                                          const char         *type,
+     112                 :             :                                          JsonNode           *packet)
+     113                 :             : {
+     114                 :             :   g_assert (VALENT_IS_DEVICE_PLUGIN (plugin));
+     115                 :             :   g_assert (type != NULL && *type != '\0');
+     116                 :             :   g_assert (VALENT_IS_PACKET (packet));
+     117                 :             : 
+     118                 :             :   g_critical ("%s: expected handler for \"%s\" packet",
+     119                 :             :               G_OBJECT_TYPE_NAME (plugin),
+     120                 :             :               type);
+     121                 :             : }
+     122                 :             : 
+     123                 :             : static void
+     124                 :             : valent_device_plugin_real_update_state (ValentDevicePlugin *plugin,
+     125                 :             :                                         ValentDeviceState   state)
+     126                 :             : {
+     127                 :             :   g_assert (VALENT_IS_DEVICE_PLUGIN (plugin));
+     128                 :             : }
+     129                 :             : /* LCOV_EXCL_STOP */
+     130                 :             : 
+     131                 :             : static void
+     132                 :         115 : valent_device_send_packet_cb (ValentDevice *device,
+     133                 :             :                               GAsyncResult *result,
+     134                 :             :                               gpointer      user_data)
+     135                 :             : {
+     136                 :         230 :   g_autoptr (GError) error = NULL;
+     137                 :             : 
+     138         [ +  + ]:         115 :   if (!valent_device_send_packet_finish (device, result, &error))
+     139                 :             :     {
+     140         [ -  + ]:           2 :       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED))
+     141                 :           0 :         g_critical ("%s(): %s", G_STRFUNC, error->message);
+     142         [ -  + ]:           2 :       else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_CONNECTED))
+     143                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     144         [ +  - ]:           2 :       else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     145                 :           2 :         g_debug ("%s(): %s", G_STRFUNC, error->message);
+     146                 :             :     }
+     147                 :         115 : }
+     148                 :             : 
+     149                 :             : /*
+     150                 :             :  * GObject
+     151                 :             :  */
+     152                 :             : static void
+     153                 :          66 : valent_device_plugin_class_init (ValentDevicePluginClass *klass)
+     154                 :             : {
+     155                 :          66 :   klass->handle_packet = valent_device_plugin_real_handle_packet;
+     156                 :          66 :   klass->update_state = valent_device_plugin_real_update_state;
+     157                 :             : }
+     158                 :             : 
+     159                 :             : static void
+     160                 :         195 : valent_device_plugin_init (ValentDevicePlugin *self)
+     161                 :             : {
+     162                 :         195 : }
+     163                 :             : 
+     164                 :             : /**
+     165                 :             :  * valent_device_plugin_queue_packet:
+     166                 :             :  * @plugin: a `ValentDevicePlugin`
+     167                 :             :  * @packet: a KDE Connect packet
+     168                 :             :  *
+     169                 :             :  * Queue a KDE Connect packet to be sent to the device this plugin is bound to.
+     170                 :             :  *
+     171                 :             :  * For notification of success call [method@Valent.Extension.get_object] and
+     172                 :             :  * then [method@Valent.Device.send_packet].
+     173                 :             :  *
+     174                 :             :  * Since: 1.0
+     175                 :             :  */
+     176                 :             : void
+     177                 :         115 : valent_device_plugin_queue_packet (ValentDevicePlugin *plugin,
+     178                 :             :                                    JsonNode           *packet)
+     179                 :             : {
+     180                 :         115 :   ValentDevice *device = NULL;
+     181                 :         230 :   g_autoptr (GCancellable) destroy = NULL;
+     182                 :             : 
+     183         [ +  - ]:         115 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     184         [ -  + ]:         115 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     185                 :             : 
+     186         [ +  - ]:         115 :   if ((device = valent_extension_get_object (VALENT_EXTENSION (plugin))) == NULL)
+     187                 :             :     return;
+     188                 :             : 
+     189                 :         115 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (plugin));
+     190         [ +  - ]:         115 :   valent_device_send_packet (device,
+     191                 :             :                              packet,
+     192                 :             :                              destroy,
+     193                 :             :                              (GAsyncReadyCallback)valent_device_send_packet_cb,
+     194                 :             :                              NULL);
+     195                 :             : }
+     196                 :             : 
+     197                 :             : /**
+     198                 :             :  * valent_device_plugin_show_notification:
+     199                 :             :  * @plugin: a `ValentDevicePlugin`
+     200                 :             :  * @id: an id for the notification
+     201                 :             :  * @notification: a `GNotification`
+     202                 :             :  *
+     203                 :             :  * A convenience for showing a local notification.
+     204                 :             :  *
+     205                 :             :  * @id will be automatically prepended with the device ID and plugin module to
+     206                 :             :  * prevent conflicting with other devices and plugins.
+     207                 :             :  *
+     208                 :             :  * Call [method@Valent.DevicePlugin.hide_notification] to make the same
+     209                 :             :  * transformation on @id and withdraw the notification.
+     210                 :             :  *
+     211                 :             :  * Since: 1.0
+     212                 :             :  */
+     213                 :             : void
+     214                 :          38 : valent_device_plugin_show_notification (ValentDevicePlugin *plugin,
+     215                 :             :                                         const char         *id,
+     216                 :             :                                         GNotification      *notification)
+     217                 :             : {
+     218                 :          38 :   GApplication *application = g_application_get_default ();
+     219                 :          38 :   g_autoptr (ValentDevice) device = NULL;
+     220   [ -  -  -  + ]:          38 :   g_autoptr (PeasPluginInfo) plugin_info = NULL;
+     221   [ -  -  -  + ]:          38 :   g_autofree char *notification_id = NULL;
+     222                 :             : 
+     223         [ +  - ]:          38 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     224         [ -  + ]:          38 :   g_return_if_fail (id != NULL);
+     225   [ +  -  +  -  :          38 :   g_return_if_fail (G_IS_NOTIFICATION (notification));
+             -  +  -  - ]
+     226                 :             : 
+     227         [ -  + ]:          38 :   if G_UNLIKELY (application == NULL)
+     228                 :             :     return;
+     229                 :             : 
+     230                 :           0 :   g_object_get (plugin,
+     231                 :             :                 "object",      &device,
+     232                 :             :                 "plugin-info", &plugin_info,
+     233                 :             :                 NULL);
+     234                 :           0 :   notification_id = g_strdup_printf ("%s::%s::%s",
+     235                 :             :                                      valent_device_get_id (device),
+     236                 :             :                                      peas_plugin_info_get_module_name (plugin_info),
+     237                 :             :                                      id);
+     238                 :           0 :   g_application_send_notification (application, notification_id, notification);
+     239                 :             : }
+     240                 :             : 
+     241                 :             : /**
+     242                 :             :  * valent_device_plugin_hide_notification:
+     243                 :             :  * @plugin: a `ValentDevicePlugin`
+     244                 :             :  * @id: an id for the notification
+     245                 :             :  *
+     246                 :             :  * A convenience for withdrawing a notification.
+     247                 :             :  *
+     248                 :             :  * This method will withdraw a notification shown with
+     249                 :             :  * [method@Valent.DevicePlugin.show_notification].
+     250                 :             :  *
+     251                 :             :  * Since: 1.0
+     252                 :             :  */
+     253                 :             : void
+     254                 :          30 : valent_device_plugin_hide_notification (ValentDevicePlugin *plugin,
+     255                 :             :                                         const char         *id)
+     256                 :             : {
+     257                 :          30 :   GApplication *application = g_application_get_default ();
+     258                 :          30 :   g_autoptr (ValentDevice) device = NULL;
+     259   [ -  -  -  + ]:          30 :   g_autoptr (PeasPluginInfo) plugin_info = NULL;
+     260   [ -  -  -  + ]:          30 :   g_autofree char *notification_id = NULL;
+     261                 :             : 
+     262         [ +  - ]:          30 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     263         [ -  + ]:          30 :   g_return_if_fail (id != NULL);
+     264                 :             : 
+     265         [ -  + ]:          30 :   if G_UNLIKELY (application == NULL)
+     266                 :             :     return;
+     267                 :             : 
+     268                 :           0 :   g_object_get (plugin,
+     269                 :             :                 "object",      &device,
+     270                 :             :                 "plugin-info", &plugin_info,
+     271                 :             :                 NULL);
+     272                 :           0 :   notification_id = g_strdup_printf ("%s::%s::%s",
+     273                 :             :                                      valent_device_get_id (device),
+     274                 :             :                                      peas_plugin_info_get_module_name (plugin_info),
+     275                 :             :                                      id);
+     276                 :           0 :   g_application_withdraw_notification (application, notification_id);
+     277                 :             : }
+     278                 :             : 
+     279                 :             : /**
+     280                 :             :  * valent_device_plugin_handle_packet: (virtual handle_packet)
+     281                 :             :  * @plugin: a `ValentDevicePlugin`
+     282                 :             :  * @type: a KDE Connect packet type
+     283                 :             :  * @packet: a KDE Connect packet
+     284                 :             :  *
+     285                 :             :  * Handle a packet from the device the plugin is bound to.
+     286                 :             :  *
+     287                 :             :  * This is called when the device receives a packet type included in the
+     288                 :             :  * `X-DevicePluginIncoming` field of the `.plugin` file.
+     289                 :             :  *
+     290                 :             :  * This is optional for implementations which do not register any incoming
+     291                 :             :  * capabilities, such as plugins that do not provide packet-based functionality.
+     292                 :             :  *
+     293                 :             :  * Since: 1.0
+     294                 :             :  */
+     295                 :             : void
+     296                 :         127 : valent_device_plugin_handle_packet (ValentDevicePlugin *plugin,
+     297                 :             :                                     const char         *type,
+     298                 :             :                                     JsonNode           *packet)
+     299                 :             : {
+     300                 :         127 :   VALENT_ENTRY;
+     301                 :             : 
+     302         [ +  - ]:         127 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     303   [ +  -  -  + ]:         127 :   g_return_if_fail (type != NULL && *type != '\0');
+     304         [ -  + ]:         127 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     305                 :             : 
+     306                 :         127 :   VALENT_DEVICE_PLUGIN_GET_CLASS (plugin)->handle_packet (plugin, type, packet);
+     307                 :             : 
+     308                 :         127 :   VALENT_EXIT;
+     309                 :             : }
+     310                 :             : 
+     311                 :             : /**
+     312                 :             :  * valent_device_plugin_update_state: (virtual update_state)
+     313                 :             :  * @plugin: a `ValentDevicePlugin`
+     314                 :             :  * @state: a `ValentDeviceState`
+     315                 :             :  *
+     316                 :             :  * Update the plugin based on the new state of the device.
+     317                 :             :  *
+     318                 :             :  * This function is called when the connected or paired state of the device
+     319                 :             :  * changes. This may be used to configure actions, event handlers that may
+     320                 :             :  * trigger outgoing packets and exchange connect-time data with the device.
+     321                 :             :  *
+     322                 :             :  * This is optional for all implementations as plugins aren't required to be
+     323                 :             :  * dependent on the device state.
+     324                 :             :  *
+     325                 :             :  * Since: 1.0
+     326                 :             :  */
+     327                 :             : void
+     328                 :         584 : valent_device_plugin_update_state (ValentDevicePlugin *plugin,
+     329                 :             :                                    ValentDeviceState   state)
+     330                 :             : {
+     331                 :         584 :   VALENT_ENTRY;
+     332                 :             : 
+     333         [ +  - ]:         584 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     334                 :             : 
+     335                 :         584 :   VALENT_DEVICE_PLUGIN_GET_CLASS (plugin)->update_state (plugin, state);
+     336                 :             : 
+     337                 :         584 :   VALENT_EXIT;
+     338                 :             : }
+     339                 :             : 
+     340                 :             : static int
+     341                 :         443 : _g_menu_find_action (GMenuModel *menu,
+     342                 :             :                      const char *action)
+     343                 :             : {
+     344                 :         443 :   int i, n_items;
+     345                 :             : 
+     346   [ +  -  +  -  :         443 :   g_assert (G_IS_MENU_MODEL (menu));
+             +  -  -  + ]
+     347         [ -  + ]:         443 :   g_assert (action != NULL);
+     348                 :             : 
+     349                 :         443 :   n_items = g_menu_model_get_n_items (menu);
+     350                 :             : 
+     351         [ +  + ]:        1031 :   for (i = 0; i < n_items; i++)
+     352                 :             :     {
+     353                 :         288 :       g_autofree char *item_str = NULL;
+     354                 :             : 
+     355                 :         288 :       g_menu_model_get_item_attribute (menu, i, "action", "s", &item_str);
+     356                 :             : 
+     357         [ +  + ]:         288 :       if (g_strcmp0 (item_str, action) == 0)
+     358                 :         143 :         return i;
+     359                 :             :     }
+     360                 :             : 
+     361                 :             :   return -1;
+     362                 :             : }
+     363                 :             : 
+     364                 :             : /**
+     365                 :             :  * valent_device_plugin_set_menu_action:
+     366                 :             :  * @plugin: a `ValentDevicePlugin`
+     367                 :             :  * @action: a `GAction` name
+     368                 :             :  * @label: (nullable): a label for the action
+     369                 :             :  * @icon_name: (nullable): an icon for the action
+     370                 :             :  *
+     371                 :             :  * Set or remove a device menu action by [iface@Gio.Action] name.
+     372                 :             :  *
+     373                 :             :  * If @label and @icon are %NULL, @action will be removed from the menu.
+     374                 :             :  *
+     375                 :             :  * Since: 1.0
+     376                 :             :  */
+     377                 :             : void
+     378                 :         152 : valent_device_plugin_set_menu_action (ValentDevicePlugin *plugin,
+     379                 :             :                                       const char         *action,
+     380                 :             :                                       const char         *label,
+     381                 :             :                                       const char         *icon_name)
+     382                 :             : {
+     383                 :         304 :   g_autoptr (GMenuItem) item = NULL;
+     384                 :             : 
+     385         [ +  - ]:         152 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     386   [ +  -  -  + ]:         152 :   g_return_if_fail (action != NULL && *action != '\0');
+     387   [ +  -  +  -  :         152 :   g_return_if_fail ((label == NULL && icon_name == NULL) ||
+                   -  + ]
+     388                 :             :                     (label != NULL && *label != '\0'));
+     389                 :             : 
+     390         [ +  - ]:         152 :   if (label != NULL)
+     391                 :             :     {
+     392                 :         304 :       g_autoptr (GIcon) icon = NULL;
+     393                 :             : 
+     394         [ +  - ]:         152 :       if (icon_name != NULL)
+     395                 :         152 :         icon = g_themed_icon_new (icon_name);
+     396                 :             : 
+     397                 :         152 :       item = g_menu_item_new (label, action);
+     398                 :         152 :       g_menu_item_set_icon (item, icon);
+     399         [ +  - ]:         152 :       g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled");
+     400                 :             :     }
+     401                 :             : 
+     402         [ +  - ]:         152 :   valent_device_plugin_set_menu_item (plugin, action, item);
+     403                 :             : }
+     404                 :             : 
+     405                 :             : /**
+     406                 :             :  * valent_device_plugin_set_menu_item:
+     407                 :             :  * @plugin: a `ValentDevicePlugin`
+     408                 :             :  * @action: a `GAction` name
+     409                 :             :  * @item: (nullable): a `GMenuItem`
+     410                 :             :  *
+     411                 :             :  * Set or remove a device [class@Gio.MenuItem] by [iface@Gio.Action] name.
+     412                 :             :  *
+     413                 :             :  * If @item is %NULL, @action will be removed from the menu.
+     414                 :             :  *
+     415                 :             :  * Since: 1.0
+     416                 :             :  */
+     417                 :             : void
+     418                 :         445 : valent_device_plugin_set_menu_item (ValentDevicePlugin *plugin,
+     419                 :             :                                     const char         *action,
+     420                 :             :                                     GMenuItem          *item)
+     421                 :             : {
+     422                 :         445 :   ValentDevice *device = NULL;
+     423                 :         445 :   GMenuModel *menu;
+     424                 :         445 :   int index_ = -1;
+     425                 :             : 
+     426         [ +  - ]:         445 :   g_return_if_fail (VALENT_IS_DEVICE_PLUGIN (plugin));
+     427   [ +  -  -  + ]:         445 :   g_return_if_fail (action != NULL && *action != '\0');
+     428   [ +  +  +  -  :         445 :   g_return_if_fail (item == NULL || G_IS_MENU_ITEM (item));
+             -  +  -  - ]
+     429                 :             : 
+     430                 :             :   /* NOTE: this method may be called by plugins in their `dispose()` */
+     431         [ +  + ]:         445 :   if ((device = valent_extension_get_object (VALENT_EXTENSION (plugin))) == NULL)
+     432                 :             :     return;
+     433                 :             : 
+     434                 :         443 :   menu = valent_device_get_menu (device);
+     435                 :         443 :   index_ = _g_menu_find_action (menu, action);
+     436                 :             : 
+     437         [ +  + ]:         443 :   if (index_ > -1)
+     438                 :         143 :     g_menu_remove (G_MENU (menu), index_);
+     439                 :             : 
+     440         [ +  + ]:         443 :   if (item != NULL)
+     441                 :             :     {
+     442         [ -  + ]:         153 :       if (index_ > -1)
+     443                 :           0 :         g_menu_insert_item (G_MENU (menu), index_, item);
+     444                 :             :       else
+     445                 :         153 :         g_menu_append_item (G_MENU (menu), item);
+     446                 :             :     }
+     447                 :             : }
+     448                 :             : 
+     449                 :             : /**
+     450                 :             :  * valent_notification_set_device_action:
+     451                 :             :  * @notification: a `GNotification`
+     452                 :             :  * @device: a `ValentDevice`
+     453                 :             :  * @action: the device action name
+     454                 :             :  * @target: (nullable): the action target
+     455                 :             :  *
+     456                 :             :  * Set the default action for @notification. @action is wrapped in the special
+     457                 :             :  * `device` action for @device, which allows it to be activated from the `app`
+     458                 :             :  * action scope.
+     459                 :             :  *
+     460                 :             :  * Since: 1.0
+     461                 :             :  */
+     462                 :             : void
+     463                 :           1 : valent_notification_set_device_action (GNotification *notification,
+     464                 :             :                                        ValentDevice  *device,
+     465                 :             :                                        const char    *action,
+     466                 :             :                                        GVariant      *target)
+     467                 :             : {
+     468                 :           1 :   GVariantBuilder builder;
+     469                 :             : 
+     470   [ +  -  +  -  :           1 :   g_return_if_fail (G_IS_NOTIFICATION (notification));
+             -  +  -  - ]
+     471         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_DEVICE (device));
+     472   [ +  -  -  + ]:           1 :   g_return_if_fail (action != NULL && *action != '\0');
+     473                 :             : 
+     474                 :           1 :   g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
+     475                 :             : 
+     476         [ +  - ]:           1 :   if (target != NULL)
+     477                 :           1 :     g_variant_builder_add (&builder, "v", target);
+     478                 :             : 
+     479                 :           1 :   g_notification_set_default_action_and_target (notification,
+     480                 :             :                                                 "app.device",
+     481                 :             :                                                 "(ssav)",
+     482                 :             :                                                 valent_device_get_id (device),
+     483                 :             :                                                 action,
+     484                 :             :                                                 &builder);
+     485                 :             : }
+     486                 :             : 
+     487                 :             : /**
+     488                 :             :  * valent_notification_add_device_button:
+     489                 :             :  * @notification: a `GNotification`
+     490                 :             :  * @device: a `ValentDevice`
+     491                 :             :  * @label: the button label
+     492                 :             :  * @action: the device action name
+     493                 :             :  * @target: (nullable): the action target
+     494                 :             :  *
+     495                 :             :  * Add an action button to @notification. @action is wrapped in the special
+     496                 :             :  * `device` action for @device, which allows it to be activated from the `app`
+     497                 :             :  * action scope.
+     498                 :             :  *
+     499                 :             :  * Since: 1.0
+     500                 :             :  */
+     501                 :             : void
+     502                 :          28 : valent_notification_add_device_button (GNotification *notification,
+     503                 :             :                                        ValentDevice  *device,
+     504                 :             :                                        const char    *label,
+     505                 :             :                                        const char    *action,
+     506                 :             :                                        GVariant      *target)
+     507                 :             : {
+     508                 :          28 :   GVariantBuilder builder;
+     509                 :             : 
+     510   [ +  -  +  -  :          28 :   g_return_if_fail (G_IS_NOTIFICATION (notification));
+             -  +  -  - ]
+     511         [ -  + ]:          28 :   g_return_if_fail (VALENT_IS_DEVICE (device));
+     512   [ +  -  -  + ]:          28 :   g_return_if_fail (label != NULL && *label != '\0');
+     513   [ +  -  -  + ]:          28 :   g_return_if_fail (action != NULL && *action != '\0');
+     514                 :             : 
+     515                 :          28 :   g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
+     516                 :             : 
+     517         [ +  + ]:          28 :   if (target != NULL)
+     518                 :          24 :     g_variant_builder_add (&builder, "v", target);
+     519                 :             : 
+     520                 :          28 :   g_notification_add_button_with_target (notification,
+     521                 :             :                                          label,
+     522                 :             :                                          "app.device",
+     523                 :             :                                          "(ssav)",
+     524                 :             :                                          valent_device_get_id (device),
+     525                 :             :                                          action,
+     526                 :             :                                          &builder);
+     527                 :             : }
+     528                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-plugin.h.func-c.html b/coverage/src/libvalent/device/valent-device-plugin.h.func-c.html new file mode 100644 index 00000000000..f31696ea83d --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PLUGIN1792
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-plugin.h.func.html b/coverage/src/libvalent/device/valent-device-plugin.h.func.html new file mode 100644 index 00000000000..2add1d0a1ec --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PLUGIN1792
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-plugin.h.gcov.html b/coverage/src/libvalent/device/valent-device-plugin.h.gcov.html new file mode 100644 index 00000000000..6b7dc1cf278 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-plugin.h.gcov.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : 
+      12                 :             : #include "../core/valent-extension.h"
+      13                 :             : #include "valent-device.h"
+      14                 :             : 
+      15                 :             : G_BEGIN_DECLS
+      16                 :             : 
+      17                 :             : #define VALENT_TYPE_DEVICE_PLUGIN (valent_device_plugin_get_type ())
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20   [ +  -  +  -  :        2519 : G_DECLARE_DERIVABLE_TYPE (ValentDevicePlugin, valent_device_plugin, VALENT, DEVICE_PLUGIN, ValentObject)
+                   +  - ]
+      21                 :             : 
+      22                 :             : struct _ValentDevicePluginClass
+      23                 :             : {
+      24                 :             :   ValentExtensionClass   parent_class;
+      25                 :             : 
+      26                 :             :   /* virtual functions */
+      27                 :             :   void                   (*handle_packet) (ValentDevicePlugin *plugin,
+      28                 :             :                                            const char         *type,
+      29                 :             :                                            JsonNode           *packet);
+      30                 :             :   void                   (*update_state)  (ValentDevicePlugin *plugin,
+      31                 :             :                                            ValentDeviceState   state);
+      32                 :             : 
+      33                 :             :   /*< private >*/
+      34                 :             :   gpointer            padding[8];
+      35                 :             : };
+      36                 :             : 
+      37                 :             : VALENT_AVAILABLE_IN_1_0
+      38                 :             : void   valent_device_plugin_handle_packet     (ValentDevicePlugin *plugin,
+      39                 :             :                                                const char         *type,
+      40                 :             :                                                JsonNode           *packet);
+      41                 :             : VALENT_AVAILABLE_IN_1_0
+      42                 :             : void   valent_device_plugin_queue_packet      (ValentDevicePlugin *plugin,
+      43                 :             :                                                JsonNode           *packet);
+      44                 :             : VALENT_AVAILABLE_IN_1_0
+      45                 :             : void   valent_device_plugin_update_state      (ValentDevicePlugin *plugin,
+      46                 :             :                                                ValentDeviceState   state);
+      47                 :             : 
+      48                 :             : /* TODO: move to extension? */
+      49                 :             : VALENT_AVAILABLE_IN_1_0
+      50                 :             : void   valent_device_plugin_show_notification (ValentDevicePlugin *plugin,
+      51                 :             :                                                const char         *id,
+      52                 :             :                                                GNotification      *notification);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : void   valent_device_plugin_hide_notification (ValentDevicePlugin *plugin,
+      55                 :             :                                                const char         *id);
+      56                 :             : 
+      57                 :             : /* TODO: GMenuModel XML */
+      58                 :             : VALENT_AVAILABLE_IN_1_0
+      59                 :             : void   valent_device_plugin_set_menu_action   (ValentDevicePlugin *plugin,
+      60                 :             :                                                const char         *action,
+      61                 :             :                                                const char         *label,
+      62                 :             :                                                const char         *icon_name);
+      63                 :             : VALENT_AVAILABLE_IN_1_0
+      64                 :             : void   valent_device_plugin_set_menu_item     (ValentDevicePlugin *plugin,
+      65                 :             :                                                const char         *action,
+      66                 :             :                                                GMenuItem          *item);
+      67                 :             : 
+      68                 :             : /* Miscellaneous Helpers */
+      69                 :             : VALENT_AVAILABLE_IN_1_0
+      70                 :             : void   valent_notification_set_device_action  (GNotification      *notification,
+      71                 :             :                                                ValentDevice       *device,
+      72                 :             :                                                const char         *action,
+      73                 :             :                                                GVariant           *target);
+      74                 :             : VALENT_AVAILABLE_IN_1_0
+      75                 :             : void   valent_notification_add_device_button  (GNotification      *notification,
+      76                 :             :                                                ValentDevice       *device,
+      77                 :             :                                                const char         *label,
+      78                 :             :                                                const char         *action,
+      79                 :             :                                                GVariant           *target);
+      80                 :             : 
+      81                 :             : G_END_DECLS
+      82                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-transfer.c.func-c.html b/coverage/src/libvalent/device/valent-device-transfer.c.func-c.html new file mode 100644 index 00000000000..1bcfa81d99d --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-transfer.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-transfer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-transfer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.8 %197175
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.1 %11456
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_transfer_ref_device4
valent_device_transfer_class_init6
valent_device_transfer_ref_file10
valent_device_transfer_get_property11
valent_device_transfer_update_packet12
valent_device_transfer_finalize18
valent_device_transfer_execute21
valent_device_transfer_execute_task21
valent_device_transfer_init21
valent_device_transfer_new21
valent_device_transfer_ref_packet22
valent_device_transfer_set_property63
valent_device_transfer_get_type260
valent_device_transfer_class_intern_init6
valent_device_transfer_get_type_once86
valent_device_transfer_get_type168
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-transfer.c.func.html b/coverage/src/libvalent/device/valent-device-transfer.c.func.html new file mode 100644 index 00000000000..ddcc6d38016 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-transfer.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-transfer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-transfer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.8 %197175
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.1 %11456
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_transfer_class_init6
valent_device_transfer_execute21
valent_device_transfer_execute_task21
valent_device_transfer_finalize18
valent_device_transfer_get_property11
valent_device_transfer_get_type260
valent_device_transfer_class_intern_init6
valent_device_transfer_get_type168
valent_device_transfer_get_type_once86
valent_device_transfer_init21
valent_device_transfer_new21
valent_device_transfer_ref_device4
valent_device_transfer_ref_file10
valent_device_transfer_ref_packet22
valent_device_transfer_set_property63
valent_device_transfer_update_packet12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-transfer.c.gcov.html b/coverage/src/libvalent/device/valent-device-transfer.c.gcov.html new file mode 100644 index 00000000000..46823da23eb --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-transfer.c.gcov.html @@ -0,0 +1,643 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-transfer.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-transfer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.8 %197175
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:49.1 %11456
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device-transfer"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-channel.h"
+      13                 :             : #include "valent-device.h"
+      14                 :             : #include "valent-device-transfer.h"
+      15                 :             : #include "valent-packet.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : /**
+      19                 :             :  * ValentDeviceTransfer:
+      20                 :             :  *
+      21                 :             :  * A class for device file transfers.
+      22                 :             :  *
+      23                 :             :  * `ValentDeviceTransfer` is an implementation of [class@Valent.Transfer] for the
+      24                 :             :  * common case of transferring a file between devices.
+      25                 :             :  *
+      26                 :             :  * The direction of the transfer is automatically detected from the content of
+      27                 :             :  * [property@Valent.DeviceTransfer:packet]. If the KDE Connect packet holds
+      28                 :             :  * payload information the transfer is assumed to be a download, otherwise it is
+      29                 :             :  * assumed to be an upload.
+      30                 :             :  *
+      31                 :             :  * Since: 1.0
+      32                 :             :  */
+      33                 :             : 
+      34                 :             : struct _ValentDeviceTransfer
+      35                 :             : {
+      36                 :             :   ValentObject  parent_instance;
+      37                 :             : 
+      38                 :             :   ValentDevice *device;
+      39                 :             :   GFile        *file;
+      40                 :             :   JsonNode     *packet;
+      41                 :             : };
+      42                 :             : 
+      43   [ +  +  +  - ]:         260 : G_DEFINE_FINAL_TYPE (ValentDeviceTransfer, valent_device_transfer, VALENT_TYPE_TRANSFER)
+      44                 :             : 
+      45                 :             : 
+      46                 :             : enum {
+      47                 :             :   PROP_0,
+      48                 :             :   PROP_DEVICE,
+      49                 :             :   PROP_FILE,
+      50                 :             :   PROP_PACKET,
+      51                 :             :   N_PROPERTIES
+      52                 :             : };
+      53                 :             : 
+      54                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      55                 :             : 
+      56                 :             : 
+      57                 :             : static inline void
+      58                 :          12 : valent_device_transfer_update_packet (JsonNode  *packet,
+      59                 :             :                                       GFileInfo *info)
+      60                 :             : {
+      61                 :          12 :   JsonObject *body;
+      62                 :          12 :   uint64_t btime_s, mtime_s;
+      63                 :          12 :   uint32_t btime_us, mtime_us;
+      64                 :          12 :   uint64_t creation_time;
+      65                 :          12 :   uint64_t last_modified;
+      66                 :          12 :   goffset payload_size;
+      67                 :             : 
+      68         [ +  - ]:          12 :   g_assert (VALENT_IS_PACKET (packet));
+      69                 :             : 
+      70                 :          12 :   btime_s = g_file_info_get_attribute_uint64 (info, "time::created");
+      71                 :          12 :   btime_us = g_file_info_get_attribute_uint32 (info, "time::created-usec");
+      72                 :          12 :   creation_time = (btime_s * 1000) + floor (btime_us / 1000);
+      73                 :             : 
+      74                 :          12 :   mtime_s = g_file_info_get_attribute_uint64 (info, "time::created");
+      75                 :          12 :   mtime_us = g_file_info_get_attribute_uint32 (info, "time::created-usec");
+      76                 :          12 :   last_modified = (mtime_s * 1000) + floor (mtime_us / 1000);
+      77                 :             : 
+      78                 :          12 :   payload_size = g_file_info_get_size (info);
+      79                 :             : 
+      80                 :          12 :   body = valent_packet_get_body (packet);
+      81                 :          12 :   json_object_set_int_member (body, "creationTime", creation_time);
+      82                 :          12 :   json_object_set_int_member (body, "lastModified", last_modified);
+      83                 :          12 :   valent_packet_set_payload_size (packet, payload_size);
+      84                 :          12 : }
+      85                 :             : 
+      86                 :             : /*
+      87                 :             :  * ValentDeviceTransfer
+      88                 :             :  */
+      89                 :             : static void
+      90                 :          21 : valent_device_transfer_execute_task (GTask        *task,
+      91                 :             :                                      gpointer      source_object,
+      92                 :             :                                      gpointer      task_data,
+      93                 :             :                                      GCancellable *cancellable)
+      94                 :             : {
+      95                 :          21 :   ValentDeviceTransfer *self = VALENT_DEVICE_TRANSFER (source_object);
+      96                 :          21 :   g_autoptr (ValentChannel) channel = NULL;
+      97         [ -  - ]:          21 :   g_autoptr (GFile) file = NULL;
+      98   [ +  -  -  - ]:          21 :   g_autoptr (JsonNode) packet = NULL;
+      99   [ +  -  -  - ]:          21 :   g_autoptr (GIOStream) stream = NULL;
+     100         [ -  - ]:          21 :   g_autoptr (GInputStream) source = NULL;
+     101         [ +  - ]:          21 :   g_autoptr (GOutputStream) target = NULL;
+     102                 :          21 :   gboolean is_download = FALSE;
+     103                 :          21 :   gssize transferred;
+     104                 :          21 :   int64_t last_modified = 0;
+     105                 :          21 :   int64_t creation_time = 0;
+     106                 :          21 :   goffset payload_size;
+     107                 :          21 :   GError *error = NULL;
+     108                 :             : 
+     109         [ +  - ]:          21 :   if (g_task_return_error_if_cancelled (task))
+     110                 :             :     return;
+     111                 :             : 
+     112                 :          21 :   valent_object_lock (VALENT_OBJECT (self));
+     113                 :          21 :   channel = valent_device_ref_channel (self->device);
+     114                 :          21 :   file = g_object_ref (self->file);
+     115                 :          21 :   packet = json_node_ref (self->packet);
+     116                 :          21 :   valent_object_unlock (VALENT_OBJECT (self));
+     117                 :             : 
+     118         [ -  + ]:          21 :   if (channel == NULL)
+     119                 :             :     {
+     120                 :           0 :       g_task_return_new_error (task,
+     121                 :             :                                G_IO_ERROR,
+     122                 :             :                                G_IO_ERROR_NOT_CONNECTED,
+     123                 :             :                                "Device is disconnected");
+     124                 :           0 :       return;
+     125                 :             :     }
+     126                 :             : 
+     127                 :             :   /* Determine if this is a download or an upload. This should be reliable,
+     128                 :             :    * given that the channel service must set the `payloadTransferInfo` field in
+     129                 :             :    * its valent_channel_upload() implementation. */
+     130                 :          21 :   is_download = valent_packet_has_payload (packet);
+     131                 :             : 
+     132         [ +  + ]:          21 :   if (is_download)
+     133                 :             :     {
+     134                 :           9 :       target = (GOutputStream *)g_file_replace (file,
+     135                 :             :                                                 NULL,
+     136                 :             :                                                 FALSE,
+     137                 :             :                                                 G_FILE_CREATE_REPLACE_DESTINATION,
+     138                 :             :                                                 cancellable,
+     139                 :             :                                                 &error);
+     140                 :             : 
+     141         [ -  + ]:           9 :       if (target == NULL)
+     142                 :           0 :         return g_task_return_error (task, error);
+     143                 :             : 
+     144                 :           9 :       stream = valent_channel_download (channel, packet, cancellable, &error);
+     145                 :             : 
+     146         [ -  + ]:           9 :       if (stream == NULL)
+     147                 :           0 :         return g_task_return_error (task, error);
+     148                 :             : 
+     149                 :           9 :       source = g_object_ref (g_io_stream_get_input_stream (stream));
+     150                 :             :     }
+     151                 :             :   else
+     152                 :             :     {
+     153         [ -  - ]:          12 :       g_autoptr (GFileInfo) info = NULL;
+     154                 :             : 
+     155                 :          12 :       info = g_file_query_info (file,
+     156                 :             :                                 G_FILE_ATTRIBUTE_TIME_CREATED","
+     157                 :             :                                 G_FILE_ATTRIBUTE_TIME_CREATED_USEC","
+     158                 :             :                                 G_FILE_ATTRIBUTE_TIME_MODIFIED","
+     159                 :             :                                 G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC","
+     160                 :             :                                 G_FILE_ATTRIBUTE_STANDARD_SIZE,
+     161                 :             :                                 G_FILE_QUERY_INFO_NONE,
+     162                 :             :                                 cancellable,
+     163                 :             :                                 &error);
+     164                 :             : 
+     165         [ -  + ]:          12 :       if (info == NULL)
+     166                 :           0 :         return g_task_return_error (task, error);
+     167                 :             : 
+     168                 :          12 :       source = (GInputStream *)g_file_read (file, cancellable, &error);
+     169                 :             : 
+     170         [ -  + ]:          12 :       if (source == NULL)
+     171                 :           0 :         return g_task_return_error (task, error);
+     172                 :             : 
+     173                 :          12 :       valent_device_transfer_update_packet (packet, info);
+     174                 :          12 :       stream = valent_channel_upload (channel, packet, cancellable, &error);
+     175                 :             : 
+     176         [ -  + ]:          12 :       if (stream == NULL)
+     177                 :           0 :         return g_task_return_error (task, error);
+     178                 :             : 
+     179                 :          12 :       target = g_object_ref (g_io_stream_get_output_stream (stream));
+     180                 :             :     }
+     181                 :             : 
+     182                 :             :   /* Transfer the payload */
+     183                 :          21 :   transferred = g_output_stream_splice (target,
+     184                 :             :                                         source,
+     185                 :             :                                         (G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
+     186                 :             :                                          G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET),
+     187                 :             :                                         cancellable,
+     188                 :             :                                         &error);
+     189                 :             : 
+     190         [ -  + ]:          21 :   if (error != NULL)
+     191                 :             :     {
+     192         [ #  # ]:           0 :       if (is_download)
+     193                 :           0 :         g_file_delete (file, NULL, NULL);
+     194                 :             : 
+     195                 :           0 :       return g_task_return_error (task, error);
+     196                 :             :     }
+     197                 :             : 
+     198                 :             :   /* If possible, confirm the transferred size with the payload size */
+     199                 :          21 :   payload_size = valent_packet_get_payload_size (packet);
+     200                 :             : 
+     201                 :          21 :   if G_UNLIKELY (payload_size > G_MAXSSIZE)
+     202                 :             :     {
+     203                 :             :       g_warning ("%s(): Payload size greater than %"G_GSSIZE_FORMAT";"
+     204                 :             :                  "unable to confirm transfer completion",
+     205                 :             :                  G_STRFUNC, G_MAXSSIZE);
+     206                 :             :     }
+     207         [ -  + ]:          21 :   else if (transferred < payload_size)
+     208                 :             :     {
+     209                 :           0 :       g_debug ("%s(): Transfer incomplete (%"G_GSSIZE_FORMAT"/%"G_GOFFSET_FORMAT" bytes)",
+     210                 :             :                G_STRFUNC, transferred, payload_size);
+     211                 :             : 
+     212         [ #  # ]:           0 :       if (is_download)
+     213                 :           0 :         g_file_delete (file, NULL, NULL);
+     214                 :             : 
+     215                 :           0 :       g_task_return_new_error (task,
+     216                 :             :                                G_IO_ERROR,
+     217                 :             :                                G_IO_ERROR_PARTIAL_INPUT,
+     218                 :             :                                "Transfer incomplete");
+     219                 :           0 :       return;
+     220                 :             :     }
+     221                 :             : 
+     222                 :             :   /* Attempt to set file attributes for downloaded files. */
+     223         [ +  + ]:          21 :   if (is_download)
+     224                 :             :     {
+     225                 :             :       /* NOTE: this is not supported by the Linux kernel... */
+     226         [ +  + ]:           9 :       if (valent_packet_get_int (packet, "creationTime", &creation_time))
+     227                 :             :         {
+     228                 :           1 :           gboolean success;
+     229                 :           1 :           g_autoptr (GError) warn = NULL;
+     230                 :             : 
+     231                 :           2 :           success = g_file_set_attribute_uint64 (file,
+     232                 :             :                                                  G_FILE_ATTRIBUTE_TIME_CREATED,
+     233                 :           1 :                                                  floor (creation_time / 1000),
+     234                 :             :                                                  G_FILE_QUERY_INFO_NONE,
+     235                 :             :                                                  cancellable,
+     236                 :             :                                                  &warn);
+     237                 :             : 
+     238         [ -  + ]:           1 :           if (success)
+     239                 :             :             {
+     240                 :           0 :               g_file_set_attribute_uint32 (file,
+     241                 :             :                                            G_FILE_ATTRIBUTE_TIME_CREATED_USEC,
+     242                 :           0 :                                            (creation_time % 1000) * 1000,
+     243                 :             :                                            G_FILE_QUERY_INFO_NONE,
+     244                 :             :                                            cancellable,
+     245                 :             :                                            &warn);
+     246                 :             :             }
+     247                 :             : 
+     248         [ +  - ]:           1 :           if (warn != NULL)
+     249                 :           1 :             g_debug ("%s: %s", G_OBJECT_TYPE_NAME (self), warn->message);
+     250                 :             :         }
+     251                 :             : 
+     252         [ +  + ]:           9 :       if (valent_packet_get_int (packet, "lastModified", &last_modified))
+     253                 :             :         {
+     254                 :           1 :           gboolean success;
+     255                 :           1 :           g_autoptr (GError) warn = NULL;
+     256                 :             : 
+     257                 :           2 :           success = g_file_set_attribute_uint64 (file,
+     258                 :             :                                                  G_FILE_ATTRIBUTE_TIME_MODIFIED,
+     259                 :           1 :                                                  floor (last_modified / 1000),
+     260                 :             :                                                  G_FILE_QUERY_INFO_NONE,
+     261                 :             :                                                  cancellable,
+     262                 :             :                                                  &warn);
+     263                 :             : 
+     264         [ +  - ]:           1 :           if (success)
+     265                 :             :             {
+     266                 :           1 :               g_file_set_attribute_uint32 (file,
+     267                 :             :                                            G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC,
+     268                 :           1 :                                            (last_modified % 1000) * 1000,
+     269                 :             :                                            G_FILE_QUERY_INFO_NONE,
+     270                 :             :                                            cancellable,
+     271                 :             :                                            &warn);
+     272                 :             :             }
+     273                 :             : 
+     274         [ -  + ]:           1 :           if (warn != NULL)
+     275                 :           0 :             g_debug ("%s: %s", G_OBJECT_TYPE_NAME (self), warn->message);
+     276                 :             :         }
+     277                 :             :     }
+     278                 :             : 
+     279         [ +  - ]:          21 :   g_task_return_boolean (task, TRUE);
+     280                 :             : }
+     281                 :             : 
+     282                 :             : static void
+     283                 :          21 : valent_device_transfer_execute (ValentTransfer      *transfer,
+     284                 :             :                                 GCancellable        *cancellable,
+     285                 :             :                                 GAsyncReadyCallback  callback,
+     286                 :             :                                 gpointer             user_data)
+     287                 :             : {
+     288                 :          42 :   g_autoptr (GTask) task = NULL;
+     289                 :             : 
+     290                 :          21 :   VALENT_ENTRY;
+     291                 :             : 
+     292         [ +  - ]:          21 :   g_assert (VALENT_IS_DEVICE_TRANSFER (transfer));
+     293   [ +  -  +  -  :          21 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     294                 :             : 
+     295                 :          21 :   task = g_task_new (transfer, cancellable, callback, user_data);
+     296         [ +  - ]:          21 :   g_task_set_source_tag (task, valent_device_transfer_execute);
+     297                 :          21 :   g_task_run_in_thread (task, valent_device_transfer_execute_task);
+     298                 :             : 
+     299         [ +  - ]:          21 :   VALENT_EXIT;
+     300                 :             : }
+     301                 :             : 
+     302                 :             : /*
+     303                 :             :  * GObject
+     304                 :             :  */
+     305                 :             : static void
+     306                 :          18 : valent_device_transfer_finalize (GObject *object)
+     307                 :             : {
+     308                 :          18 :   ValentDeviceTransfer *self = VALENT_DEVICE_TRANSFER (object);
+     309                 :             : 
+     310                 :          18 :   valent_object_lock (VALENT_OBJECT (self));
+     311         [ +  - ]:          18 :   g_clear_object (&self->device);
+     312         [ +  - ]:          18 :   g_clear_object (&self->file);
+     313         [ +  - ]:          18 :   g_clear_pointer (&self->packet, json_node_unref);
+     314                 :          18 :   valent_object_unlock (VALENT_OBJECT (self));
+     315                 :             : 
+     316                 :          18 :   G_OBJECT_CLASS (valent_device_transfer_parent_class)->finalize (object);
+     317                 :          18 : }
+     318                 :             : 
+     319                 :             : static void
+     320                 :          11 : valent_device_transfer_get_property (GObject    *object,
+     321                 :             :                                      guint       prop_id,
+     322                 :             :                                      GValue     *value,
+     323                 :             :                                      GParamSpec *pspec)
+     324                 :             : {
+     325                 :          11 :   ValentDeviceTransfer *self = VALENT_DEVICE_TRANSFER (object);
+     326                 :             : 
+     327   [ +  +  +  - ]:          11 :   switch (prop_id)
+     328                 :             :     {
+     329                 :           4 :     case PROP_DEVICE:
+     330                 :           4 :       g_value_take_object (value, valent_device_transfer_ref_device (self));
+     331                 :           4 :       break;
+     332                 :             : 
+     333                 :           5 :     case PROP_FILE:
+     334                 :           5 :       g_value_take_object (value, valent_device_transfer_ref_file (self));
+     335                 :           5 :       break;
+     336                 :             : 
+     337                 :           2 :     case PROP_PACKET:
+     338                 :           2 :       g_value_take_boxed (value, valent_device_transfer_ref_packet (self));
+     339                 :           2 :       break;
+     340                 :             : 
+     341                 :           0 :     default:
+     342                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     343                 :             :     }
+     344                 :          11 : }
+     345                 :             : 
+     346                 :             : static void
+     347                 :          63 : valent_device_transfer_set_property (GObject      *object,
+     348                 :             :                                      guint         prop_id,
+     349                 :             :                                      const GValue *value,
+     350                 :             :                                      GParamSpec   *pspec)
+     351                 :             : {
+     352                 :          63 :   ValentDeviceTransfer *self = VALENT_DEVICE_TRANSFER (object);
+     353                 :             : 
+     354   [ +  +  +  - ]:          63 :   switch (prop_id)
+     355                 :             :     {
+     356                 :             :     case PROP_DEVICE:
+     357                 :          21 :       valent_object_lock (VALENT_OBJECT (self));
+     358                 :          21 :       self->device = g_value_dup_object (value);
+     359                 :          21 :       valent_object_unlock (VALENT_OBJECT (self));
+     360                 :          21 :       break;
+     361                 :             : 
+     362                 :             :     case PROP_FILE:
+     363                 :          21 :       valent_object_lock (VALENT_OBJECT (self));
+     364                 :          21 :       self->file = g_value_dup_object (value);
+     365                 :          21 :       valent_object_unlock (VALENT_OBJECT (self));
+     366                 :          21 :       break;
+     367                 :             : 
+     368                 :             :     case PROP_PACKET:
+     369                 :          21 :       valent_object_lock (VALENT_OBJECT (self));
+     370                 :          21 :       self->packet = g_value_dup_boxed (value);
+     371                 :          21 :       valent_object_unlock (VALENT_OBJECT (self));
+     372                 :          21 :       break;
+     373                 :             : 
+     374                 :           0 :     default:
+     375                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     376                 :             :     }
+     377                 :          63 : }
+     378                 :             : 
+     379                 :             : static void
+     380                 :           6 : valent_device_transfer_class_init (ValentDeviceTransferClass *klass)
+     381                 :             : {
+     382                 :           6 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     383                 :           6 :   ValentTransferClass *transfer_class = VALENT_TRANSFER_CLASS (klass);
+     384                 :             : 
+     385                 :           6 :   object_class->finalize = valent_device_transfer_finalize;
+     386                 :           6 :   object_class->get_property = valent_device_transfer_get_property;
+     387                 :           6 :   object_class->set_property = valent_device_transfer_set_property;
+     388                 :             : 
+     389                 :           6 :   transfer_class->execute = valent_device_transfer_execute;
+     390                 :             : 
+     391                 :             :   /**
+     392                 :             :    * ValentDeviceTransfer:device: (getter ref_device)
+     393                 :             :    *
+     394                 :             :    * The [class@Valent.Device] this transfer is for.
+     395                 :             :    *
+     396                 :             :    * Since: 1.0
+     397                 :             :    */
+     398                 :          12 :   properties [PROP_DEVICE] =
+     399                 :           6 :     g_param_spec_object ("device", NULL, NULL,
+     400                 :             :                          VALENT_TYPE_DEVICE,
+     401                 :             :                          (G_PARAM_READWRITE |
+     402                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     403                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     404                 :             :                           G_PARAM_STATIC_STRINGS));
+     405                 :             : 
+     406                 :             :   /**
+     407                 :             :    * ValentDeviceTransfer:file: (getter ref_file)
+     408                 :             :    *
+     409                 :             :    * The local [iface@Gio.File].
+     410                 :             :    *
+     411                 :             :    * If this a download, then this is the destination. If it's upload, this is
+     412                 :             :    * the source.
+     413                 :             :    *
+     414                 :             :    * Since: 1.0
+     415                 :             :    */
+     416                 :          12 :   properties [PROP_FILE] =
+     417                 :           6 :     g_param_spec_object ("file", NULL, NULL,
+     418                 :             :                          G_TYPE_FILE,
+     419                 :             :                          (G_PARAM_READWRITE |
+     420                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     421                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     422                 :             :                           G_PARAM_STATIC_STRINGS));
+     423                 :             : 
+     424                 :             :   /**
+     425                 :             :    * ValentDeviceTransfer:packet: (getter ref_packet)
+     426                 :             :    *
+     427                 :             :    * The KDE Connect packet describing the payload.
+     428                 :             :    *
+     429                 :             :    * Since: 1.0
+     430                 :             :    */
+     431                 :          12 :   properties [PROP_PACKET] =
+     432                 :           6 :     g_param_spec_boxed ("packet", NULL, NULL,
+     433                 :             :                         JSON_TYPE_NODE,
+     434                 :             :                         (G_PARAM_READWRITE |
+     435                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     436                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     437                 :             :                          G_PARAM_STATIC_STRINGS));
+     438                 :             : 
+     439                 :           6 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     440                 :           6 : }
+     441                 :             : 
+     442                 :             : static void
+     443                 :          21 : valent_device_transfer_init (ValentDeviceTransfer *self)
+     444                 :             : {
+     445                 :          21 : }
+     446                 :             : 
+     447                 :             : /**
+     448                 :             :  * valent_device_transfer_new:
+     449                 :             :  * @device: a `ValentDevice`
+     450                 :             :  * @packet: a KDE Connect packet
+     451                 :             :  * @file: a `GFile`
+     452                 :             :  *
+     453                 :             :  * A convenience for creating a simple file transfer.
+     454                 :             :  *
+     455                 :             :  * Returns: (transfer full) (nullable): a `ValentDeviceTransfer`
+     456                 :             :  *
+     457                 :             :  * Since: 1.0
+     458                 :             :  */
+     459                 :             : ValentTransfer *
+     460                 :          21 : valent_device_transfer_new (ValentDevice *device,
+     461                 :             :                             JsonNode     *packet,
+     462                 :             :                             GFile        *file)
+     463                 :             : {
+     464         [ +  - ]:          21 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+     465         [ -  + ]:          21 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), NULL);
+     466   [ +  -  +  -  :          21 :   g_return_val_if_fail (G_IS_FILE (file), NULL);
+             +  -  -  + ]
+     467                 :             : 
+     468                 :          21 :   return g_object_new (VALENT_TYPE_DEVICE_TRANSFER,
+     469                 :             :                        "device", device,
+     470                 :             :                        "packet", packet,
+     471                 :             :                        "file",   file,
+     472                 :             :                        NULL);
+     473                 :             : }
+     474                 :             : 
+     475                 :             : /**
+     476                 :             :  * valent_device_transfer_ref_device: (get-property device)
+     477                 :             :  * @transfer: a `ValentDeviceTransfer`
+     478                 :             :  *
+     479                 :             :  * Get the [class@Valent.Device].
+     480                 :             :  *
+     481                 :             :  * Returns: (transfer full) (nullable): a `ValentDevice`
+     482                 :             :  *
+     483                 :             :  * Since: 1.0
+     484                 :             :  */
+     485                 :             : ValentDevice *
+     486                 :           4 : valent_device_transfer_ref_device (ValentDeviceTransfer *transfer)
+     487                 :             : {
+     488                 :           8 :   g_autoptr (ValentDevice) ret = NULL;
+     489                 :             : 
+     490         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_DEVICE_TRANSFER (transfer), NULL);
+     491                 :             : 
+     492                 :           4 :   valent_object_lock (VALENT_OBJECT (transfer));
+     493         [ +  - ]:           4 :   if (transfer->device != NULL)
+     494                 :           4 :     ret = g_object_ref (transfer->device);
+     495                 :           4 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     496                 :             : 
+     497                 :           4 :   return g_steal_pointer (&ret);
+     498                 :             : }
+     499                 :             : 
+     500                 :             : /**
+     501                 :             :  * valent_device_transfer_ref_file: (get-property file)
+     502                 :             :  * @transfer: a `ValentDeviceTransfer`
+     503                 :             :  *
+     504                 :             :  * Get the local [iface@Gio.File].
+     505                 :             :  *
+     506                 :             :  * Returns: (transfer full) (nullable): a `GFile`
+     507                 :             :  *
+     508                 :             :  * Since: 1.0
+     509                 :             :  */
+     510                 :             : GFile *
+     511                 :          10 : valent_device_transfer_ref_file (ValentDeviceTransfer *transfer)
+     512                 :             : {
+     513                 :          20 :   g_autoptr (GFile) ret = NULL;
+     514                 :             : 
+     515         [ +  - ]:          10 :   g_return_val_if_fail (VALENT_IS_DEVICE_TRANSFER (transfer), NULL);
+     516                 :             : 
+     517                 :          10 :   valent_object_lock (VALENT_OBJECT (transfer));
+     518         [ +  - ]:          10 :   if (transfer->file != NULL)
+     519                 :          10 :     ret = g_object_ref (transfer->file);
+     520                 :          10 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     521                 :             : 
+     522                 :          10 :   return g_steal_pointer (&ret);
+     523                 :             : }
+     524                 :             : 
+     525                 :             : /**
+     526                 :             :  * valent_device_transfer_ref_packet: (get-property packet)
+     527                 :             :  * @transfer: a `ValentDeviceTransfer`
+     528                 :             :  *
+     529                 :             :  * Get the KDE Connect packet.
+     530                 :             :  *
+     531                 :             :  * Returns: (transfer full) (nullable): a KDE Connect packet
+     532                 :             :  *
+     533                 :             :  * Since: 1.0
+     534                 :             :  */
+     535                 :             : JsonNode *
+     536                 :          22 : valent_device_transfer_ref_packet (ValentDeviceTransfer *transfer)
+     537                 :             : {
+     538                 :          44 :   g_autoptr (JsonNode) ret = NULL;
+     539                 :             : 
+     540         [ +  - ]:          22 :   g_return_val_if_fail (VALENT_IS_DEVICE_TRANSFER (transfer), NULL);
+     541                 :             : 
+     542                 :          22 :   valent_object_lock (VALENT_OBJECT (transfer));
+     543         [ +  - ]:          22 :   if (transfer->packet != NULL)
+     544                 :          22 :     ret = json_node_ref (transfer->packet);
+     545                 :          22 :   valent_object_unlock (VALENT_OBJECT (transfer));
+     546                 :             : 
+     547                 :          22 :   return g_steal_pointer (&ret);
+     548                 :             : }
+     549                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-transfer.h.func-c.html b/coverage/src/libvalent/device/valent-device-transfer.h.func-c.html new file mode 100644 index 00000000000..e7b19521c46 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-transfer.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-transfer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-transfer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_TRANSFER61
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-transfer.h.func.html b/coverage/src/libvalent/device/valent-device-transfer.h.func.html new file mode 100644 index 00000000000..376794a3d17 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-transfer.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-transfer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-transfer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_TRANSFER61
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device-transfer.h.gcov.html b/coverage/src/libvalent/device/valent-device-transfer.h.gcov.html new file mode 100644 index 00000000000..49c26c499b7 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device-transfer.h.gcov.html @@ -0,0 +1,126 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device-transfer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device-transfer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : 
+      12                 :             : #include "../core/valent-transfer.h"
+      13                 :             : #include "valent-device.h"
+      14                 :             : 
+      15                 :             : G_BEGIN_DECLS
+      16                 :             : 
+      17                 :             : #define VALENT_TYPE_DEVICE_TRANSFER (valent_device_transfer_get_type())
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20   [ +  -  +  -  :          61 : G_DECLARE_FINAL_TYPE (ValentDeviceTransfer, valent_device_transfer, VALENT, DEVICE_TRANSFER, ValentTransfer)
+                   -  + ]
+      21                 :             : 
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : ValentTransfer * valent_device_transfer_new        (ValentDevice         *device,
+      24                 :             :                                                     JsonNode             *packet,
+      25                 :             :                                                     GFile                *file);
+      26                 :             : VALENT_AVAILABLE_IN_1_0
+      27                 :             : ValentDevice   * valent_device_transfer_ref_device (ValentDeviceTransfer *transfer);
+      28                 :             : VALENT_AVAILABLE_IN_1_0
+      29                 :             : GFile          * valent_device_transfer_ref_file   (ValentDeviceTransfer *transfer);
+      30                 :             : VALENT_AVAILABLE_IN_1_0
+      31                 :             : JsonNode       * valent_device_transfer_ref_packet (ValentDeviceTransfer *transfer);
+      32                 :             : 
+      33                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device.c.func-c.html b/coverage/src/libvalent/device/valent-device.c.func-c.html new file mode 100644 index 00000000000..c0007166f7e --- /dev/null +++ b/coverage/src/libvalent/device/valent-device.c.func-c.html @@ -0,0 +1,469 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.0 %626582
Test Date:2024-03-31 18:46:36Functions:100.0 %5353
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:67.5 %388262
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_new1
valent_device_disable_plugin2
valent_device_notify_pair2
unpair_action3
valent_device_change_action_state3
on_plugin_enabled_changed4
pair_action4
valent_device_get_icon_name5
valent_device_handle_pair5
send_pair_cb7
valent_device_send_pair9
valent_device_list_actions11
valent_device_get_property28
g_action_group_iface_init33
valent_device_class_init33
valent_device_ref_channel33
valent_device_activate_action37
on_plugin_action_state_changed40
valent_device_get_name52
valent_device_get_id58
valent_device_get_context84
valent_device_destroy92
valent_device_finalize92
valent_device_new_full92
valent_device_constructed95
valent_device_get_plugins95
valent_device_init95
valent_device_set_paired95
valent_device_send_packet_finish118
valent_device_send_packet_cb134
valent_device_send_packet136
valent_device_handle_identity170
valent_device_reload_plugins170
device_plugin_free185
valent_device_reset_pair190
valent_device_set_property190
valent_device_enable_plugin193
valent_device_update_plugins196
valent_device_set_channel249
valent_device_query_action256
on_plugin_action_removed305
on_plugin_action_added317
valent_device_get_menu451
valent_device_get_state453
on_unload_plugin492
on_plugin_action_enabled_changed566
on_load_plugin799
valent_device_supports_plugin1622
valent_device_handle_packet3501
read_packet_cb3579
valent_device_get_type13401
valent_device_class_intern_init33
valent_device_get_type_once86
valent_device_get_type13282
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device.c.func.html b/coverage/src/libvalent/device/valent-device.c.func.html new file mode 100644 index 00000000000..a5b47b93192 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device.c.func.html @@ -0,0 +1,469 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.0 %626582
Test Date:2024-03-31 18:46:36Functions:100.0 %5353
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:67.5 %388262
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
device_plugin_free185
g_action_group_iface_init33
on_load_plugin799
on_plugin_action_added317
on_plugin_action_enabled_changed566
on_plugin_action_removed305
on_plugin_action_state_changed40
on_plugin_enabled_changed4
on_unload_plugin492
pair_action4
read_packet_cb3579
send_pair_cb7
unpair_action3
valent_device_activate_action37
valent_device_change_action_state3
valent_device_class_init33
valent_device_constructed95
valent_device_destroy92
valent_device_disable_plugin2
valent_device_enable_plugin193
valent_device_finalize92
valent_device_get_context84
valent_device_get_icon_name5
valent_device_get_id58
valent_device_get_menu451
valent_device_get_name52
valent_device_get_plugins95
valent_device_get_property28
valent_device_get_state453
valent_device_get_type13401
valent_device_class_intern_init33
valent_device_get_type13282
valent_device_get_type_once86
valent_device_handle_identity170
valent_device_handle_packet3501
valent_device_handle_pair5
valent_device_init95
valent_device_list_actions11
valent_device_new1
valent_device_new_full92
valent_device_notify_pair2
valent_device_query_action256
valent_device_ref_channel33
valent_device_reload_plugins170
valent_device_reset_pair190
valent_device_send_packet136
valent_device_send_packet_cb134
valent_device_send_packet_finish118
valent_device_send_pair9
valent_device_set_channel249
valent_device_set_paired95
valent_device_set_property190
valent_device_supports_plugin1622
valent_device_update_plugins196
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device.c.gcov.html b/coverage/src/libvalent/device/valent-device.c.gcov.html new file mode 100644 index 00000000000..475ef716a4a --- /dev/null +++ b/coverage/src/libvalent/device/valent-device.c.gcov.html @@ -0,0 +1,1838 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.0 %626582
Test Date:2024-03-31 18:46:36Functions:100.0 %5353
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:67.5 %388262
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-device-enums.h"
+      13                 :             : 
+      14                 :             : #include "../core/valent-component-private.h"
+      15                 :             : #include "valent-channel.h"
+      16                 :             : #include "valent-device.h"
+      17                 :             : #include "valent-device-plugin.h"
+      18                 :             : #include "valent-device-private.h"
+      19                 :             : #include "valent-packet.h"
+      20                 :             : 
+      21                 :             : #define DEVICE_TYPE_DESKTOP  "desktop"
+      22                 :             : #define DEVICE_TYPE_LAPTOP   "laptop"
+      23                 :             : #define DEVICE_TYPE_PHONE    "phone"
+      24                 :             : #define DEVICE_TYPE_TABLET   "tablet"
+      25                 :             : #define DEVICE_TYPE_TV       "tv"
+      26                 :             : 
+      27                 :             : #define PAIR_REQUEST_ID      "pair-request"
+      28                 :             : #define PAIR_REQUEST_TIMEOUT 30
+      29                 :             : 
+      30                 :             : 
+      31                 :             : /**
+      32                 :             :  * ValentDevice:
+      33                 :             :  *
+      34                 :             :  * A class representing a remote device, such as a smartphone or desktop.
+      35                 :             :  *
+      36                 :             :  * Device functionality is limited to pairing and sending packets, while other
+      37                 :             :  * functionality is delegated to [class@Valent.DevicePlugin] extensions.
+      38                 :             :  *
+      39                 :             :  * `ValentDevice` implements the [iface@Gio.ActionGroup] interface, acting as an
+      40                 :             :  * aggregate action group for plugins. Plugin actions are automatically included
+      41                 :             :  * in the device action group with the plugin module name as a prefix
+      42                 :             :  * (eg. `share.files`).
+      43                 :             :  *
+      44                 :             :  * Since: 1.0
+      45                 :             :  */
+      46                 :             : 
+      47                 :             : struct _ValentDevice
+      48                 :             : {
+      49                 :             :   ValentObject    parent_instance;
+      50                 :             : 
+      51                 :             :   ValentContext  *context;
+      52                 :             :   GSettings      *settings;
+      53                 :             : 
+      54                 :             :   /* Properties */
+      55                 :             :   char           *icon_name;
+      56                 :             :   char           *id;
+      57                 :             :   char           *name;
+      58                 :             :   char           *type;
+      59                 :             :   char          **incoming_capabilities;
+      60                 :             :   char          **outgoing_capabilities;
+      61                 :             : 
+      62                 :             :   /* State */
+      63                 :             :   ValentChannel  *channel;
+      64                 :             :   gboolean        paired;
+      65                 :             :   unsigned int    incoming_pair;
+      66                 :             :   unsigned int    outgoing_pair;
+      67                 :             : 
+      68                 :             :   /* Plugins */
+      69                 :             :   PeasEngine     *engine;
+      70                 :             :   GHashTable     *plugins;
+      71                 :             :   GHashTable     *handlers;
+      72                 :             :   GHashTable     *actions;
+      73                 :             :   GMenu          *menu;
+      74                 :             : };
+      75                 :             : 
+      76                 :             : static void       valent_device_reload_plugins  (ValentDevice   *device);
+      77                 :             : static void       valent_device_update_plugins  (ValentDevice   *device);
+      78                 :             : static gboolean   valent_device_supports_plugin (ValentDevice   *device,
+      79                 :             :                                                  PeasPluginInfo *info);
+      80                 :             : 
+      81                 :             : static void       g_action_group_iface_init     (GActionGroupInterface *iface);
+      82                 :             : 
+      83   [ +  +  +  - ]:       13401 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentDevice, valent_device, VALENT_TYPE_OBJECT,
+      84                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_action_group_iface_init))
+      85                 :             : 
+      86                 :             : 
+      87                 :             : enum {
+      88                 :             :   PROP_0,
+      89                 :             :   PROP_CONTEXT,
+      90                 :             :   PROP_ICON_NAME,
+      91                 :             :   PROP_ID,
+      92                 :             :   PROP_NAME,
+      93                 :             :   PROP_PLUGINS,
+      94                 :             :   PROP_STATE,
+      95                 :             :   N_PROPERTIES
+      96                 :             : };
+      97                 :             : 
+      98                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      99                 :             : 
+     100                 :             : 
+     101                 :             : /*
+     102                 :             :  * GActionGroup
+     103                 :             :  */
+     104                 :             : static void
+     105                 :          37 : valent_device_activate_action (GActionGroup *action_group,
+     106                 :             :                                const char   *action_name,
+     107                 :             :                                GVariant     *parameter)
+     108                 :             : {
+     109                 :          37 :   ValentDevice *self = VALENT_DEVICE (action_group);
+     110                 :          37 :   GAction *action;
+     111                 :             : 
+     112         [ +  - ]:          37 :   if ((action = g_hash_table_lookup (self->actions, action_name)) != NULL)
+     113                 :          37 :     g_action_activate (action, parameter);
+     114                 :          37 : }
+     115                 :             : 
+     116                 :             : static void
+     117                 :           3 : valent_device_change_action_state (GActionGroup *action_group,
+     118                 :             :                                    const char   *action_name,
+     119                 :             :                                    GVariant     *value)
+     120                 :             : {
+     121                 :           3 :   ValentDevice *self = VALENT_DEVICE (action_group);
+     122                 :           3 :   GAction *action;
+     123                 :             : 
+     124         [ +  - ]:           3 :   if ((action = g_hash_table_lookup (self->actions, action_name)) != NULL)
+     125                 :           3 :     g_action_change_state (action, value);
+     126                 :           3 : }
+     127                 :             : 
+     128                 :             : static char **
+     129                 :          11 : valent_device_list_actions (GActionGroup *action_group)
+     130                 :             : {
+     131                 :          11 :   ValentDevice *self = VALENT_DEVICE (action_group);
+     132                 :          22 :   g_auto (GStrv) actions = NULL;
+     133                 :          11 :   GHashTableIter iter;
+     134                 :          11 :   gpointer key;
+     135                 :          11 :   unsigned int i = 0;
+     136                 :             : 
+     137         [ -  + ]:          11 :   actions = g_new0 (char *, g_hash_table_size (self->actions) + 1);
+     138                 :             : 
+     139                 :          11 :   g_hash_table_iter_init (&iter, self->actions);
+     140                 :             : 
+     141         [ +  + ]:          62 :   while (g_hash_table_iter_next (&iter, &key, NULL))
+     142         [ -  + ]:         102 :     actions[i++] = g_strdup (key);
+     143                 :             : 
+     144                 :          11 :   return g_steal_pointer (&actions);
+     145                 :             : }
+     146                 :             : 
+     147                 :             : static gboolean
+     148                 :         256 : valent_device_query_action (GActionGroup        *action_group,
+     149                 :             :                             const char          *action_name,
+     150                 :             :                             gboolean            *enabled,
+     151                 :             :                             const GVariantType **parameter_type,
+     152                 :             :                             const GVariantType **state_type,
+     153                 :             :                             GVariant           **state_hint,
+     154                 :             :                             GVariant           **state)
+     155                 :             : {
+     156                 :         256 :   ValentDevice *self = VALENT_DEVICE (action_group);
+     157                 :         256 :   GAction *action;
+     158                 :             : 
+     159         [ +  + ]:         256 :   if ((action = g_hash_table_lookup (self->actions, action_name)) == NULL)
+     160                 :             :     return FALSE;
+     161                 :             : 
+     162         [ +  + ]:         245 :   if (enabled)
+     163                 :         131 :     *enabled = g_action_get_enabled (action);
+     164                 :             : 
+     165         [ +  + ]:         245 :   if (parameter_type)
+     166                 :          56 :     *parameter_type = g_action_get_parameter_type (action);
+     167                 :             : 
+     168         [ +  + ]:         245 :   if (state_type)
+     169                 :           1 :     *state_type = g_action_get_state_type (action);
+     170                 :             : 
+     171         [ +  + ]:         245 :   if (state_hint)
+     172                 :           1 :     *state_hint = g_action_get_state_hint (action);
+     173                 :             : 
+     174         [ +  + ]:         245 :   if (state)
+     175                 :          77 :     *state = g_action_get_state (action);
+     176                 :             : 
+     177                 :             :   return TRUE;
+     178                 :             : }
+     179                 :             : 
+     180                 :             : static void
+     181                 :          33 : g_action_group_iface_init (GActionGroupInterface *iface)
+     182                 :             : {
+     183                 :          33 :   iface->activate_action = valent_device_activate_action;
+     184                 :          33 :   iface->change_action_state = valent_device_change_action_state;
+     185                 :          33 :   iface->list_actions = valent_device_list_actions;
+     186                 :          33 :   iface->query_action = valent_device_query_action;
+     187                 :          33 : }
+     188                 :             : 
+     189                 :             : 
+     190                 :             : /*
+     191                 :             :  * Private plugin methods
+     192                 :             :  */
+     193                 :             : static void
+     194                 :         185 : device_plugin_free (gpointer data)
+     195                 :             : {
+     196                 :         185 :   ValentPlugin *plugin = data;
+     197                 :             : 
+     198                 :             :   /* `::action-removed` needs to be emitted before the plugin is freed */
+     199         [ +  - ]:         185 :   if (plugin->extension != NULL)
+     200                 :         185 :     valent_object_destroy (VALENT_OBJECT (plugin->extension));
+     201                 :             : 
+     202                 :         185 :   g_clear_pointer (&plugin, valent_plugin_free);
+     203                 :         185 : }
+     204                 :             : 
+     205                 :             : static void
+     206                 :         317 : on_plugin_action_added (GActionGroup *action_group,
+     207                 :             :                         const char   *action_name,
+     208                 :             :                         ValentPlugin *plugin)
+     209                 :             : {
+     210                 :         317 :   ValentDevice *self = VALENT_DEVICE (plugin->parent);
+     211                 :         634 :   g_autofree char *full_name = NULL;
+     212                 :         317 :   GAction *action;
+     213                 :             : 
+     214                 :         317 :   full_name = g_strdup_printf ("%s.%s",
+     215                 :         317 :                                peas_plugin_info_get_module_name (plugin->info),
+     216                 :             :                                action_name);
+     217                 :         317 :   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
+     218                 :             :                                        action_name);
+     219                 :             : 
+     220                 :         317 :   g_hash_table_replace (self->actions,
+     221         [ -  + ]:         634 :                         g_strdup (full_name),
+     222                 :             :                         g_object_ref (action));
+     223                 :         317 :   g_action_group_action_added (G_ACTION_GROUP (plugin->parent), full_name);
+     224                 :         317 : }
+     225                 :             : 
+     226                 :             : static void
+     227                 :         566 : on_plugin_action_enabled_changed (GActionGroup *action_group,
+     228                 :             :                                   const char   *action_name,
+     229                 :             :                                   gboolean      enabled,
+     230                 :             :                                   ValentPlugin *plugin)
+     231                 :             : {
+     232                 :        1132 :   g_autofree char *full_name = NULL;
+     233                 :             : 
+     234                 :         566 :   full_name = g_strdup_printf ("%s.%s",
+     235                 :         566 :                                peas_plugin_info_get_module_name (plugin->info),
+     236                 :             :                                action_name);
+     237                 :         566 :   g_action_group_action_enabled_changed (G_ACTION_GROUP (plugin->parent),
+     238                 :             :                                          full_name,
+     239                 :             :                                          enabled);
+     240                 :         566 : }
+     241                 :             : 
+     242                 :             : static void
+     243                 :         305 : on_plugin_action_removed (GActionGroup *action_group,
+     244                 :             :                           const char   *action_name,
+     245                 :             :                           ValentPlugin *plugin)
+     246                 :             : {
+     247                 :         305 :   ValentDevice *self = VALENT_DEVICE (plugin->parent);
+     248                 :         610 :   g_autofree char *full_name = NULL;
+     249                 :             : 
+     250                 :         305 :   full_name = g_strdup_printf ("%s.%s",
+     251                 :         305 :                                peas_plugin_info_get_module_name (plugin->info),
+     252                 :             :                                action_name);
+     253                 :             : 
+     254                 :         305 :   g_action_group_action_removed (G_ACTION_GROUP (plugin->parent), full_name);
+     255                 :         305 :   g_hash_table_remove (self->actions, full_name);
+     256                 :         305 : }
+     257                 :             : 
+     258                 :             : static void
+     259                 :          40 : on_plugin_action_state_changed (GActionGroup *action_group,
+     260                 :             :                                 const char   *action_name,
+     261                 :             :                                 GVariant     *value,
+     262                 :             :                                 ValentPlugin *plugin)
+     263                 :             : {
+     264                 :          80 :   g_autofree char *full_name = NULL;
+     265                 :             : 
+     266                 :          40 :   full_name = g_strdup_printf ("%s.%s",
+     267                 :          40 :                                peas_plugin_info_get_module_name (plugin->info),
+     268                 :             :                                action_name);
+     269                 :          40 :   g_action_group_action_state_changed (G_ACTION_GROUP (plugin->parent),
+     270                 :             :                                        full_name,
+     271                 :             :                                        value);
+     272                 :          40 : }
+     273                 :             : 
+     274                 :             : static void
+     275                 :         193 : valent_device_enable_plugin (ValentDevice *device,
+     276                 :             :                              ValentPlugin *plugin)
+     277                 :             : {
+     278                 :         386 :   g_auto (GStrv) actions = NULL;
+     279                 :         193 :   const char *incoming = NULL;
+     280                 :             : 
+     281         [ +  - ]:         193 :   g_assert (VALENT_IS_DEVICE (device));
+     282         [ -  + ]:         193 :   g_assert (plugin != NULL);
+     283                 :             : 
+     284                 :             :   /* Instantiate the plugin */
+     285                 :         193 :   plugin->extension = peas_engine_create_extension (device->engine,
+     286                 :             :                                                     plugin->info,
+     287                 :             :                                                     VALENT_TYPE_DEVICE_PLUGIN,
+     288                 :             :                                                     "context", plugin->context,
+     289                 :             :                                                     "object",  plugin->parent,
+     290                 :             :                                                     NULL);
+     291         [ -  + ]:         193 :   g_return_if_fail (G_IS_OBJECT (plugin->extension));
+     292                 :             : 
+     293                 :             :   /* Register packet handlers */
+     294                 :         193 :   incoming = peas_plugin_info_get_external_data (plugin->info,
+     295                 :             :                                                  "DevicePluginIncoming");
+     296                 :             : 
+     297         [ +  + ]:         193 :   if (incoming != NULL)
+     298                 :             :     {
+     299                 :         288 :       g_auto (GStrv) capabilities = NULL;
+     300                 :             : 
+     301                 :          95 :       capabilities = g_strsplit (incoming, ";", -1);
+     302                 :             : 
+     303         [ +  + ]:         266 :       for (unsigned int i = 0; capabilities[i] != NULL; i++)
+     304                 :             :         {
+     305                 :         171 :           GPtrArray *handlers = NULL;
+     306                 :         171 :           const char *type = capabilities[i];
+     307                 :             : 
+     308         [ +  + ]:         171 :           if ((handlers = g_hash_table_lookup (device->handlers, type)) == NULL)
+     309                 :             :             {
+     310                 :         163 :               handlers = g_ptr_array_new ();
+     311         [ -  + ]:         326 :               g_hash_table_insert (device->handlers, g_strdup (type), handlers);
+     312                 :             :             }
+     313                 :             : 
+     314                 :         171 :           g_ptr_array_add (handlers, plugin->extension);
+     315                 :             :         }
+     316                 :             :     }
+     317                 :             : 
+     318                 :             :   /* Register plugin actions */
+     319                 :         193 :   actions = g_action_group_list_actions (G_ACTION_GROUP (plugin->extension));
+     320                 :             : 
+     321         [ +  + ]:         510 :   for (unsigned int i = 0; actions[i] != NULL; i++)
+     322                 :             :     {
+     323                 :         317 :       on_plugin_action_added (G_ACTION_GROUP (plugin->extension),
+     324                 :             :                               actions[i],
+     325                 :             :                               plugin);
+     326                 :             :     }
+     327                 :             : 
+     328                 :         193 :   g_signal_connect (plugin->extension,
+     329                 :             :                     "action-added",
+     330                 :             :                     G_CALLBACK (on_plugin_action_added),
+     331                 :             :                     plugin);
+     332                 :         193 :   g_signal_connect (plugin->extension,
+     333                 :             :                     "action-enabled-changed",
+     334                 :             :                     G_CALLBACK (on_plugin_action_enabled_changed),
+     335                 :             :                     plugin);
+     336                 :         193 :   g_signal_connect (plugin->extension,
+     337                 :             :                     "action-removed",
+     338                 :             :                     G_CALLBACK (on_plugin_action_removed),
+     339                 :             :                     plugin);
+     340                 :         193 :   g_signal_connect (plugin->extension,
+     341                 :             :                     "action-state-changed",
+     342                 :             :                     G_CALLBACK (on_plugin_action_state_changed),
+     343                 :             :                     plugin);
+     344                 :             : 
+     345                 :             :   /* Bootstrap the newly instantiated plugin */
+     346         [ +  - ]:         193 :   valent_device_plugin_update_state (VALENT_DEVICE_PLUGIN (plugin->extension),
+     347                 :             :                                      valent_device_get_state (device));
+     348                 :             : }
+     349                 :             : 
+     350                 :             : static void
+     351                 :           2 : valent_device_disable_plugin (ValentDevice *device,
+     352                 :             :                               ValentPlugin *plugin)
+     353                 :             : {
+     354                 :           4 :   g_auto (GStrv) actions = NULL;
+     355                 :           2 :   const char *incoming = NULL;
+     356                 :             : 
+     357         [ +  - ]:           2 :   g_assert (VALENT_IS_DEVICE (device));
+     358         [ -  + ]:           2 :   g_assert (plugin != NULL);
+     359         [ -  + ]:           2 :   g_return_if_fail (G_IS_OBJECT (plugin->extension));
+     360                 :             : 
+     361                 :             :   /* Unregister actions */
+     362                 :           2 :   g_signal_handlers_disconnect_by_data (plugin->extension, plugin);
+     363                 :           2 :   actions = g_action_group_list_actions (G_ACTION_GROUP (plugin->extension));
+     364                 :             : 
+     365         [ +  + ]:           5 :   for (unsigned int i = 0; actions[i]; i++)
+     366                 :             :     {
+     367                 :           3 :       on_plugin_action_removed (G_ACTION_GROUP (plugin->extension),
+     368                 :             :                                 actions[i],
+     369                 :             :                                 plugin);
+     370                 :             :     }
+     371                 :             : 
+     372                 :             :   /* Unregister packet handlers */
+     373                 :           2 :   incoming = peas_plugin_info_get_external_data (plugin->info,
+     374                 :             :                                                  "DevicePluginIncoming");
+     375                 :             : 
+     376         [ +  + ]:           2 :   if (incoming != NULL)
+     377                 :             :     {
+     378                 :           3 :       g_auto (GStrv) capabilities = NULL;
+     379                 :             : 
+     380                 :           1 :       capabilities = g_strsplit (incoming, ";", -1);
+     381                 :             : 
+     382         [ +  + ]:           3 :       for (unsigned int i = 0; capabilities[i] != NULL; i++)
+     383                 :             :         {
+     384                 :           2 :           const char *type = capabilities[i];
+     385                 :           2 :           GPtrArray *handlers = NULL;
+     386                 :             : 
+     387         [ -  + ]:           2 :           if ((handlers = g_hash_table_lookup (device->handlers, type)) == NULL)
+     388                 :           0 :             continue;
+     389                 :             : 
+     390   [ +  -  -  + ]:           2 :           if (g_ptr_array_remove (handlers, plugin->extension) && handlers->len == 0)
+     391                 :           0 :             g_hash_table_remove (device->handlers, type);
+     392                 :             :         }
+     393                 :             :     }
+     394                 :             : 
+     395                 :             :   /* `::action-removed` needs to be emitted before the plugin is freed */
+     396                 :           2 :   valent_object_destroy (VALENT_OBJECT (plugin->extension));
+     397   [ +  -  +  - ]:           2 :   g_clear_object (&plugin->extension);
+     398                 :             : }
+     399                 :             : 
+     400                 :             : static void
+     401                 :           4 : on_plugin_enabled_changed (ValentPlugin *plugin)
+     402                 :             : {
+     403         [ +  - ]:           4 :   g_assert (plugin != NULL);
+     404         [ -  + ]:           4 :   g_assert (VALENT_IS_DEVICE (plugin->parent));
+     405                 :             : 
+     406         [ +  + ]:           4 :   if (valent_plugin_get_enabled (plugin))
+     407                 :           2 :     valent_device_enable_plugin (plugin->parent, plugin);
+     408                 :             :   else
+     409                 :           2 :     valent_device_disable_plugin (plugin->parent, plugin);
+     410                 :           4 : }
+     411                 :             : 
+     412                 :             : 
+     413                 :             : /*
+     414                 :             :  * Private pairing methods
+     415                 :             :  */
+     416                 :             : static gboolean
+     417                 :         190 : valent_device_reset_pair (gpointer object)
+     418                 :             : {
+     419                 :         190 :   ValentDevice *device = VALENT_DEVICE (object);
+     420                 :         190 :   GApplication *application = g_application_get_default ();
+     421                 :             : 
+     422         [ +  - ]:         190 :   g_assert (VALENT_IS_DEVICE (device));
+     423                 :             : 
+     424         [ -  + ]:         190 :   if (application != NULL)
+     425                 :             :     {
+     426                 :           0 :       g_autofree char *notification_id = NULL;
+     427                 :             : 
+     428                 :           0 :       notification_id = g_strdup_printf ("%s::%s", device->id, PAIR_REQUEST_ID);
+     429                 :           0 :       g_application_withdraw_notification (application, notification_id);
+     430                 :             :     }
+     431                 :             : 
+     432         [ +  + ]:         190 :   g_clear_handle_id (&device->incoming_pair, g_source_remove);
+     433         [ +  + ]:         190 :   g_clear_handle_id (&device->outgoing_pair, g_source_remove);
+     434                 :             : 
+     435                 :         190 :   g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_STATE]);
+     436                 :             : 
+     437                 :         190 :   return G_SOURCE_REMOVE;
+     438                 :             : }
+     439                 :             : 
+     440                 :             : static void
+     441                 :           7 : send_pair_cb (ValentChannel *channel,
+     442                 :             :               GAsyncResult  *result,
+     443                 :             :               ValentDevice  *device)
+     444                 :             : {
+     445                 :          14 :   g_autoptr (GError) error = NULL;
+     446                 :             : 
+     447         [ +  - ]:           7 :   g_assert (VALENT_IS_CHANNEL (channel));
+     448         [ -  + ]:           7 :   g_assert (VALENT_IS_DEVICE (device));
+     449                 :             : 
+     450         [ -  + ]:           7 :   if (!valent_channel_write_packet_finish (channel, result, &error))
+     451                 :             :     {
+     452                 :           0 :       VALENT_NOTE ("%s: %s", device->name, error->message);
+     453                 :             : 
+     454                 :           0 :       valent_device_reset_pair (device);
+     455                 :             : 
+     456                 :           0 :       valent_object_lock (VALENT_OBJECT (device));
+     457         [ #  # ]:           0 :       if (device->channel == channel)
+     458                 :           0 :         valent_device_set_channel (device, NULL);
+     459                 :           0 :       valent_object_unlock (VALENT_OBJECT (device));
+     460                 :             :     }
+     461                 :             : 
+     462         [ -  + ]:           7 :   g_object_unref (device);
+     463                 :           7 : }
+     464                 :             : 
+     465                 :             : static void
+     466                 :           9 : valent_device_send_pair (ValentDevice *device,
+     467                 :             :                          gboolean      pair)
+     468                 :             : {
+     469                 :           9 :   g_autoptr (JsonBuilder) builder = NULL;
+     470   [ -  +  -  + ]:           9 :   g_autoptr (JsonNode) packet = NULL;
+     471   [ -  +  +  - ]:           9 :   g_autoptr (GCancellable) cancellable = NULL;
+     472                 :             : 
+     473         [ +  - ]:           9 :   g_assert (VALENT_IS_DEVICE (device));
+     474                 :             : 
+     475                 :           9 :   valent_object_lock (VALENT_OBJECT (device));
+     476                 :             : 
+     477         [ +  + ]:           9 :   if (device->channel == NULL)
+     478                 :             :     {
+     479                 :           2 :       valent_object_unlock (VALENT_OBJECT (device));
+     480         [ -  + ]:           2 :       return;
+     481                 :             :     }
+     482                 :             : 
+     483                 :           7 :   valent_packet_init (&builder, "kdeconnect.pair");
+     484                 :           7 :   json_builder_set_member_name (builder, "pair");
+     485                 :           7 :   json_builder_add_boolean_value (builder, pair);
+     486                 :           7 :   packet = valent_packet_end (&builder);
+     487                 :             : 
+     488                 :           7 :   valent_channel_write_packet (device->channel,
+     489                 :             :                                packet,
+     490                 :             :                                cancellable,
+     491                 :             :                                (GAsyncReadyCallback)send_pair_cb,
+     492                 :             :                                g_object_ref (device));
+     493                 :             : 
+     494         [ +  - ]:           7 :   valent_object_unlock (VALENT_OBJECT (device));
+     495                 :             : }
+     496                 :             : 
+     497                 :             : static void
+     498                 :           2 : valent_device_notify_pair (ValentDevice *device)
+     499                 :             : {
+     500                 :           2 :   GApplication *application = g_application_get_default ();
+     501                 :             : 
+     502         [ +  - ]:           2 :   g_assert (VALENT_IS_DEVICE (device));
+     503                 :             : 
+     504         [ -  + ]:           2 :   if (application != NULL)
+     505                 :             :     {
+     506                 :           0 :       g_autofree char *notification_id = NULL;
+     507                 :           0 :       g_autoptr (GNotification) notification = NULL;
+     508         [ #  # ]:           0 :       g_autoptr (GIcon) icon = NULL;
+     509         [ #  # ]:           0 :       g_autofree char *title = NULL;
+     510                 :           0 :       const char *body;
+     511                 :             : 
+     512                 :           0 :       title = g_strdup_printf (_("Pairing request from %s"), device->name);
+     513                 :           0 :       notification = g_notification_new (title);
+     514                 :             : 
+     515         [ #  # ]:           0 :       if ((body = valent_channel_get_verification_key (device->channel)) != NULL)
+     516                 :           0 :         g_notification_set_body (notification, body);
+     517                 :             : 
+     518                 :           0 :       icon = g_themed_icon_new (APPLICATION_ID);
+     519                 :           0 :       g_notification_set_icon (notification, icon);
+     520                 :             : 
+     521                 :           0 :       g_notification_set_priority (notification, G_NOTIFICATION_PRIORITY_URGENT);
+     522                 :             : 
+     523                 :           0 :       g_notification_add_button_with_target (notification, _("Reject"), "app.device",
+     524                 :             :                                              "(ssav)",
+     525                 :             :                                              device->id,
+     526                 :             :                                              "unpair",
+     527                 :             :                                              NULL);
+     528                 :             : 
+     529                 :           0 :       g_notification_add_button_with_target (notification, _("Accept"), "app.device",
+     530                 :             :                                              "(ssav)",
+     531                 :             :                                              device->id,
+     532                 :             :                                              "pair",
+     533                 :             :                                              NULL);
+     534                 :             : 
+     535                 :             :       /* Show the pairing notification and set a timeout for 30s */
+     536                 :           0 :       notification_id = g_strdup_printf ("%s::%s", device->id, PAIR_REQUEST_ID);
+     537                 :           0 :       g_application_send_notification (application,
+     538                 :             :                                        notification_id,
+     539                 :             :                                        notification);
+     540                 :             :     }
+     541                 :             : 
+     542                 :           2 :   device->incoming_pair = g_timeout_add_seconds (PAIR_REQUEST_TIMEOUT,
+     543                 :             :                                                  valent_device_reset_pair,
+     544                 :             :                                                  device);
+     545                 :           2 :   g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_STATE]);
+     546                 :           2 : }
+     547                 :             : 
+     548                 :             : static void
+     549                 :           5 : valent_device_handle_pair (ValentDevice *device,
+     550                 :             :                            JsonNode     *packet)
+     551                 :             : {
+     552                 :           5 :   gboolean pair;
+     553                 :             : 
+     554                 :           5 :   VALENT_ENTRY;
+     555                 :             : 
+     556         [ +  - ]:           5 :   g_assert (VALENT_IS_DEVICE (device));
+     557         [ -  + ]:           5 :   g_assert (VALENT_IS_PACKET (packet));
+     558                 :             : 
+     559         [ -  + ]:           5 :   if (!valent_packet_get_boolean (packet, "pair", &pair))
+     560                 :             :     {
+     561                 :           0 :       g_warning ("%s(): malformed pair packet from \"%s\"",
+     562                 :             :                  G_STRFUNC,
+     563                 :             :                  device->name);
+     564                 :           0 :       VALENT_EXIT;
+     565                 :             :     }
+     566                 :             : 
+     567                 :             :   /* Device is requesting pairing or accepting our request */
+     568         [ +  + ]:           5 :   if (pair)
+     569                 :             :     {
+     570                 :             :       /* The device is accepting our request */
+     571         [ +  + ]:           4 :       if (device->outgoing_pair > 0)
+     572                 :             :         {
+     573                 :           1 :           VALENT_NOTE ("Pairing accepted by \"%s\"", device->name);
+     574                 :           1 :           valent_device_set_paired (device, TRUE);
+     575                 :             :         }
+     576                 :             : 
+     577                 :             :       /* The device thinks we're unpaired */
+     578         [ +  + ]:           3 :       else if (device->paired)
+     579                 :             :         {
+     580                 :           1 :           valent_device_send_pair (device, TRUE);
+     581                 :           1 :           valent_device_set_paired (device, TRUE);
+     582                 :             :         }
+     583                 :             : 
+     584                 :             :       /* The device is requesting pairing */
+     585                 :             :       else
+     586                 :             :         {
+     587                 :           2 :           VALENT_NOTE ("Pairing requested by \"%s\"", device->name);
+     588                 :           2 :           valent_device_notify_pair (device);
+     589                 :             :         }
+     590                 :             :     }
+     591                 :             : 
+     592                 :             :   /* Device is requesting unpairing or rejecting our request */
+     593                 :             :   else
+     594                 :             :     {
+     595                 :           1 :       VALENT_NOTE ("Pairing rejected by \"%s\"", device->name);
+     596                 :           1 :       valent_device_set_paired (device, FALSE);
+     597                 :             :     }
+     598                 :             : 
+     599                 :           5 :   VALENT_EXIT;
+     600                 :             : }
+     601                 :             : 
+     602                 :             : /*
+     603                 :             :  * Private identity methods
+     604                 :             :  */
+     605                 :             : static void
+     606                 :         170 : valent_device_handle_identity (ValentDevice *device,
+     607                 :             :                                JsonNode     *packet)
+     608                 :             : {
+     609                 :         170 :   const char *device_id;
+     610                 :         170 :   const char *device_name;
+     611                 :         170 :   const char *device_type;
+     612                 :             : 
+     613                 :         170 :   VALENT_ENTRY;
+     614                 :             : 
+     615         [ +  - ]:         170 :   g_assert (VALENT_IS_DEVICE (device));
+     616         [ -  + ]:         170 :   g_assert (VALENT_IS_PACKET (packet));
+     617                 :             : 
+     618                 :         170 :   valent_object_lock (VALENT_OBJECT (device));
+     619                 :             : 
+     620                 :             :   /* Device ID, which MUST exist and MUST match the construct-time value */
+     621         [ +  - ]:         170 :   if (!valent_packet_get_string (packet, "deviceId", &device_id) ||
+     622         [ -  + ]:         170 :       !g_str_equal (device->id, device_id))
+     623                 :             :     {
+     624                 :           0 :       g_critical ("%s(): expected \"deviceId\" field holding \"%s\"",
+     625                 :             :                   G_STRFUNC,
+     626                 :             :                   device->id);
+     627                 :           0 :       valent_object_unlock (VALENT_OBJECT (device));
+     628                 :           0 :       VALENT_EXIT;
+     629                 :             :     }
+     630                 :             : 
+     631                 :             :   /* Device Name */
+     632         [ -  + ]:         170 :   if (!valent_packet_get_string (packet, "deviceName", &device_name))
+     633                 :           0 :     device_name = "Unnamed";
+     634                 :             : 
+     635         [ +  + ]:         170 :   if (g_set_str (&device->name, device_name))
+     636                 :          92 :     g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_NAME]);
+     637                 :             : 
+     638                 :             :   /* Device Type */
+     639         [ -  + ]:         170 :   if (!valent_packet_get_string (packet, "deviceType", &device_type))
+     640                 :           0 :     device_type = DEVICE_TYPE_DESKTOP;
+     641                 :             : 
+     642         [ +  + ]:         170 :   if (g_set_str (&device->type, device_type))
+     643                 :             :     {
+     644                 :          92 :       const char *device_icon = "computer-symbolic";
+     645                 :             : 
+     646         [ -  + ]:          92 :       if (g_str_equal (device_type, DEVICE_TYPE_DESKTOP))
+     647                 :             :         device_icon = "computer-symbolic";
+     648         [ +  - ]:          92 :       else if (g_str_equal (device_type, DEVICE_TYPE_LAPTOP))
+     649                 :             :         device_icon = "laptop-symbolic";
+     650         [ -  + ]:          92 :       else if (g_str_equal (device_type, DEVICE_TYPE_PHONE))
+     651                 :             :         device_icon = "phone-symbolic";
+     652         [ #  # ]:           0 :       else if (g_str_equal (device_type, DEVICE_TYPE_TABLET))
+     653                 :             :         device_icon = "tablet-symbolic";
+     654         [ #  # ]:           0 :       else if (g_str_equal (device_type, DEVICE_TYPE_TV))
+     655                 :          92 :         device_icon = "tv-symbolic";
+     656                 :             : 
+     657         [ +  - ]:          92 :       if (g_set_str (&device->icon_name, device_icon))
+     658                 :          92 :         g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_ICON_NAME]);
+     659                 :             :     }
+     660                 :             : 
+     661                 :             :   /* Generally, these should be static, but could change if the connection type
+     662                 :             :    * changes between eg. TCP and Bluetooth */
+     663         [ +  + ]:         170 :   g_clear_pointer (&device->incoming_capabilities, g_strfreev);
+     664                 :         170 :   device->incoming_capabilities = valent_packet_dup_strv (packet,
+     665                 :             :                                                           "incomingCapabilities");
+     666                 :             : 
+     667         [ +  + ]:         170 :   g_clear_pointer (&device->outgoing_capabilities, g_strfreev);
+     668                 :         170 :   device->outgoing_capabilities = valent_packet_dup_strv (packet,
+     669                 :             :                                                           "outgoingCapabilities");
+     670                 :             : 
+     671                 :         170 :   valent_object_unlock (VALENT_OBJECT (device));
+     672                 :             : 
+     673                 :             :   /* Recheck plugins and load or unload if capabilities have changed */
+     674                 :         170 :   valent_device_reload_plugins (device);
+     675                 :             : 
+     676                 :         170 :   VALENT_EXIT;
+     677                 :             : }
+     678                 :             : 
+     679                 :             : static void
+     680                 :        3501 : valent_device_handle_packet (ValentDevice *device,
+     681                 :             :                              JsonNode     *packet)
+     682                 :             : {
+     683                 :        3501 :   GPtrArray *handlers = NULL;
+     684                 :        3501 :   const char *type;
+     685                 :             : 
+     686         [ +  - ]:        3501 :   g_assert (VALENT_IS_DEVICE (device));
+     687         [ -  + ]:        3501 :   g_assert (VALENT_IS_PACKET (packet));
+     688                 :             : 
+     689                 :        3501 :   VALENT_JSON (packet, device->name);
+     690                 :             : 
+     691                 :        3501 :   type = valent_packet_get_type (packet);
+     692                 :             : 
+     693         [ +  + ]:        3501 :   if G_UNLIKELY (strcmp (type, "kdeconnect.pair") == 0)
+     694                 :             :     {
+     695                 :           5 :       valent_device_handle_pair (device, packet);
+     696                 :             :     }
+     697         [ +  + ]:        3496 :   else if G_UNLIKELY (!device->paired)
+     698                 :             :     {
+     699                 :           1 :       valent_device_send_pair (device, FALSE);
+     700                 :             :     }
+     701         [ +  + ]:        3495 :   else if ((handlers = g_hash_table_lookup (device->handlers, type)) != NULL)
+     702                 :             :     {
+     703         [ +  + ]:         254 :       for (unsigned int i = 0, len = handlers->len; i < len; i++)
+     704                 :             :         {
+     705                 :         127 :           ValentDevicePlugin *handler = g_ptr_array_index (handlers, i);
+     706                 :             : 
+     707                 :         127 :           valent_device_plugin_handle_packet (handler, type, packet);
+     708                 :             :         }
+     709                 :             :     }
+     710                 :             :   else
+     711                 :             :     {
+     712                 :        3501 :       VALENT_NOTE ("%s: Unsupported packet \"%s\"", device->name, type);
+     713                 :             :     }
+     714                 :        3501 : }
+     715                 :             : 
+     716                 :             : /*
+     717                 :             :  * ValentEngine callbacks
+     718                 :             :  */
+     719                 :             : static void
+     720                 :         799 : on_load_plugin (PeasEngine     *engine,
+     721                 :             :                 PeasPluginInfo *info,
+     722                 :             :                 ValentDevice   *self)
+     723                 :             : {
+     724                 :         799 :   ValentPlugin *plugin;
+     725                 :             : 
+     726         [ +  - ]:         799 :   g_assert (PEAS_IS_ENGINE (engine));
+     727         [ -  + ]:         799 :   g_assert (info != NULL);
+     728         [ -  + ]:         799 :   g_assert (VALENT_IS_DEVICE (self));
+     729                 :             : 
+     730         [ +  + ]:         799 :   if (!valent_device_supports_plugin (self, info))
+     731                 :             :     return;
+     732                 :             : 
+     733         [ +  + ]:         439 :   if (g_hash_table_contains (self->plugins, info))
+     734                 :             :     return;
+     735                 :             : 
+     736                 :         191 :   VALENT_NOTE ("%s: %s",
+     737                 :             :                self->name,
+     738                 :             :                peas_plugin_info_get_module_name (info));
+     739                 :             : 
+     740                 :             :   /* Register the plugin & data (hash tables are ref owners) */
+     741                 :         191 :   plugin = valent_plugin_new (self, self->context, info,
+     742                 :             :                               G_CALLBACK (on_plugin_enabled_changed));
+     743                 :         191 :   g_hash_table_insert (self->plugins, info, plugin);
+     744                 :             : 
+     745         [ +  - ]:         191 :   if (valent_plugin_get_enabled (plugin))
+     746                 :         191 :     valent_device_enable_plugin (self, plugin);
+     747                 :             : 
+     748                 :         191 :   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_PLUGINS]);
+     749                 :             : }
+     750                 :             : 
+     751                 :             : static void
+     752                 :         492 : on_unload_plugin (PeasEngine     *engine,
+     753                 :             :                   PeasPluginInfo *info,
+     754                 :             :                   ValentDevice   *device)
+     755                 :             : {
+     756         [ +  - ]:         492 :   g_assert (PEAS_IS_ENGINE (engine));
+     757         [ -  + ]:         492 :   g_assert (info != NULL);
+     758         [ -  + ]:         492 :   g_assert (VALENT_IS_DEVICE (device));
+     759                 :             : 
+     760         [ +  + ]:         492 :   if (!g_hash_table_contains (device->plugins, info))
+     761                 :             :     return;
+     762                 :             : 
+     763                 :           6 :   VALENT_NOTE ("%s: %s",
+     764                 :             :                device->name,
+     765                 :             :                peas_plugin_info_get_module_name (info));
+     766                 :             : 
+     767                 :           6 :   g_hash_table_remove (device->plugins, info);
+     768                 :           6 :   g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_PLUGINS]);
+     769                 :             : }
+     770                 :             : 
+     771                 :             : 
+     772                 :             : /*
+     773                 :             :  * GActions
+     774                 :             :  */
+     775                 :             : static void
+     776                 :           4 : pair_action (GSimpleAction *action,
+     777                 :             :              GVariant      *parameter,
+     778                 :             :              gpointer       user_data)
+     779                 :             : {
+     780                 :           4 :   ValentDevice *device = VALENT_DEVICE (user_data);
+     781                 :             : 
+     782                 :             :   /* We're accepting an incoming pair request */
+     783         [ +  + ]:           4 :   if (device->incoming_pair > 0)
+     784                 :             :     {
+     785                 :           1 :       valent_device_send_pair (device, TRUE);
+     786                 :           1 :       valent_device_set_paired (device, TRUE);
+     787                 :             :     }
+     788                 :             : 
+     789                 :             :   /* We're initiating an outgoing pair request */
+     790         [ +  - ]:           3 :   else if (!device->paired)
+     791                 :             :     {
+     792                 :           3 :       valent_device_reset_pair (device);
+     793                 :           3 :       valent_device_send_pair (device, TRUE);
+     794                 :           3 :       device->outgoing_pair = g_timeout_add_seconds (PAIR_REQUEST_TIMEOUT,
+     795                 :             :                                                      valent_device_reset_pair,
+     796                 :             :                                                      device);
+     797                 :           3 :       VALENT_NOTE ("Pair request sent to \"%s\"", device->name);
+     798                 :             : 
+     799                 :           3 :       g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_STATE]);
+     800                 :             :     }
+     801                 :           4 : }
+     802                 :             : 
+     803                 :             : static void
+     804                 :           3 : unpair_action (GSimpleAction *action,
+     805                 :             :                GVariant      *parameter,
+     806                 :             :                gpointer       user_data)
+     807                 :             : {
+     808                 :           3 :   ValentDevice *device = VALENT_DEVICE (user_data);
+     809                 :             : 
+     810                 :           3 :   valent_device_send_pair (device, FALSE);
+     811                 :           3 :   valent_device_set_paired (device, FALSE);
+     812                 :           3 : }
+     813                 :             : 
+     814                 :             : /*
+     815                 :             :  * ValentObject
+     816                 :             :  */
+     817                 :             : static void
+     818                 :          92 : valent_device_destroy (ValentObject *object)
+     819                 :             : {
+     820                 :          92 :   ValentDevice *self = VALENT_DEVICE (object);
+     821                 :             : 
+     822                 :             :   /* State */
+     823                 :          92 :   valent_device_reset_pair (self);
+     824                 :          92 :   valent_device_set_channel (self, NULL);
+     825                 :             : 
+     826                 :             :   /* Plugins */
+     827                 :          92 :   g_signal_handlers_disconnect_by_data (self->engine, self);
+     828                 :          92 :   g_hash_table_remove_all (self->plugins);
+     829                 :          92 :   g_hash_table_remove_all (self->actions);
+     830                 :          92 :   g_hash_table_remove_all (self->handlers);
+     831                 :             : 
+     832                 :          92 :   VALENT_OBJECT_CLASS (valent_device_parent_class)->destroy (object);
+     833                 :          92 : }
+     834                 :             : 
+     835                 :             : /*
+     836                 :             :  * GObject
+     837                 :             :  */
+     838                 :             : static void
+     839                 :          95 : valent_device_constructed (GObject *object)
+     840                 :             : {
+     841                 :          95 :   ValentDevice *self = VALENT_DEVICE (object);
+     842                 :         190 :   g_autofree char *path = NULL;
+     843                 :          95 :   unsigned int n_plugins = 0;
+     844                 :             : 
+     845                 :             :   /* We must at least have a device ID */
+     846         [ +  - ]:          95 :   g_assert (self->id != NULL);
+     847                 :             : 
+     848                 :             :   /* Context */
+     849         [ +  + ]:          95 :   if (self->context == NULL)
+     850                 :          88 :     self->context = valent_context_new (NULL, "device", self->id);
+     851                 :             : 
+     852                 :             :   /* GSettings*/
+     853                 :          95 :   path = g_strdup_printf ("/ca/andyholmes/valent/device/%s/", self->id);
+     854                 :          95 :   self->settings = g_settings_new_with_path ("ca.andyholmes.Valent.Device", path);
+     855                 :          95 :   self->paired = g_settings_get_boolean (self->settings, "paired");
+     856                 :             : 
+     857                 :             :   /* Load plugins and watch for changes */
+     858                 :          95 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (self->engine));
+     859                 :             : 
+     860         [ +  + ]:         549 :   for (unsigned int i = 0; i < n_plugins; i++)
+     861                 :             :     {
+     862                 :         454 :       g_autoptr (PeasPluginInfo) info = NULL;
+     863                 :             : 
+     864                 :         454 :       info = g_list_model_get_item (G_LIST_MODEL (self->engine), i);
+     865                 :             : 
+     866         [ +  + ]:         454 :       if (peas_plugin_info_is_loaded (info))
+     867                 :         453 :         on_load_plugin (self->engine, info, self);
+     868                 :             :     }
+     869                 :             : 
+     870                 :          95 :   g_signal_connect_object (self->engine,
+     871                 :             :                            "load-plugin",
+     872                 :             :                            G_CALLBACK (on_load_plugin),
+     873                 :             :                            self,
+     874                 :             :                            G_CONNECT_AFTER);
+     875                 :             : 
+     876                 :          95 :   g_signal_connect_object (self->engine,
+     877                 :             :                            "unload-plugin",
+     878                 :             :                            G_CALLBACK (on_unload_plugin),
+     879                 :             :                            self,
+     880                 :             :                            0);
+     881                 :             : 
+     882                 :          95 :   G_OBJECT_CLASS (valent_device_parent_class)->constructed (object);
+     883                 :          95 : }
+     884                 :             : 
+     885                 :             : static void
+     886                 :          92 : valent_device_finalize (GObject *object)
+     887                 :             : {
+     888                 :          92 :   ValentDevice *self = VALENT_DEVICE (object);
+     889                 :             : 
+     890         [ +  - ]:          92 :   g_clear_object (&self->context);
+     891         [ +  - ]:          92 :   g_clear_object (&self->settings);
+     892                 :             : 
+     893                 :             :   /* Properties */
+     894         [ +  + ]:          92 :   g_clear_pointer (&self->icon_name, g_free);
+     895         [ +  - ]:          92 :   g_clear_pointer (&self->id, g_free);
+     896         [ +  + ]:          92 :   g_clear_pointer (&self->name, g_free);
+     897         [ +  + ]:          92 :   g_clear_pointer (&self->type, g_free);
+     898         [ +  + ]:          92 :   g_clear_pointer (&self->incoming_capabilities, g_strfreev);
+     899         [ +  + ]:          92 :   g_clear_pointer (&self->outgoing_capabilities, g_strfreev);
+     900                 :             : 
+     901                 :             :   /* State */
+     902         [ -  + ]:          92 :   g_clear_object (&self->channel);
+     903                 :             : 
+     904                 :             :   /* Plugins */
+     905         [ +  - ]:          92 :   g_clear_pointer (&self->plugins, g_hash_table_unref);
+     906         [ +  - ]:          92 :   g_clear_pointer (&self->actions, g_hash_table_unref);
+     907         [ +  - ]:          92 :   g_clear_pointer (&self->handlers, g_hash_table_unref);
+     908         [ +  - ]:          92 :   g_clear_object (&self->menu);
+     909                 :             : 
+     910                 :          92 :   G_OBJECT_CLASS (valent_device_parent_class)->finalize (object);
+     911                 :          92 : }
+     912                 :             : 
+     913                 :             : static void
+     914                 :          28 : valent_device_get_property (GObject    *object,
+     915                 :             :                             guint       prop_id,
+     916                 :             :                             GValue     *value,
+     917                 :             :                             GParamSpec *pspec)
+     918                 :             : {
+     919                 :          28 :   ValentDevice *self = VALENT_DEVICE (object);
+     920                 :             : 
+     921   [ +  +  +  +  :          28 :   switch (prop_id)
+                +  +  - ]
+     922                 :             :     {
+     923                 :           1 :     case PROP_CONTEXT:
+     924                 :           1 :       g_value_set_object (value, self->context);
+     925                 :           1 :       break;
+     926                 :             : 
+     927                 :           3 :     case PROP_ICON_NAME:
+     928                 :           3 :       g_value_set_string (value, self->icon_name);
+     929                 :           3 :       break;
+     930                 :             : 
+     931                 :           7 :     case PROP_ID:
+     932                 :           7 :       g_value_set_string (value, self->id);
+     933                 :           7 :       break;
+     934                 :             : 
+     935                 :          13 :     case PROP_NAME:
+     936                 :          13 :       g_value_set_string (value, self->name);
+     937                 :          13 :       break;
+     938                 :             : 
+     939                 :           2 :     case PROP_PLUGINS:
+     940                 :           2 :       g_value_take_boxed (value, valent_device_get_plugins (self));
+     941                 :           2 :       break;
+     942                 :             : 
+     943                 :           2 :     case PROP_STATE:
+     944                 :           2 :       g_value_set_flags (value, valent_device_get_state (self));
+     945                 :           2 :       break;
+     946                 :             : 
+     947                 :           0 :     default:
+     948                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     949                 :             :     }
+     950                 :          28 : }
+     951                 :             : 
+     952                 :             : static void
+     953                 :         190 : valent_device_set_property (GObject      *object,
+     954                 :             :                             guint         prop_id,
+     955                 :             :                             const GValue *value,
+     956                 :             :                             GParamSpec   *pspec)
+     957                 :             : {
+     958                 :         190 :   ValentDevice *self = VALENT_DEVICE (object);
+     959                 :             : 
+     960      [ +  +  - ]:         190 :   switch (prop_id)
+     961                 :             :     {
+     962                 :          95 :     case PROP_CONTEXT:
+     963                 :          95 :       self->context = g_value_dup_object (value);
+     964                 :          95 :       break;
+     965                 :             : 
+     966                 :          95 :     case PROP_ID:
+     967                 :          95 :       self->id = g_value_dup_string (value);
+     968                 :          95 :       break;
+     969                 :             : 
+     970                 :           0 :     default:
+     971                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     972                 :             :     }
+     973                 :         190 : }
+     974                 :             : 
+     975                 :             : static void
+     976                 :          95 : valent_device_init (ValentDevice *self)
+     977                 :             : {
+     978                 :          95 :   GSimpleAction *action = NULL;
+     979                 :             : 
+     980                 :             :   /* Plugins */
+     981                 :          95 :   self->engine = valent_get_plugin_engine ();
+     982                 :          95 :   self->plugins = g_hash_table_new_full (NULL, NULL, NULL, device_plugin_free);
+     983                 :          95 :   self->handlers = g_hash_table_new_full (g_str_hash,
+     984                 :             :                                           g_str_equal,
+     985                 :             :                                           g_free,
+     986                 :             :                                           (GDestroyNotify)g_ptr_array_unref);
+     987                 :          95 :   self->actions = g_hash_table_new_full (g_str_hash,
+     988                 :             :                                          g_str_equal,
+     989                 :             :                                          g_free,
+     990                 :             :                                          g_object_unref);
+     991                 :          95 :   self->menu = g_menu_new ();
+     992                 :             : 
+     993                 :             :   /* Stock Actions */
+     994                 :          95 :   action = g_simple_action_new ("pair", NULL);
+     995                 :          95 :   g_signal_connect_object (action,
+     996                 :             :                            "activate",
+     997                 :             :                            G_CALLBACK (pair_action),
+     998                 :             :                            self, 0);
+     999                 :          95 :   g_hash_table_replace (self->actions,
+    1000                 :          95 :                         g_strdup ("pair"),
+    1001                 :             :                         g_steal_pointer (&action));
+    1002                 :             : 
+    1003                 :          95 :   action = g_simple_action_new ("unpair", NULL);
+    1004                 :          95 :   g_signal_connect_object (action,
+    1005                 :             :                            "activate",
+    1006                 :             :                            G_CALLBACK (unpair_action),
+    1007                 :             :                            self, 0);
+    1008                 :          95 :   g_hash_table_replace (self->actions,
+    1009                 :          95 :                         g_strdup ("unpair"),
+    1010                 :             :                         g_steal_pointer (&action));
+    1011                 :          95 : }
+    1012                 :             : 
+    1013                 :             : static void
+    1014                 :          33 : valent_device_class_init (ValentDeviceClass *klass)
+    1015                 :             : {
+    1016                 :          33 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    1017                 :          33 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+    1018                 :             : 
+    1019                 :          33 :   object_class->constructed = valent_device_constructed;
+    1020                 :          33 :   object_class->finalize = valent_device_finalize;
+    1021                 :          33 :   object_class->get_property = valent_device_get_property;
+    1022                 :          33 :   object_class->set_property = valent_device_set_property;
+    1023                 :             : 
+    1024                 :          33 :   vobject_class->destroy = valent_device_destroy;
+    1025                 :             : 
+    1026                 :             :   /**
+    1027                 :             :    * ValentDevice:context: (getter get_context)
+    1028                 :             :    *
+    1029                 :             :    * The data context.
+    1030                 :             :    *
+    1031                 :             :    * Since: 1.0
+    1032                 :             :    */
+    1033                 :          66 :   properties [PROP_CONTEXT] =
+    1034                 :          33 :     g_param_spec_object ("context", NULL, NULL,
+    1035                 :             :                          VALENT_TYPE_CONTEXT,
+    1036                 :             :                          (G_PARAM_READWRITE |
+    1037                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+    1038                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+    1039                 :             :                           G_PARAM_STATIC_STRINGS));
+    1040                 :             : 
+    1041                 :             :   /**
+    1042                 :             :    * ValentDevice:icon-name: (getter get_icon_name)
+    1043                 :             :    *
+    1044                 :             :    * A symbolic icon name for the device.
+    1045                 :             :    *
+    1046                 :             :    * Since: 1.0
+    1047                 :             :    */
+    1048                 :          66 :   properties [PROP_ICON_NAME] =
+    1049                 :          33 :     g_param_spec_string ("icon-name", NULL, NULL,
+    1050                 :             :                          "computer-symbolic",
+    1051                 :             :                          (G_PARAM_READABLE |
+    1052                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+    1053                 :             :                           G_PARAM_STATIC_STRINGS));
+    1054                 :             : 
+    1055                 :             :   /**
+    1056                 :             :    * ValentDevice:id: (getter get_id)
+    1057                 :             :    *
+    1058                 :             :    * A unique ID for the device.
+    1059                 :             :    *
+    1060                 :             :    * By convention, the single source of truth for a device ID in KDE Connect is
+    1061                 :             :    * the common name of its TLS certificate. It is not well-defined how this ID
+    1062                 :             :    * is generated, however.
+    1063                 :             :    *
+    1064                 :             :    * Since: 1.0
+    1065                 :             :    */
+    1066                 :          66 :   properties [PROP_ID] =
+    1067                 :          33 :     g_param_spec_string ("id", NULL, NULL,
+    1068                 :             :                          NULL,
+    1069                 :             :                          (G_PARAM_READWRITE |
+    1070                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+    1071                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+    1072                 :             :                           G_PARAM_STATIC_STRINGS));
+    1073                 :             : 
+    1074                 :             :   /**
+    1075                 :             :    * ValentDevice:name: (getter get_name)
+    1076                 :             :    *
+    1077                 :             :    * A display name for the device.
+    1078                 :             :    *
+    1079                 :             :    * Since: 1.0
+    1080                 :             :    */
+    1081                 :          66 :   properties [PROP_NAME] =
+    1082                 :          33 :     g_param_spec_string ("name", NULL, NULL,
+    1083                 :             :                          NULL,
+    1084                 :             :                          (G_PARAM_READABLE |
+    1085                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+    1086                 :             :                           G_PARAM_STATIC_STRINGS));
+    1087                 :             : 
+    1088                 :             :   /**
+    1089                 :             :    * ValentDevice:plugins: (getter get_plugins)
+    1090                 :             :    *
+    1091                 :             :    * A list of loaded plugin names.
+    1092                 :             :    *
+    1093                 :             :    * Since: 1.0
+    1094                 :             :    */
+    1095                 :          66 :   properties [PROP_PLUGINS] =
+    1096                 :          33 :     g_param_spec_boxed ("plugins", NULL, NULL,
+    1097                 :             :                         G_TYPE_STRV,
+    1098                 :             :                         (G_PARAM_READABLE |
+    1099                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+    1100                 :             :                          G_PARAM_STATIC_STRINGS));
+    1101                 :             : 
+    1102                 :             :   /**
+    1103                 :             :    * ValentDevice:state: (getter get_state)
+    1104                 :             :    *
+    1105                 :             :    * The state of the device.
+    1106                 :             :    *
+    1107                 :             :    * Since: 1.0
+    1108                 :             :    */
+    1109                 :          66 :   properties [PROP_STATE] =
+    1110                 :          33 :     g_param_spec_flags ("state", NULL, NULL,
+    1111                 :             :                         VALENT_TYPE_DEVICE_STATE,
+    1112                 :             :                         VALENT_DEVICE_STATE_NONE,
+    1113                 :             :                         (G_PARAM_READABLE |
+    1114                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+    1115                 :             :                          G_PARAM_STATIC_STRINGS));
+    1116                 :             : 
+    1117                 :          33 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+    1118                 :          33 : }
+    1119                 :             : 
+    1120                 :             : /**
+    1121                 :             :  * valent_device_new:
+    1122                 :             :  * @id: (not nullable): a device ID
+    1123                 :             :  *
+    1124                 :             :  * Create a new device for @id.
+    1125                 :             :  *
+    1126                 :             :  * Returns: (transfer full) (nullable): a new `ValentDevice`
+    1127                 :             :  *
+    1128                 :             :  * Since: 1.0
+    1129                 :             :  */
+    1130                 :             : ValentDevice *
+    1131                 :           1 : valent_device_new (const char *id)
+    1132                 :             : {
+    1133   [ +  -  +  - ]:           1 :   g_return_val_if_fail (id != NULL && *id != '\0', NULL);
+    1134                 :             : 
+    1135                 :           1 :   return g_object_new (VALENT_TYPE_DEVICE,
+    1136                 :             :                        "id", id,
+    1137                 :             :                        NULL);
+    1138                 :             : }
+    1139                 :             : 
+    1140                 :             : /*< private >
+    1141                 :             :  * valent_device_new_full:
+    1142                 :             :  * @identity: a KDE Connect identity packet
+    1143                 :             :  * @context: (nullable): a `ValentContext`
+    1144                 :             :  *
+    1145                 :             :  * Create a new device for @identity.
+    1146                 :             :  *
+    1147                 :             :  * Returns: (transfer full) (nullable): a new `ValentDevice`
+    1148                 :             :  */
+    1149                 :             : ValentDevice *
+    1150                 :          92 : valent_device_new_full (JsonNode      *identity,
+    1151                 :             :                         ValentContext *context)
+    1152                 :             : {
+    1153                 :          92 :   ValentDevice *ret;
+    1154                 :          92 :   const char *id;
+    1155                 :             : 
+    1156         [ +  - ]:          92 :   g_return_val_if_fail (VALENT_IS_PACKET (identity), NULL);
+    1157                 :             : 
+    1158         [ -  + ]:          92 :   if (!valent_packet_get_string (identity, "deviceId", &id))
+    1159                 :             :     {
+    1160                 :           0 :       g_critical ("%s(): missing \"deviceId\" field", G_STRFUNC);
+    1161                 :           0 :       return NULL;
+    1162                 :             :     }
+    1163                 :             : 
+    1164                 :          92 :   ret = g_object_new (VALENT_TYPE_DEVICE,
+    1165                 :             :                       "id",      id,
+    1166                 :             :                       "context", context,
+    1167                 :             :                       NULL);
+    1168                 :          92 :   valent_device_handle_identity (ret, identity);
+    1169                 :             : 
+    1170                 :          92 :   return ret;
+    1171                 :             : }
+    1172                 :             : 
+    1173                 :             : static void
+    1174                 :         134 : valent_device_send_packet_cb (ValentChannel *channel,
+    1175                 :             :                               GAsyncResult  *result,
+    1176                 :             :                               gpointer       user_data)
+    1177                 :             : {
+    1178                 :         134 :   g_autoptr (GTask) task = G_TASK (user_data);
+    1179                 :         134 :   ValentDevice *device = g_task_get_source_object (task);
+    1180   [ +  -  +  - ]:         134 :   g_autoptr (GError) error = NULL;
+    1181                 :             : 
+    1182         [ +  - ]:         134 :   g_assert (VALENT_IS_DEVICE (device));
+    1183                 :             : 
+    1184         [ +  + ]:         134 :   if (valent_channel_write_packet_finish (channel, result, &error))
+    1185         [ -  + ]:         132 :     return g_task_return_boolean (task, TRUE);
+    1186                 :             : 
+    1187                 :           2 :   VALENT_NOTE ("%s: %s", device->name, error->message);
+    1188                 :           2 :   g_task_return_error (task, g_steal_pointer (&error));
+    1189                 :             : 
+    1190                 :           2 :   valent_object_lock (VALENT_OBJECT (device));
+    1191         [ -  + ]:           2 :   if (device->channel == channel)
+    1192                 :           0 :     valent_device_set_channel (device, NULL);
+    1193         [ -  + ]:           2 :   valent_object_unlock (VALENT_OBJECT (device));
+    1194                 :             : }
+    1195                 :             : 
+    1196                 :             : /**
+    1197                 :             :  * valent_device_send_packet:
+    1198                 :             :  * @device: a `ValentDevice`
+    1199                 :             :  * @packet: a KDE Connect packet
+    1200                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1201                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1202                 :             :  * @user_data: (closure): user supplied data
+    1203                 :             :  *
+    1204                 :             :  * Send a KDE Connect packet to the device.
+    1205                 :             :  *
+    1206                 :             :  * Call [method@Valent.Device.send_packet_finish] to get the result.
+    1207                 :             :  *
+    1208                 :             :  * If @device is disconnected or unpaired when this method is called,
+    1209                 :             :  * %G_IO_ERROR_NOT_CONNECTED or %G_IO_ERROR_PERMISSION_DENIED will be set on the
+    1210                 :             :  * result, respectively.
+    1211                 :             :  *
+    1212                 :             :  * Since: 1.0
+    1213                 :             :  */
+    1214                 :             : void
+    1215                 :         136 : valent_device_send_packet (ValentDevice        *device,
+    1216                 :             :                            JsonNode            *packet,
+    1217                 :             :                            GCancellable        *cancellable,
+    1218                 :             :                            GAsyncReadyCallback  callback,
+    1219                 :             :                            gpointer             user_data)
+    1220                 :             : {
+    1221                 :         134 :   g_autoptr (GTask) task = NULL;
+    1222                 :             : 
+    1223         [ +  - ]:         136 :   g_return_if_fail (VALENT_IS_DEVICE (device));
+    1224         [ -  + ]:         136 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+    1225                 :             : 
+    1226                 :         136 :   valent_object_lock (VALENT_OBJECT (device));
+    1227                 :             : 
+    1228         [ +  + ]:         136 :   if G_UNLIKELY (device->channel == NULL)
+    1229                 :             :     {
+    1230                 :           1 :       valent_object_unlock (VALENT_OBJECT (device));
+    1231                 :           1 :       return g_task_report_new_error (device,
+    1232                 :             :                                       callback,
+    1233                 :             :                                       user_data,
+    1234                 :             :                                       valent_device_send_packet,
+    1235                 :             :                                       G_IO_ERROR,
+    1236                 :             :                                       G_IO_ERROR_NOT_CONNECTED,
+    1237                 :             :                                       "%s is disconnected", device->name);
+    1238                 :             :     }
+    1239                 :             : 
+    1240         [ +  + ]:         135 :   if G_UNLIKELY (!device->paired)
+    1241                 :             :     {
+    1242                 :           1 :       valent_object_unlock (VALENT_OBJECT (device));
+    1243                 :           1 :       return g_task_report_new_error (device,
+    1244                 :             :                                       callback,
+    1245                 :             :                                       user_data,
+    1246                 :             :                                       valent_device_send_packet,
+    1247                 :             :                                       G_IO_ERROR,
+    1248                 :             :                                       G_IO_ERROR_PERMISSION_DENIED,
+    1249                 :             :                                       "%s is unpaired", device->name);
+    1250                 :             :     }
+    1251                 :             : 
+    1252                 :         134 :   task = g_task_new (device, cancellable, callback, user_data);
+    1253         [ +  - ]:         134 :   g_task_set_source_tag (task, valent_device_send_packet);
+    1254                 :             : 
+    1255                 :         134 :   VALENT_JSON (packet, device->name);
+    1256                 :         134 :   valent_channel_write_packet (device->channel,
+    1257                 :             :                                packet,
+    1258                 :             :                                cancellable,
+    1259                 :             :                                (GAsyncReadyCallback)valent_device_send_packet_cb,
+    1260                 :             :                                g_steal_pointer (&task));
+    1261                 :             : 
+    1262                 :         134 :   valent_object_unlock (VALENT_OBJECT (device));
+    1263                 :             : }
+    1264                 :             : 
+    1265                 :             : /**
+    1266                 :             :  * valent_device_send_packet_finish:
+    1267                 :             :  * @device: a `ValentDevice`
+    1268                 :             :  * @result: a `GAsyncResult`
+    1269                 :             :  * @error: (nullable): a `GError`
+    1270                 :             :  *
+    1271                 :             :  * Finish an operation started by [method@Valent.Device.send_packet].
+    1272                 :             :  *
+    1273                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+    1274                 :             :  *
+    1275                 :             :  * Since: 1.0
+    1276                 :             :  */
+    1277                 :             : gboolean
+    1278                 :         118 : valent_device_send_packet_finish (ValentDevice  *device,
+    1279                 :             :                                   GAsyncResult  *result,
+    1280                 :             :                                   GError       **error)
+    1281                 :             : {
+    1282         [ +  - ]:         118 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), FALSE);
+    1283         [ -  + ]:         118 :   g_return_val_if_fail (g_task_is_valid (result, device), FALSE);
+    1284   [ +  -  -  + ]:         118 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+    1285                 :             : 
+    1286                 :         118 :   return g_task_propagate_boolean (G_TASK (result), error);
+    1287                 :             : }
+    1288                 :             : 
+    1289                 :             : /**
+    1290                 :             :  * valent_device_ref_channel:
+    1291                 :             :  * @device: a `ValentDevice`
+    1292                 :             :  *
+    1293                 :             :  * Get the active channel.
+    1294                 :             :  *
+    1295                 :             :  * Returns: (transfer full) (nullable): a `ValentChannel`, or %NULL if disconnected
+    1296                 :             :  *
+    1297                 :             :  * Since: 1.0
+    1298                 :             :  */
+    1299                 :             : ValentChannel *
+    1300                 :          33 : valent_device_ref_channel (ValentDevice *device)
+    1301                 :             : {
+    1302                 :          33 :   ValentChannel *ret = NULL;
+    1303                 :             : 
+    1304         [ +  - ]:          33 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+    1305                 :             : 
+    1306                 :          33 :   valent_object_lock (VALENT_OBJECT (device));
+    1307         [ +  - ]:          33 :   if (device->channel != NULL)
+    1308                 :          33 :     ret = g_object_ref (device->channel);
+    1309                 :          33 :   valent_object_unlock (VALENT_OBJECT (device));
+    1310                 :             : 
+    1311                 :          33 :   return ret;
+    1312                 :             : }
+    1313                 :             : 
+    1314                 :             : static void
+    1315                 :        3579 : read_packet_cb (ValentChannel *channel,
+    1316                 :             :                 GAsyncResult  *result,
+    1317                 :             :                 ValentDevice  *device)
+    1318                 :             : {
+    1319                 :        7158 :   g_autoptr (GError) error = NULL;
+    1320         [ +  + ]:        3579 :   g_autoptr (JsonNode) packet = NULL;
+    1321                 :             : 
+    1322         [ +  - ]:        3579 :   g_assert (VALENT_IS_CHANNEL (channel));
+    1323         [ -  + ]:        3579 :   g_assert (VALENT_IS_DEVICE (device));
+    1324                 :             : 
+    1325                 :        3579 :   packet = valent_channel_read_packet_finish (channel, result, &error);
+    1326                 :             : 
+    1327                 :             :   /* On success, queue another read before handling the packet */
+    1328         [ +  + ]:        3579 :   if (packet != NULL)
+    1329                 :             :     {
+    1330                 :        3501 :       valent_channel_read_packet (channel,
+    1331                 :             :                                   NULL,
+    1332                 :             :                                   (GAsyncReadyCallback)read_packet_cb,
+    1333                 :             :                                   g_object_ref (device));
+    1334                 :             : 
+    1335                 :        3501 :       valent_device_handle_packet (device, packet);
+    1336                 :             :     }
+    1337                 :             : 
+    1338                 :             :   /* On failure, drop our reference if it's still the active channel */
+    1339                 :             :   else
+    1340                 :             :     {
+    1341                 :          78 :       VALENT_NOTE ("%s: %s", device->name, error->message);
+    1342                 :             : 
+    1343                 :          78 :       valent_object_lock (VALENT_OBJECT (device));
+    1344         [ +  + ]:          78 :       if (device->channel == channel)
+    1345                 :          74 :         valent_device_set_channel (device, NULL);
+    1346                 :          78 :       valent_object_unlock (VALENT_OBJECT (device));
+    1347                 :             :     }
+    1348                 :             : 
+    1349         [ +  + ]:        3579 :   g_object_unref (device);
+    1350                 :        3579 : }
+    1351                 :             : 
+    1352                 :             : /**
+    1353                 :             :  * valent_device_set_channel:
+    1354                 :             :  * @device: A `ValentDevice`
+    1355                 :             :  * @channel: (nullable): A `ValentChannel`
+    1356                 :             :  *
+    1357                 :             :  * Sets the active channel.
+    1358                 :             :  *
+    1359                 :             :  * Since: 1.0
+    1360                 :             :  */
+    1361                 :             : void
+    1362                 :         249 : valent_device_set_channel (ValentDevice  *device,
+    1363                 :             :                            ValentChannel *channel)
+    1364                 :             : {
+    1365                 :         249 :   gboolean was_connected;
+    1366                 :         249 :   gboolean is_connected;
+    1367                 :             : 
+    1368         [ +  - ]:         249 :   g_return_if_fail (VALENT_IS_DEVICE (device));
+    1369   [ +  +  -  + ]:         249 :   g_return_if_fail (channel == NULL || VALENT_IS_CHANNEL (channel));
+    1370                 :             : 
+    1371                 :         249 :   valent_object_lock (VALENT_OBJECT (device));
+    1372                 :             : 
+    1373         [ +  + ]:         249 :   if (device->channel == channel)
+    1374                 :             :     {
+    1375                 :          93 :       valent_object_unlock (VALENT_OBJECT (device));
+    1376                 :          93 :       return;
+    1377                 :             :     }
+    1378                 :             : 
+    1379                 :             :   /* If there's an active channel, close it asynchronously and drop our
+    1380                 :             :    * reference so the task holds the final reference. */
+    1381         [ +  + ]:         156 :   if ((was_connected = (device->channel != NULL)))
+    1382                 :             :     {
+    1383                 :          78 :       valent_channel_close_async (device->channel, NULL, NULL, NULL);
+    1384         [ +  - ]:          78 :       g_clear_object (&device->channel);
+    1385                 :             :     }
+    1386                 :             : 
+    1387                 :             :   /* If there's a new channel, handle the peer identity and queue the first
+    1388                 :             :    * read operation before notifying of the state change. */
+    1389         [ +  + ]:         156 :   if ((is_connected = g_set_object (&device->channel, channel)))
+    1390                 :             :     {
+    1391                 :          78 :       JsonNode *peer_identity;
+    1392                 :             : 
+    1393                 :             :       /* Handle the peer identity packet */
+    1394                 :          78 :       peer_identity = valent_channel_get_peer_identity (channel);
+    1395                 :          78 :       valent_device_handle_identity (device, peer_identity);
+    1396                 :             : 
+    1397                 :             :       /* Start receiving packets */
+    1398                 :          78 :       valent_channel_read_packet (channel,
+    1399                 :             :                                   NULL,
+    1400                 :             :                                   (GAsyncReadyCallback)read_packet_cb,
+    1401                 :             :                                   g_object_ref (device));
+    1402                 :             :     }
+    1403                 :             : 
+    1404                 :         156 :   valent_object_unlock (VALENT_OBJECT (device));
+    1405                 :             : 
+    1406                 :             :   /* If the state changed, update the plugins and notify */
+    1407         [ +  - ]:         156 :   if (is_connected == was_connected)
+    1408                 :             :     return;
+    1409                 :             : 
+    1410                 :         156 :   valent_device_update_plugins (device);
+    1411                 :         156 :   g_object_notify_by_pspec (G_OBJECT (device), properties [PROP_STATE]);
+    1412                 :             : }
+    1413                 :             : 
+    1414                 :             : /**
+    1415                 :             :  * valent_device_get_context: (get-property context)
+    1416                 :             :  * @device: a `ValentDevice`
+    1417                 :             :  *
+    1418                 :             :  * Get the data context.
+    1419                 :             :  *
+    1420                 :             :  * Returns: (transfer full): a `ValentContext`
+    1421                 :             :  *
+    1422                 :             :  * Since: 1.0
+    1423                 :             :  */
+    1424                 :             : ValentContext *
+    1425                 :          84 : valent_device_get_context (ValentDevice *device)
+    1426                 :             : {
+    1427         [ +  - ]:          84 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+    1428                 :             : 
+    1429                 :          84 :   return device->context;
+    1430                 :             : }
+    1431                 :             : 
+    1432                 :             : /**
+    1433                 :             :  * valent_device_get_icon_name: (get-property icon-name)
+    1434                 :             :  * @device: a `ValentDevice`
+    1435                 :             :  *
+    1436                 :             :  * Get the symbolic icon name.
+    1437                 :             :  *
+    1438                 :             :  * Returns: (transfer none): the icon name.
+    1439                 :             :  *
+    1440                 :             :  * Since: 1.0
+    1441                 :             :  */
+    1442                 :             : const char *
+    1443                 :           5 : valent_device_get_icon_name (ValentDevice *device)
+    1444                 :             : {
+    1445         [ +  - ]:           5 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), "computer-symbolic");
+    1446                 :             : 
+    1447                 :           5 :   return device->icon_name;
+    1448                 :             : }
+    1449                 :             : 
+    1450                 :             : /**
+    1451                 :             :  * valent_device_get_id: (get-property id)
+    1452                 :             :  * @device: a `ValentDevice`
+    1453                 :             :  *
+    1454                 :             :  * Get the unique ID.
+    1455                 :             :  *
+    1456                 :             :  * Returns: (transfer none): the device id.
+    1457                 :             :  *
+    1458                 :             :  * Since: 1.0
+    1459                 :             :  */
+    1460                 :             : const char *
+    1461                 :          58 : valent_device_get_id (ValentDevice *device)
+    1462                 :             : {
+    1463         [ +  - ]:          58 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+    1464         [ -  + ]:          58 :   g_return_val_if_fail (device->id != NULL, NULL);
+    1465                 :             : 
+    1466                 :             :   return device->id;
+    1467                 :             : }
+    1468                 :             : 
+    1469                 :             : /**
+    1470                 :             :  * valent_device_get_menu:
+    1471                 :             :  * @device: a `ValentDevice`
+    1472                 :             :  *
+    1473                 :             :  * Get the [class@Gio.MenuModel] of the device.
+    1474                 :             :  *
+    1475                 :             :  * Plugins may add items and submenus to this when they want to expose actions
+    1476                 :             :  * with presentation details like a label or icon.
+    1477                 :             :  *
+    1478                 :             :  * Returns: (transfer none): a `GMenuModel`
+    1479                 :             :  *
+    1480                 :             :  * Since: 1.0
+    1481                 :             :  */
+    1482                 :             : GMenuModel *
+    1483                 :         451 : valent_device_get_menu (ValentDevice *device)
+    1484                 :             : {
+    1485         [ +  - ]:         451 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+    1486                 :             : 
+    1487                 :         451 :   return G_MENU_MODEL (device->menu);
+    1488                 :             : }
+    1489                 :             : 
+    1490                 :             : /**
+    1491                 :             :  * valent_device_get_name:
+    1492                 :             :  * @device: a `ValentDevice`
+    1493                 :             :  *
+    1494                 :             :  * Get the display name of the device.
+    1495                 :             :  *
+    1496                 :             :  * Returns: (transfer none) (nullable): a display name, or %NULL if unset
+    1497                 :             :  *
+    1498                 :             :  * Since: 1.0
+    1499                 :             :  */
+    1500                 :             : const char *
+    1501                 :          52 : valent_device_get_name (ValentDevice *device)
+    1502                 :             : {
+    1503         [ +  - ]:          52 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+    1504                 :             : 
+    1505                 :          52 :   return device->name;
+    1506                 :             : }
+    1507                 :             : 
+    1508                 :             : /**
+    1509                 :             :  * valent_device_set_paired:
+    1510                 :             :  * @device: a `ValentDevice`
+    1511                 :             :  * @paired: %TRUE if paired, %FALSE if unpaired
+    1512                 :             :  *
+    1513                 :             :  * Set the paired state of the device.
+    1514                 :             :  *
+    1515                 :             :  * NOTE: since valent_device_update_plugins() will be called as a side effect,
+    1516                 :             :  * this must be called after valent_device_send_pair().
+    1517                 :             :  */
+    1518                 :             : void
+    1519                 :          95 : valent_device_set_paired (ValentDevice *device,
+    1520                 :             :                           gboolean      paired)
+    1521                 :             : {
+    1522         [ +  - ]:          95 :   g_assert (VALENT_IS_DEVICE (device));
+    1523                 :             : 
+    1524                 :          95 :   valent_object_lock (VALENT_OBJECT (device));
+    1525                 :             : 
+    1526                 :             :   /* If nothing's changed, only reset pending pair timeouts */
+    1527         [ +  + ]:          95 :   if (device->paired == paired)
+    1528                 :             :     {
+    1529                 :          55 :       valent_device_reset_pair (device);
+    1530                 :          55 :       valent_object_unlock (VALENT_OBJECT (device));
+    1531                 :          55 :       return;
+    1532                 :             :     }
+    1533                 :             : 
+    1534                 :             :   /* FIXME: If we're connected store/clear connection data */
+    1535   [ +  +  +  + ]:          40 :   if (paired && device->channel != NULL)
+    1536                 :           5 :     valent_channel_store_data (device->channel, device->context);
+    1537                 :             :   else if (!paired)
+    1538                 :           6 :     valent_context_clear (device->context);
+    1539                 :             : 
+    1540                 :          40 :   device->paired = paired;
+    1541                 :          40 :   g_settings_set_boolean (device->settings, "paired", device->paired);
+    1542                 :             : 
+    1543                 :          40 :   valent_object_unlock (VALENT_OBJECT (device));
+    1544                 :             : 
+    1545                 :             :   /* Update plugins and notify */
+    1546                 :          40 :   valent_device_update_plugins (device);
+    1547                 :          40 :   valent_device_reset_pair (device);
+    1548                 :             : }
+    1549                 :             : 
+    1550                 :             : /**
+    1551                 :             :  * valent_device_get_plugins: (get-property plugins)
+    1552                 :             :  * @device: a `ValentDevice`
+    1553                 :             :  *
+    1554                 :             :  * Get a list of the loaded plugins.
+    1555                 :             :  *
+    1556                 :             :  * Returns: (transfer full): a list of loaded plugins
+    1557                 :             :  *
+    1558                 :             :  * Since: 1.0
+    1559                 :             :  */
+    1560                 :             : GStrv
+    1561                 :          95 : valent_device_get_plugins (ValentDevice *device)
+    1562                 :             : {
+    1563                 :         190 :   g_autoptr (GStrvBuilder) builder = NULL;
+    1564                 :          95 :   GHashTableIter iter;
+    1565                 :          95 :   PeasPluginInfo *info;
+    1566                 :             : 
+    1567         [ +  - ]:          95 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+    1568                 :             : 
+    1569                 :          95 :   builder = g_strv_builder_new ();
+    1570                 :          95 :   g_hash_table_iter_init (&iter, device->plugins);
+    1571                 :             : 
+    1572         [ +  + ]:         276 :   while (g_hash_table_iter_next (&iter, (void **)&info, NULL))
+    1573                 :         181 :     g_strv_builder_add (builder, peas_plugin_info_get_module_name (info));
+    1574                 :             : 
+    1575                 :          95 :   return g_strv_builder_end (builder);
+    1576                 :             : }
+    1577                 :             : 
+    1578                 :             : /**
+    1579                 :             :  * valent_device_get_state: (get-property state)
+    1580                 :             :  * @device: a `ValentDevice`
+    1581                 :             :  *
+    1582                 :             :  * Get the state of the device.
+    1583                 :             :  *
+    1584                 :             :  * Returns: `ValentDeviceState` flags describing the state of the device
+    1585                 :             :  *
+    1586                 :             :  * Since: 1.0
+    1587                 :             :  */
+    1588                 :             : ValentDeviceState
+    1589                 :         453 : valent_device_get_state (ValentDevice *device)
+    1590                 :             : {
+    1591                 :         453 :   ValentDeviceState state = VALENT_DEVICE_STATE_NONE;
+    1592                 :             : 
+    1593         [ +  - ]:         453 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), state);
+    1594                 :             : 
+    1595                 :         453 :   valent_object_lock (VALENT_OBJECT (device));
+    1596                 :             : 
+    1597         [ +  + ]:         453 :   if (device->channel != NULL)
+    1598                 :         120 :     state |= VALENT_DEVICE_STATE_CONNECTED;
+    1599                 :             : 
+    1600         [ +  + ]:         453 :   if (device->paired)
+    1601                 :         317 :     state |= VALENT_DEVICE_STATE_PAIRED;
+    1602                 :             : 
+    1603         [ +  + ]:         453 :   if (device->incoming_pair > 0)
+    1604                 :           3 :     state |= VALENT_DEVICE_STATE_PAIR_INCOMING;
+    1605                 :             : 
+    1606         [ +  + ]:         453 :   if (device->outgoing_pair > 0)
+    1607                 :           2 :     state |= VALENT_DEVICE_STATE_PAIR_OUTGOING;
+    1608                 :             : 
+    1609                 :         453 :   valent_object_unlock (VALENT_OBJECT (device));
+    1610                 :             : 
+    1611                 :         453 :   return state;
+    1612                 :             : }
+    1613                 :             : 
+    1614                 :             : /*< private >
+    1615                 :             :  * valent_device_reload_plugins:
+    1616                 :             :  * @device: a `ValentDevice`
+    1617                 :             :  *
+    1618                 :             :  * Reload all plugins.
+    1619                 :             :  *
+    1620                 :             :  * Check each available plugin and load or unload them if the required
+    1621                 :             :  * capabilities have changed.
+    1622                 :             :  */
+    1623                 :             : static void
+    1624                 :         170 : valent_device_reload_plugins (ValentDevice *device)
+    1625                 :             : {
+    1626                 :         170 :   unsigned int n_plugins = 0;
+    1627                 :             : 
+    1628         [ +  - ]:         170 :   g_assert (VALENT_IS_DEVICE (device));
+    1629                 :             : 
+    1630                 :         170 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (device->engine));
+    1631                 :             : 
+    1632         [ +  + ]:         993 :   for (unsigned int i = 0; i < n_plugins; i++)
+    1633                 :             :     {
+    1634                 :         823 :       g_autoptr (PeasPluginInfo) info = NULL;
+    1635                 :             : 
+    1636                 :         823 :       info = g_list_model_get_item (G_LIST_MODEL (device->engine), i);
+    1637                 :             : 
+    1638         [ +  + ]:         823 :       if (valent_device_supports_plugin (device, info))
+    1639                 :         339 :         on_load_plugin (device->engine, info, device);
+    1640                 :             :       else
+    1641                 :         484 :         on_unload_plugin (device->engine, info, device);
+    1642                 :             :     }
+    1643                 :         170 : }
+    1644                 :             : 
+    1645                 :             : /*< private >
+    1646                 :             :  * valent_device_update_plugins:
+    1647                 :             :  * @device: a `ValentDevice`
+    1648                 :             :  *
+    1649                 :             :  * Update all plugins.
+    1650                 :             :  *
+    1651                 :             :  * Call [method@Valent.DevicePlugin.update_state] on each enabled plugin.
+    1652                 :             :  */
+    1653                 :             : static void
+    1654                 :         196 : valent_device_update_plugins (ValentDevice *device)
+    1655                 :             : {
+    1656                 :         196 :   ValentDeviceState state = VALENT_DEVICE_STATE_NONE;
+    1657                 :         196 :   GHashTableIter iter;
+    1658                 :         196 :   ValentPlugin *plugin;
+    1659                 :             : 
+    1660         [ +  - ]:         196 :   g_assert (VALENT_IS_DEVICE (device));
+    1661                 :             : 
+    1662                 :         196 :   state = valent_device_get_state (device);
+    1663                 :             : 
+    1664                 :         196 :   g_hash_table_iter_init (&iter, device->plugins);
+    1665                 :             : 
+    1666         [ +  + ]:         587 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&plugin))
+    1667                 :             :     {
+    1668         [ -  + ]:         391 :       if (plugin->extension == NULL)
+    1669                 :           0 :         continue;
+    1670                 :             : 
+    1671                 :         391 :       valent_device_plugin_update_state (VALENT_DEVICE_PLUGIN (plugin->extension),
+    1672                 :             :                                          state);
+    1673                 :             :     }
+    1674                 :         196 : }
+    1675                 :             : 
+    1676                 :             : /*< private >
+    1677                 :             :  * valent_device_supports_plugin:
+    1678                 :             :  * @device: a `ValentDevice`
+    1679                 :             :  * @info: a `PeasPluginInfo`
+    1680                 :             :  *
+    1681                 :             :  * Check if @device supports the plugin described by @info.
+    1682                 :             :  *
+    1683                 :             :  * Returns: %TRUE if supported, or %FALSE if not
+    1684                 :             :  */
+    1685                 :             : static gboolean
+    1686                 :        1622 : valent_device_supports_plugin (ValentDevice   *device,
+    1687                 :             :                                PeasPluginInfo *info)
+    1688                 :             : {
+    1689                 :        1622 :   const char **device_incoming;
+    1690                 :        1622 :   const char **device_outgoing;
+    1691                 :        1622 :   const char *in_str, *out_str;
+    1692                 :             : 
+    1693         [ +  - ]:        1622 :   g_assert (VALENT_IS_DEVICE (device));
+    1694         [ -  + ]:        1622 :   g_assert (info != NULL);
+    1695                 :             : 
+    1696         [ +  + ]:        1622 :   if (!peas_engine_provides_extension (device->engine,
+    1697                 :             :                                        info,
+    1698                 :             :                                        VALENT_TYPE_DEVICE_PLUGIN))
+    1699                 :             :     return FALSE;
+    1700                 :             : 
+    1701                 :             :   /* Packet-less plugins aren't dependent on device capabilities */
+    1702                 :        1089 :   in_str = peas_plugin_info_get_external_data (info, "DevicePluginIncoming");
+    1703                 :        1089 :   out_str = peas_plugin_info_get_external_data (info, "DevicePluginOutgoing");
+    1704                 :             : 
+    1705         [ +  + ]:        1089 :   if (in_str == NULL && out_str == NULL)
+    1706                 :             :     return TRUE;
+    1707                 :             : 
+    1708                 :             :   /* Device hasn't supplied an identity packet yet */
+    1709                 :         652 :   device_incoming = (const char **)device->incoming_capabilities;
+    1710                 :         652 :   device_outgoing = (const char **)device->outgoing_capabilities;
+    1711                 :             : 
+    1712         [ +  + ]:         652 :   if (device_incoming == NULL || device_outgoing == NULL)
+    1713                 :             :     return FALSE;
+    1714                 :             : 
+    1715                 :             :   /* Check if outgoing from plugin matches incoming from device */
+    1716         [ +  - ]:         484 :   if (out_str != NULL)
+    1717                 :             :     {
+    1718                 :        2269 :       g_auto (GStrv) plugin_outgoing = NULL;
+    1719                 :             : 
+    1720                 :         484 :       plugin_outgoing = g_strsplit(out_str, ";", -1);
+    1721                 :             : 
+    1722         [ +  + ]:         797 :       for (int i = 0; plugin_outgoing[i]; i++)
+    1723                 :             :         {
+    1724         [ +  + ]:         634 :           if (g_strv_contains (device_incoming, plugin_outgoing[i]))
+    1725         [ +  - ]:         321 :             return TRUE;
+    1726                 :             :         }
+    1727                 :             :     }
+    1728                 :             : 
+    1729                 :             :   /* Check if incoming from plugin matches outgoing from device */
+    1730         [ -  + ]:         163 :   if (in_str != NULL)
+    1731                 :             :     {
+    1732                 :        1785 :       g_auto (GStrv) plugin_incoming = NULL;
+    1733                 :             : 
+    1734                 :         163 :       plugin_incoming = g_strsplit(in_str, ";", -1);
+    1735                 :             : 
+    1736         [ +  + ]:         449 :       for (int i = 0; plugin_incoming[i]; i++)
+    1737                 :             :         {
+    1738         [ +  + ]:         306 :           if (g_strv_contains (device_outgoing, plugin_incoming[i]))
+    1739         [ +  - ]:          20 :             return TRUE;
+    1740                 :             :         }
+    1741                 :             :     }
+    1742                 :             : 
+    1743                 :             :   return FALSE;
+    1744                 :             : }
+    1745                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device.h.func-c.html b/coverage/src/libvalent/device/valent-device.h.func-c.html new file mode 100644 index 00000000000..e9d8f946bfc --- /dev/null +++ b/coverage/src/libvalent/device/valent-device.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %1612
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE13014
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device.h.func.html b/coverage/src/libvalent/device/valent-device.h.func.html new file mode 100644 index 00000000000..5cb4298b957 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %1612
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE13014
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-device.h.gcov.html b/coverage/src/libvalent/device/valent-device.h.gcov.html new file mode 100644 index 00000000000..865f4f48996 --- /dev/null +++ b/coverage/src/libvalent/device/valent-device.h.gcov.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-device.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %1612
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : 
+      12                 :             : #include "valent-channel.h"
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : /**
+      17                 :             :  * ValentDeviceState:
+      18                 :             :  * @VALENT_DEVICE_STATE_NONE: Device is unpaired and disconnected
+      19                 :             :  * @VALENT_DEVICE_STATE_CONNECTED: Device is connected
+      20                 :             :  * @VALENT_DEVICE_STATE_PAIRED: Device is paired
+      21                 :             :  * @VALENT_DEVICE_STATE_PAIR_INCOMING: Pair request received from device
+      22                 :             :  * @VALENT_DEVICE_STATE_PAIR_OUTGOING: Pair request sent to device
+      23                 :             :  *
+      24                 :             :  * Device state flags.
+      25                 :             :  *
+      26                 :             :  * Since: 1.0
+      27                 :             :  */
+      28                 :             : typedef enum
+      29                 :             : {
+      30                 :             :   VALENT_DEVICE_STATE_NONE,
+      31                 :             :   VALENT_DEVICE_STATE_CONNECTED     = (1<<0),
+      32                 :             :   VALENT_DEVICE_STATE_PAIRED        = (1<<1),
+      33                 :             :   VALENT_DEVICE_STATE_PAIR_INCOMING = (1<<2),
+      34                 :             :   VALENT_DEVICE_STATE_PAIR_OUTGOING = (1<<3),
+      35                 :             : } ValentDeviceState;
+      36                 :             : 
+      37                 :             : 
+      38                 :             : #define VALENT_TYPE_DEVICE (valent_device_get_type())
+      39                 :             : 
+      40                 :             : VALENT_AVAILABLE_IN_1_0
+      41   [ +  -  +  +  :       13161 : G_DECLARE_FINAL_TYPE (ValentDevice, valent_device, VALENT, DEVICE, ValentObject)
+          +  +  +  +  +  
+          +  +  -  +  +  
+                   -  - ]
+      42                 :             : 
+      43                 :             : VALENT_AVAILABLE_IN_1_0
+      44                 :             : ValentDevice      * valent_device_new                (const char           *id);
+      45                 :             : VALENT_AVAILABLE_IN_1_0
+      46                 :             : ValentChannel     * valent_device_ref_channel        (ValentDevice         *device);
+      47                 :             : VALENT_AVAILABLE_IN_1_0
+      48                 :             : ValentContext     * valent_device_get_context        (ValentDevice         *device);
+      49                 :             : VALENT_AVAILABLE_IN_1_0
+      50                 :             : const char        * valent_device_get_icon_name      (ValentDevice         *device);
+      51                 :             : VALENT_AVAILABLE_IN_1_0
+      52                 :             : const char        * valent_device_get_id             (ValentDevice         *device);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : GMenuModel        * valent_device_get_menu           (ValentDevice         *device);
+      55                 :             : VALENT_AVAILABLE_IN_1_0
+      56                 :             : const char        * valent_device_get_name           (ValentDevice         *device);
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : GStrv               valent_device_get_plugins        (ValentDevice         *device);
+      59                 :             : VALENT_AVAILABLE_IN_1_0
+      60                 :             : ValentDeviceState   valent_device_get_state          (ValentDevice         *device);
+      61                 :             : VALENT_AVAILABLE_IN_1_0
+      62                 :             : void                valent_device_send_packet        (ValentDevice         *device,
+      63                 :             :                                                       JsonNode             *packet,
+      64                 :             :                                                       GCancellable         *cancellable,
+      65                 :             :                                                       GAsyncReadyCallback   callback,
+      66                 :             :                                                       gpointer              user_data);
+      67                 :             : VALENT_AVAILABLE_IN_1_0
+      68                 :             : gboolean            valent_device_send_packet_finish (ValentDevice         *device,
+      69                 :             :                                                       GAsyncResult         *result,
+      70                 :             :                                                       GError              **error);
+      71                 :             : 
+      72                 :             : G_END_DECLS
+      73                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-packet.c.func-c.html b/coverage/src/libvalent/device/valent-packet.c.func-c.html new file mode 100644 index 00000000000..3cf101c70f4 --- /dev/null +++ b/coverage/src/libvalent/device/valent-packet.c.func-c.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-packet.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-packet.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.1 %331308
Test Date:2024-03-31 18:46:36Functions:100.0 %2727
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %342209
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_packet_get_id1
valent_packet_get_payload_info1
valent_packet_set_payload_full1
valent_packet_get_double5
valent_packet_new9
valent_packet_from_stream14
valent_packet_error_quark15
valent_packet_serialize15
valent_packet_get_array18
valent_packet_get_object23
valent_packet_get_payload_full30
valent_packet_set_payload_info30
valent_packet_set_payload_size39
valent_packet_get_payload_size43
valent_packet_has_payload43
valent_packet_get_boolean57
valent_packet_check_field125
valent_packet_get_int148
valent_packet_end151
valent_packet_init151
valent_packet_dup_strv341
valent_packet_get_body404
valent_packet_get_string792
valent_packet_get_type3652
valent_packet_deserialize3665
valent_packet_to_stream3671
valent_packet_validate7387
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-packet.c.func.html b/coverage/src/libvalent/device/valent-packet.c.func.html new file mode 100644 index 00000000000..40f93d2c494 --- /dev/null +++ b/coverage/src/libvalent/device/valent-packet.c.func.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-packet.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-packet.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.1 %331308
Test Date:2024-03-31 18:46:36Functions:100.0 %2727
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %342209
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_packet_check_field125
valent_packet_deserialize3665
valent_packet_dup_strv341
valent_packet_end151
valent_packet_error_quark15
valent_packet_from_stream14
valent_packet_get_array18
valent_packet_get_body404
valent_packet_get_boolean57
valent_packet_get_double5
valent_packet_get_id1
valent_packet_get_int148
valent_packet_get_object23
valent_packet_get_payload_full30
valent_packet_get_payload_info1
valent_packet_get_payload_size43
valent_packet_get_string792
valent_packet_get_type3652
valent_packet_has_payload43
valent_packet_init151
valent_packet_new9
valent_packet_serialize15
valent_packet_set_payload_full1
valent_packet_set_payload_info30
valent_packet_set_payload_size39
valent_packet_to_stream3671
valent_packet_validate7387
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-packet.c.gcov.html b/coverage/src/libvalent/device/valent-packet.c.gcov.html new file mode 100644 index 00000000000..dd137dd61ea --- /dev/null +++ b/coverage/src/libvalent/device/valent-packet.c.gcov.html @@ -0,0 +1,1224 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-packet.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-packet.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.1 %331308
Test Date:2024-03-31 18:46:36Functions:100.0 %2727
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %342209
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-core"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : 
+      11                 :             : #include "../core/valent-global.h"
+      12                 :             : #include "valent-packet.h"
+      13                 :             : 
+      14                 :             : 
+      15         [ +  + ]:          15 : G_DEFINE_QUARK (valent-packet-error, valent_packet_error)
+      16                 :             : 
+      17                 :             : 
+      18                 :             : /**
+      19                 :             :  * valent_packet_new:
+      20                 :             :  * @type: a KDE Connect packet type
+      21                 :             :  *
+      22                 :             :  * A convenience function for creating a new KDE Connect packet with the type
+      23                 :             :  * field set to @type.
+      24                 :             :  *
+      25                 :             :  * Returns: (transfer full): a KDE Connect packet
+      26                 :             :  *
+      27                 :             :  * Since: 1.0
+      28                 :             :  */
+      29                 :             : JsonNode *
+      30                 :           9 : valent_packet_new (const char *type)
+      31                 :             : {
+      32                 :          18 :   g_autoptr (JsonBuilder) builder = NULL;
+      33                 :             : 
+      34         [ +  - ]:           9 :   g_return_val_if_fail (type != NULL, NULL);
+      35                 :             : 
+      36                 :           9 :   builder = json_builder_new ();
+      37                 :             : 
+      38                 :           9 :   json_builder_begin_object (builder);
+      39                 :           9 :   json_builder_set_member_name (builder, "id");
+      40                 :           9 :   json_builder_add_int_value (builder, 0);
+      41                 :           9 :   json_builder_set_member_name (builder, "type");
+      42                 :           9 :   json_builder_add_string_value (builder, type);
+      43                 :           9 :   json_builder_set_member_name (builder, "body");
+      44                 :           9 :   json_builder_end_object (json_builder_begin_object (builder));
+      45                 :           9 :   json_builder_end_object (builder);
+      46                 :             : 
+      47                 :           9 :   return json_builder_get_root (builder);
+      48                 :             : }
+      49                 :             : 
+      50                 :             : 
+      51                 :             : /**
+      52                 :             :  * valent_packet_init: (skip)
+      53                 :             :  * @builder: a location to initialize a `JsonBuilder`
+      54                 :             :  * @type: a KDE Connect packet type
+      55                 :             :  *
+      56                 :             :  * Initialize a [class@Json.Builder] and KDE Connect packet.
+      57                 :             :  *
+      58                 :             :  * Creates a new [class@Json.Builder] and initializes a packet for @type,
+      59                 :             :  * leaving the builder in the `body` object. Call [func@Valent.packet_end]
+      60                 :             :  * to finish the packet and get the result.
+      61                 :             :  *
+      62                 :             :  * ```c
+      63                 :             :  * g_autoptr (JsonBuilder) builder = NULL;
+      64                 :             :  * g_autoptr (JsonNode) packet = NULL;
+      65                 :             :  *
+      66                 :             :  * valent_packet_init (&builder, "kdeconnect.ping");
+      67                 :             :  * json_builder_set_member_name (builder, "message");
+      68                 :             :  * json_builder_add_string_value (builder, "Ping!");
+      69                 :             :  * packet = valent_packet_end (&builder);
+      70                 :             :  * ```
+      71                 :             :  *
+      72                 :             :  *
+      73                 :             :  * Since: 1.0
+      74                 :             :  */
+      75                 :             : void
+      76                 :         151 : valent_packet_init (JsonBuilder **builder,
+      77                 :             :                     const char   *type)
+      78                 :             : {
+      79   [ +  -  +  - ]:         151 :   g_return_if_fail (builder != NULL && *builder == NULL);
+      80   [ +  -  -  + ]:         151 :   g_return_if_fail (type != NULL && *type != '\0');
+      81                 :             : 
+      82                 :         151 :   *builder = json_builder_new ();
+      83                 :         151 :   json_builder_begin_object (*builder);
+      84                 :         151 :   json_builder_set_member_name (*builder, "id");
+      85                 :         151 :   json_builder_add_int_value (*builder, 0);
+      86                 :         151 :   json_builder_set_member_name (*builder, "type");
+      87                 :         151 :   json_builder_add_string_value (*builder, type);
+      88                 :         151 :   json_builder_set_member_name (*builder, "body");
+      89                 :             : 
+      90                 :         151 :   json_builder_begin_object (*builder);
+      91                 :             : }
+      92                 :             : 
+      93                 :             : /**
+      94                 :             :  * valent_packet_end: (skip)
+      95                 :             :  * @builder: a pointer to a `JsonBuilder`
+      96                 :             :  *
+      97                 :             :  * Finish a packet created with [func@Valent.packet_init].
+      98                 :             :  *
+      99                 :             :  * This function closes the `body` and root objects, then calls
+     100                 :             :  * [method@Json.Builder.get_root]. Then the reference count of @builder is
+     101                 :             :  * decreased and the pointer is set to %NULL, before returning the packet.
+     102                 :             :  *
+     103                 :             :  * Returns: (transfer full) (nullable): a KDE Connect packet
+     104                 :             :  *
+     105                 :             :  * Since: 1.0
+     106                 :             :  */
+     107                 :             : JsonNode *
+     108                 :         151 : valent_packet_end (JsonBuilder **builder)
+     109                 :             : {
+     110                 :         151 :   JsonNode *ret = NULL;
+     111                 :             : 
+     112   [ +  -  +  -  :         151 :   g_return_val_if_fail (builder != NULL && JSON_IS_BUILDER (*builder), NULL);
+          +  -  -  +  -  
+                      - ]
+     113                 :             : 
+     114                 :             :   /* Finish the `body` object and the root object */
+     115                 :         151 :   json_builder_end_object (*builder);
+     116                 :         151 :   json_builder_end_object (*builder);
+     117                 :             : 
+     118                 :         151 :   ret = json_builder_get_root (*builder);
+     119         [ +  - ]:         151 :   g_clear_object (builder);
+     120                 :             : 
+     121                 :             :   return g_steal_pointer (&ret);
+     122                 :             : }
+     123                 :             : 
+     124                 :             : /**
+     125                 :             :  * valent_packet_get_id:
+     126                 :             :  * @packet: a KDE Connect packet
+     127                 :             :  *
+     128                 :             :  * Convenience function for getting the timestamp of a KDE Connect packet.
+     129                 :             :  *
+     130                 :             :  * Returns: a UNIX epoch timestamp
+     131                 :             :  *
+     132                 :             :  * Since: 1.0
+     133                 :             :  */
+     134                 :             : int64_t
+     135                 :           1 : valent_packet_get_id (JsonNode *packet)
+     136                 :             : {
+     137                 :           1 :   JsonObject *root;
+     138                 :           1 :   JsonNode *node;
+     139                 :             : 
+     140         [ +  - ]:           1 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), 0);
+     141                 :             : 
+     142                 :           1 :   root = json_node_get_object (packet);
+     143                 :             : 
+     144   [ +  -  +  - ]:           1 :   if G_UNLIKELY ((node = json_object_get_member (root, "id")) == NULL ||
+     145                 :             :                  json_node_get_value_type (node) != G_TYPE_INT64)
+     146                 :           0 :     g_return_val_if_reached (0);
+     147                 :             : 
+     148                 :           1 :   return json_node_get_int (node);
+     149                 :             : }
+     150                 :             : 
+     151                 :             : /**
+     152                 :             :  * valent_packet_get_type:
+     153                 :             :  * @packet: a KDE Connect packet
+     154                 :             :  *
+     155                 :             :  * Convenience function for getting the capability type of a KDE Connect packet.
+     156                 :             :  *
+     157                 :             :  * Returns: (transfer none) (nullable): a KDE Connect capability
+     158                 :             :  *
+     159                 :             :  * Since: 1.0
+     160                 :             :  */
+     161                 :             : const char *
+     162                 :        3652 : valent_packet_get_type (JsonNode *packet)
+     163                 :             : {
+     164                 :        3652 :   JsonObject *root;
+     165                 :        3652 :   JsonNode *node;
+     166                 :             : 
+     167         [ +  - ]:        3652 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), NULL);
+     168                 :             : 
+     169                 :        3652 :   root = json_node_get_object (packet);
+     170                 :             : 
+     171   [ +  -  +  - ]:        3652 :   if G_UNLIKELY ((node = json_object_get_member (root, "type")) == NULL ||
+     172                 :             :                  json_node_get_value_type (node) != G_TYPE_STRING)
+     173                 :           0 :     g_return_val_if_reached (NULL);
+     174                 :             : 
+     175                 :        3652 :   return json_node_get_string (node);
+     176                 :             : }
+     177                 :             : 
+     178                 :             : /**
+     179                 :             :  * valent_packet_get_body:
+     180                 :             :  * @packet: a KDE Connect packet
+     181                 :             :  *
+     182                 :             :  * Convenience function for getting the packet body of a KDE Connect packet.
+     183                 :             :  *
+     184                 :             :  * Returns: (transfer none) (nullable): a `JsonObject`
+     185                 :             :  *
+     186                 :             :  * Since: 1.0
+     187                 :             :  */
+     188                 :             : JsonObject *
+     189                 :         404 : valent_packet_get_body (JsonNode *packet)
+     190                 :             : {
+     191                 :         404 :   JsonObject *root;
+     192                 :         404 :   JsonNode *node;
+     193                 :             : 
+     194         [ +  - ]:         404 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), NULL);
+     195                 :             : 
+     196                 :         404 :   root = json_node_get_object (packet);
+     197                 :             : 
+     198   [ +  -  +  - ]:         404 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     199                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     200                 :           0 :     g_return_val_if_reached (NULL);
+     201                 :             : 
+     202                 :         404 :   return json_node_get_object (node);
+     203                 :             : }
+     204                 :             : 
+     205                 :             : /**
+     206                 :             :  * valent_packet_has_payload:
+     207                 :             :  * @packet: a KDE Connect packet
+     208                 :             :  *
+     209                 :             :  * Return %TRUE if the packet holds valid transfer information. Payload
+     210                 :             :  * information is considered invalid in the following cases:
+     211                 :             :  *
+     212                 :             :  * - The `payloadSize` field is present, but not a %G_TYPE_INT64
+     213                 :             :  * - The `payloadTransferInfo` field is missing from the root object
+     214                 :             :  * - The `payloadTransferInfo` field is not a %JSON_NODE_OBJECT
+     215                 :             :  *
+     216                 :             :  * Returns: %TRUE if @packet has a payload
+     217                 :             :  *
+     218                 :             :  * Since: 1.0
+     219                 :             :  */
+     220                 :             : gboolean
+     221                 :          43 : valent_packet_has_payload (JsonNode *packet)
+     222                 :             : {
+     223                 :          43 :   JsonObject *root;
+     224                 :          43 :   JsonNode *node;
+     225                 :             : 
+     226         [ +  - ]:          43 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), FALSE);
+     227                 :             : 
+     228                 :          43 :   root = json_node_get_object (packet);
+     229                 :             : 
+     230   [ +  +  -  + ]:          81 :   if ((node = json_object_get_member (root, "payloadSize")) != NULL &&
+     231                 :          38 :       json_node_get_value_type (node) != G_TYPE_INT64)
+     232                 :             :     return FALSE;
+     233                 :             : 
+     234   [ +  +  -  + ]:          71 :   if ((node = json_object_get_member (root, "payloadTransferInfo")) == NULL ||
+     235                 :          28 :       json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     236                 :          15 :     return FALSE;
+     237                 :             : 
+     238                 :             :   return TRUE;
+     239                 :             : }
+     240                 :             : 
+     241                 :             : /**
+     242                 :             :  * valent_packet_get_payload_full:
+     243                 :             :  * @packet: a KDE Connect packet
+     244                 :             :  * @size: (out) (nullable): the payload size
+     245                 :             :  * @error: (nullable): a `GError`
+     246                 :             :  *
+     247                 :             :  * A convenience for retrieving the `payloadTransferInfo` and `payloadSize`
+     248                 :             :  * fields from @packet.
+     249                 :             :  *
+     250                 :             :  * If @packet is malformed or missing payload information, %NULL will be
+     251                 :             :  * returned with @error set. See valent_packet_has_payload() for validation
+     252                 :             :  * criteria.
+     253                 :             :  *
+     254                 :             :  * Returns: (transfer none) (nullable): a `JsonObject`
+     255                 :             :  *
+     256                 :             :  * Since: 1.0
+     257                 :             :  */
+     258                 :             : JsonObject *
+     259                 :          30 : valent_packet_get_payload_full (JsonNode  *packet,
+     260                 :             :                                 goffset   *size,
+     261                 :             :                                 GError   **error)
+     262                 :             : {
+     263                 :          30 :   JsonObject *root;
+     264                 :          30 :   JsonNode *node;
+     265                 :             : 
+     266         [ -  + ]:          30 :   if (!valent_packet_validate (packet, error))
+     267                 :             :     return NULL;
+     268                 :             : 
+     269                 :          30 :   root = json_node_get_object (packet);
+     270                 :             : 
+     271                 :             :   /* The documentation implies that this field could be missing or have a value
+     272                 :             :    * of `-1` to indicate the length is indefinite (eg. for streaming). */
+     273   [ +  -  -  + ]:          60 :   if ((node = json_object_get_member (root, "payloadSize")) != NULL &&
+     274                 :          30 :       json_node_get_value_type (node) != G_TYPE_INT64)
+     275                 :             :     {
+     276                 :           0 :       g_set_error_literal (error,
+     277                 :             :                            VALENT_PACKET_ERROR,
+     278                 :             :                            VALENT_PACKET_ERROR_INVALID_FIELD,
+     279                 :             :                            "expected \"payloadSize\" field to hold an integer");
+     280                 :           0 :       return NULL;
+     281                 :             :     }
+     282                 :             : 
+     283         [ +  - ]:          30 :   if (size != NULL)
+     284         [ +  - ]:          30 :     *size = node ? json_node_get_int (node) : -1;
+     285                 :             : 
+     286   [ +  -  -  + ]:          60 :   if ((node = json_object_get_member (root, "payloadTransferInfo")) == NULL ||
+     287                 :          30 :       json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     288                 :             :     {
+     289                 :           0 :       g_set_error_literal (error,
+     290                 :             :                            VALENT_PACKET_ERROR,
+     291                 :             :                            node == NULL
+     292                 :             :                              ? VALENT_PACKET_ERROR_MISSING_FIELD
+     293                 :             :                              : VALENT_PACKET_ERROR_INVALID_FIELD,
+     294                 :             :                            "expected \"payloadTransferInfo\" field holding an object");
+     295                 :           0 :       return NULL;
+     296                 :             :     }
+     297                 :             : 
+     298                 :          30 :   return json_node_get_object (node);
+     299                 :             : }
+     300                 :             : 
+     301                 :             : /**
+     302                 :             :  * valent_packet_set_payload_full:
+     303                 :             :  * @packet: a KDE Connect packet
+     304                 :             :  * @info: (transfer full): a `JsonObject`
+     305                 :             :  * @size: the payload size in bytes
+     306                 :             :  *
+     307                 :             :  * A convenience method for setting the `payloadTransferInfo` and `payloadSize`
+     308                 :             :  * fields on @packet.
+     309                 :             :  *
+     310                 :             :  * Since: 1.0
+     311                 :             :  */
+     312                 :             : void
+     313                 :           1 : valent_packet_set_payload_full (JsonNode   *packet,
+     314                 :             :                                 JsonObject *info,
+     315                 :             :                                 goffset     size)
+     316                 :             : {
+     317                 :           1 :   JsonObject *root;
+     318                 :             : 
+     319         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     320                 :             : 
+     321                 :           1 :   root = json_node_get_object (packet);
+     322                 :             : 
+     323                 :           1 :   json_object_set_object_member (root, "payloadTransferInfo", info);
+     324                 :           1 :   json_object_set_int_member (root, "payloadSize", (int64_t)size);
+     325                 :             : }
+     326                 :             : 
+     327                 :             : /**
+     328                 :             :  * valent_packet_get_payload_info:
+     329                 :             :  * @packet: a KDE Connect packet
+     330                 :             :  *
+     331                 :             :  * A convenience for retrieve the 'payloadTransferInfo` field from @packet.
+     332                 :             :  *
+     333                 :             :  * Returns: (transfer none) (nullable): a `JsonObject`
+     334                 :             :  *
+     335                 :             :  * Since: 1.0
+     336                 :             :  */
+     337                 :             : JsonObject *
+     338                 :           1 : valent_packet_get_payload_info (JsonNode *packet)
+     339                 :             : {
+     340                 :           1 :   JsonNode *node;
+     341                 :             : 
+     342         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), NULL);
+     343                 :             : 
+     344                 :           1 :   node = json_object_get_member (json_node_get_object (packet),
+     345                 :             :                                  "payloadTransferInfo");
+     346                 :             : 
+     347   [ +  -  +  - ]:           1 :   if G_UNLIKELY (node == NULL || !JSON_NODE_HOLDS_OBJECT (node))
+     348                 :           0 :     g_return_val_if_reached (NULL);
+     349                 :             : 
+     350                 :           1 :   return json_node_get_object (node);
+     351                 :             : }
+     352                 :             : 
+     353                 :             : /**
+     354                 :             :  * valent_packet_set_payload_info:
+     355                 :             :  * @packet: a KDE Connect packet
+     356                 :             :  * @info: (transfer full): a `JsonObject`
+     357                 :             :  *
+     358                 :             :  * A convenience method for setting the `payloadTransferInfo` field on @packet.
+     359                 :             :  *
+     360                 :             :  * Since: 1.0
+     361                 :             :  */
+     362                 :             : void
+     363                 :          30 : valent_packet_set_payload_info (JsonNode   *packet,
+     364                 :             :                                 JsonObject *info)
+     365                 :             : {
+     366                 :          30 :   JsonObject *root;
+     367                 :             : 
+     368         [ +  - ]:          30 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     369         [ -  + ]:          30 :   g_return_if_fail (info != NULL);
+     370                 :             : 
+     371                 :          30 :   root = json_node_get_object (packet);
+     372                 :             : 
+     373                 :          30 :   json_object_set_object_member (root, "payloadTransferInfo", info);
+     374                 :             : }
+     375                 :             : 
+     376                 :             : /**
+     377                 :             :  * valent_packet_get_payload_size:
+     378                 :             :  * @packet: a KDE Connect packet
+     379                 :             :  *
+     380                 :             :  * Get the `payloadSize` field of @packet in bytes.
+     381                 :             :  *
+     382                 :             :  * Returns: the payload size
+     383                 :             :  *
+     384                 :             :  * Since: 1.0
+     385                 :             :  */
+     386                 :             : goffset
+     387                 :          43 : valent_packet_get_payload_size (JsonNode *packet)
+     388                 :             : {
+     389                 :          43 :   JsonObject *root;
+     390                 :          43 :   JsonNode *node;
+     391                 :             : 
+     392         [ +  - ]:          43 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), 0);
+     393                 :             : 
+     394                 :          43 :   root = json_node_get_object (packet);
+     395                 :          43 :   node = json_object_get_member (root, "payloadSize");
+     396                 :             : 
+     397   [ +  -  -  + ]:          86 :   if ((node = json_object_get_member (root, "payloadSize")) != NULL &&
+     398                 :          43 :       json_node_get_value_type (node) != G_TYPE_INT64)
+     399                 :           0 :     g_return_val_if_reached (-1);
+     400                 :             : 
+     401                 :          43 :   return node ? json_node_get_int (node) : -1;
+     402                 :             : }
+     403                 :             : 
+     404                 :             : /**
+     405                 :             :  * valent_packet_set_payload_size:
+     406                 :             :  * @packet: a KDE Connect packet
+     407                 :             :  * @size: the payload size in bytes
+     408                 :             :  *
+     409                 :             :  * Set the `payloadSize` field of @packet to @size.
+     410                 :             :  *
+     411                 :             :  * Since: 1.0
+     412                 :             :  */
+     413                 :             : void
+     414                 :          39 : valent_packet_set_payload_size (JsonNode *packet,
+     415                 :             :                                 goffset   size)
+     416                 :             : {
+     417                 :          39 :   JsonObject *root;
+     418                 :             : 
+     419         [ +  - ]:          39 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     420         [ -  + ]:          39 :   g_return_if_fail (size >= -1);
+     421                 :             : 
+     422                 :          39 :   root = json_node_get_object (packet);
+     423                 :             : 
+     424                 :          39 :   json_object_set_int_member (root, "payloadSize", (int64_t)size);
+     425                 :             : }
+     426                 :             : 
+     427                 :             : /**
+     428                 :             :  * valent_packet_check_field:
+     429                 :             :  * @packet: a KDE Connect packet
+     430                 :             :  * @field: (not nullable): field name
+     431                 :             :  *
+     432                 :             :  * Check @packet for @field and return %TRUE if present, with two exceptions:
+     433                 :             :  *
+     434                 :             :  * 1. If @field is a %G_TYPE_BOOLEAN, its value is returned
+     435                 :             :  * 2. If @field is a %G_TYPE_STRING, %FALSE is returned if the string is empty.
+     436                 :             :  *
+     437                 :             :  * Returns: %TRUE, or %FALSE on failure
+     438                 :             :  *
+     439                 :             :  * Since: 1.0
+     440                 :             :  */
+     441                 :             : gboolean
+     442                 :         125 : valent_packet_check_field (JsonNode   *packet,
+     443                 :             :                            const char *field)
+     444                 :             : {
+     445                 :         125 :   JsonObject *root;
+     446                 :         125 :   JsonObject *body;
+     447                 :         125 :   JsonNode *node;
+     448                 :             : 
+     449         [ +  - ]:         125 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     450   [ +  -  -  + ]:         125 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     451                 :             : 
+     452                 :         125 :   root = json_node_get_object (packet);
+     453                 :             : 
+     454   [ +  -  +  - ]:         125 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     455                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     456                 :           0 :     return FALSE;
+     457                 :             : 
+     458                 :         125 :   body = json_node_get_object (node);
+     459                 :             : 
+     460         [ +  + ]:         125 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL)
+     461                 :             :     return FALSE;
+     462                 :             : 
+     463         [ +  + ]:          46 :   if (json_node_get_value_type (node) == G_TYPE_BOOLEAN)
+     464                 :          33 :     return json_node_get_boolean (node);
+     465                 :             : 
+     466         [ +  - ]:          13 :   if (json_node_get_value_type (node) == G_TYPE_STRING)
+     467                 :          13 :     return json_node_get_string (node)[0] != '\0';
+     468                 :             : 
+     469                 :             :   return TRUE;
+     470                 :             : }
+     471                 :             : 
+     472                 :             : /**
+     473                 :             :  * valent_packet_get_boolean:
+     474                 :             :  * @packet: a KDE Connect packet
+     475                 :             :  * @field: (not nullable): field name
+     476                 :             :  * @value: (out) (nullable): a boolean
+     477                 :             :  *
+     478                 :             :  * Lookup @field in the body of @packet and assign it to @value.
+     479                 :             :  *
+     480                 :             :  * If @field is not found or it is not a boolean, %FALSE will be returned and
+     481                 :             :  * @value will not be set.
+     482                 :             :  *
+     483                 :             :  * Returns: %TRUE, or %FALSE on failure
+     484                 :             :  *
+     485                 :             :  * Since: 1.0
+     486                 :             :  */
+     487                 :             : gboolean
+     488                 :          57 : valent_packet_get_boolean (JsonNode   *packet,
+     489                 :             :                            const char *field,
+     490                 :             :                            gboolean   *value)
+     491                 :             : {
+     492                 :          57 :   JsonObject *root, *body;
+     493                 :          57 :   JsonNode *node;
+     494                 :             : 
+     495         [ +  - ]:          57 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     496   [ +  -  -  + ]:          57 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     497                 :             : 
+     498                 :          57 :   root = json_node_get_object (packet);
+     499                 :             : 
+     500   [ +  -  +  - ]:          57 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     501                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     502                 :           0 :     return FALSE;
+     503                 :             : 
+     504                 :          57 :   body = json_node_get_object (node);
+     505                 :             : 
+     506   [ +  +  +  - ]:          57 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     507                 :             :                  json_node_get_value_type (node) != G_TYPE_BOOLEAN)
+     508                 :          16 :     return FALSE;
+     509                 :             : 
+     510         [ +  - ]:          41 :   if (value)
+     511                 :          41 :     *value = json_node_get_double (node);
+     512                 :             : 
+     513                 :             :   return TRUE;
+     514                 :             : }
+     515                 :             : 
+     516                 :             : /**
+     517                 :             :  * valent_packet_get_double:
+     518                 :             :  * @packet: a KDE Connect packet
+     519                 :             :  * @field: (not nullable): field name
+     520                 :             :  * @value: (out) (nullable): a double
+     521                 :             :  *
+     522                 :             :  * Lookup @field in the body of @packet and assign it to @value.
+     523                 :             :  *
+     524                 :             :  * If @field is not found or it is not a double, %FALSE will be returned and
+     525                 :             :  * @value will not be set.
+     526                 :             :  *
+     527                 :             :  * Returns: %TRUE, or %FALSE on failure
+     528                 :             :  *
+     529                 :             :  * Since: 1.0
+     530                 :             :  */
+     531                 :             : gboolean
+     532                 :           5 : valent_packet_get_double (JsonNode   *packet,
+     533                 :             :                           const char *field,
+     534                 :             :                           double     *value)
+     535                 :             : {
+     536                 :           5 :   JsonObject *root, *body;
+     537                 :           5 :   JsonNode *node;
+     538                 :             : 
+     539         [ +  - ]:           5 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     540   [ +  -  -  + ]:           5 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     541                 :             : 
+     542                 :           5 :   root = json_node_get_object (packet);
+     543                 :             : 
+     544   [ +  -  +  - ]:           5 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     545                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     546                 :           0 :     return FALSE;
+     547                 :             : 
+     548                 :           5 :   body = json_node_get_object (node);
+     549                 :             : 
+     550   [ +  -  +  - ]:           5 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     551                 :             :                  json_node_get_value_type (node) != G_TYPE_DOUBLE)
+     552                 :           0 :     return FALSE;
+     553                 :             : 
+     554         [ +  - ]:           5 :   if (value)
+     555                 :           5 :     *value = json_node_get_double (node);
+     556                 :             : 
+     557                 :             :   return TRUE;
+     558                 :             : }
+     559                 :             : 
+     560                 :             : /**
+     561                 :             :  * valent_packet_get_int:
+     562                 :             :  * @packet: a KDE Connect packet
+     563                 :             :  * @field: (not nullable): field name
+     564                 :             :  * @value: (out) (nullable): an int64
+     565                 :             :  *
+     566                 :             :  * Lookup @field in the body of @packet and assign it to @value.
+     567                 :             :  *
+     568                 :             :  * If @field is not found or it is not an integer, %FALSE will be returned and
+     569                 :             :  * @value will not be set.
+     570                 :             :  *
+     571                 :             :  * Returns: %TRUE, or %FALSE on failure
+     572                 :             :  *
+     573                 :             :  * Since: 1.0
+     574                 :             :  */
+     575                 :             : gboolean
+     576                 :         148 : valent_packet_get_int (JsonNode   *packet,
+     577                 :             :                        const char *field,
+     578                 :             :                        int64_t    *value)
+     579                 :             : {
+     580                 :         148 :   JsonObject *root, *body;
+     581                 :         148 :   JsonNode *node;
+     582                 :             : 
+     583         [ +  - ]:         148 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     584   [ +  -  -  + ]:         148 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     585                 :             : 
+     586                 :         148 :   root = json_node_get_object (packet);
+     587                 :             : 
+     588   [ +  -  +  - ]:         148 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     589                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     590                 :           0 :     return FALSE;
+     591                 :             : 
+     592                 :         148 :   body = json_node_get_object (node);
+     593                 :             : 
+     594   [ +  +  +  - ]:         148 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     595                 :             :                  json_node_get_value_type (node) != G_TYPE_INT64)
+     596                 :          61 :     return FALSE;
+     597                 :             : 
+     598         [ +  + ]:          87 :   if (value)
+     599                 :          82 :     *value = json_node_get_int (node);
+     600                 :             : 
+     601                 :             :   return TRUE;
+     602                 :             : }
+     603                 :             : 
+     604                 :             : /**
+     605                 :             :  * valent_packet_get_string:
+     606                 :             :  * @packet: a KDE Connect packet
+     607                 :             :  * @field: (not nullable): field name
+     608                 :             :  * @value: (out) (nullable): a string
+     609                 :             :  *
+     610                 :             :  * Lookup @field in the body of @packet and assign it to @value.
+     611                 :             :  *
+     612                 :             :  * If @field is not found or it is not a non-empty string, %FALSE will be
+     613                 :             :  * returned and @value will not be set.
+     614                 :             :  *
+     615                 :             :  * Returns: %TRUE, or %FALSE on failure
+     616                 :             :  *
+     617                 :             :  * Since: 1.0
+     618                 :             :  */
+     619                 :             : gboolean
+     620                 :         792 : valent_packet_get_string (JsonNode    *packet,
+     621                 :             :                           const char  *field,
+     622                 :             :                           const char **value)
+     623                 :             : {
+     624                 :         792 :   JsonObject *root, *body;
+     625                 :         792 :   JsonNode *node;
+     626                 :         792 :   const char *string;
+     627                 :             : 
+     628         [ +  - ]:         792 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     629   [ +  -  -  + ]:         792 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     630                 :             : 
+     631                 :         792 :   root = json_node_get_object (packet);
+     632                 :             : 
+     633   [ +  -  +  - ]:         792 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     634                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     635                 :           0 :     return FALSE;
+     636                 :             : 
+     637                 :         792 :   body = json_node_get_object (node);
+     638                 :             : 
+     639   [ +  +  +  - ]:         792 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     640                 :             :                  json_node_get_value_type (node) != G_TYPE_STRING)
+     641                 :          51 :     return FALSE;
+     642                 :             : 
+     643                 :         741 :   string = json_node_get_string (node);
+     644                 :             : 
+     645         [ -  + ]:         741 :   if G_UNLIKELY (*string == '\0')
+     646                 :             :     return FALSE;
+     647                 :             : 
+     648         [ +  + ]:         741 :   if (value)
+     649                 :         738 :     *value = string;
+     650                 :             : 
+     651                 :             :   return TRUE;
+     652                 :             : }
+     653                 :             : 
+     654                 :             : /**
+     655                 :             :  * valent_packet_get_array:
+     656                 :             :  * @packet: a KDE Connect packet
+     657                 :             :  * @field: (not nullable): field name
+     658                 :             :  * @value: (out) (nullable): a `JsonArray`
+     659                 :             :  *
+     660                 :             :  * Lookup @field in the body of @packet and assign it to @value.
+     661                 :             :  *
+     662                 :             :  * If @field is not found or it is not a `JsonArray`, %FALSE will be returned and
+     663                 :             :  * @value will not be set.
+     664                 :             :  *
+     665                 :             :  * Returns: %TRUE, or %FALSE on failure
+     666                 :             :  *
+     667                 :             :  * Since: 1.0
+     668                 :             :  */
+     669                 :             : gboolean
+     670                 :          18 : valent_packet_get_array (JsonNode    *packet,
+     671                 :             :                          const char  *field,
+     672                 :             :                          JsonArray  **value)
+     673                 :             : {
+     674                 :          18 :   JsonObject *root, *body;
+     675                 :          18 :   JsonNode *node;
+     676                 :             : 
+     677         [ +  - ]:          18 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     678   [ +  -  -  + ]:          18 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     679                 :             : 
+     680                 :          18 :   root = json_node_get_object (packet);
+     681                 :             : 
+     682   [ +  -  +  - ]:          18 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     683                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     684                 :           0 :     return FALSE;
+     685                 :             : 
+     686                 :          18 :   body = json_node_get_object (node);
+     687                 :             : 
+     688   [ +  +  +  - ]:          18 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     689                 :             :                  json_node_get_node_type (node) != JSON_NODE_ARRAY)
+     690                 :           6 :     return FALSE;
+     691                 :             : 
+     692         [ +  - ]:          12 :   if (value)
+     693                 :          12 :     *value = json_node_get_array (node);
+     694                 :             : 
+     695                 :             :   return TRUE;
+     696                 :             : }
+     697                 :             : 
+     698                 :             : /**
+     699                 :             :  * valent_packet_get_object:
+     700                 :             :  * @packet: a KDE Connect packet
+     701                 :             :  * @field: (not nullable): field name
+     702                 :             :  * @value: (out) (nullable): a `JsonObject`
+     703                 :             :  *
+     704                 :             :  * Lookup @field in the body of @packet and assign it to @value.
+     705                 :             :  *
+     706                 :             :  * If @field is not found or it is not a `JsonObject`, %FALSE will be returned
+     707                 :             :  * and @value will not be set.
+     708                 :             :  *
+     709                 :             :  * Returns: %TRUE, or %FALSE on failure
+     710                 :             :  *
+     711                 :             :  * Since: 1.0
+     712                 :             :  */
+     713                 :             : gboolean
+     714                 :          23 : valent_packet_get_object (JsonNode    *packet,
+     715                 :             :                           const char  *field,
+     716                 :             :                           JsonObject **value)
+     717                 :             : {
+     718                 :          23 :   JsonObject *root, *body;
+     719                 :          23 :   JsonNode *node;
+     720                 :             : 
+     721         [ +  - ]:          23 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), FALSE);
+     722   [ +  -  -  + ]:          23 :   g_return_val_if_fail (field != NULL && *field != '\0', FALSE);
+     723                 :             : 
+     724                 :          23 :   root = json_node_get_object (packet);
+     725                 :             : 
+     726   [ +  -  +  - ]:          23 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     727                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     728                 :           0 :     return FALSE;
+     729                 :             : 
+     730                 :          23 :   body = json_node_get_object (node);
+     731                 :             : 
+     732   [ +  -  +  - ]:          23 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     733                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     734                 :           0 :     return FALSE;
+     735                 :             : 
+     736         [ +  - ]:          23 :   if (value)
+     737                 :          23 :     *value = json_node_get_object (node);
+     738                 :             : 
+     739                 :             :   return TRUE;
+     740                 :             : }
+     741                 :             : 
+     742                 :             : /**
+     743                 :             :  * valent_packet_dup_strv:
+     744                 :             :  * @packet: a KDE Connect packet
+     745                 :             :  * @field: (not nullable): field name
+     746                 :             :  *
+     747                 :             :  * Lookup @field in the body of @packet and return a newly allocated list of
+     748                 :             :  * strings.
+     749                 :             :  *
+     750                 :             :  * If @field is not found, it is not a `JsonArray` or any of its elements are not
+     751                 :             :  * strings, %NULL will be returned.
+     752                 :             :  *
+     753                 :             :  * Returns: (transfer full) (nullable) (array zero-terminated=1): a list of strings
+     754                 :             :  *
+     755                 :             :  * Since: 1.0
+     756                 :             :  */
+     757                 :             : GStrv
+     758                 :         341 : valent_packet_dup_strv (JsonNode   *packet,
+     759                 :             :                         const char *field)
+     760                 :             : {
+     761                 :         341 :   JsonObject *root, *body;
+     762                 :         341 :   JsonNode *node;
+     763                 :         341 :   JsonArray *array;
+     764                 :         682 :   g_auto (GStrv) strv = NULL;
+     765                 :         341 :   unsigned int n_strings;
+     766                 :             : 
+     767         [ +  - ]:         341 :   g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (packet), NULL);
+     768   [ +  -  -  + ]:         341 :   g_return_val_if_fail (field != NULL && *field != '\0', NULL);
+     769                 :             : 
+     770                 :             : #ifndef __clang_analyzer__
+     771                 :         341 :   root = json_node_get_object (packet);
+     772                 :             : 
+     773   [ +  -  +  - ]:         341 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     774                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     775                 :           0 :     return NULL;
+     776                 :             : 
+     777                 :         341 :   body = json_node_get_object (node);
+     778                 :             : 
+     779   [ +  -  +  - ]:         341 :   if G_UNLIKELY ((node = json_object_get_member (body, field)) == NULL ||
+     780                 :             :                  json_node_get_node_type (node) != JSON_NODE_ARRAY)
+     781                 :           0 :     return NULL;
+     782                 :             : 
+     783                 :         341 :   array = json_node_get_array (node);
+     784                 :         341 :   n_strings = json_array_get_length (array);
+     785         [ -  + ]:         341 :   strv = g_new0 (char *, n_strings + 1);
+     786                 :             : 
+     787         [ +  + ]:        1027 :   for (unsigned int i = 0; i < n_strings; i++)
+     788                 :             :     {
+     789                 :         686 :       JsonNode *element = json_array_get_element (array, i);
+     790                 :             : 
+     791         [ +  - ]:         686 :       if G_UNLIKELY (json_node_get_value_type (element) != G_TYPE_STRING)
+     792                 :             :         return NULL;
+     793                 :             : 
+     794                 :         686 :       strv[i] = json_node_dup_string (element);
+     795                 :             :     }
+     796                 :             : #endif /* __clang_analyzer__ */
+     797                 :             : 
+     798                 :             :   return g_steal_pointer (&strv);
+     799                 :             : }
+     800                 :             : 
+     801                 :             : /**
+     802                 :             :  * valent_packet_validate:
+     803                 :             :  * @packet: (nullable): a KDE Connect packet
+     804                 :             :  * @error: (nullable): a `GError`
+     805                 :             :  *
+     806                 :             :  * Check if @packet is a well-formed KDE Connect packet.
+     807                 :             :  *
+     808                 :             :  * Returns: %TRUE if @packet is valid, or %FALSE with @error set
+     809                 :             :  *
+     810                 :             :  * Since: 1.0
+     811                 :             :  */
+     812                 :             : gboolean
+     813                 :        7387 : valent_packet_validate (JsonNode  *packet,
+     814                 :             :                         GError   **error)
+     815                 :             : {
+     816                 :        7387 :   JsonObject *root;
+     817                 :        7387 :   JsonNode *node;
+     818                 :             : 
+     819         [ +  + ]:        7387 :   if G_UNLIKELY (packet == NULL)
+     820                 :             :     {
+     821                 :           2 :       g_set_error_literal (error,
+     822                 :             :                            VALENT_PACKET_ERROR,
+     823                 :             :                            VALENT_PACKET_ERROR_INVALID_DATA,
+     824                 :             :                            "packet is NULL");
+     825                 :           2 :       return FALSE;
+     826                 :             :     }
+     827                 :             : 
+     828         [ +  + ]:        7385 :   if G_UNLIKELY (!JSON_NODE_HOLDS_OBJECT (packet))
+     829                 :             :     {
+     830                 :           2 :       g_set_error_literal (error,
+     831                 :             :                            VALENT_PACKET_ERROR,
+     832                 :             :                            VALENT_PACKET_ERROR_MALFORMED,
+     833                 :             :                            "expected the root element to be an object");
+     834                 :           2 :       return FALSE;
+     835                 :             :     }
+     836                 :             : 
+     837                 :        7383 :   root = json_node_get_object (packet);
+     838                 :             : 
+     839                 :             :   /* TODO: kdeconnect-kde stringifies this in identity packets
+     840                 :             :    *       https://invent.kde.org/network/kdeconnect-kde/-/merge_requests/380 */
+     841   [ +  +  +  +  :        7383 :   if G_UNLIKELY ((node = json_object_get_member (root, "id")) == NULL ||
+                   +  + ]
+     842                 :             :                  (json_node_get_value_type (node) != G_TYPE_INT64 &&
+     843                 :             :                   json_node_get_value_type (node) != G_TYPE_STRING))
+     844                 :             :     {
+     845         [ +  + ]:           3 :       g_set_error_literal (error,
+     846                 :             :                            VALENT_PACKET_ERROR,
+     847                 :             :                            node == NULL
+     848                 :             :                              ? VALENT_PACKET_ERROR_MISSING_FIELD
+     849                 :             :                              : VALENT_PACKET_ERROR_INVALID_FIELD,
+     850                 :             :                            "expected \"id\" field holding an integer or string");
+     851                 :           2 :       return FALSE;
+     852                 :             :     }
+     853                 :             : 
+     854   [ +  +  +  + ]:        7381 :   if G_UNLIKELY ((node = json_object_get_member (root, "type")) == NULL ||
+     855                 :             :                  json_node_get_value_type (node) != G_TYPE_STRING)
+     856                 :             :     {
+     857         [ +  + ]:           3 :       g_set_error_literal (error,
+     858                 :             :                            VALENT_PACKET_ERROR,
+     859                 :             :                            node == NULL
+     860                 :             :                              ? VALENT_PACKET_ERROR_MISSING_FIELD
+     861                 :             :                              : VALENT_PACKET_ERROR_INVALID_FIELD,
+     862                 :             :                            "expected \"type\" field holding a string");
+     863                 :           2 :       return FALSE;
+     864                 :             :     }
+     865                 :             : 
+     866   [ +  +  +  + ]:        7379 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+     867                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     868                 :             :     {
+     869         [ +  + ]:           3 :       g_set_error_literal (error,
+     870                 :             :                            VALENT_PACKET_ERROR,
+     871                 :             :                            node == NULL
+     872                 :             :                              ? VALENT_PACKET_ERROR_MISSING_FIELD
+     873                 :             :                              : VALENT_PACKET_ERROR_INVALID_FIELD,
+     874                 :             :                            "expected \"body\" field holding an object");
+     875                 :           2 :       return FALSE;
+     876                 :             :     }
+     877                 :             : 
+     878                 :             :   /* These two are optional, but have defined value types */
+     879   [ +  +  +  + ]:        7377 :   if G_UNLIKELY ((node = json_object_get_member (root, "payloadSize")) != NULL &&
+     880                 :             :                  json_node_get_value_type (node) != G_TYPE_INT64)
+     881                 :             :     {
+     882                 :           1 :       g_set_error_literal (error,
+     883                 :             :                            VALENT_PACKET_ERROR,
+     884                 :             :                            VALENT_PACKET_ERROR_INVALID_FIELD,
+     885                 :             :                            "expected \"payloadSize\" field to hold an integer");
+     886                 :           1 :       return FALSE;
+     887                 :             :     }
+     888                 :             : 
+     889   [ +  +  +  + ]:        7376 :   if G_UNLIKELY ((node = json_object_get_member (root, "payloadTransferInfo")) != NULL &&
+     890                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+     891                 :             :     {
+     892                 :           1 :       g_set_error_literal (error,
+     893                 :             :                            VALENT_PACKET_ERROR,
+     894                 :             :                            VALENT_PACKET_ERROR_INVALID_FIELD,
+     895                 :             :                            "expected \"payloadTransferInfo\" field to hold an object");
+     896                 :           1 :       return FALSE;
+     897                 :             :     }
+     898                 :             : 
+     899                 :             :   return TRUE;
+     900                 :             : }
+     901                 :             : 
+     902                 :             : /**
+     903                 :             :  * valent_packet_from_stream:
+     904                 :             :  * @stream: a `GInputStream`
+     905                 :             :  * @max_len: the maximum number bytes to read, or `-1` for no limit
+     906                 :             :  * @cancellable: (nullable): a `GCancellable`
+     907                 :             :  * @error: (nullable): a `GError`
+     908                 :             :  *
+     909                 :             :  * Read a KDE Connect packet from an input stream.
+     910                 :             :  *
+     911                 :             :  * If reading fails or the packet does not conform to the minimum structure of
+     912                 :             :  * a KDE Connect packet, %NULL will be returned with @error set.
+     913                 :             :  *
+     914                 :             :  * If @max_len is greater than `-1`, then at most @max_len bytes will be read.
+     915                 :             :  * If @max_len bytes are read without encountering a line-feed character, %NULL
+     916                 :             :  * will be returned with @error set to %G_IO_ERROR_MESSAGE_TOO_LARGE.
+     917                 :             :  *
+     918                 :             :  * Returns: (transfer full): a KDE Connect packet, or %NULL with @error set.
+     919                 :             :  *
+     920                 :             :  * Since: 1.0
+     921                 :             :  */
+     922                 :             : JsonNode *
+     923                 :          14 : valent_packet_from_stream (GInputStream  *stream,
+     924                 :             :                            gssize         max_len,
+     925                 :             :                            GCancellable  *cancellable,
+     926                 :             :                            GError       **error)
+     927                 :             : {
+     928                 :          28 :   g_autoptr (JsonParser) parser = NULL;
+     929         [ +  + ]:          14 :   g_autoptr (JsonNode) packet = NULL;
+     930         [ -  + ]:          14 :   g_autofree char *line = NULL;
+     931                 :          14 :   gssize count = 0;
+     932                 :          14 :   gssize size = 4096;
+     933                 :             : 
+     934   [ +  -  +  -  :          14 :   g_return_val_if_fail (G_IS_INPUT_STREAM (stream), NULL);
+             +  -  -  + ]
+     935   [ +  +  +  -  :          14 :   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
+             -  +  -  - ]
+     936   [ +  -  -  + ]:          14 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     937                 :             : 
+     938                 :             : #ifndef __clang_analyzer__
+     939         [ +  + ]:          14 :   if (max_len < 0)
+     940                 :          10 :     max_len = G_MAXSSIZE;
+     941                 :             : 
+     942                 :          14 :   line = g_malloc0 (size);
+     943                 :             : 
+     944                 :        6498 :   while (TRUE)
+     945                 :             :     {
+     946                 :        6498 :       gssize read = 0;
+     947                 :             : 
+     948         [ +  + ]:        6498 :       if G_UNLIKELY (count == max_len)
+     949                 :             :         {
+     950                 :           1 :           g_set_error (error,
+     951                 :             :                        G_IO_ERROR,
+     952                 :             :                        G_IO_ERROR_MESSAGE_TOO_LARGE,
+     953                 :             :                        "Packet too large");
+     954                 :           1 :           return NULL;
+     955                 :             :         }
+     956                 :             : 
+     957         [ +  + ]:        6497 :       if G_UNLIKELY (count == size)
+     958                 :             :         {
+     959                 :           1 :           size = MIN (size * 2, max_len);
+     960                 :           1 :           line = g_realloc (line, size);
+     961                 :             :         }
+     962                 :             : 
+     963                 :       12994 :       read = g_input_stream_read (stream,
+     964                 :        6497 :                                   line + count,
+     965                 :             :                                   1,
+     966                 :             :                                   cancellable,
+     967                 :             :                                   error);
+     968                 :             : 
+     969         [ +  + ]:        6497 :       if (read > 0)
+     970                 :        6493 :         count += read;
+     971         [ +  + ]:           4 :       else if (read == 0)
+     972                 :             :         break;
+     973                 :             :       else
+     974                 :             :         return NULL;
+     975                 :             : 
+     976   [ +  +  +  + ]:        6493 :       if G_UNLIKELY (line[count - 1] == '\n')
+     977                 :             :         break;
+     978                 :             :     }
+     979                 :             : 
+     980                 :          12 :   parser = json_parser_new_immutable ();
+     981                 :             : 
+     982         [ +  + ]:          12 :   if (!json_parser_load_from_data (parser, line, count, error))
+     983                 :             :     return NULL;
+     984                 :             : 
+     985                 :          11 :   packet = json_parser_steal_root (parser);
+     986                 :             : 
+     987         [ +  + ]:          11 :   if (!valent_packet_validate (packet, error))
+     988                 :           2 :     return NULL;
+     989                 :             : #endif /* __clang_analyzer__ */
+     990                 :             : 
+     991                 :             :   return g_steal_pointer (&packet);
+     992                 :             : }
+     993                 :             : 
+     994                 :             : /**
+     995                 :             :  * valent_packet_to_stream:
+     996                 :             :  * @stream: a `GOutputStream`
+     997                 :             :  * @packet: a KDE Connect packet
+     998                 :             :  * @cancellable: (nullable): a `GCancellable`
+     999                 :             :  * @error: (nullable): a `GError`
+    1000                 :             :  *
+    1001                 :             :  * A convenience function for writing a packet to a connection.
+    1002                 :             :  *
+    1003                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+    1004                 :             :  *
+    1005                 :             :  * Since: 1.0
+    1006                 :             :  */
+    1007                 :             : gboolean
+    1008                 :        3671 : valent_packet_to_stream (GOutputStream  *stream,
+    1009                 :             :                          JsonNode       *packet,
+    1010                 :             :                          GCancellable   *cancellable,
+    1011                 :             :                          GError        **error)
+    1012                 :             : {
+    1013                 :        7342 :   g_autoptr (JsonGenerator) generator = NULL;
+    1014                 :        3671 :   JsonObject *root;
+    1015         [ +  - ]:        3671 :   g_autofree char *packet_str = NULL;
+    1016                 :        3671 :   size_t packet_len;
+    1017                 :        3671 :   size_t n_written;
+    1018                 :             : 
+    1019   [ +  -  +  -  :        3671 :   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
+             +  -  -  + ]
+    1020   [ +  +  +  -  :        3671 :   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+             -  +  -  - ]
+    1021   [ +  -  -  + ]:        3671 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+    1022                 :             : 
+    1023         [ -  + ]:        3671 :   if (!valent_packet_validate (packet, error))
+    1024                 :             :     return FALSE;
+    1025                 :             : 
+    1026                 :             :   /* Timestamp the packet (UNIX Epoch ms) */
+    1027                 :        3671 :   root = json_node_get_object (packet);
+    1028                 :        3671 :   json_object_set_int_member (root, "id", valent_timestamp_ms ());
+    1029                 :             : 
+    1030                 :             :   /* Serialize the packet and replace the trailing NULL with an LF */
+    1031                 :        3671 :   generator = json_generator_new ();
+    1032                 :        3671 :   json_generator_set_root (generator, packet);
+    1033                 :        3671 :   packet_str = json_generator_to_data (generator, &packet_len);
+    1034                 :        3671 :   packet_str[packet_len++] = '\n';
+    1035                 :             : 
+    1036         [ +  + ]:        3671 :   if (!g_output_stream_write_all (stream,
+    1037                 :             :                                   packet_str,
+    1038                 :             :                                   packet_len,
+    1039                 :             :                                   &n_written,
+    1040                 :             :                                   cancellable,
+    1041                 :             :                                   error))
+    1042                 :             :     return FALSE;
+    1043                 :             : 
+    1044         [ -  + ]:        3670 :   if (n_written != packet_len)
+    1045                 :             :     {
+    1046                 :           0 :       g_set_error (error,
+    1047                 :             :                    G_IO_ERROR,
+    1048                 :             :                    G_IO_ERROR_CONNECTION_CLOSED,
+    1049                 :             :                    "Channel is closed");
+    1050                 :           0 :       return FALSE;
+    1051                 :             :     }
+    1052                 :             : 
+    1053                 :             :   return TRUE;
+    1054                 :             : }
+    1055                 :             : 
+    1056                 :             : /**
+    1057                 :             :  * valent_packet_serialize:
+    1058                 :             :  * @packet: a complete KDE Connect packet
+    1059                 :             :  *
+    1060                 :             :  * Convenience function that updates the timestamp of a packet before returning
+    1061                 :             :  * a serialized string with newline ending, ready to be written to a stream.
+    1062                 :             :  *
+    1063                 :             :  * Returns: (transfer full) (nullable): the serialized packet.
+    1064                 :             :  *
+    1065                 :             :  * Since: 1.0
+    1066                 :             :  */
+    1067                 :             : char *
+    1068                 :          15 : valent_packet_serialize (JsonNode *packet)
+    1069                 :             : {
+    1070                 :          30 :   g_autoptr (JsonGenerator) generator = NULL;
+    1071                 :          15 :   JsonObject *root;
+    1072         [ +  - ]:          15 :   g_autofree char *packet_str = NULL;
+    1073                 :             : 
+    1074         [ +  - ]:          15 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), NULL);
+    1075                 :             : 
+    1076                 :             :   /* Timestamp the packet (UNIX Epoch ms) */
+    1077                 :          15 :   root = json_node_get_object (packet);
+    1078                 :          15 :   json_object_set_int_member (root, "id", valent_timestamp_ms ());
+    1079                 :             : 
+    1080                 :             :   /* Stringify the packet and return a newline-terminated string */
+    1081                 :          15 :   generator = json_generator_new ();
+    1082                 :          15 :   json_generator_set_root (generator, packet);
+    1083                 :          15 :   packet_str = json_generator_to_data (generator, NULL);
+    1084                 :             : 
+    1085                 :          15 :   return g_strconcat (packet_str, "\n", NULL);
+    1086                 :             : }
+    1087                 :             : 
+    1088                 :             : /**
+    1089                 :             :  * valent_packet_deserialize:
+    1090                 :             :  * @json: a complete KDE Connect packet
+    1091                 :             :  * @error: (nullable): a `GError`
+    1092                 :             :  *
+    1093                 :             :  * Convenience function that deserializes a KDE Connect packet from a string
+    1094                 :             :  * with basic validation. If @str is empty, this function will return %NULL.
+    1095                 :             :  *
+    1096                 :             :  * If parsing or validation fails, @error will be set and %NULL returned.
+    1097                 :             :  *
+    1098                 :             :  * Returns: (transfer full) (nullable): a KDE Connect packet
+    1099                 :             :  *
+    1100                 :             :  * Since: 1.0
+    1101                 :             :  */
+    1102                 :             : JsonNode *
+    1103                 :        3665 : valent_packet_deserialize (const char  *json,
+    1104                 :             :                            GError     **error)
+    1105                 :             : {
+    1106                 :        7330 :   g_autoptr (JsonParser) parser = NULL;
+    1107         [ +  - ]:        3665 :   g_autoptr (JsonNode) packet = NULL;
+    1108                 :             : 
+    1109         [ +  - ]:        3665 :   g_return_val_if_fail (json != NULL, NULL);
+    1110   [ +  -  -  + ]:        3665 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+    1111                 :             : 
+    1112                 :        3665 :   parser = json_parser_new_immutable ();
+    1113                 :             : 
+    1114         [ +  - ]:        3665 :   if (!json_parser_load_from_data (parser, json, -1, error))
+    1115                 :             :     return NULL;
+    1116                 :             : 
+    1117         [ +  - ]:        3665 :   if ((packet = json_parser_steal_root (parser)) == NULL)
+    1118                 :             :     return NULL;
+    1119                 :             : 
+    1120         [ -  + ]:        3665 :   if (!valent_packet_validate (packet, error))
+    1121                 :           0 :     return NULL;
+    1122                 :             : 
+    1123                 :             :   return g_steal_pointer (&packet);
+    1124                 :             : }
+    1125                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-packet.h.func-c.html b/coverage/src/libvalent/device/valent-packet.h.func-c.html new file mode 100644 index 00000000000..cb60be85e8c --- /dev/null +++ b/coverage/src/libvalent/device/valent-packet.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-packet.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-packet.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1414
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:84.6 %2622
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_packet_is_valid67174
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-packet.h.func.html b/coverage/src/libvalent/device/valent-packet.h.func.html new file mode 100644 index 00000000000..60bf7ae6a19 --- /dev/null +++ b/coverage/src/libvalent/device/valent-packet.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-packet.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-packet.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1414
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:84.6 %2622
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_packet_is_valid67174
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/device/valent-packet.h.gcov.html b/coverage/src/libvalent/device/valent-packet.h.gcov.html new file mode 100644 index 00000000000..7ba95489af1 --- /dev/null +++ b/coverage/src/libvalent/device/valent-packet.h.gcov.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/device/valent-packet.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/device - valent-packet.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1414
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:84.6 %2622
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : 
+      12                 :             : #include "../core/valent-object.h"
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentPacketError:
+      19                 :             :  * @VALENT_PACKET_ERROR_UNKNOWN: an unknown error
+      20                 :             :  * @VALENT_PACKET_ERROR_INVALID_DATA: the packet is %NULL or not JSON
+      21                 :             :  * @VALENT_PACKET_ERROR_MALFORMED: the packet structure is malformed
+      22                 :             :  * @VALENT_PACKET_ERROR_INVALID_FIELD: an expected field holds an invalid type
+      23                 :             :  * @VALENT_PACKET_ERROR_MISSING_FIELD: an expected field is missing
+      24                 :             :  *
+      25                 :             :  * Error enumeration for KDE Connect packet validation.
+      26                 :             :  *
+      27                 :             :  * This enumeration can be extended at later date
+      28                 :             :  *
+      29                 :             :  * Since: 1.0
+      30                 :             :  */
+      31                 :             : typedef enum {
+      32                 :             :   VALENT_PACKET_ERROR_UNKNOWN,
+      33                 :             :   VALENT_PACKET_ERROR_INVALID_DATA,
+      34                 :             :   VALENT_PACKET_ERROR_MALFORMED,
+      35                 :             :   VALENT_PACKET_ERROR_INVALID_FIELD,
+      36                 :             :   VALENT_PACKET_ERROR_MISSING_FIELD,
+      37                 :             : } ValentPacketError;
+      38                 :             : 
+      39                 :             : VALENT_AVAILABLE_IN_1_0
+      40                 :             : GQuark   valent_packet_error_quark (void);
+      41                 :             : #define VALENT_PACKET_ERROR (valent_packet_error_quark ())
+      42                 :             : 
+      43                 :             : 
+      44                 :             : /**
+      45                 :             :  * valent_packet_is_valid:
+      46                 :             :  * @packet: (nullable): a `JsonNode`
+      47                 :             :  *
+      48                 :             :  * Check if @packet is a well-formed KDE Connect packet. This can be used in
+      49                 :             :  * g_return_if_fail() checks.
+      50                 :             :  *
+      51                 :             :  * Returns: %TRUE if @packet is valid, or %FALSE if not
+      52                 :             :  */
+      53                 :             : static inline gboolean
+      54                 :       67174 : valent_packet_is_valid (JsonNode *packet)
+      55                 :             : {
+      56                 :       67174 :   JsonObject *root;
+      57                 :       67174 :   JsonNode *node;
+      58                 :             : 
+      59   [ +  -  +  + ]:       67174 :   if G_UNLIKELY (packet == NULL || !JSON_NODE_HOLDS_OBJECT (packet))
+      60                 :         160 :     return FALSE;
+      61                 :             : 
+      62                 :       67014 :   root = json_node_get_object (packet);
+      63                 :             : 
+      64                 :             :   /* TODO: kdeconnect-kde stringifies this in identity packets
+      65                 :             :    *       https://invent.kde.org/network/kdeconnect-kde/-/merge_requests/380 */
+      66   [ +  +  +  +  :       67014 :   if G_UNLIKELY ((node = json_object_get_member (root, "id")) == NULL ||
+                   +  + ]
+      67                 :             :                  (json_node_get_value_type (node) != G_TYPE_INT64 &&
+      68                 :             :                   json_node_get_value_type (node) != G_TYPE_STRING))
+      69                 :       49628 :     return FALSE;
+      70                 :             : 
+      71   [ +  +  +  - ]:       17386 :   if G_UNLIKELY ((node = json_object_get_member (root, "type")) == NULL ||
+      72                 :             :                  json_node_get_value_type (node) != G_TYPE_STRING)
+      73                 :        1732 :     return FALSE;
+      74                 :             : 
+      75   [ +  +  +  + ]:       15654 :   if G_UNLIKELY ((node = json_object_get_member (root, "body")) == NULL ||
+      76                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+      77                 :         160 :     return FALSE;
+      78                 :             : 
+      79                 :             :   /* These two are optional, but have defined value types */
+      80   [ +  +  -  + ]:       15494 :   if G_UNLIKELY ((node = json_object_get_member (root, "payloadSize")) != NULL &&
+      81                 :             :                  json_node_get_value_type (node) != G_TYPE_INT64)
+      82                 :             :     return FALSE;
+      83                 :             : 
+      84   [ +  +  -  + ]:       15494 :   if G_UNLIKELY ((node = json_object_get_member (root, "payloadTransferInfo")) != NULL &&
+      85                 :             :                  json_node_get_node_type (node) != JSON_NODE_OBJECT)
+      86                 :             :     return FALSE;
+      87                 :             : 
+      88                 :             :   return TRUE;
+      89                 :             : }
+      90                 :             : #define VALENT_IS_PACKET(packet) (valent_packet_is_valid (packet))
+      91                 :             : 
+      92                 :             : 
+      93                 :             : /* Packet Helpers */
+      94                 :             : VALENT_AVAILABLE_IN_1_0
+      95                 :             : JsonNode   * valent_packet_new              (const char     *type);
+      96                 :             : VALENT_AVAILABLE_IN_1_0
+      97                 :             : void         valent_packet_init             (JsonBuilder   **builder,
+      98                 :             :                                              const char     *type);
+      99                 :             : VALENT_AVAILABLE_IN_1_0
+     100                 :             : JsonNode   * valent_packet_end              (JsonBuilder   **builder);
+     101                 :             : VALENT_AVAILABLE_IN_1_0
+     102                 :             : int64_t      valent_packet_get_id           (JsonNode       *packet);
+     103                 :             : VALENT_AVAILABLE_IN_1_0
+     104                 :             : const char * valent_packet_get_type         (JsonNode       *packet);
+     105                 :             : VALENT_AVAILABLE_IN_1_0
+     106                 :             : JsonObject * valent_packet_get_body         (JsonNode       *packet);
+     107                 :             : VALENT_AVAILABLE_IN_1_0
+     108                 :             : gboolean     valent_packet_has_payload      (JsonNode       *packet);
+     109                 :             : VALENT_AVAILABLE_IN_1_0
+     110                 :             : JsonObject * valent_packet_get_payload_full (JsonNode       *packet,
+     111                 :             :                                              goffset        *size,
+     112                 :             :                                              GError        **error);
+     113                 :             : VALENT_AVAILABLE_IN_1_0
+     114                 :             : void         valent_packet_set_payload_full (JsonNode       *packet,
+     115                 :             :                                              JsonObject     *info,
+     116                 :             :                                              goffset         size);
+     117                 :             : VALENT_AVAILABLE_IN_1_0
+     118                 :             : JsonObject * valent_packet_get_payload_info (JsonNode       *packet);
+     119                 :             : VALENT_AVAILABLE_IN_1_0
+     120                 :             : void         valent_packet_set_payload_info (JsonNode       *packet,
+     121                 :             :                                              JsonObject     *info);
+     122                 :             : VALENT_AVAILABLE_IN_1_0
+     123                 :             : goffset      valent_packet_get_payload_size (JsonNode       *packet);
+     124                 :             : VALENT_AVAILABLE_IN_1_0
+     125                 :             : void         valent_packet_set_payload_size (JsonNode       *packet,
+     126                 :             :                                              goffset         size);
+     127                 :             : 
+     128                 :             : /* Field Helpers */
+     129                 :             : VALENT_AVAILABLE_IN_1_0
+     130                 :             : gboolean     valent_packet_check_field      (JsonNode       *packet,
+     131                 :             :                                              const char     *field);
+     132                 :             : VALENT_AVAILABLE_IN_1_0
+     133                 :             : gboolean     valent_packet_get_boolean      (JsonNode       *packet,
+     134                 :             :                                              const char     *field,
+     135                 :             :                                              gboolean       *value);
+     136                 :             : VALENT_AVAILABLE_IN_1_0
+     137                 :             : gboolean     valent_packet_get_double       (JsonNode       *packet,
+     138                 :             :                                              const char     *field,
+     139                 :             :                                              double         *value);
+     140                 :             : VALENT_AVAILABLE_IN_1_0
+     141                 :             : gboolean     valent_packet_get_int          (JsonNode       *packet,
+     142                 :             :                                              const char     *field,
+     143                 :             :                                              int64_t        *value);
+     144                 :             : VALENT_AVAILABLE_IN_1_0
+     145                 :             : gboolean     valent_packet_get_string       (JsonNode       *packet,
+     146                 :             :                                              const char     *field,
+     147                 :             :                                              const char    **value);
+     148                 :             : VALENT_AVAILABLE_IN_1_0
+     149                 :             : gboolean     valent_packet_get_array        (JsonNode       *packet,
+     150                 :             :                                              const char     *field,
+     151                 :             :                                              JsonArray     **value);
+     152                 :             : VALENT_AVAILABLE_IN_1_0
+     153                 :             : gboolean     valent_packet_get_object       (JsonNode       *packet,
+     154                 :             :                                              const char     *field,
+     155                 :             :                                              JsonObject    **value);
+     156                 :             : VALENT_AVAILABLE_IN_1_0
+     157                 :             : GStrv        valent_packet_dup_strv         (JsonNode       *packet,
+     158                 :             :                                              const char     *field);
+     159                 :             : 
+     160                 :             : /* I/O Helpers */
+     161                 :             : VALENT_AVAILABLE_IN_1_0
+     162                 :             : gboolean     valent_packet_validate         (JsonNode       *packet,
+     163                 :             :                                              GError        **error);
+     164                 :             : VALENT_AVAILABLE_IN_1_0
+     165                 :             : JsonNode   * valent_packet_from_stream      (GInputStream   *stream,
+     166                 :             :                                              gssize          max_len,
+     167                 :             :                                              GCancellable   *cancellable,
+     168                 :             :                                              GError        **error);
+     169                 :             : VALENT_AVAILABLE_IN_1_0
+     170                 :             : gboolean     valent_packet_to_stream        (GOutputStream  *stream,
+     171                 :             :                                              JsonNode       *packet,
+     172                 :             :                                              GCancellable   *cancellable,
+     173                 :             :                                              GError        **error);
+     174                 :             : VALENT_AVAILABLE_IN_1_0
+     175                 :             : char       * valent_packet_serialize        (JsonNode       *packet);
+     176                 :             : VALENT_AVAILABLE_IN_1_0
+     177                 :             : JsonNode   * valent_packet_deserialize      (const char     *json,
+     178                 :             :                                              GError        **error);
+     179                 :             : 
+     180                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-detail-sort-b.html b/coverage/src/libvalent/input/index-detail-sort-b.html new file mode 100644 index 00000000000..67e19361386 --- /dev/null +++ b/coverage/src/libvalent/input/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-detail-sort-f.html b/coverage/src/libvalent/input/index-detail-sort-f.html new file mode 100644 index 00000000000..3d53f530193 --- /dev/null +++ b/coverage/src/libvalent/input/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-detail-sort-l.html b/coverage/src/libvalent/input/index-detail-sort-l.html new file mode 100644 index 00000000000..e8460fa127b --- /dev/null +++ b/coverage/src/libvalent/input/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-detail.html b/coverage/src/libvalent/input/index-detail.html new file mode 100644 index 00000000000..458b3216977 --- /dev/null +++ b/coverage/src/libvalent/input/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-sort-b.html b/coverage/src/libvalent/input/index-sort-b.html new file mode 100644 index 00000000000..67e19361386 --- /dev/null +++ b/coverage/src/libvalent/input/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-sort-f.html b/coverage/src/libvalent/input/index-sort-f.html new file mode 100644 index 00000000000..3d53f530193 --- /dev/null +++ b/coverage/src/libvalent/input/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index-sort-l.html b/coverage/src/libvalent/input/index-sort-l.html new file mode 100644 index 00000000000..e8460fa127b --- /dev/null +++ b/coverage/src/libvalent/input/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/index.html b/coverage/src/libvalent/input/index.html new file mode 100644 index 00000000000..458b3216977 --- /dev/null +++ b/coverage/src/libvalent/input/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/inputCoverageTotalHit
Test:Code CoverageLines:90.8 %153139
Test Date:2024-03-31 18:46:36Functions:89.7 %2926
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.3 %11656
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-input-adapter.c +
100.0%
+
100.0 %343442.1 %3816100.0 %88
valent-input-adapter.h +
100.0%
+
100.0 %1150.0 %84100.0 %11
valent-input.c +
88.0%88.0%
+
88.0 %11710351.6 %643384.2 %1916
valent-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input-adapter.c.func-c.html b/coverage/src/libvalent/input/valent-input-adapter.c.func-c.html new file mode 100644 index 00000000000..607a7be9cb2 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input-adapter.c.func-c.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3434
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.1 %3816
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_input_adapter_pointer_axis4
valent_input_adapter_pointer_motion7
valent_input_adapter_init10
valent_input_adapter_pointer_button18
valent_input_adapter_keyboard_keysym28
valent_input_adapter_get_type520
valent_input_adapter_class_intern_init67
valent_input_adapter_get_type_once86
valent_input_adapter_get_type367
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input-adapter.c.func.html b/coverage/src/libvalent/input/valent-input-adapter.c.func.html new file mode 100644 index 00000000000..9cda30ea167 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input-adapter.c.func.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3434
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.1 %3816
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_input_adapter_get_type520
valent_input_adapter_class_intern_init67
valent_input_adapter_get_type367
valent_input_adapter_get_type_once86
valent_input_adapter_init10
valent_input_adapter_keyboard_keysym28
valent_input_adapter_pointer_axis4
valent_input_adapter_pointer_button18
valent_input_adapter_pointer_motion7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input-adapter.c.gcov.html b/coverage/src/libvalent/input/valent-input-adapter.c.gcov.html new file mode 100644 index 00000000000..efb6af0e57f --- /dev/null +++ b/coverage/src/libvalent/input/valent-input-adapter.c.gcov.html @@ -0,0 +1,312 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3434
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.1 %3816
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-input-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-input-adapter.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentInputAdapter:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for virtual input devices.
+      18                 :             :  *
+      19                 :             :  * `ValentInputAdapter` is a base class for plugins that provide an interface to
+      20                 :             :  * the pointer and keyboard. This usually means simulating pointer and keyboard
+      21                 :             :  * events on the host system.
+      22                 :             :  *
+      23                 :             :  * ## `.plugin` File
+      24                 :             :  *
+      25                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      26                 :             :  *
+      27                 :             :  * - `X-InputAdapterPriority`
+      28                 :             :  *
+      29                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      30                 :             :  *     lowest value will be used as the primary adapter.
+      31                 :             :  *
+      32                 :             :  * Since: 1.0
+      33                 :             :  */
+      34                 :             : 
+      35                 :             : typedef struct
+      36                 :             : {
+      37                 :             :   uint8_t  active : 1;
+      38                 :             : } ValentInputAdapterPrivate;
+      39                 :             : 
+      40   [ +  +  +  - ]:         520 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentInputAdapter, valent_input_adapter, VALENT_TYPE_EXTENSION)
+      41                 :             : 
+      42                 :             : /**
+      43                 :             :  * ValentInputAdapterClass:
+      44                 :             :  * @keyboard_keysym: the virtual function pointer for valent_input_adapter_keyboard_keysym()
+      45                 :             :  * @pointer_axis: the virtual function pointer for valent_input_adapter_pointer_axis()
+      46                 :             :  * @pointer_button: the virtual function pointer for valent_input_adapter_pointer_button()
+      47                 :             :  * @pointer_motion: the virtual function pointer for valent_input_adapter_pointer_motion()
+      48                 :             :  *
+      49                 :             :  * The virtual function table for `ValentInputAdapter`.
+      50                 :             :  */
+      51                 :             : 
+      52                 :             : 
+      53                 :             : /* LCOV_EXCL_START */
+      54                 :             : static void
+      55                 :             : valent_input_adapter_real_keyboard_keysym (ValentInputAdapter *adapter,
+      56                 :             :                                            uint32_t            keysym,
+      57                 :             :                                            gboolean            state)
+      58                 :             : {
+      59                 :             : }
+      60                 :             : 
+      61                 :             : static void
+      62                 :             : valent_input_adapter_real_pointer_axis (ValentInputAdapter *adapter,
+      63                 :             :                                         double              dx,
+      64                 :             :                                         double              dy)
+      65                 :             : {
+      66                 :             : }
+      67                 :             : 
+      68                 :             : static void
+      69                 :             : valent_input_adapter_real_pointer_button (ValentInputAdapter  *adapter,
+      70                 :             :                                           unsigned int         button,
+      71                 :             :                                           gboolean             state)
+      72                 :             : {
+      73                 :             : }
+      74                 :             : 
+      75                 :             : static void
+      76                 :             : valent_input_adapter_real_pointer_motion (ValentInputAdapter *adapter,
+      77                 :             :                                           double              dx,
+      78                 :             :                                           double              dy)
+      79                 :             : {
+      80                 :             : }
+      81                 :             : /* LCOV_EXCL_STOP */
+      82                 :             : 
+      83                 :             : /*
+      84                 :             :  * GObject
+      85                 :             :  */
+      86                 :             : static void
+      87                 :          67 : valent_input_adapter_class_init (ValentInputAdapterClass *klass)
+      88                 :             : {
+      89                 :          67 :   klass->keyboard_keysym = valent_input_adapter_real_keyboard_keysym;
+      90                 :          67 :   klass->pointer_axis = valent_input_adapter_real_pointer_axis;
+      91                 :          67 :   klass->pointer_button = valent_input_adapter_real_pointer_button;
+      92                 :          67 :   klass->pointer_motion = valent_input_adapter_real_pointer_motion;
+      93                 :             : }
+      94                 :             : 
+      95                 :             : static void
+      96                 :          10 : valent_input_adapter_init (ValentInputAdapter *adapter)
+      97                 :             : {
+      98                 :          10 : }
+      99                 :             : 
+     100                 :             : /**
+     101                 :             :  * valent_input_adapter_keyboard_keysym:
+     102                 :             :  * @adapter: a `ValentInputAdapter`
+     103                 :             :  * @keysym: a keysym
+     104                 :             :  * @state: %TRUE to press, or %FALSE to release
+     105                 :             :  *
+     106                 :             :  * Press or release @keysym.
+     107                 :             :  *
+     108                 :             :  * Since: 1.0
+     109                 :             :  */
+     110                 :             : void
+     111                 :          28 : valent_input_adapter_keyboard_keysym (ValentInputAdapter *adapter,
+     112                 :             :                                       uint32_t            keysym,
+     113                 :             :                                       gboolean            state)
+     114                 :             : {
+     115                 :          28 :   VALENT_ENTRY;
+     116                 :             : 
+     117         [ +  - ]:          28 :   g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
+     118                 :             : 
+     119                 :             :   /* Silently ignore empty symbols */
+     120         [ +  - ]:          28 :   if G_UNLIKELY (keysym == 0)
+     121                 :          28 :     VALENT_EXIT;
+     122                 :             : 
+     123                 :          28 :   VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->keyboard_keysym (adapter,
+     124                 :             :                                                              keysym,
+     125                 :             :                                                              state);
+     126                 :             : 
+     127                 :          28 :   VALENT_EXIT;
+     128                 :             : }
+     129                 :             : 
+     130                 :             : /**
+     131                 :             :  * valent_input_adapter_pointer_axis:
+     132                 :             :  * @adapter: a `ValentInputAdapter`
+     133                 :             :  * @dx: movement on x-axis
+     134                 :             :  * @dy: movement on y-axis
+     135                 :             :  *
+     136                 :             :  * Scroll the surface under the pointer (@dx, @dy), relative to its current
+     137                 :             :  * position.
+     138                 :             :  *
+     139                 :             :  * Implementations should handle any necessary scaling.
+     140                 :             :  *
+     141                 :             :  * Since: 1.0
+     142                 :             :  */
+     143                 :             : void
+     144                 :           4 : valent_input_adapter_pointer_axis (ValentInputAdapter *adapter,
+     145                 :             :                                    double              dx,
+     146                 :             :                                    double              dy)
+     147                 :             : {
+     148                 :           4 :   VALENT_ENTRY;
+     149                 :             : 
+     150         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
+     151                 :             : 
+     152                 :             :   /* Silently ignore 0-delta motion */
+     153   [ -  +  -  -  :           4 :   if G_UNLIKELY (G_APPROX_VALUE (dx, 0.0, 0.01) && G_APPROX_VALUE (dy, 0.0, 0.01))
+          +  -  +  -  +  
+                -  -  - ]
+     154                 :           4 :     VALENT_EXIT;
+     155                 :             : 
+     156                 :           4 :   VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->pointer_axis (adapter, dx, dy);
+     157                 :             : 
+     158                 :           4 :   VALENT_EXIT;
+     159                 :             : }
+     160                 :             : 
+     161                 :             : /**
+     162                 :             :  * valent_input_adapter_pointer_button:
+     163                 :             :  * @adapter: a `ValentInputAdapter`
+     164                 :             :  * @button: a button number
+     165                 :             :  * @state: %TRUE to press, or %FALSE to release
+     166                 :             :  *
+     167                 :             :  * Press or release @button.
+     168                 :             :  *
+     169                 :             :  * Since: 1.0
+     170                 :             :  */
+     171                 :             : void
+     172                 :          18 : valent_input_adapter_pointer_button (ValentInputAdapter *adapter,
+     173                 :             :                                      unsigned int        button,
+     174                 :             :                                      gboolean            state)
+     175                 :             : {
+     176                 :          18 :   VALENT_ENTRY;
+     177                 :             : 
+     178         [ +  - ]:          18 :   g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
+     179                 :             : 
+     180                 :          18 :   VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->pointer_button (adapter,
+     181                 :             :                                                             button,
+     182                 :             :                                                             state);
+     183                 :             : 
+     184                 :          18 :   VALENT_EXIT;
+     185                 :             : }
+     186                 :             : 
+     187                 :             : /**
+     188                 :             :  * valent_input_adapter_pointer_motion:
+     189                 :             :  * @adapter: a `ValentInputAdapter`
+     190                 :             :  * @dx: movement on x-axis
+     191                 :             :  * @dy: movement on y-axis
+     192                 :             :  *
+     193                 :             :  * Move the pointer (@dx, @dy), relative to its current position.
+     194                 :             :  *
+     195                 :             :  * Implementation should handle any necessary scaling
+     196                 :             :  *
+     197                 :             :  * Since: 1.0
+     198                 :             :  */
+     199                 :             : void
+     200                 :           7 : valent_input_adapter_pointer_motion (ValentInputAdapter *adapter,
+     201                 :             :                                      double              dx,
+     202                 :             :                                      double              dy)
+     203                 :             : {
+     204                 :           7 :   VALENT_ENTRY;
+     205                 :             : 
+     206         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
+     207                 :             : 
+     208                 :             :   /* Silently ignore 0-delta motion */
+     209   [ +  +  -  +  :           7 :   if G_UNLIKELY (G_APPROX_VALUE (dx, 0.0, 0.01) && G_APPROX_VALUE (dy, 0.0, 0.01))
+          -  +  -  -  -  
+                -  -  - ]
+     210                 :           7 :     VALENT_EXIT;
+     211                 :             : 
+     212                 :           7 :   VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->pointer_motion (adapter, dx, dy);
+     213                 :             : 
+     214                 :           7 :   VALENT_EXIT;
+     215                 :             : }
+     216                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input-adapter.h.func-c.html b/coverage/src/libvalent/input/valent-input-adapter.h.func-c.html new file mode 100644 index 00000000000..c4ec15180c3 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_INPUT_ADAPTER128
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input-adapter.h.func.html b/coverage/src/libvalent/input/valent-input-adapter.h.func.html new file mode 100644 index 00000000000..e1ce3715fe9 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_INPUT_ADAPTER128
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input-adapter.h.gcov.html b/coverage/src/libvalent/input/valent-input-adapter.h.gcov.html new file mode 100644 index 00000000000..a0a3c3c62e2 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input-adapter.h.gcov.html @@ -0,0 +1,152 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_INPUT_ADAPTER (valent_input_adapter_get_type())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :         190 : G_DECLARE_DERIVABLE_TYPE (ValentInputAdapter, valent_input_adapter, VALENT, INPUT_ADAPTER, ValentExtension)
+             +  -  +  - ]
+      18                 :             : 
+      19                 :             : struct _ValentInputAdapterClass
+      20                 :             : {
+      21                 :             :   ValentExtensionClass   parent_class;
+      22                 :             : 
+      23                 :             :   /* virtual functions */
+      24                 :             :   void                   (*keyboard_keysym) (ValentInputAdapter *adapter,
+      25                 :             :                                              uint32_t            keysym,
+      26                 :             :                                              gboolean            state);
+      27                 :             :   void                   (*pointer_axis)    (ValentInputAdapter *adapter,
+      28                 :             :                                              double              dx,
+      29                 :             :                                              double              dy);
+      30                 :             :   void                   (*pointer_button)  (ValentInputAdapter *adapter,
+      31                 :             :                                              unsigned int        button,
+      32                 :             :                                              gboolean            state);
+      33                 :             :   void                   (*pointer_motion)  (ValentInputAdapter *adapter,
+      34                 :             :                                              double              dx,
+      35                 :             :                                              double              dy);
+      36                 :             : 
+      37                 :             :   /*< private >*/
+      38                 :             :   gpointer               padding[8];
+      39                 :             : };
+      40                 :             : 
+      41                 :             : VALENT_AVAILABLE_IN_1_0
+      42                 :             : void   valent_input_adapter_keyboard_keysym (ValentInputAdapter *adapter,
+      43                 :             :                                              uint32_t            keysym,
+      44                 :             :                                              gboolean            state);
+      45                 :             : VALENT_AVAILABLE_IN_1_0
+      46                 :             : void   valent_input_adapter_pointer_axis    (ValentInputAdapter *adapter,
+      47                 :             :                                              double              dx,
+      48                 :             :                                              double              dy);
+      49                 :             : VALENT_AVAILABLE_IN_1_0
+      50                 :             : void   valent_input_adapter_pointer_button  (ValentInputAdapter *adapter,
+      51                 :             :                                              unsigned int        button,
+      52                 :             :                                              gboolean            state);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : void   valent_input_adapter_pointer_motion  (ValentInputAdapter *adapter,
+      55                 :             :                                              double              dx,
+      56                 :             :                                              double              dy);
+      57                 :             : 
+      58                 :             : G_END_DECLS
+      59                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input.c.func-c.html b/coverage/src/libvalent/input/valent-input.c.func-c.html new file mode 100644 index 00000000000..c05c31bfb36 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.0 %117103
Test Date:2024-03-31 18:46:36Functions:84.2 %1916
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.6 %6433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_input_get_item0
valent_input_get_item_type0
valent_input_get_n_items0
valent_input_export_adapter2
valent_input_unexport_adapter2
valent_input_destroy3
valent_input_finalize3
valent_input_pointer_axis3
g_list_model_iface_init6
valent_input_init6
valent_input_pointer_motion6
on_items_changed7
valent_input_bind_preferred8
valent_input_get_default13
valent_input_pointer_button16
valent_input_keyboard_keysym26
valent_input_get_type254
valent_input_class_intern_init6
valent_input_get_type_once86
valent_input_get_type162
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input.c.func.html b/coverage/src/libvalent/input/valent-input.c.func.html new file mode 100644 index 00000000000..866421ddf76 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.0 %117103
Test Date:2024-03-31 18:46:36Functions:84.2 %1916
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.6 %6433
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init6
on_items_changed7
valent_input_bind_preferred8
valent_input_destroy3
valent_input_export_adapter2
valent_input_finalize3
valent_input_get_default13
valent_input_get_item0
valent_input_get_item_type0
valent_input_get_n_items0
valent_input_get_type254
valent_input_class_intern_init6
valent_input_get_type162
valent_input_get_type_once86
valent_input_init6
valent_input_keyboard_keysym26
valent_input_pointer_axis3
valent_input_pointer_button16
valent_input_pointer_motion6
valent_input_unexport_adapter2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input.c.gcov.html b/coverage/src/libvalent/input/valent-input.c.gcov.html new file mode 100644 index 00000000000..508bbf0e30a --- /dev/null +++ b/coverage/src/libvalent/input/valent-input.c.gcov.html @@ -0,0 +1,492 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.0 %117103
Test Date:2024-03-31 18:46:36Functions:84.2 %1916
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.6 %6433
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-input"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib-object.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-input.h"
+      13                 :             : #include "valent-input-adapter.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : /**
+      17                 :             :  * ValentInput:
+      18                 :             :  *
+      19                 :             :  * A class for controlling pointer and keyboard devices.
+      20                 :             :  *
+      21                 :             :  * `ValentInput` is an abstraction of virtual input devices, intended for use by
+      22                 :             :  * [class@Valent.DevicePlugin] implementations.
+      23                 :             :  *
+      24                 :             :  * Plugins can implement [class@Valent.InputAdapter] to provide an interface to
+      25                 :             :  * control the pointer and keyboard.
+      26                 :             :  *
+      27                 :             :  * Since: 1.0
+      28                 :             :  */
+      29                 :             : 
+      30                 :             : struct _ValentInput
+      31                 :             : {
+      32                 :             :   ValentComponent     parent_instance;
+      33                 :             : 
+      34                 :             :   ValentInputAdapter *default_adapter;
+      35                 :             :   GPtrArray          *adapters; /* complete list of adapters */
+      36                 :             :   GListModel         *exports;  /* adapters marked for export */
+      37                 :             :   GPtrArray          *items;    /* adapters exposed by GListModel */
+      38                 :             : };
+      39                 :             : 
+      40                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      41                 :             : 
+      42   [ +  +  +  - ]:         254 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentInput, valent_input, VALENT_TYPE_COMPONENT,
+      43                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      44                 :             : 
+      45                 :             : 
+      46                 :             : static ValentInput *default_input = NULL;
+      47                 :             : 
+      48                 :             : 
+      49                 :             : static void
+      50                 :           7 : on_items_changed (GListModel   *list,
+      51                 :             :                   unsigned int  position,
+      52                 :             :                   unsigned int  removed,
+      53                 :             :                   unsigned int  added,
+      54                 :             :                   ValentInput  *self)
+      55                 :             : {
+      56                 :           7 :   unsigned int real_position = 0;
+      57                 :             : 
+      58                 :           7 :   VALENT_ENTRY;
+      59                 :             : 
+      60         [ +  - ]:           7 :   g_assert (G_IS_LIST_MODEL (list));
+      61         [ +  - ]:           7 :   g_assert (VALENT_IS_INPUT (self));
+      62                 :             : 
+      63                 :             :   /* Translate the adapter position */
+      64         [ +  - ]:           7 :   for (unsigned int i = 0; i < self->adapters->len; i++)
+      65                 :             :     {
+      66                 :           7 :       GListModel *adapter = g_ptr_array_index (self->adapters, i);
+      67                 :             : 
+      68         [ -  + ]:           7 :       if (adapter == list)
+      69                 :             :         break;
+      70                 :             : 
+      71                 :           0 :       real_position += g_list_model_get_n_items (adapter);
+      72                 :             :     }
+      73                 :             : 
+      74                 :           7 :   real_position += position;
+      75                 :             : 
+      76                 :             :   /* Propagate the changes */
+      77         [ +  + ]:           9 :   for (unsigned int i = 0; i < removed; i++)
+      78                 :             :     {
+      79                 :           2 :       g_autoptr (ValentInputAdapter) adapter = NULL;
+      80                 :             : 
+      81                 :           2 :       adapter = g_ptr_array_steal_index (self->items, real_position);
+      82                 :             : 
+      83         [ +  - ]:           2 :       VALENT_NOTE ("removed %s", G_OBJECT_TYPE_NAME (adapter));
+      84                 :             :     }
+      85                 :             : 
+      86         [ +  + ]:           9 :   for (unsigned int i = 0; i < added; i++)
+      87                 :             :     {
+      88                 :           2 :       ValentInputAdapter *adapter = NULL;
+      89                 :             : 
+      90                 :           2 :       adapter = g_list_model_get_item (list, position + i);
+      91                 :           2 :       g_ptr_array_insert (self->items, real_position + i, adapter);
+      92                 :             : 
+      93                 :           2 :       VALENT_NOTE ("added %s", G_OBJECT_TYPE_NAME (adapter));
+      94                 :             :     }
+      95                 :             : 
+      96                 :           7 :   g_list_model_items_changed (G_LIST_MODEL (self), real_position, removed, added);
+      97                 :             : 
+      98                 :           7 :   VALENT_EXIT;
+      99                 :             : }
+     100                 :             : 
+     101                 :             : /*
+     102                 :             :  * GListModel
+     103                 :             :  */
+     104                 :             : static gpointer
+     105                 :           0 : valent_input_get_item (GListModel   *list,
+     106                 :             :                        unsigned int  position)
+     107                 :             : {
+     108                 :           0 :   ValentInput *self = VALENT_INPUT (list);
+     109                 :             : 
+     110         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT (self));
+     111                 :             : 
+     112         [ #  # ]:           0 :   if G_UNLIKELY (position >= self->items->len)
+     113                 :             :     return NULL;
+     114                 :             : 
+     115                 :           0 :   return g_object_ref (g_ptr_array_index (self->items, position));
+     116                 :             : }
+     117                 :             : 
+     118                 :             : static GType
+     119                 :           0 : valent_input_get_item_type (GListModel *list)
+     120                 :             : {
+     121                 :           0 :   return VALENT_TYPE_INPUT_ADAPTER;
+     122                 :             : }
+     123                 :             : 
+     124                 :             : static unsigned int
+     125                 :           0 : valent_input_get_n_items (GListModel *list)
+     126                 :             : {
+     127                 :           0 :   ValentInput *self = VALENT_INPUT (list);
+     128                 :             : 
+     129         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT (self));
+     130                 :             : 
+     131                 :           0 :   return self->items->len;
+     132                 :             : }
+     133                 :             : 
+     134                 :             : static void
+     135                 :           6 : g_list_model_iface_init (GListModelInterface *iface)
+     136                 :             : {
+     137                 :           6 :   iface->get_item = valent_input_get_item;
+     138                 :           6 :   iface->get_item_type = valent_input_get_item_type;
+     139                 :           6 :   iface->get_n_items = valent_input_get_n_items;
+     140                 :           6 : }
+     141                 :             : 
+     142                 :             : /*
+     143                 :             :  * ValentComponent
+     144                 :             :  */
+     145                 :             : static void
+     146                 :           8 : valent_input_bind_preferred (ValentComponent *component,
+     147                 :             :                              GObject         *extension)
+     148                 :             : {
+     149                 :           8 :   ValentInput *self = VALENT_INPUT (component);
+     150                 :           8 :   ValentInputAdapter *adapter = VALENT_INPUT_ADAPTER (extension);
+     151                 :             : 
+     152                 :           8 :   VALENT_ENTRY;
+     153                 :             : 
+     154         [ +  - ]:           8 :   g_assert (VALENT_IS_INPUT (self));
+     155   [ +  -  -  + ]:           8 :   g_assert (adapter == NULL || VALENT_IS_INPUT_ADAPTER (adapter));
+     156                 :             : 
+     157                 :           8 :   self->default_adapter = adapter;
+     158                 :             : 
+     159                 :           8 :   VALENT_EXIT;
+     160                 :             : }
+     161                 :             : 
+     162                 :             : /*
+     163                 :             :  * ValentObject
+     164                 :             :  */
+     165                 :             : static void
+     166                 :           3 : valent_input_destroy (ValentObject *object)
+     167                 :             : {
+     168                 :           3 :   ValentInput *self = VALENT_INPUT (object);
+     169                 :             : 
+     170                 :           3 :   g_list_store_remove_all (G_LIST_STORE (self->exports));
+     171                 :             : 
+     172                 :           3 :   VALENT_OBJECT_CLASS (valent_input_parent_class)->destroy (object);
+     173                 :           3 : }
+     174                 :             : 
+     175                 :             : /*
+     176                 :             :  * GObject
+     177                 :             :  */
+     178                 :             : static void
+     179                 :           3 : valent_input_finalize (GObject *object)
+     180                 :             : {
+     181                 :           3 :   ValentInput *self = VALENT_INPUT (object);
+     182                 :             : 
+     183         [ +  - ]:           3 :   g_clear_object (&self->exports);
+     184         [ +  - ]:           3 :   g_clear_pointer (&self->adapters, g_ptr_array_unref);
+     185         [ +  - ]:           3 :   g_clear_pointer (&self->items, g_ptr_array_unref);
+     186                 :             : 
+     187                 :           3 :   G_OBJECT_CLASS (valent_input_parent_class)->finalize (object);
+     188                 :           3 : }
+     189                 :             : 
+     190                 :             : static void
+     191                 :           6 : valent_input_class_init (ValentInputClass *klass)
+     192                 :             : {
+     193                 :           6 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     194                 :           6 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     195                 :           6 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     196                 :             : 
+     197                 :           6 :   object_class->finalize = valent_input_finalize;
+     198                 :             : 
+     199                 :           6 :   vobject_class->destroy = valent_input_destroy;
+     200                 :             : 
+     201                 :           6 :   component_class->bind_preferred = valent_input_bind_preferred;
+     202                 :             : }
+     203                 :             : 
+     204                 :             : static void
+     205                 :           6 : valent_input_init (ValentInput *self)
+     206                 :             : {
+     207                 :           6 :   self->adapters = g_ptr_array_new_with_free_func (g_object_unref);
+     208                 :           6 :   self->items = g_ptr_array_new_with_free_func (g_object_unref);
+     209                 :             : 
+     210                 :           6 :   self->exports = G_LIST_MODEL (g_list_store_new (VALENT_TYPE_INPUT_ADAPTER));
+     211                 :           6 :   g_signal_connect_object (self->exports,
+     212                 :             :                            "items-changed",
+     213                 :             :                            G_CALLBACK (on_items_changed),
+     214                 :             :                            self, 0);
+     215                 :           6 :   g_ptr_array_add (self->adapters, g_object_ref (self->exports));
+     216                 :           6 : }
+     217                 :             : 
+     218                 :             : /**
+     219                 :             :  * valent_input_get_default:
+     220                 :             :  *
+     221                 :             :  * Get the default [class@Valent.Input].
+     222                 :             :  *
+     223                 :             :  * Returns: (transfer none) (not nullable): a `ValentInput`
+     224                 :             :  *
+     225                 :             :  * Since: 1.0
+     226                 :             :  */
+     227                 :             : ValentInput *
+     228                 :          13 : valent_input_get_default (void)
+     229                 :             : {
+     230         [ +  + ]:          13 :   if (default_input == NULL)
+     231                 :             :     {
+     232                 :           6 :       default_input = g_object_new (VALENT_TYPE_INPUT,
+     233                 :             :                                     "plugin-domain", "input",
+     234                 :             :                                     "plugin-type",   VALENT_TYPE_INPUT_ADAPTER,
+     235                 :             :                                     NULL);
+     236                 :             : 
+     237                 :           6 :       g_object_add_weak_pointer (G_OBJECT (default_input),
+     238                 :             :                                  (gpointer)&default_input);
+     239                 :             :     }
+     240                 :             : 
+     241                 :          13 :   return default_input;
+     242                 :             : }
+     243                 :             : 
+     244                 :             : /**
+     245                 :             :  * valent_input_export_adapter:
+     246                 :             :  * @input: a `ValentInput`
+     247                 :             :  * @adapter: a `ValentInputAdapter`
+     248                 :             :  *
+     249                 :             :  * Export @adapter on all adapters that support it.
+     250                 :             :  *
+     251                 :             :  * Since: 1.0
+     252                 :             :  */
+     253                 :             : void
+     254                 :           2 : valent_input_export_adapter (ValentInput        *input,
+     255                 :             :                              ValentInputAdapter *adapter)
+     256                 :             : {
+     257                 :           2 :   VALENT_ENTRY;
+     258                 :             : 
+     259         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_INPUT (input));
+     260         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
+     261                 :             : 
+     262                 :           2 :   g_list_store_append (G_LIST_STORE (input->exports), adapter);
+     263                 :             : 
+     264                 :           2 :   VALENT_EXIT;
+     265                 :             : }
+     266                 :             : 
+     267                 :             : /**
+     268                 :             :  * valent_input_unexport_adapter:
+     269                 :             :  * @input: a `ValentInput`
+     270                 :             :  * @adapter: a `ValentInputAdapter`
+     271                 :             :  *
+     272                 :             :  * Unexport @adapter from all adapters that support it.
+     273                 :             :  *
+     274                 :             :  * Since: 1.0
+     275                 :             :  */
+     276                 :             : void
+     277                 :           2 : valent_input_unexport_adapter (ValentInput        *input,
+     278                 :             :                                ValentInputAdapter *adapter)
+     279                 :             : {
+     280                 :           2 :   unsigned int position = 0;
+     281                 :             : 
+     282                 :           2 :   VALENT_ENTRY;
+     283                 :             : 
+     284         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_INPUT (input));
+     285         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
+     286                 :             : 
+     287         [ -  + ]:           2 :   if (!g_list_store_find (G_LIST_STORE (input->exports), adapter, &position))
+     288                 :             :     {
+     289                 :           0 :       g_critical ("%s(): unknown adapter %s",
+     290                 :             :                   G_STRFUNC,
+     291                 :             :                   G_OBJECT_TYPE_NAME (adapter));
+     292                 :           0 :       return;
+     293                 :             :     }
+     294                 :             : 
+     295                 :           2 :   g_list_store_remove (G_LIST_STORE (input->exports), position);
+     296                 :             : 
+     297                 :           2 :   VALENT_EXIT;
+     298                 :             : }
+     299                 :             : 
+     300                 :             : /**
+     301                 :             :  * valent_input_keyboard_keysym:
+     302                 :             :  * @input: a `ValentInput`
+     303                 :             :  * @keysym: a keysym
+     304                 :             :  * @state: %TRUE to press, or %FALSE to release
+     305                 :             :  *
+     306                 :             :  * Press or release @keysym.
+     307                 :             :  *
+     308                 :             :  * Since: 1.0
+     309                 :             :  */
+     310                 :             : void
+     311                 :          26 : valent_input_keyboard_keysym (ValentInput  *input,
+     312                 :             :                               uint32_t      keysym,
+     313                 :             :                               gboolean      state)
+     314                 :             : {
+     315                 :          26 :   VALENT_ENTRY;
+     316                 :             : 
+     317         [ +  - ]:          26 :   g_return_if_fail (VALENT_IS_INPUT (input));
+     318                 :             : 
+     319         [ +  - ]:          26 :   if G_LIKELY (input->default_adapter != NULL)
+     320                 :          26 :     valent_input_adapter_keyboard_keysym (input->default_adapter, keysym, state);
+     321                 :             : 
+     322                 :          26 :   VALENT_EXIT;
+     323                 :             : }
+     324                 :             : 
+     325                 :             : /**
+     326                 :             :  * valent_input_pointer_axis:
+     327                 :             :  * @input: a `ValentInput`
+     328                 :             :  * @dx: movement on x-axis
+     329                 :             :  * @dy: movement on y-axis
+     330                 :             :  *
+     331                 :             :  * Scroll the surface under the pointer (@dx, @dy), relative to its current
+     332                 :             :  * position.
+     333                 :             :  *
+     334                 :             :  * Since: 1.0
+     335                 :             :  */
+     336                 :             : void
+     337                 :           3 : valent_input_pointer_axis (ValentInput *input,
+     338                 :             :                            double       dx,
+     339                 :             :                            double       dy)
+     340                 :             : {
+     341                 :           3 :   VALENT_ENTRY;
+     342                 :             : 
+     343         [ +  - ]:           3 :   g_return_if_fail (VALENT_IS_INPUT (input));
+     344                 :             : 
+     345         [ +  - ]:           3 :   if G_LIKELY (input->default_adapter != NULL)
+     346                 :           3 :     valent_input_adapter_pointer_axis (input->default_adapter, dx, dy);
+     347                 :             : 
+     348                 :           3 :   VALENT_EXIT;
+     349                 :             : }
+     350                 :             : 
+     351                 :             : /**
+     352                 :             :  * valent_input_pointer_button:
+     353                 :             :  * @input: a `ValentInput`
+     354                 :             :  * @button: a button
+     355                 :             :  * @state: %TRUE to press, or %FALSE to release
+     356                 :             :  *
+     357                 :             :  * Press or release @button.
+     358                 :             :  *
+     359                 :             :  * Since: 1.0
+     360                 :             :  */
+     361                 :             : void
+     362                 :          16 : valent_input_pointer_button (ValentInput  *input,
+     363                 :             :                              unsigned int  button,
+     364                 :             :                              gboolean      state)
+     365                 :             : {
+     366                 :          16 :   VALENT_ENTRY;
+     367                 :             : 
+     368         [ +  - ]:          16 :   g_return_if_fail (VALENT_IS_INPUT (input));
+     369                 :             : 
+     370         [ +  - ]:          16 :   if G_LIKELY (input->default_adapter != NULL)
+     371                 :          16 :     valent_input_adapter_pointer_button (input->default_adapter, button, state);
+     372                 :             : 
+     373                 :          16 :   VALENT_EXIT;
+     374                 :             : }
+     375                 :             : 
+     376                 :             : /**
+     377                 :             :  * valent_input_pointer_motion:
+     378                 :             :  * @input: a `ValentInput`
+     379                 :             :  * @dx: position on x-axis
+     380                 :             :  * @dy: position on y-axis
+     381                 :             :  *
+     382                 :             :  * Move the pointer (@dx, @dy), relative to its current position.
+     383                 :             :  *
+     384                 :             :  * Since: 1.0
+     385                 :             :  */
+     386                 :             : void
+     387                 :           6 : valent_input_pointer_motion (ValentInput *input,
+     388                 :             :                              double       dx,
+     389                 :             :                              double       dy)
+     390                 :             : {
+     391                 :           6 :   VALENT_ENTRY;
+     392                 :             : 
+     393         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_INPUT (input));
+     394                 :             : 
+     395         [ +  - ]:           6 :   if G_LIKELY (input->default_adapter != NULL)
+     396                 :           6 :     valent_input_adapter_pointer_motion (input->default_adapter, dx, dy);
+     397                 :             : 
+     398                 :           6 :   VALENT_EXIT;
+     399                 :             : }
+     400                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input.h.func-c.html b/coverage/src/libvalent/input/valent-input.h.func-c.html new file mode 100644 index 00000000000..0b19024cb65 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_INPUT70
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input.h.func.html b/coverage/src/libvalent/input/valent-input.h.func.html new file mode 100644 index 00000000000..92469270e51 --- /dev/null +++ b/coverage/src/libvalent/input/valent-input.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_INPUT70
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/input/valent-input.h.gcov.html b/coverage/src/libvalent/input/valent-input.h.gcov.html new file mode 100644 index 00000000000..1625c39f82e --- /dev/null +++ b/coverage/src/libvalent/input/valent-input.h.gcov.html @@ -0,0 +1,139 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/input/valent-input.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/input - valent-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : #include "valent-input-adapter.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_INPUT (valent_input_get_type ())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :          70 : G_DECLARE_FINAL_TYPE (ValentInput, valent_input, VALENT, INPUT, ValentComponent)
+                   -  + ]
+      19                 :             : 
+      20                 :             : VALENT_AVAILABLE_IN_1_0
+      21                 :             : ValentInput * valent_input_get_default      (void);
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : void          valent_input_export_adapter   (ValentInput        *input,
+      24                 :             :                                              ValentInputAdapter *adapter);
+      25                 :             : VALENT_AVAILABLE_IN_1_0
+      26                 :             : void          valent_input_unexport_adapter (ValentInput        *input,
+      27                 :             :                                              ValentInputAdapter *adapter);
+      28                 :             : VALENT_AVAILABLE_IN_1_0
+      29                 :             : void          valent_input_keyboard_keysym  (ValentInput        *input,
+      30                 :             :                                              uint32_t            keysym,
+      31                 :             :                                              gboolean            state);
+      32                 :             : VALENT_AVAILABLE_IN_1_0
+      33                 :             : void          valent_input_pointer_axis     (ValentInput        *input,
+      34                 :             :                                              double              dx,
+      35                 :             :                                              double              dy);
+      36                 :             : VALENT_AVAILABLE_IN_1_0
+      37                 :             : void          valent_input_pointer_button   (ValentInput        *input,
+      38                 :             :                                              unsigned int        button,
+      39                 :             :                                              gboolean            state);
+      40                 :             : VALENT_AVAILABLE_IN_1_0
+      41                 :             : void          valent_input_pointer_motion   (ValentInput        *input,
+      42                 :             :                                              double              dx,
+      43                 :             :                                              double              dy);
+      44                 :             : 
+      45                 :             : G_END_DECLS
+      46                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-detail-sort-b.html b/coverage/src/libvalent/media/index-detail-sort-b.html new file mode 100644 index 00000000000..dbc77a1ff3e --- /dev/null +++ b/coverage/src/libvalent/media/index-detail-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-detail-sort-f.html b/coverage/src/libvalent/media/index-detail-sort-f.html new file mode 100644 index 00000000000..6a8dd93f0f4 --- /dev/null +++ b/coverage/src/libvalent/media/index-detail-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-detail-sort-l.html b/coverage/src/libvalent/media/index-detail-sort-l.html new file mode 100644 index 00000000000..620e50ecfb7 --- /dev/null +++ b/coverage/src/libvalent/media/index-detail-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-detail.html b/coverage/src/libvalent/media/index-detail.html new file mode 100644 index 00000000000..bd22988f16f --- /dev/null +++ b/coverage/src/libvalent/media/index-detail.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-sort-b.html b/coverage/src/libvalent/media/index-sort-b.html new file mode 100644 index 00000000000..dbc77a1ff3e --- /dev/null +++ b/coverage/src/libvalent/media/index-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-sort-f.html b/coverage/src/libvalent/media/index-sort-f.html new file mode 100644 index 00000000000..6a8dd93f0f4 --- /dev/null +++ b/coverage/src/libvalent/media/index-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index-sort-l.html b/coverage/src/libvalent/media/index-sort-l.html new file mode 100644 index 00000000000..620e50ecfb7 --- /dev/null +++ b/coverage/src/libvalent/media/index-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/index.html b/coverage/src/libvalent/media/index.html new file mode 100644 index 00000000000..bd22988f16f --- /dev/null +++ b/coverage/src/libvalent/media/index.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mediaCoverageTotalHit
Test:Code CoverageLines:95.4 %410391
Test Date:2024-03-31 18:46:36Functions:96.6 %5957
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:57.0 %200114
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-media-adapter.c +
93.8%93.8%
+
93.8 %656153.1 %321792.3 %1312
valent-media-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-player.c +
97.9%97.9%
+
97.9 %19318962.1 %5836100.0 %2525
valent-media-player.h +
100.0%
+
100.0 %1140.9 %229100.0 %11
valent-media.c +
92.6%92.6%
+
92.6 %14913860.5 %764694.4 %1817
valent-media.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-adapter.c.func-c.html b/coverage/src/libvalent/media/valent-media-adapter.c.func-c.html new file mode 100644 index 00000000000..45ce616d90c --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-adapter.c.func-c.html @@ -0,0 +1,189 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %6561
Test Date:2024-03-31 18:46:36Functions:92.3 %1312
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:53.1 %3217
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_media_adapter_get_item_type0
valent_media_adapter_export_player2
valent_media_adapter_unexport_player2
valent_media_adapter_player_added7
valent_media_adapter_player_removed7
valent_media_adapter_get_item9
valent_media_adapter_finalize10
valent_media_adapter_init13
valent_media_adapter_get_n_items32
g_list_model_iface_init66
valent_media_adapter_get_type472
valent_media_adapter_class_intern_init66
valent_media_adapter_get_type_once86
valent_media_adapter_get_type320
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-adapter.c.func.html b/coverage/src/libvalent/media/valent-media-adapter.c.func.html new file mode 100644 index 00000000000..00003b9de31 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-adapter.c.func.html @@ -0,0 +1,189 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %6561
Test Date:2024-03-31 18:46:36Functions:92.3 %1312
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:53.1 %3217
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init66
valent_media_adapter_export_player2
valent_media_adapter_finalize10
valent_media_adapter_get_item9
valent_media_adapter_get_item_type0
valent_media_adapter_get_n_items32
valent_media_adapter_get_type472
valent_media_adapter_class_intern_init66
valent_media_adapter_get_type320
valent_media_adapter_get_type_once86
valent_media_adapter_init13
valent_media_adapter_player_added7
valent_media_adapter_player_removed7
valent_media_adapter_unexport_player2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-adapter.c.gcov.html b/coverage/src/libvalent/media/valent-media-adapter.c.gcov.html new file mode 100644 index 00000000000..85afd6c7a98 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-adapter.c.gcov.html @@ -0,0 +1,356 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %6561
Test Date:2024-03-31 18:46:36Functions:92.3 %1312
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:53.1 %3217
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-media-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libvalent-core.h>
+       9                 :             : 
+      10                 :             : #include "valent-media-player.h"
+      11                 :             : #include "valent-media-adapter.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentMediaAdapter:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for media player adapters.
+      18                 :             :  *
+      19                 :             :  * `ValentMediaAdapter` is a base class for plugins that provide an interface to
+      20                 :             :  * manage media players. This usually means monitoring and querying instances of
+      21                 :             :  * [class@Valent.MediaPlayer].
+      22                 :             :  *
+      23                 :             :  * ## `.plugin` File
+      24                 :             :  *
+      25                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      26                 :             :  *
+      27                 :             :  * - `X-MediaAdapterPriority`
+      28                 :             :  *
+      29                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      30                 :             :  *     lowest value will be used as the primary adapter.
+      31                 :             :  *
+      32                 :             :  * Since: 1.0
+      33                 :             :  */
+      34                 :             : 
+      35                 :             : typedef struct
+      36                 :             : {
+      37                 :             :   GPtrArray      *players;
+      38                 :             : } ValentMediaAdapterPrivate;
+      39                 :             : 
+      40                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      41                 :             : 
+      42   [ +  +  +  - ]:         550 : G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ValentMediaAdapter, valent_media_adapter, VALENT_TYPE_EXTENSION,
+      43                 :             :                                   G_ADD_PRIVATE (ValentMediaAdapter)
+      44                 :             :                                   G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      45                 :             : 
+      46                 :             : /**
+      47                 :             :  * ValentMediaAdapterClass:
+      48                 :             :  * @export_player: the virtual function pointer for valent_media_adapter_export()
+      49                 :             :  * @unexport_player: the virtual function pointer for valent_media_adapter_unexport()
+      50                 :             :  *
+      51                 :             :  * The virtual function table for `ValentMediaAdapter`.
+      52                 :             :  */
+      53                 :             : 
+      54                 :             : 
+      55                 :             : /*
+      56                 :             :  * GListModel
+      57                 :             :  */
+      58                 :             : static gpointer
+      59                 :           9 : valent_media_adapter_get_item (GListModel   *list,
+      60                 :             :                                unsigned int  position)
+      61                 :             : {
+      62                 :           9 :   ValentMediaAdapter *self = VALENT_MEDIA_ADAPTER (list);
+      63                 :           9 :   ValentMediaAdapterPrivate *priv = valent_media_adapter_get_instance_private (self);
+      64                 :             : 
+      65         [ +  - ]:           9 :   g_assert (VALENT_IS_MEDIA_ADAPTER (self));
+      66                 :             : 
+      67         [ +  - ]:           9 :   if G_UNLIKELY (position >= priv->players->len)
+      68                 :             :     return NULL;
+      69                 :             : 
+      70                 :           9 :   return g_object_ref (g_ptr_array_index (priv->players, position));
+      71                 :             : }
+      72                 :             : 
+      73                 :             : static GType
+      74                 :           0 : valent_media_adapter_get_item_type (GListModel *list)
+      75                 :             : {
+      76                 :           0 :   return VALENT_TYPE_MEDIA_ADAPTER;
+      77                 :             : }
+      78                 :             : 
+      79                 :             : static unsigned int
+      80                 :          32 : valent_media_adapter_get_n_items (GListModel *list)
+      81                 :             : {
+      82                 :          32 :   ValentMediaAdapter *self = VALENT_MEDIA_ADAPTER (list);
+      83                 :          32 :   ValentMediaAdapterPrivate *priv = valent_media_adapter_get_instance_private (self);
+      84                 :             : 
+      85         [ +  - ]:          32 :   g_assert (VALENT_IS_MEDIA_ADAPTER (self));
+      86                 :             : 
+      87                 :          32 :   return priv->players->len;
+      88                 :             : }
+      89                 :             : 
+      90                 :             : static void
+      91                 :          66 : g_list_model_iface_init (GListModelInterface *iface)
+      92                 :             : {
+      93                 :          66 :   iface->get_item = valent_media_adapter_get_item;
+      94                 :          66 :   iface->get_item_type = valent_media_adapter_get_item_type;
+      95                 :          66 :   iface->get_n_items = valent_media_adapter_get_n_items;
+      96                 :          66 : }
+      97                 :             : 
+      98                 :             : /* LCOV_EXCL_START */
+      99                 :             : static void
+     100                 :             : valent_media_adapter_real_export_player (ValentMediaAdapter *adapter,
+     101                 :             :                                          ValentMediaPlayer  *player)
+     102                 :             : {
+     103                 :             :   g_assert (VALENT_IS_MEDIA_ADAPTER (adapter));
+     104                 :             :   g_assert (VALENT_IS_MEDIA_PLAYER (player));
+     105                 :             : }
+     106                 :             : 
+     107                 :             : static void
+     108                 :             : valent_media_adapter_real_unexport_player (ValentMediaAdapter *adapter,
+     109                 :             :                                            ValentMediaPlayer  *player)
+     110                 :             : {
+     111                 :             :   g_assert (VALENT_IS_MEDIA_ADAPTER (adapter));
+     112                 :             :   g_assert (VALENT_IS_MEDIA_PLAYER (player));
+     113                 :             : }
+     114                 :             : /* LCOV_EXCL_STOP */
+     115                 :             : 
+     116                 :             : /*
+     117                 :             :  * GObject
+     118                 :             :  */
+     119                 :             : static void
+     120                 :          10 : valent_media_adapter_finalize (GObject *object)
+     121                 :             : {
+     122                 :          10 :   ValentMediaAdapter *self = VALENT_MEDIA_ADAPTER (object);
+     123                 :          10 :   ValentMediaAdapterPrivate *priv = valent_media_adapter_get_instance_private (self);
+     124                 :             : 
+     125         [ +  - ]:          10 :   g_clear_pointer (&priv->players, g_ptr_array_unref);
+     126                 :             : 
+     127                 :          10 :   G_OBJECT_CLASS (valent_media_adapter_parent_class)->finalize (object);
+     128                 :          10 : }
+     129                 :             : 
+     130                 :             : static void
+     131                 :          66 : valent_media_adapter_class_init (ValentMediaAdapterClass *klass)
+     132                 :             : {
+     133                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     134                 :             : 
+     135                 :          66 :   object_class->finalize = valent_media_adapter_finalize;
+     136                 :             : 
+     137                 :          66 :   klass->export_player = valent_media_adapter_real_export_player;
+     138                 :          66 :   klass->unexport_player = valent_media_adapter_real_unexport_player;
+     139                 :             : }
+     140                 :             : 
+     141                 :             : static void
+     142                 :          13 : valent_media_adapter_init (ValentMediaAdapter *self)
+     143                 :             : {
+     144                 :          13 :   ValentMediaAdapterPrivate *priv = valent_media_adapter_get_instance_private (self);
+     145                 :             : 
+     146                 :          13 :   priv->players = g_ptr_array_new_with_free_func (g_object_unref);
+     147                 :          13 : }
+     148                 :             : 
+     149                 :             : /**
+     150                 :             :  * valent_media_adapter_player_added:
+     151                 :             :  * @adapter: a `ValentMediaAdapter`
+     152                 :             :  * @player: a `ValentMediaPlayer`
+     153                 :             :  *
+     154                 :             :  * Called when @player has been added to @adapter.
+     155                 :             :  *
+     156                 :             :  * This method should only be called by implementations of
+     157                 :             :  * [class@Valent.MediaAdapter]. @adapter will hold a reference on @player and
+     158                 :             :  * emit [signal@Gio.ListModel::items-changed].
+     159                 :             :  *
+     160                 :             :  * Since: 1.0
+     161                 :             :  */
+     162                 :             : void
+     163                 :           7 : valent_media_adapter_player_added (ValentMediaAdapter *adapter,
+     164                 :             :                                    ValentMediaPlayer  *player)
+     165                 :             : {
+     166                 :           7 :   ValentMediaAdapterPrivate *priv = valent_media_adapter_get_instance_private (adapter);
+     167                 :           7 :   unsigned int position = 0;
+     168                 :             : 
+     169         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_MEDIA_ADAPTER (adapter));
+     170         [ -  + ]:           7 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     171                 :             : 
+     172                 :           7 :   position = priv->players->len;
+     173                 :           7 :   g_ptr_array_add (priv->players, g_object_ref (player));
+     174                 :           7 :   g_list_model_items_changed (G_LIST_MODEL (adapter), position, 0, 1);
+     175                 :             : }
+     176                 :             : 
+     177                 :             : /**
+     178                 :             :  * valent_media_adapter_player_removed:
+     179                 :             :  * @adapter: a `ValentMediaAdapter`
+     180                 :             :  * @player: a `ValentMediaPlayer`
+     181                 :             :  *
+     182                 :             :  * Called when @player has been removed from @adapter.
+     183                 :             :  *
+     184                 :             :  * This method should only be called by implementations of
+     185                 :             :  * [class@Valent.MediaAdapter]. @adapter will drop its reference on @player
+     186                 :             :  * and emit [signal@Gio.ListModel::items-changed].
+     187                 :             :  *
+     188                 :             :  * Since: 1.0
+     189                 :             :  */
+     190                 :             : void
+     191                 :           7 : valent_media_adapter_player_removed (ValentMediaAdapter *adapter,
+     192                 :             :                                      ValentMediaPlayer  *player)
+     193                 :             : {
+     194                 :           7 :   ValentMediaAdapterPrivate *priv = valent_media_adapter_get_instance_private (adapter);
+     195                 :           7 :   g_autoptr (ValentMediaPlayer) item = NULL;
+     196                 :           7 :   unsigned int position = 0;
+     197                 :             : 
+     198         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_MEDIA_ADAPTER (adapter));
+     199         [ -  + ]:           7 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     200                 :             : 
+     201         [ -  + ]:           7 :   if (!g_ptr_array_find (priv->players, player, &position))
+     202                 :             :     {
+     203                 :           0 :       g_warning ("No such player \"%s\" found in \"%s\"",
+     204                 :             :                  G_OBJECT_TYPE_NAME (player),
+     205                 :             :                  G_OBJECT_TYPE_NAME (adapter));
+     206                 :           0 :       return;
+     207                 :             :     }
+     208                 :             : 
+     209                 :           7 :   item = g_ptr_array_steal_index (priv->players, position);
+     210         [ +  - ]:           7 :   g_list_model_items_changed (G_LIST_MODEL (adapter), position, 1, 0);
+     211                 :             : }
+     212                 :             : 
+     213                 :             : /**
+     214                 :             :  * valent_media_adapter_export_player: (virtual export_player)
+     215                 :             :  * @adapter: an `ValentMediaAdapter`
+     216                 :             :  * @player: a `ValentMediaPlayer`
+     217                 :             :  *
+     218                 :             :  * Export @player on @adapter.
+     219                 :             :  *
+     220                 :             :  * This method is intended to allow device plugins to expose remote media
+     221                 :             :  * players to the host system. Usually this means exporting an interface on
+     222                 :             :  * D-Bus or an mDNS service.
+     223                 :             :  *
+     224                 :             :  * Implementations must automatically unexport any players when destroyed.
+     225                 :             :  *
+     226                 :             :  * Since: 1.0
+     227                 :             :  */
+     228                 :             : void
+     229                 :           2 : valent_media_adapter_export_player (ValentMediaAdapter *adapter,
+     230                 :             :                                     ValentMediaPlayer  *player)
+     231                 :             : {
+     232                 :           2 :   VALENT_ENTRY;
+     233                 :             : 
+     234         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_MEDIA_ADAPTER (adapter));
+     235         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     236                 :             : 
+     237                 :           2 :   VALENT_MEDIA_ADAPTER_GET_CLASS (adapter)->export_player (adapter, player);
+     238                 :             : 
+     239                 :           2 :   VALENT_EXIT;
+     240                 :             : }
+     241                 :             : 
+     242                 :             : /**
+     243                 :             :  * valent_media_adapter_unexport_player: (virtual unexport_player)
+     244                 :             :  * @adapter: an `ValentMediaAdapter`
+     245                 :             :  * @player: a `ValentMediaPlayer`
+     246                 :             :  *
+     247                 :             :  * Unexport @player from @adapter.
+     248                 :             :  *
+     249                 :             :  * Since: 1.0
+     250                 :             :  */
+     251                 :             : void
+     252                 :           2 : valent_media_adapter_unexport_player (ValentMediaAdapter *adapter,
+     253                 :             :                                       ValentMediaPlayer  *player)
+     254                 :             : {
+     255                 :           2 :   VALENT_ENTRY;
+     256                 :             : 
+     257         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_MEDIA_ADAPTER (adapter));
+     258         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     259                 :             : 
+     260                 :           2 :   VALENT_MEDIA_ADAPTER_GET_CLASS (adapter)->unexport_player (adapter, player);
+     261                 :             : 
+     262                 :           2 :   VALENT_EXIT;
+     263                 :             : }
+     264                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-adapter.h.func-c.html b/coverage/src/libvalent/media/valent-media-adapter.h.func-c.html new file mode 100644 index 00000000000..bc4940df3f3 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA_ADAPTER84
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-adapter.h.func.html b/coverage/src/libvalent/media/valent-media-adapter.h.func.html new file mode 100644 index 00000000000..f1f3b8a6107 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA_ADAPTER84
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-adapter.h.gcov.html b/coverage/src/libvalent/media/valent-media-adapter.h.gcov.html new file mode 100644 index 00000000000..25ef1023b46 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-adapter.h.gcov.html @@ -0,0 +1,141 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : #include "valent-media-player.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_MEDIA_ADAPTER (valent_media_adapter_get_type())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :          88 : G_DECLARE_DERIVABLE_TYPE (ValentMediaAdapter, valent_media_adapter, VALENT, MEDIA_ADAPTER, ValentExtension)
+                   +  - ]
+      19                 :             : 
+      20                 :             : struct _ValentMediaAdapterClass
+      21                 :             : {
+      22                 :             :   ValentExtensionClass   parent_class;
+      23                 :             : 
+      24                 :             :   /* virtual functions */
+      25                 :             :   void                   (*export_player)   (ValentMediaAdapter *adapter,
+      26                 :             :                                              ValentMediaPlayer  *player);
+      27                 :             :   void                   (*unexport_player) (ValentMediaAdapter *adapter,
+      28                 :             :                                              ValentMediaPlayer  *player);
+      29                 :             : 
+      30                 :             :   /*< private >*/
+      31                 :             :   gpointer               padding[8];
+      32                 :             : };
+      33                 :             : 
+      34                 :             : VALENT_AVAILABLE_IN_1_0
+      35                 :             : void   valent_media_adapter_player_added    (ValentMediaAdapter *adapter,
+      36                 :             :                                              ValentMediaPlayer  *player);
+      37                 :             : VALENT_AVAILABLE_IN_1_0
+      38                 :             : void   valent_media_adapter_player_removed  (ValentMediaAdapter *adapter,
+      39                 :             :                                              ValentMediaPlayer  *player);
+      40                 :             : VALENT_AVAILABLE_IN_1_0
+      41                 :             : void   valent_media_adapter_export_player   (ValentMediaAdapter *adapter,
+      42                 :             :                                              ValentMediaPlayer  *player);
+      43                 :             : VALENT_AVAILABLE_IN_1_0
+      44                 :             : void   valent_media_adapter_unexport_player (ValentMediaAdapter *adapter,
+      45                 :             :                                              ValentMediaPlayer  *player);
+      46                 :             : 
+      47                 :             : G_END_DECLS
+      48                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-player.c.func-c.html b/coverage/src/libvalent/media/valent-media-player.c.func-c.html new file mode 100644 index 00000000000..240df53fbae --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-player.c.func-c.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-player.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-player.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.9 %193189
Test Date:2024-03-31 18:46:36Functions:100.0 %2525
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.1 %5836
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_media_player_class_init5
valent_media_player_set_position6
valent_media_player_set_volume8
valent_media_player_next9
valent_media_player_previous9
valent_media_player_stop9
valent_media_player_pause10
valent_media_player_seek10
valent_media_player_set_shuffle10
valent_media_player_play11
valent_media_player_set_property11
valent_media_player_set_repeat11
valent_media_player_init14
valent_media_player_get_property26
valent_media_player_get_volume26
valent_media_player_get_repeat27
valent_media_player_get_shuffle28
valent_media_player_get_name40
valent_media_player_get_position50
valent_media_player_get_metadata54
valent_media_player_get_flags65
valent_media_player_get_state87
valent_media_player_get_type718
valent_media_player_class_intern_init5
valent_media_player_get_type_once86
valent_media_player_get_type627
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-player.c.func.html b/coverage/src/libvalent/media/valent-media-player.c.func.html new file mode 100644 index 00000000000..d04bb3b3bde --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-player.c.func.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-player.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-player.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.9 %193189
Test Date:2024-03-31 18:46:36Functions:100.0 %2525
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.1 %5836
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_media_player_class_init5
valent_media_player_get_flags65
valent_media_player_get_metadata54
valent_media_player_get_name40
valent_media_player_get_position50
valent_media_player_get_property26
valent_media_player_get_repeat27
valent_media_player_get_shuffle28
valent_media_player_get_state87
valent_media_player_get_type718
valent_media_player_class_intern_init5
valent_media_player_get_type627
valent_media_player_get_type_once86
valent_media_player_get_volume26
valent_media_player_init14
valent_media_player_next9
valent_media_player_pause10
valent_media_player_play11
valent_media_player_previous9
valent_media_player_seek10
valent_media_player_set_position6
valent_media_player_set_property11
valent_media_player_set_repeat11
valent_media_player_set_shuffle10
valent_media_player_set_volume8
valent_media_player_stop9
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-player.c.gcov.html b/coverage/src/libvalent/media/valent-media-player.c.gcov.html new file mode 100644 index 00000000000..df1be6d6a39 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-player.c.gcov.html @@ -0,0 +1,993 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-player.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-player.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.9 %193189
Test Date:2024-03-31 18:46:36Functions:100.0 %2525
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.1 %5836
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-media-player"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-media-enums.h"
+      12                 :             : #include "valent-media-player.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentMediaPlayer:
+      17                 :             :  *
+      18                 :             :  * A base class for media players.
+      19                 :             :  *
+      20                 :             :  * A `ValentMediaPlayer` is a base class for plugins to providing an interface to
+      21                 :             :  * media players via [class@Valent.MediaAdapter].
+      22                 :             :  *
+      23                 :             :  * Since: 1.0
+      24                 :             :  */
+      25                 :             : 
+      26   [ +  +  +  - ]:         718 : G_DEFINE_TYPE (ValentMediaPlayer, valent_media_player, VALENT_TYPE_OBJECT)
+      27                 :             : 
+      28                 :             : /**
+      29                 :             :  * ValentMediaPlayerClass:
+      30                 :             :  * @next: the virtual function pointer for valent_media_player_next()
+      31                 :             :  * @pause: the virtual function pointer for valent_media_player_pause()
+      32                 :             :  * @play: the virtual function pointer for valent_media_player_play()
+      33                 :             :  * @previous: the virtual function pointer for valent_media_player_previous()
+      34                 :             :  * @seek: the virtual function pointer for valent_media_player_seek()
+      35                 :             :  * @stop: the virtual function pointer for valent_media_player_stop()
+      36                 :             :  * @get_flags: Getter for the `ValentMediaPlayer`:flags property.
+      37                 :             :  * @get_metadata: Getter for the `ValentMediaPlayer`:metadata property.
+      38                 :             :  * @get_name: Getter for the `ValentMediaPlayer`:name property.
+      39                 :             :  * @get_position: Getter for the `ValentMediaPlayer`:position property.
+      40                 :             :  * @set_position: Setter for the `ValentMediaPlayer`:position property.
+      41                 :             :  * @get_repeat: Getter for the `ValentMediaPlayer`:repeat property.
+      42                 :             :  * @set_repeat: Setter for the `ValentMediaPlayer`:repeat property.
+      43                 :             :  * @get_state: Getter for the `ValentMediaPlayer`:state property.
+      44                 :             :  * @get_volume: Getter for the `ValentMediaPlayer`:volume property.
+      45                 :             :  * @set_volume: Setter for the `ValentMediaPlayer`:volume property.
+      46                 :             :  *
+      47                 :             :  * Virtual table for `ValentMediaPlayer`
+      48                 :             :  */
+      49                 :             : 
+      50                 :             : enum {
+      51                 :             :   PROP_0,
+      52                 :             :   PROP_FLAGS,
+      53                 :             :   PROP_METADATA,
+      54                 :             :   PROP_NAME,
+      55                 :             :   PROP_POSITION,
+      56                 :             :   PROP_REPEAT,
+      57                 :             :   PROP_SHUFFLE,
+      58                 :             :   PROP_STATE,
+      59                 :             :   PROP_VOLUME,
+      60                 :             :   N_PROPERTIES
+      61                 :             : };
+      62                 :             : 
+      63                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      64                 :             : 
+      65                 :             : 
+      66                 :             : /* LCOV_EXCL_START */
+      67                 :             : static ValentMediaActions
+      68                 :             : valent_media_player_real_get_flags (ValentMediaPlayer *player)
+      69                 :             : {
+      70                 :             :   return VALENT_MEDIA_ACTION_NONE;
+      71                 :             : }
+      72                 :             : 
+      73                 :             : static GVariant *
+      74                 :             : valent_media_player_real_get_metadata (ValentMediaPlayer *player)
+      75                 :             : {
+      76                 :             :   return NULL;
+      77                 :             : }
+      78                 :             : 
+      79                 :             : static const char *
+      80                 :             : valent_media_player_real_get_name (ValentMediaPlayer *player)
+      81                 :             : {
+      82                 :             :   return "Media Player";
+      83                 :             : }
+      84                 :             : 
+      85                 :             : static double
+      86                 :             : valent_media_player_real_get_position (ValentMediaPlayer *player)
+      87                 :             : {
+      88                 :             :   return 0.0;
+      89                 :             : }
+      90                 :             : 
+      91                 :             : static void
+      92                 :             : valent_media_player_real_set_position (ValentMediaPlayer *player,
+      93                 :             :                                        double             position)
+      94                 :             : {
+      95                 :             : }
+      96                 :             : 
+      97                 :             : static ValentMediaRepeat
+      98                 :             : valent_media_player_real_get_repeat (ValentMediaPlayer *player)
+      99                 :             : {
+     100                 :             :   return VALENT_MEDIA_REPEAT_NONE;
+     101                 :             : }
+     102                 :             : 
+     103                 :             : static void
+     104                 :             : valent_media_player_real_set_repeat (ValentMediaPlayer *player,
+     105                 :             :                                      ValentMediaRepeat  repeat)
+     106                 :             : {
+     107                 :             : }
+     108                 :             : 
+     109                 :             : static gboolean
+     110                 :             : valent_media_player_real_get_shuffle (ValentMediaPlayer *player)
+     111                 :             : {
+     112                 :             :   return FALSE;
+     113                 :             : }
+     114                 :             : 
+     115                 :             : static void
+     116                 :             : valent_media_player_real_set_shuffle (ValentMediaPlayer *player,
+     117                 :             :                                       gboolean           shuffle)
+     118                 :             : {
+     119                 :             : }
+     120                 :             : 
+     121                 :             : static ValentMediaState
+     122                 :             : valent_media_player_real_get_state (ValentMediaPlayer *player)
+     123                 :             : {
+     124                 :             :   return VALENT_MEDIA_STATE_STOPPED;
+     125                 :             : }
+     126                 :             : 
+     127                 :             : static double
+     128                 :             : valent_media_player_real_get_volume (ValentMediaPlayer *player)
+     129                 :             : {
+     130                 :             :   return 1.0;
+     131                 :             : }
+     132                 :             : 
+     133                 :             : static void
+     134                 :             : valent_media_player_real_set_volume (ValentMediaPlayer *player,
+     135                 :             :                                      double             volume)
+     136                 :             : {
+     137                 :             : }
+     138                 :             : 
+     139                 :             : static void
+     140                 :             : valent_media_player_real_next (ValentMediaPlayer *player)
+     141                 :             : {
+     142                 :             : }
+     143                 :             : 
+     144                 :             : static void
+     145                 :             : valent_media_player_real_pause (ValentMediaPlayer *player)
+     146                 :             : {
+     147                 :             : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :             : valent_media_player_real_play (ValentMediaPlayer *player)
+     151                 :             : {
+     152                 :             : }
+     153                 :             : 
+     154                 :             : static void
+     155                 :             : valent_media_player_real_previous (ValentMediaPlayer *player)
+     156                 :             : {
+     157                 :             :   g_debug ("%s(): operation not supported", G_STRFUNC);
+     158                 :             : }
+     159                 :             : 
+     160                 :             : static void
+     161                 :             : valent_media_player_real_seek (ValentMediaPlayer *player,
+     162                 :             :                                double             offset)
+     163                 :             : {
+     164                 :             :   g_debug ("%s(): operation not supported", G_STRFUNC);
+     165                 :             : }
+     166                 :             : 
+     167                 :             : static void
+     168                 :             : valent_media_player_real_stop (ValentMediaPlayer *player)
+     169                 :             : {
+     170                 :             :   g_debug ("%s(): operation not supported", G_STRFUNC);
+     171                 :             : }
+     172                 :             : /* LCOV_EXCL_STOP */
+     173                 :             : 
+     174                 :             : 
+     175                 :             : /*
+     176                 :             :  * GObject
+     177                 :             :  */
+     178                 :             : static void
+     179                 :          26 : valent_media_player_get_property (GObject    *object,
+     180                 :             :                                   guint       prop_id,
+     181                 :             :                                   GValue     *value,
+     182                 :             :                                   GParamSpec *pspec)
+     183                 :             : {
+     184                 :          26 :   ValentMediaPlayer *self = VALENT_MEDIA_PLAYER (object);
+     185                 :             : 
+     186   [ +  +  +  +  :          26 :   switch (prop_id)
+             +  +  +  +  
+                      - ]
+     187                 :             :     {
+     188                 :           3 :     case PROP_FLAGS:
+     189                 :           3 :       g_value_set_flags (value, valent_media_player_get_flags (self));
+     190                 :           3 :       break;
+     191                 :             : 
+     192                 :           3 :     case PROP_METADATA:
+     193                 :           3 :       g_value_take_variant (value, valent_media_player_get_metadata (self));
+     194                 :           3 :       break;
+     195                 :             : 
+     196                 :           5 :     case PROP_NAME:
+     197                 :           5 :       g_value_set_string (value, valent_media_player_get_name (self));
+     198                 :           5 :       break;
+     199                 :             : 
+     200                 :           3 :     case PROP_POSITION:
+     201                 :           3 :       g_value_set_double (value, valent_media_player_get_position (self));
+     202                 :           3 :       break;
+     203                 :             : 
+     204                 :           3 :     case PROP_REPEAT:
+     205                 :           3 :       g_value_set_enum (value, valent_media_player_get_repeat (self));
+     206                 :           3 :       break;
+     207                 :             : 
+     208                 :           3 :     case PROP_SHUFFLE:
+     209                 :           3 :       g_value_set_boolean (value, valent_media_player_get_shuffle (self));
+     210                 :           3 :       break;
+     211                 :             : 
+     212                 :           3 :     case PROP_STATE:
+     213                 :           3 :       g_value_set_enum (value, valent_media_player_get_state (self));
+     214                 :           3 :       break;
+     215                 :             : 
+     216                 :           3 :     case PROP_VOLUME:
+     217                 :           3 :       g_value_set_double (value, valent_media_player_get_volume (self));
+     218                 :           3 :       break;
+     219                 :             : 
+     220                 :           0 :     default:
+     221                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     222                 :             :     }
+     223                 :          26 : }
+     224                 :             : 
+     225                 :             : static void
+     226                 :          11 : valent_media_player_set_property (GObject      *object,
+     227                 :             :                                   guint         prop_id,
+     228                 :             :                                   const GValue *value,
+     229                 :             :                                   GParamSpec   *pspec)
+     230                 :             : {
+     231                 :          11 :   ValentMediaPlayer *self = VALENT_MEDIA_PLAYER (object);
+     232                 :             : 
+     233   [ +  +  +  +  :          11 :   switch (prop_id)
+                      - ]
+     234                 :             :     {
+     235                 :           2 :     case PROP_POSITION:
+     236                 :           2 :       valent_media_player_set_position (self, g_value_get_double (value));
+     237                 :           2 :       break;
+     238                 :             : 
+     239                 :           3 :     case PROP_REPEAT:
+     240                 :           3 :       valent_media_player_set_repeat (self, g_value_get_enum (value));
+     241                 :           3 :       break;
+     242                 :             : 
+     243                 :           3 :     case PROP_SHUFFLE:
+     244                 :           3 :       valent_media_player_set_shuffle (self, g_value_get_boolean (value));
+     245                 :           3 :       break;
+     246                 :             : 
+     247                 :           3 :     case PROP_VOLUME:
+     248                 :           3 :       valent_media_player_set_volume (self, g_value_get_double (value));
+     249                 :           3 :       break;
+     250                 :             : 
+     251                 :           0 :     default:
+     252                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     253                 :             :     }
+     254                 :          11 : }
+     255                 :             : 
+     256                 :             : static void
+     257                 :           5 : valent_media_player_class_init (ValentMediaPlayerClass *klass)
+     258                 :             : {
+     259                 :           5 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     260                 :           5 :   ValentMediaPlayerClass *player_class = VALENT_MEDIA_PLAYER_CLASS (klass);
+     261                 :             : 
+     262                 :           5 :   object_class->get_property = valent_media_player_get_property;
+     263                 :           5 :   object_class->set_property = valent_media_player_set_property;
+     264                 :             : 
+     265                 :           5 :   player_class->get_flags = valent_media_player_real_get_flags;
+     266                 :           5 :   player_class->get_metadata = valent_media_player_real_get_metadata;
+     267                 :           5 :   player_class->get_name = valent_media_player_real_get_name;
+     268                 :           5 :   player_class->get_position = valent_media_player_real_get_position;
+     269                 :           5 :   player_class->set_position = valent_media_player_real_set_position;
+     270                 :           5 :   player_class->get_repeat = valent_media_player_real_get_repeat;
+     271                 :           5 :   player_class->set_repeat = valent_media_player_real_set_repeat;
+     272                 :           5 :   player_class->get_shuffle = valent_media_player_real_get_shuffle;
+     273                 :           5 :   player_class->set_shuffle = valent_media_player_real_set_shuffle;
+     274                 :           5 :   player_class->get_state = valent_media_player_real_get_state;
+     275                 :           5 :   player_class->get_volume = valent_media_player_real_get_volume;
+     276                 :           5 :   player_class->set_volume = valent_media_player_real_set_volume;
+     277                 :           5 :   player_class->next = valent_media_player_real_next;
+     278                 :           5 :   player_class->pause = valent_media_player_real_pause;
+     279                 :           5 :   player_class->play = valent_media_player_real_play;
+     280                 :           5 :   player_class->previous = valent_media_player_real_previous;
+     281                 :           5 :   player_class->seek = valent_media_player_real_seek;
+     282                 :           5 :   player_class->stop = valent_media_player_real_stop;
+     283                 :             : 
+     284                 :             :   /**
+     285                 :             :    * ValentMediaPlayer:flags:
+     286                 :             :    *
+     287                 :             :    * The available actions.
+     288                 :             :    *
+     289                 :             :    * Implementations should emit [signal@GObject.Object::notify] when they
+     290                 :             :    * change the internal representation of this property.
+     291                 :             :    *
+     292                 :             :    * Since: 1.0
+     293                 :             :    */
+     294                 :          10 :   properties [PROP_FLAGS] =
+     295                 :           5 :     g_param_spec_flags ("flags", NULL, NULL,
+     296                 :             :                         VALENT_TYPE_MEDIA_ACTIONS,
+     297                 :             :                         VALENT_MEDIA_ACTION_NONE,
+     298                 :             :                         (G_PARAM_READABLE |
+     299                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     300                 :             :                          G_PARAM_STATIC_STRINGS));
+     301                 :             : 
+     302                 :             :   /**
+     303                 :             :    * ValentMediaPlayer:metadata: (getter get_metadata)
+     304                 :             :    *
+     305                 :             :    * The metadata of the active media item.
+     306                 :             :    *
+     307                 :             :    * The content of the variant should be in the same format as MPRISv2.
+     308                 :             :    *
+     309                 :             :    * Implementations should emit [signal@GObject.Object::notify] when they
+     310                 :             :    * change the internal representation of this property.
+     311                 :             :    *
+     312                 :             :    * Since: 1.0
+     313                 :             :    */
+     314                 :          10 :   properties [PROP_METADATA] =
+     315                 :           5 :     g_param_spec_variant ("metadata", NULL, NULL,
+     316                 :             :                           G_VARIANT_TYPE ("a{sv}"),
+     317                 :             :                           NULL,
+     318                 :             :                           (G_PARAM_READABLE |
+     319                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     320                 :             :                            G_PARAM_STATIC_STRINGS));
+     321                 :             : 
+     322                 :             :   /**
+     323                 :             :    * ValentMediaPlayer:name: (getter get_name)
+     324                 :             :    *
+     325                 :             :    * The display name of the media player.
+     326                 :             :    *
+     327                 :             :    * Typically, this property should remain constant through the lifetime of the
+     328                 :             :    * media player. Implementations should emit [signal@GObject.Object::notify]
+     329                 :             :    * the internal representation of this property changes, regardless.
+     330                 :             :    *
+     331                 :             :    * Since: 1.0
+     332                 :             :    */
+     333                 :          10 :   properties [PROP_NAME] =
+     334                 :           5 :     g_param_spec_string ("name", NULL, NULL,
+     335                 :             :                          NULL,
+     336                 :             :                          (G_PARAM_READABLE |
+     337                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     338                 :             :                           G_PARAM_STATIC_STRINGS));
+     339                 :             : 
+     340                 :             :   /**
+     341                 :             :    * ValentMediaPlayer:position: (getter get_position) (setter set_position)
+     342                 :             :    *
+     343                 :             :    * The current track position in seconds.
+     344                 :             :    *
+     345                 :             :    * Acceptable values are between `0` and the `mpris:length` metadata entry
+     346                 :             :    * (see [property@Valent.MediaPlayer:metadata]). If the player does not have
+     347                 :             :    * %VALENT_MEDIA_ACTION_SEEK in [property@Valent.MediaPlayer:flags], setting
+     348                 :             :    * this property should have no effect.
+     349                 :             :    *
+     350                 :             :    * Since: 1.0
+     351                 :             :    */
+     352                 :          10 :   properties [PROP_POSITION] =
+     353                 :           5 :     g_param_spec_double ("position", NULL, NULL,
+     354                 :             :                          0.0, G_MAXDOUBLE,
+     355                 :             :                          0.0,
+     356                 :             :                          (G_PARAM_READWRITE |
+     357                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     358                 :             :                           G_PARAM_STATIC_STRINGS));
+     359                 :             : 
+     360                 :             :   /**
+     361                 :             :    * ValentMediaPlayer:repeat: (getter get_repeat) (setter set_repeat)
+     362                 :             :    *
+     363                 :             :    * The repeat mode.
+     364                 :             :    *
+     365                 :             :    * If the player does not have the appropriate bitmask in
+     366                 :             :    * [property@Valent.MediaPlayer:flags], setting this property should have no
+     367                 :             :    * effect.
+     368                 :             :    *
+     369                 :             :    * Implementations should emit [signal@GObject.Object::notify] when they
+     370                 :             :    * change the internal representation of this property.
+     371                 :             :    *
+     372                 :             :    * Since: 1.0
+     373                 :             :    */
+     374                 :          10 :   properties [PROP_REPEAT] =
+     375                 :           5 :     g_param_spec_enum ("repeat", NULL, NULL,
+     376                 :             :                        VALENT_TYPE_MEDIA_REPEAT,
+     377                 :             :                        VALENT_MEDIA_REPEAT_NONE,
+     378                 :             :                        (G_PARAM_READWRITE |
+     379                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     380                 :             :                         G_PARAM_STATIC_STRINGS));
+     381                 :             : 
+     382                 :             :   /**
+     383                 :             :    * ValentMediaPlayer:state: (getter get_state)
+     384                 :             :    *
+     385                 :             :    * The playback state.
+     386                 :             :    *
+     387                 :             :    * Implementations should emit [signal@GObject.Object::notify] when they
+     388                 :             :    * change the internal representation of this property.
+     389                 :             :    *
+     390                 :             :    * Since: 1.0
+     391                 :             :    */
+     392                 :          10 :   properties [PROP_STATE] =
+     393                 :           5 :     g_param_spec_enum ("state", NULL, NULL,
+     394                 :             :                        VALENT_TYPE_MEDIA_STATE,
+     395                 :             :                        VALENT_MEDIA_STATE_STOPPED,
+     396                 :             :                        (G_PARAM_READABLE |
+     397                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     398                 :             :                         G_PARAM_STATIC_STRINGS));
+     399                 :             : 
+     400                 :             :   /**
+     401                 :             :    * ValentMediaPlayer:shuffle: (getter get_shuffle) (setter set_shuffle)
+     402                 :             :    *
+     403                 :             :    * Whether playback order is shuffled.
+     404                 :             :    *
+     405                 :             :    * A value of %FALSE indicates that playback is progressing linearly through a
+     406                 :             :    * playlist, while %TRUE means playback is progressing through a playlist in
+     407                 :             :    * some other order.
+     408                 :             :    *
+     409                 :             :    * Implementations should emit [signal@GObject.Object::notify] when they
+     410                 :             :    * change the internal representation of this property.
+     411                 :             :    *
+     412                 :             :    * Since: 1.0
+     413                 :             :    */
+     414                 :          10 :   properties [PROP_SHUFFLE] =
+     415                 :           5 :     g_param_spec_boolean ("shuffle", NULL, NULL,
+     416                 :             :                           FALSE,
+     417                 :             :                           (G_PARAM_READWRITE |
+     418                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     419                 :             :                            G_PARAM_STATIC_STRINGS));
+     420                 :             : 
+     421                 :             :   /**
+     422                 :             :    * ValentMediaPlayer:volume: (getter get_volume) (setter set_volume)
+     423                 :             :    *
+     424                 :             :    * The volume level.
+     425                 :             :    *
+     426                 :             :    * Attempts to change this property may be ignored by some implementations.
+     427                 :             :    *
+     428                 :             :    * Implementations should emit [signal@GObject.Object::notify] when they
+     429                 :             :    * change the internal representation of this property.
+     430                 :             :    *
+     431                 :             :    * Since: 1.0
+     432                 :             :    */
+     433                 :          10 :   properties [PROP_VOLUME] =
+     434                 :           5 :     g_param_spec_double ("volume", NULL, NULL,
+     435                 :             :                          0.0, G_MAXDOUBLE,
+     436                 :             :                          0.0,
+     437                 :             :                          (G_PARAM_READWRITE |
+     438                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     439                 :             :                           G_PARAM_STATIC_STRINGS));
+     440                 :             : 
+     441                 :           5 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     442                 :           5 : }
+     443                 :             : 
+     444                 :             : static void
+     445                 :          14 : valent_media_player_init (ValentMediaPlayer *self)
+     446                 :             : {
+     447                 :          14 : }
+     448                 :             : 
+     449                 :             : /**
+     450                 :             :  * valent_media_player_get_flags: (virtual get_flags) (get-property flags)
+     451                 :             :  * @player: a `ValentMediaPlayer`
+     452                 :             :  *
+     453                 :             :  * Get flags describing the available actions of @player.
+     454                 :             :  *
+     455                 :             :  * Returns: a bitmask of `ValentMediaActions`
+     456                 :             :  *
+     457                 :             :  * Since: 1.0
+     458                 :             :  */
+     459                 :             : ValentMediaActions
+     460                 :          65 : valent_media_player_get_flags (ValentMediaPlayer *player)
+     461                 :             : {
+     462                 :          65 :   ValentMediaActions ret;
+     463                 :             : 
+     464                 :          65 :   VALENT_ENTRY;
+     465                 :             : 
+     466         [ +  - ]:          65 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), VALENT_MEDIA_ACTION_NONE);
+     467                 :             : 
+     468                 :          65 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_flags (player);
+     469                 :             : 
+     470                 :          65 :   VALENT_RETURN (ret);
+     471                 :             : }
+     472                 :             : 
+     473                 :             : /**
+     474                 :             :  * valent_media_player_get_metadata: (virtual get_metadata) (get-property metadata)
+     475                 :             :  * @player: a `ValentMediaPlayer`
+     476                 :             :  *
+     477                 :             :  * Get the metadata of the active media items.
+     478                 :             :  *
+     479                 :             :  * Implementations should typically have an entry for the `mpris:length` field.
+     480                 :             :  * Other fields generally supported by KDE Connect clients include
+     481                 :             :  * `mpris:artUrl`, `xesam:artist`, `xesam:album` and `xesam:title`.
+     482                 :             :  *
+     483                 :             :  * Returns: (transfer full): a `GVariant` of type `a{sv}`
+     484                 :             :  *
+     485                 :             :  * Since: 1.0
+     486                 :             :  */
+     487                 :             : GVariant *
+     488                 :          54 : valent_media_player_get_metadata (ValentMediaPlayer *player)
+     489                 :             : {
+     490                 :          54 :   GVariant *ret;
+     491                 :             : 
+     492                 :          54 :   VALENT_ENTRY;
+     493                 :             : 
+     494         [ +  - ]:          54 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), NULL);
+     495                 :             : 
+     496                 :          54 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_metadata (player);
+     497                 :             : 
+     498         [ +  + ]:          54 :   if G_UNLIKELY (ret == NULL)
+     499                 :          11 :     ret = g_variant_parse (G_VARIANT_TYPE_VARDICT, "{}", NULL, NULL, NULL);
+     500                 :             : 
+     501                 :          54 :   VALENT_RETURN (ret);
+     502                 :             : }
+     503                 :             : 
+     504                 :             : /**
+     505                 :             :  * valent_media_player_get_name: (virtual get_name) (get-property name)
+     506                 :             :  * @player: a `ValentMediaPlayer`
+     507                 :             :  *
+     508                 :             :  * Get the display name of the @player.
+     509                 :             :  *
+     510                 :             :  * Returns: (transfer none): player name
+     511                 :             :  *
+     512                 :             :  * Since: 1.0
+     513                 :             :  */
+     514                 :             : const char *
+     515                 :          40 : valent_media_player_get_name (ValentMediaPlayer *player)
+     516                 :             : {
+     517                 :          40 :   const char *ret;
+     518                 :             : 
+     519                 :          40 :   VALENT_ENTRY;
+     520                 :             : 
+     521         [ +  - ]:          40 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), NULL);
+     522                 :             : 
+     523                 :          40 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_name (player);
+     524                 :             : 
+     525                 :          40 :   VALENT_RETURN (ret);
+     526                 :             : }
+     527                 :             : 
+     528                 :             : /**
+     529                 :             :  * valent_media_player_get_position: (virtual get_position) (get-property position)
+     530                 :             :  * @player: a `ValentMediaPlayer`
+     531                 :             :  *
+     532                 :             :  * Get the current position in seconds.
+     533                 :             :  *
+     534                 :             :  * Returns: position in seconds
+     535                 :             :  *
+     536                 :             :  * Since: 1.0
+     537                 :             :  */
+     538                 :             : double
+     539                 :          50 : valent_media_player_get_position (ValentMediaPlayer *player)
+     540                 :             : {
+     541                 :          50 :   double ret;
+     542                 :             : 
+     543                 :          50 :   VALENT_ENTRY;
+     544                 :             : 
+     545         [ +  - ]:          50 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), 0.0);
+     546                 :             : 
+     547                 :          50 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_position (player);
+     548                 :             : 
+     549                 :          50 :   VALENT_RETURN (ret);
+     550                 :             : }
+     551                 :             : 
+     552                 :             : /**
+     553                 :             :  * valent_media_player_set_position: (virtual set_position) (set-property position)
+     554                 :             :  * @player: a `ValentMediaPlayer`
+     555                 :             :  * @position: position in seconds
+     556                 :             :  *
+     557                 :             :  * Set the current position in seconds.
+     558                 :             :  *
+     559                 :             :  * Since: 1.0
+     560                 :             :  */
+     561                 :             : void
+     562                 :           6 : valent_media_player_set_position (ValentMediaPlayer *player,
+     563                 :             :                                   double             position)
+     564                 :             : {
+     565                 :           6 :   VALENT_ENTRY;
+     566                 :             : 
+     567         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     568         [ -  + ]:           6 :   g_return_if_fail (position >= 0.0);
+     569                 :             : 
+     570                 :           6 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->set_position (player, position);
+     571                 :             : 
+     572                 :           6 :   VALENT_EXIT;
+     573                 :             : }
+     574                 :             : 
+     575                 :             : /**
+     576                 :             :  * valent_media_player_get_repeat: (virtual get_repeat) (get-property repeat)
+     577                 :             :  * @player: a `ValentMediaPlayer`
+     578                 :             :  *
+     579                 :             :  * Get the repeat mode for @player.
+     580                 :             :  *
+     581                 :             :  * Returns: `ValentMediaRepeat`
+     582                 :             :  *
+     583                 :             :  * Since: 1.0
+     584                 :             :  */
+     585                 :             : ValentMediaRepeat
+     586                 :          27 : valent_media_player_get_repeat (ValentMediaPlayer *player)
+     587                 :             : {
+     588                 :          27 :   ValentMediaRepeat ret;
+     589                 :             : 
+     590                 :          27 :   VALENT_ENTRY;
+     591                 :             : 
+     592         [ +  - ]:          27 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), VALENT_MEDIA_REPEAT_NONE);
+     593                 :             : 
+     594                 :          27 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_repeat (player);
+     595                 :             : 
+     596                 :          27 :   VALENT_RETURN (ret);
+     597                 :             : }
+     598                 :             : 
+     599                 :             : /**
+     600                 :             :  * valent_media_player_set_repeat: (virtual set_repeat) (set-property repeat)
+     601                 :             :  * @player: a `ValentMediaPlayer`
+     602                 :             :  * @repeat: a `ValentMediaRepeat`
+     603                 :             :  *
+     604                 :             :  * Set the repeat mode of @player to @repeat.
+     605                 :             :  *
+     606                 :             :  * Since: 1.0
+     607                 :             :  */
+     608                 :             : void
+     609                 :          11 : valent_media_player_set_repeat (ValentMediaPlayer *player,
+     610                 :             :                                ValentMediaRepeat   repeat)
+     611                 :             : {
+     612                 :          11 :   VALENT_ENTRY;
+     613                 :             : 
+     614         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     615                 :             : 
+     616                 :          11 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->set_repeat (player, repeat);
+     617                 :             : 
+     618                 :          11 :   VALENT_EXIT;
+     619                 :             : }
+     620                 :             : 
+     621                 :             : /**
+     622                 :             :  * valent_media_player_get_shuffle: (virtual get_shuffle) (get-property shuffle)
+     623                 :             :  * @player: a `ValentMediaPlayer`
+     624                 :             :  *
+     625                 :             :  * Get whether playback order is shuffled.
+     626                 :             :  *
+     627                 :             :  * Returns: the shuffle state
+     628                 :             :  *
+     629                 :             :  * Since: 1.0
+     630                 :             :  */
+     631                 :             : gboolean
+     632                 :          28 : valent_media_player_get_shuffle (ValentMediaPlayer *player)
+     633                 :             : {
+     634                 :          28 :   gboolean ret;
+     635                 :             : 
+     636                 :          28 :   VALENT_ENTRY;
+     637                 :             : 
+     638         [ +  - ]:          28 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), FALSE);
+     639                 :             : 
+     640                 :          28 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_shuffle (player);
+     641                 :             : 
+     642                 :          28 :   VALENT_RETURN (ret);
+     643                 :             : }
+     644                 :             : 
+     645                 :             : /**
+     646                 :             :  * valent_media_player_set_shuffle: (virtual set_shuffle) (set-property shuffle)
+     647                 :             :  * @player: a `ValentMediaPlayer`
+     648                 :             :  * @shuffle: shuffle state
+     649                 :             :  *
+     650                 :             :  * Set whether playback order is shuffled.
+     651                 :             :  *
+     652                 :             :  * Since: 1.0
+     653                 :             :  */
+     654                 :             : void
+     655                 :          10 : valent_media_player_set_shuffle (ValentMediaPlayer *player,
+     656                 :             :                                   gboolean           shuffle)
+     657                 :             : {
+     658                 :          10 :   VALENT_ENTRY;
+     659                 :             : 
+     660         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     661                 :             : 
+     662                 :          10 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->set_shuffle (player, shuffle);
+     663                 :             : 
+     664                 :          10 :   VALENT_EXIT;
+     665                 :             : }
+     666                 :             : 
+     667                 :             : /**
+     668                 :             :  * valent_media_player_get_state: (virtual get_state) (get-property state)
+     669                 :             :  * @player: a `ValentMediaPlayer`
+     670                 :             :  *
+     671                 :             :  * Get the playback state for @player.
+     672                 :             :  *
+     673                 :             :  * Returns: `ValentMediaState`
+     674                 :             :  *
+     675                 :             :  * Since: 1.0
+     676                 :             :  */
+     677                 :             : ValentMediaState
+     678                 :          87 : valent_media_player_get_state (ValentMediaPlayer *player)
+     679                 :             : {
+     680                 :          87 :   ValentMediaState ret;
+     681                 :             : 
+     682                 :          87 :   VALENT_ENTRY;
+     683                 :             : 
+     684         [ +  - ]:          87 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), VALENT_MEDIA_STATE_STOPPED);
+     685                 :             : 
+     686                 :          87 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_state (player);
+     687                 :             : 
+     688                 :          87 :   VALENT_RETURN (ret);
+     689                 :             : }
+     690                 :             : 
+     691                 :             : /**
+     692                 :             :  * valent_media_player_get_volume: (virtual get_volume) (get-property volume)
+     693                 :             :  * @player: a `ValentMediaPlayer`
+     694                 :             :  *
+     695                 :             :  * Get the volume level.
+     696                 :             :  *
+     697                 :             :  * Returns: the volume of @player
+     698                 :             :  *
+     699                 :             :  * Since: 1.0
+     700                 :             :  */
+     701                 :             : double
+     702                 :          26 : valent_media_player_get_volume (ValentMediaPlayer *player)
+     703                 :             : {
+     704                 :          26 :   double ret;
+     705                 :             : 
+     706                 :          26 :   VALENT_ENTRY;
+     707                 :             : 
+     708         [ +  - ]:          26 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), 0.0);
+     709                 :             : 
+     710                 :          26 :   ret = VALENT_MEDIA_PLAYER_GET_CLASS (player)->get_volume (player);
+     711                 :             : 
+     712                 :          26 :   VALENT_RETURN (ret);
+     713                 :             : }
+     714                 :             : 
+     715                 :             : /**
+     716                 :             :  * valent_media_player_set_volume: (virtual set_volume) (set-property volume)
+     717                 :             :  * @player: a `ValentMediaPlayer`
+     718                 :             :  * @volume: volume level
+     719                 :             :  *
+     720                 :             :  * Set the volume level of @player.
+     721                 :             :  *
+     722                 :             :  * Since: 1.0
+     723                 :             :  */
+     724                 :             : void
+     725                 :           8 : valent_media_player_set_volume (ValentMediaPlayer *player,
+     726                 :             :                                 double             volume)
+     727                 :             : {
+     728                 :           8 :   VALENT_ENTRY;
+     729                 :             : 
+     730         [ +  - ]:           8 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     731                 :             : 
+     732                 :           8 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->set_volume (player, volume);
+     733                 :             : 
+     734                 :           8 :   VALENT_EXIT;
+     735                 :             : }
+     736                 :             : 
+     737                 :             : /**
+     738                 :             :  * valent_media_player_next: (virtual next)
+     739                 :             :  * @player: a `ValentMediaPlayer`
+     740                 :             :  *
+     741                 :             :  * Skip to the next media item.
+     742                 :             :  *
+     743                 :             :  * If there is no next track (and endless playback and track repeat are both
+     744                 :             :  * off), stop playback. If playback is paused or stopped, it remains that way.
+     745                 :             :  *
+     746                 :             :  * If [property@Valent.MediaPlayer:flags] does not include
+     747                 :             :  * %VALENT_MEDIA_ACTION_NEXT, calling this method should have no effect.
+     748                 :             :  *
+     749                 :             :  * Since: 1.0
+     750                 :             :  */
+     751                 :             : void
+     752                 :           9 : valent_media_player_next (ValentMediaPlayer *player)
+     753                 :             : {
+     754                 :           9 :   VALENT_ENTRY;
+     755                 :             : 
+     756         [ +  - ]:           9 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     757                 :             : 
+     758                 :           9 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->next (player);
+     759                 :             : 
+     760                 :           9 :   VALENT_EXIT;
+     761                 :             : }
+     762                 :             : 
+     763                 :             : /**
+     764                 :             :  * valent_media_player_pause: (virtual pause)
+     765                 :             :  * @player: a `ValentMediaPlayer`
+     766                 :             :  *
+     767                 :             :  * Pauses playback.
+     768                 :             :  *
+     769                 :             :  * If playback is already paused, this has no effect. Calling
+     770                 :             :  * [method@Valent.MediaPlayer.pause] after this should cause playback to start
+     771                 :             :  * again from the same position.
+     772                 :             :  *
+     773                 :             :  * If [property@Valent.MediaPlayer:flags] does not include
+     774                 :             :  * %VALENT_MEDIA_ACTION_PAUSE, calling this method should have no effect.
+     775                 :             :  *
+     776                 :             :  * Since: 1.0
+     777                 :             :  */
+     778                 :             : void
+     779                 :          10 : valent_media_player_pause (ValentMediaPlayer *player)
+     780                 :             : {
+     781                 :          10 :   VALENT_ENTRY;
+     782                 :             : 
+     783         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     784                 :             : 
+     785                 :          10 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->pause (player);
+     786                 :             : 
+     787                 :          10 :   VALENT_EXIT;
+     788                 :             : }
+     789                 :             : 
+     790                 :             : /**
+     791                 :             :  * valent_media_player_play: (virtual play)
+     792                 :             :  * @player: a `ValentMediaPlayer`
+     793                 :             :  *
+     794                 :             :  * Start playback.
+     795                 :             :  *
+     796                 :             :  * If already playing, this has no effect. If paused, playback resumes from the
+     797                 :             :  * current position. If there is no track to play, this has no effect.
+     798                 :             :  *
+     799                 :             :  * If [property@Valent.MediaPlayer:flags] does not include
+     800                 :             :  * %VALENT_MEDIA_ACTION_PLAY, calling this method should have no effect.
+     801                 :             :  *
+     802                 :             :  * Since: 1.0
+     803                 :             :  */
+     804                 :             : void
+     805                 :          11 : valent_media_player_play (ValentMediaPlayer *player)
+     806                 :             : {
+     807                 :          11 :   VALENT_ENTRY;
+     808                 :             : 
+     809         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     810                 :             : 
+     811                 :          11 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->play (player);
+     812                 :             : 
+     813                 :          11 :   VALENT_EXIT;
+     814                 :             : }
+     815                 :             : 
+     816                 :             : /**
+     817                 :             :  * valent_media_player_previous: (virtual previous)
+     818                 :             :  * @player: a `ValentMediaPlayer`
+     819                 :             :  *
+     820                 :             :  * Skip to the previous media item.
+     821                 :             :  *
+     822                 :             :  * If there is no previous track (and endless playback and track repeat are both
+     823                 :             :  * off), stop playback. If playback is paused or stopped, it remains that way.
+     824                 :             :  *
+     825                 :             :  * If [property@Valent.MediaPlayer:flags] does not include
+     826                 :             :  * %VALENT_MEDIA_ACTION_PREVIOUS, calling this method should have no effect.
+     827                 :             :  *
+     828                 :             :  * Since: 1.0
+     829                 :             :  */
+     830                 :             : void
+     831                 :           9 : valent_media_player_previous (ValentMediaPlayer *player)
+     832                 :             : {
+     833                 :           9 :   VALENT_ENTRY;
+     834                 :             : 
+     835         [ +  - ]:           9 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     836                 :             : 
+     837                 :           9 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->previous (player);
+     838                 :             : 
+     839                 :           9 :   VALENT_EXIT;
+     840                 :             : }
+     841                 :             : 
+     842                 :             : /**
+     843                 :             :  * valent_media_player_seek: (virtual seek)
+     844                 :             :  * @player: a `ValentMediaPlayer`
+     845                 :             :  * @offset: number of seconds to seek forward
+     846                 :             :  *
+     847                 :             :  * Seek in the current media item by @offset seconds.
+     848                 :             :  *
+     849                 :             :  * A negative value seeks back. If this would mean seeking back further than the
+     850                 :             :  * start of the track, the position is set to `0`. If the value passed in would
+     851                 :             :  * mean seeking beyond the end of the track, acts like a call to
+     852                 :             :  * valent_media_player_seek().
+     853                 :             :  *
+     854                 :             :  * If [property@Valent.MediaPlayer:flags] does not include
+     855                 :             :  * %VALENT_MEDIA_ACTION_SEEK, calling this method should have no effect.
+     856                 :             :  *
+     857                 :             :  * Since: 1.0
+     858                 :             :  */
+     859                 :             : void
+     860                 :          10 : valent_media_player_seek (ValentMediaPlayer *player,
+     861                 :             :                           double             offset)
+     862                 :             : {
+     863                 :          10 :   VALENT_ENTRY;
+     864                 :             : 
+     865         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     866                 :             : 
+     867                 :          10 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->seek (player, offset);
+     868                 :             : 
+     869                 :          10 :   VALENT_EXIT;
+     870                 :             : }
+     871                 :             : 
+     872                 :             : /**
+     873                 :             :  * valent_media_player_stop: (virtual stop)
+     874                 :             :  * @player: a `ValentMediaPlayer`
+     875                 :             :  *
+     876                 :             :  * Stop playback.
+     877                 :             :  *
+     878                 :             :  * If playback is already stopped, this has no effect. Calling
+     879                 :             :  * valent_media_player_play() after this should cause playback to start again
+     880                 :             :  * from the beginning of the track.
+     881                 :             :  *
+     882                 :             :  * If [property@Valent.MediaPlayer:flags] does not include
+     883                 :             :  * %VALENT_MEDIA_ACTION_STOP, calling this method should have no effect.
+     884                 :             :  *
+     885                 :             :  * Since: 1.0
+     886                 :             :  */
+     887                 :             : void
+     888                 :           9 : valent_media_player_stop (ValentMediaPlayer *player)
+     889                 :             : {
+     890                 :           9 :   VALENT_ENTRY;
+     891                 :             : 
+     892         [ +  - ]:           9 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     893                 :             : 
+     894                 :           9 :   VALENT_MEDIA_PLAYER_GET_CLASS (player)->stop (player);
+     895                 :             : 
+     896                 :           9 :   VALENT_EXIT;
+     897                 :             : }
+     898                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-player.h.func-c.html b/coverage/src/libvalent/media/valent-media-player.h.func-c.html new file mode 100644 index 00000000000..ee50097e520 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-player.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-player.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-player.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.9 %229
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA_PLAYER521
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-player.h.func.html b/coverage/src/libvalent/media/valent-media-player.h.func.html new file mode 100644 index 00000000000..cf268fc4f51 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-player.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-player.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-player.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.9 %229
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA_PLAYER521
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media-player.h.gcov.html b/coverage/src/libvalent/media/valent-media-player.h.gcov.html new file mode 100644 index 00000000000..715a8bdeb3f --- /dev/null +++ b/coverage/src/libvalent/media/valent-media-player.h.gcov.html @@ -0,0 +1,257 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media-player.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media-player.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.9 %229
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-object.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentMediaActions:
+      16                 :             :  * @VALENT_MEDIA_ACTION_NONE: The player can not be controlled
+      17                 :             :  * @VALENT_MEDIA_ACTION_PLAY: Start or resume playback
+      18                 :             :  * @VALENT_MEDIA_ACTION_PAUSE: Pause playback
+      19                 :             :  * @VALENT_MEDIA_ACTION_STOP: Stop playback
+      20                 :             :  * @VALENT_MEDIA_ACTION_NEXT: Next track
+      21                 :             :  * @VALENT_MEDIA_ACTION_PREVIOUS: Previous track
+      22                 :             :  * @VALENT_MEDIA_ACTION_SEEK: Change the playback position
+      23                 :             :  * @VALENT_MEDIA_ACTION_RESERVED1: Reserved
+      24                 :             :  * @VALENT_MEDIA_ACTION_RESERVED2: Reserved
+      25                 :             :  *
+      26                 :             :  * Media action flags.
+      27                 :             :  *
+      28                 :             :  * Since: 1.0
+      29                 :             :  */
+      30                 :             : typedef enum
+      31                 :             : {
+      32                 :             :   VALENT_MEDIA_ACTION_NONE,
+      33                 :             :   VALENT_MEDIA_ACTION_PLAY      = (1<<0),
+      34                 :             :   VALENT_MEDIA_ACTION_PAUSE     = (1<<1),
+      35                 :             :   VALENT_MEDIA_ACTION_STOP      = (1<<2),
+      36                 :             :   VALENT_MEDIA_ACTION_NEXT      = (1<<3),
+      37                 :             :   VALENT_MEDIA_ACTION_PREVIOUS  = (1<<4),
+      38                 :             :   VALENT_MEDIA_ACTION_SEEK      = (1<<5),
+      39                 :             :   VALENT_MEDIA_ACTION_RESERVED1 = (1<<6),
+      40                 :             :   VALENT_MEDIA_ACTION_RESERVED2 = (1<<7)
+      41                 :             : } ValentMediaActions;
+      42                 :             : 
+      43                 :             : 
+      44                 :             : /**
+      45                 :             :  * ValentMediaRepeat:
+      46                 :             :  * @VALENT_MEDIA_REPEAT_NONE: Repeat off.
+      47                 :             :  * @VALENT_MEDIA_REPEAT_ALL: Repeat all items.
+      48                 :             :  * @VALENT_MEDIA_REPEAT_ONE: Repeat one items.
+      49                 :             :  *
+      50                 :             :  * Enumeration of loop modes.
+      51                 :             :  *
+      52                 :             :  * Since: 1.0
+      53                 :             :  */
+      54                 :             : typedef enum
+      55                 :             : {
+      56                 :             :   VALENT_MEDIA_REPEAT_NONE,
+      57                 :             :   VALENT_MEDIA_REPEAT_ALL,
+      58                 :             :   VALENT_MEDIA_REPEAT_ONE,
+      59                 :             : } ValentMediaRepeat;
+      60                 :             : 
+      61                 :             : 
+      62                 :             : /**
+      63                 :             :  * ValentMediaState:
+      64                 :             :  * @VALENT_MEDIA_STATE_STOPPED: The player state is unknown.
+      65                 :             :  * @VALENT_MEDIA_STATE_PLAYING: Playback is active.
+      66                 :             :  * @VALENT_MEDIA_STATE_PAUSED: Playback is paused.
+      67                 :             :  *
+      68                 :             :  * Media state flags.
+      69                 :             :  *
+      70                 :             :  * Since: 1.0
+      71                 :             :  */
+      72                 :             : typedef enum
+      73                 :             : {
+      74                 :             :   VALENT_MEDIA_STATE_STOPPED,
+      75                 :             :   VALENT_MEDIA_STATE_PLAYING,
+      76                 :             :   VALENT_MEDIA_STATE_PAUSED,
+      77                 :             : } ValentMediaState;
+      78                 :             : 
+      79                 :             : 
+      80                 :             : #define VALENT_TYPE_MEDIA_PLAYER (valent_media_player_get_type())
+      81                 :             : 
+      82                 :             : VALENT_AVAILABLE_IN_1_0
+      83   [ +  -  +  -  :        1044 : G_DECLARE_DERIVABLE_TYPE (ValentMediaPlayer, valent_media_player, VALENT, MEDIA_PLAYER, ValentObject)
+          +  -  +  -  +  
+          -  -  -  +  -  
+          -  -  +  -  +  
+                -  +  - ]
+      84                 :             : 
+      85                 :             : struct _ValentMediaPlayerClass
+      86                 :             : {
+      87                 :             :   ValentObjectClass    parent_class;
+      88                 :             : 
+      89                 :             :   /* virtual functions */
+      90                 :             :   ValentMediaActions   (*get_flags)    (ValentMediaPlayer *player);
+      91                 :             :   GVariant           * (*get_metadata) (ValentMediaPlayer *player);
+      92                 :             :   const char         * (*get_name)     (ValentMediaPlayer *player);
+      93                 :             :   double               (*get_position) (ValentMediaPlayer *player);
+      94                 :             :   void                 (*set_position) (ValentMediaPlayer *player,
+      95                 :             :                                         double             position);
+      96                 :             :   ValentMediaRepeat    (*get_repeat)   (ValentMediaPlayer *player);
+      97                 :             :   void                 (*set_repeat)   (ValentMediaPlayer *player,
+      98                 :             :                                         ValentMediaRepeat  repeat);
+      99                 :             :   gboolean             (*get_shuffle)  (ValentMediaPlayer *player);
+     100                 :             :   void                 (*set_shuffle)  (ValentMediaPlayer *player,
+     101                 :             :                                         gboolean           shuffle);
+     102                 :             :   ValentMediaState     (*get_state)    (ValentMediaPlayer *player);
+     103                 :             :   double               (*get_volume)   (ValentMediaPlayer *player);
+     104                 :             :   void                 (*set_volume)   (ValentMediaPlayer *player,
+     105                 :             :                                         double             volume);
+     106                 :             :   void                 (*next)         (ValentMediaPlayer *player);
+     107                 :             :   void                 (*pause)        (ValentMediaPlayer *player);
+     108                 :             :   void                 (*play)         (ValentMediaPlayer *player);
+     109                 :             :   void                 (*previous)     (ValentMediaPlayer *player);
+     110                 :             :   void                 (*seek)         (ValentMediaPlayer *player,
+     111                 :             :                                         double             offset);
+     112                 :             :   void                 (*stop)         (ValentMediaPlayer *player);
+     113                 :             : 
+     114                 :             :   /*< private >*/
+     115                 :             :   gpointer             padding[8];
+     116                 :             : };
+     117                 :             : 
+     118                 :             : VALENT_AVAILABLE_IN_1_0
+     119                 :             : ValentMediaActions   valent_media_player_get_flags    (ValentMediaPlayer *player);
+     120                 :             : VALENT_AVAILABLE_IN_1_0
+     121                 :             : GVariant           * valent_media_player_get_metadata (ValentMediaPlayer *player);
+     122                 :             : VALENT_AVAILABLE_IN_1_0
+     123                 :             : const char         * valent_media_player_get_name     (ValentMediaPlayer *player);
+     124                 :             : VALENT_AVAILABLE_IN_1_0
+     125                 :             : ValentMediaRepeat    valent_media_player_get_repeat   (ValentMediaPlayer *player);
+     126                 :             : VALENT_AVAILABLE_IN_1_0
+     127                 :             : void                 valent_media_player_set_repeat   (ValentMediaPlayer *player,
+     128                 :             :                                                        ValentMediaRepeat  repeat);
+     129                 :             : VALENT_AVAILABLE_IN_1_0
+     130                 :             : double               valent_media_player_get_position (ValentMediaPlayer *player);
+     131                 :             : VALENT_AVAILABLE_IN_1_0
+     132                 :             : void                 valent_media_player_set_position (ValentMediaPlayer *player,
+     133                 :             :                                                        double             position);
+     134                 :             : VALENT_AVAILABLE_IN_1_0
+     135                 :             : gboolean             valent_media_player_get_shuffle  (ValentMediaPlayer *player);
+     136                 :             : VALENT_AVAILABLE_IN_1_0
+     137                 :             : void                 valent_media_player_set_shuffle  (ValentMediaPlayer *player,
+     138                 :             :                                                        gboolean           shuffle);
+     139                 :             : VALENT_AVAILABLE_IN_1_0
+     140                 :             : ValentMediaState     valent_media_player_get_state    (ValentMediaPlayer *player);
+     141                 :             : VALENT_AVAILABLE_IN_1_0
+     142                 :             : double               valent_media_player_get_volume   (ValentMediaPlayer *player);
+     143                 :             : VALENT_AVAILABLE_IN_1_0
+     144                 :             : void                 valent_media_player_set_volume   (ValentMediaPlayer *player,
+     145                 :             :                                                        double             volume);
+     146                 :             : VALENT_AVAILABLE_IN_1_0
+     147                 :             : void                 valent_media_player_next         (ValentMediaPlayer *player);
+     148                 :             : VALENT_AVAILABLE_IN_1_0
+     149                 :             : void                 valent_media_player_pause        (ValentMediaPlayer *player);
+     150                 :             : VALENT_AVAILABLE_IN_1_0
+     151                 :             : void                 valent_media_player_play         (ValentMediaPlayer *player);
+     152                 :             : VALENT_AVAILABLE_IN_1_0
+     153                 :             : void                 valent_media_player_previous     (ValentMediaPlayer *player);
+     154                 :             : VALENT_AVAILABLE_IN_1_0
+     155                 :             : void                 valent_media_player_seek         (ValentMediaPlayer *player,
+     156                 :             :                                                        double             offset);
+     157                 :             : VALENT_AVAILABLE_IN_1_0
+     158                 :             : void                 valent_media_player_stop         (ValentMediaPlayer *player);
+     159                 :             : 
+     160                 :             : G_END_DECLS
+     161                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media.c.func-c.html b/coverage/src/libvalent/media/valent-media.c.func-c.html new file mode 100644 index 00000000000..486d4314831 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.6 %149138
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.5 %7646
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_media_get_item_type0
valent_media_export_player1
valent_media_unexport_player1
valent_media_pause3
valent_media_unpause3
g_list_model_iface_init5
valent_media_destroy8
valent_media_finalize8
valent_media_init10
valent_media_unbind_extension10
valent_media_bind_extension13
valent_media_get_item19
valent_media_get_default23
valent_media_get_n_items25
on_items_changed47
valent_media_get_type320
valent_media_class_intern_init5
valent_media_get_type_once86
valent_media_get_type229
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media.c.func.html b/coverage/src/libvalent/media/valent-media.c.func.html new file mode 100644 index 00000000000..00442326aac --- /dev/null +++ b/coverage/src/libvalent/media/valent-media.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.6 %149138
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.5 %7646
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init5
on_items_changed47
valent_media_bind_extension13
valent_media_destroy8
valent_media_export_player1
valent_media_finalize8
valent_media_get_default23
valent_media_get_item19
valent_media_get_item_type0
valent_media_get_n_items25
valent_media_get_type320
valent_media_class_intern_init5
valent_media_get_type229
valent_media_get_type_once86
valent_media_init10
valent_media_pause3
valent_media_unbind_extension10
valent_media_unexport_player1
valent_media_unpause3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media.c.gcov.html b/coverage/src/libvalent/media/valent-media.c.gcov.html new file mode 100644 index 00000000000..d617abc2e90 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media.c.gcov.html @@ -0,0 +1,534 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.6 %149138
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.5 %7646
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-media"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-media.h"
+      13                 :             : #include "valent-media-adapter.h"
+      14                 :             : #include "valent-media-player.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentMedia:
+      19                 :             :  *
+      20                 :             :  * A class for monitoring and controlling media players.
+      21                 :             :  *
+      22                 :             :  * `ValentMedia` is an aggregator of media players, intended for use by
+      23                 :             :  * [class@Valent.DevicePlugin] implementations.
+      24                 :             :  *
+      25                 :             :  * Plugins can implement [class@Valent.MediaAdapter] to provide an
+      26                 :             :  * interface to manage instances of [class@Valent.MediaPlayer].
+      27                 :             :  *
+      28                 :             :  * Since: 1.0
+      29                 :             :  */
+      30                 :             : 
+      31                 :             : struct _ValentMedia
+      32                 :             : {
+      33                 :             :   ValentComponent  parent_instance;
+      34                 :             : 
+      35                 :             :   GPtrArray       *adapters;
+      36                 :             :   GListModel      *exports;
+      37                 :             :   GPtrArray       *players;
+      38                 :             :   GPtrArray       *paused;
+      39                 :             : };
+      40                 :             : 
+      41                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      42                 :             : 
+      43   [ +  +  +  - ]:         320 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentMedia, valent_media, VALENT_TYPE_COMPONENT,
+      44                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      45                 :             : 
+      46                 :             : static ValentMedia *default_media = NULL;
+      47                 :             : 
+      48                 :             : 
+      49                 :             : static void
+      50                 :          47 : on_items_changed (GListModel   *list,
+      51                 :             :                   unsigned int  position,
+      52                 :             :                   unsigned int  removed,
+      53                 :             :                   unsigned int  added,
+      54                 :             :                   ValentMedia  *self)
+      55                 :             : {
+      56                 :          47 :   unsigned int real_position = 0;
+      57                 :             : 
+      58                 :          47 :   VALENT_ENTRY;
+      59                 :             : 
+      60         [ +  - ]:          47 :   g_assert (G_IS_LIST_MODEL (list));
+      61         [ +  - ]:          47 :   g_assert (VALENT_IS_MEDIA (self));
+      62                 :             : 
+      63                 :             :   /* Translate the adapter position */
+      64         [ +  - ]:          89 :   for (unsigned int i = 0; i < self->adapters->len; i++)
+      65                 :             :     {
+      66                 :          89 :       GListModel *adapter = g_ptr_array_index (self->adapters, i);
+      67                 :             : 
+      68         [ +  + ]:          89 :       if (adapter == list)
+      69                 :             :         break;
+      70                 :             : 
+      71                 :          42 :       real_position += g_list_model_get_n_items (adapter);
+      72                 :             :     }
+      73                 :             : 
+      74                 :          47 :   real_position += position;
+      75                 :             : 
+      76                 :             :   /* Propagate the changes */
+      77         [ +  + ]:          55 :   for (unsigned int i = 0; i < removed; i++)
+      78                 :             :     {
+      79                 :           8 :       g_autoptr (ValentMediaPlayer) player = NULL;
+      80                 :             : 
+      81                 :           8 :       player = g_ptr_array_steal_index (self->players, real_position);
+      82                 :           8 :       g_ptr_array_remove (self->paused, player);
+      83                 :             : 
+      84         [ +  - ]:           8 :       VALENT_NOTE ("removed %s (%s)",
+      85                 :             :                    G_OBJECT_TYPE_NAME (player),
+      86                 :             :                    valent_media_player_get_name (player));
+      87                 :             :     }
+      88                 :             : 
+      89         [ +  + ]:          55 :   for (unsigned int i = 0; i < added; i++)
+      90                 :             :     {
+      91                 :           8 :       ValentMediaPlayer *player = NULL;
+      92                 :             : 
+      93                 :           8 :       player = g_list_model_get_item (list, position + i);
+      94                 :           8 :       g_ptr_array_insert (self->players, real_position + i, player);
+      95                 :             : 
+      96                 :           8 :       VALENT_NOTE ("added %s (%s)",
+      97                 :             :                    G_OBJECT_TYPE_NAME (player),
+      98                 :             :                    valent_media_player_get_name (player));
+      99                 :             :     }
+     100                 :             : 
+     101                 :          47 :   g_list_model_items_changed (G_LIST_MODEL (self), real_position, removed, added);
+     102                 :             : 
+     103                 :          47 :   VALENT_EXIT;
+     104                 :             : }
+     105                 :             : 
+     106                 :             : /*
+     107                 :             :  * GListModel
+     108                 :             :  */
+     109                 :             : static gpointer
+     110                 :          19 : valent_media_get_item (GListModel   *list,
+     111                 :             :                        unsigned int  position)
+     112                 :             : {
+     113                 :          19 :   ValentMedia *self = VALENT_MEDIA (list);
+     114                 :             : 
+     115         [ +  - ]:          19 :   g_assert (VALENT_IS_MEDIA (self));
+     116                 :             : 
+     117         [ +  - ]:          19 :   if G_UNLIKELY (position >= self->players->len)
+     118                 :             :     return NULL;
+     119                 :             : 
+     120                 :          19 :   return g_object_ref (g_ptr_array_index (self->players, position));
+     121                 :             : }
+     122                 :             : 
+     123                 :             : static GType
+     124                 :           0 : valent_media_get_item_type (GListModel *list)
+     125                 :             : {
+     126                 :           0 :   return VALENT_TYPE_MEDIA_PLAYER;
+     127                 :             : }
+     128                 :             : 
+     129                 :             : static unsigned int
+     130                 :          25 : valent_media_get_n_items (GListModel *list)
+     131                 :             : {
+     132                 :          25 :   ValentMedia *self = VALENT_MEDIA (list);
+     133                 :             : 
+     134         [ +  - ]:          25 :   g_assert (VALENT_IS_MEDIA (self));
+     135                 :             : 
+     136                 :          25 :   return self->players->len;
+     137                 :             : }
+     138                 :             : 
+     139                 :             : static void
+     140                 :           5 : g_list_model_iface_init (GListModelInterface *iface)
+     141                 :             : {
+     142                 :           5 :   iface->get_item = valent_media_get_item;
+     143                 :           5 :   iface->get_item_type = valent_media_get_item_type;
+     144                 :           5 :   iface->get_n_items = valent_media_get_n_items;
+     145                 :           5 : }
+     146                 :             : 
+     147                 :             : /*
+     148                 :             :  * ValentComponent
+     149                 :             :  */
+     150                 :             : static void
+     151                 :          13 : valent_media_bind_extension (ValentComponent *component,
+     152                 :             :                              GObject         *extension)
+     153                 :             : {
+     154                 :          13 :   ValentMedia *self = VALENT_MEDIA (component);
+     155                 :          13 :   GListModel *list = G_LIST_MODEL (extension);
+     156                 :          13 :   unsigned int n_exports = 0;
+     157                 :             : 
+     158                 :          13 :   VALENT_ENTRY;
+     159                 :             : 
+     160         [ +  - ]:          13 :   g_assert (VALENT_IS_MEDIA (self));
+     161         [ -  + ]:          13 :   g_assert (VALENT_IS_MEDIA_ADAPTER (extension));
+     162                 :             : 
+     163                 :          13 :   g_ptr_array_add (self->adapters, g_object_ref (extension));
+     164                 :          13 :   on_items_changed (list, 0, 0, g_list_model_get_n_items (list), self);
+     165                 :          13 :   g_signal_connect_object (list,
+     166                 :             :                            "items-changed",
+     167                 :             :                            G_CALLBACK (on_items_changed),
+     168                 :             :                            self,
+     169                 :             :                            0);
+     170                 :             : 
+     171                 :          13 :   n_exports = g_list_model_get_n_items (G_LIST_MODEL (self->exports));
+     172                 :             : 
+     173         [ -  + ]:          13 :   for (unsigned int i = 0; i < n_exports; i++)
+     174                 :             :     {
+     175                 :           0 :       g_autoptr (ValentMediaPlayer) player = NULL;
+     176                 :             : 
+     177                 :           0 :       player = g_list_model_get_item (G_LIST_MODEL (self->exports), i);
+     178         [ #  # ]:           0 :       valent_media_adapter_export_player (VALENT_MEDIA_ADAPTER (extension),
+     179                 :             :                                           player);
+     180                 :             :     }
+     181                 :             : 
+     182                 :          13 :   VALENT_EXIT;
+     183                 :             : }
+     184                 :             : 
+     185                 :             : static void
+     186                 :          10 : valent_media_unbind_extension (ValentComponent *component,
+     187                 :             :                                GObject         *extension)
+     188                 :             : {
+     189                 :          10 :   ValentMedia *self = VALENT_MEDIA (component);
+     190                 :          10 :   GListModel *list = G_LIST_MODEL (extension);
+     191                 :             : 
+     192                 :          10 :   VALENT_ENTRY;
+     193                 :             : 
+     194         [ +  - ]:          10 :   g_assert (VALENT_IS_MEDIA (self));
+     195         [ -  + ]:          10 :   g_assert (VALENT_IS_MEDIA_ADAPTER (extension));
+     196                 :             : 
+     197         [ -  + ]:          10 :   if (!g_ptr_array_find (self->adapters, extension, NULL))
+     198                 :             :     {
+     199                 :           0 :       g_warning ("No such adapter \"%s\" found in \"%s\"",
+     200                 :             :                  G_OBJECT_TYPE_NAME (extension),
+     201                 :             :                  G_OBJECT_TYPE_NAME (component));
+     202                 :           0 :       return;
+     203                 :             :     }
+     204                 :             : 
+     205                 :          10 :   g_signal_handlers_disconnect_by_func (list, on_items_changed, self);
+     206                 :          10 :   on_items_changed (list, 0, g_list_model_get_n_items (list), 0, self);
+     207                 :          10 :   g_ptr_array_remove (self->adapters, extension);
+     208                 :             : 
+     209                 :          10 :   VALENT_EXIT;
+     210                 :             : }
+     211                 :             : 
+     212                 :             : /*
+     213                 :             :  * ValentObject
+     214                 :             :  */
+     215                 :             : static void
+     216                 :           8 : valent_media_destroy (ValentObject *object)
+     217                 :             : {
+     218                 :           8 :   ValentMedia *self = VALENT_MEDIA (object);
+     219                 :             : 
+     220                 :           8 :   g_list_store_remove_all (G_LIST_STORE (self->exports));
+     221                 :             : 
+     222                 :           8 :   VALENT_OBJECT_CLASS (valent_media_parent_class)->destroy (object);
+     223                 :           8 : }
+     224                 :             : 
+     225                 :             : /*
+     226                 :             :  * GObject
+     227                 :             :  */
+     228                 :             : static void
+     229                 :           8 : valent_media_finalize (GObject *object)
+     230                 :             : {
+     231                 :           8 :   ValentMedia *self = VALENT_MEDIA (object);
+     232                 :             : 
+     233         [ +  - ]:           8 :   g_clear_object (&self->exports);
+     234         [ +  - ]:           8 :   g_clear_pointer (&self->adapters, g_ptr_array_unref);
+     235         [ +  - ]:           8 :   g_clear_pointer (&self->players, g_ptr_array_unref);
+     236         [ +  - ]:           8 :   g_clear_pointer (&self->paused, g_ptr_array_unref);
+     237                 :             : 
+     238                 :           8 :   G_OBJECT_CLASS (valent_media_parent_class)->finalize (object);
+     239                 :           8 : }
+     240                 :             : 
+     241                 :             : static void
+     242                 :           5 : valent_media_class_init (ValentMediaClass *klass)
+     243                 :             : {
+     244                 :           5 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     245                 :           5 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     246                 :           5 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     247                 :             : 
+     248                 :           5 :   object_class->finalize = valent_media_finalize;
+     249                 :             : 
+     250                 :           5 :   vobject_class->destroy = valent_media_destroy;
+     251                 :             : 
+     252                 :           5 :   component_class->bind_extension = valent_media_bind_extension;
+     253                 :           5 :   component_class->unbind_extension = valent_media_unbind_extension;
+     254                 :             : }
+     255                 :             : 
+     256                 :             : static void
+     257                 :          10 : valent_media_init (ValentMedia *self)
+     258                 :             : {
+     259                 :          10 :   self->adapters = g_ptr_array_new_with_free_func (g_object_unref);
+     260                 :          10 :   self->exports = G_LIST_MODEL (g_list_store_new (VALENT_TYPE_MEDIA_PLAYER));
+     261                 :          10 :   self->players = g_ptr_array_new_with_free_func (g_object_unref);
+     262                 :          10 :   self->paused = g_ptr_array_new ();
+     263                 :             : 
+     264                 :          10 :   g_ptr_array_add (self->adapters, g_object_ref (self->exports));
+     265                 :          10 :   g_signal_connect_object (self->exports,
+     266                 :             :                            "items-changed",
+     267                 :             :                            G_CALLBACK (on_items_changed),
+     268                 :             :                            self, 0);
+     269                 :          10 : }
+     270                 :             : 
+     271                 :             : /**
+     272                 :             :  * valent_media_get_default:
+     273                 :             :  *
+     274                 :             :  * Get the default [class@Valent.Media].
+     275                 :             :  *
+     276                 :             :  * Returns: (transfer none) (not nullable): a `ValentMedia`
+     277                 :             :  *
+     278                 :             :  * Since: 1.0
+     279                 :             :  */
+     280                 :             : ValentMedia *
+     281                 :          23 : valent_media_get_default (void)
+     282                 :             : {
+     283         [ +  + ]:          23 :   if (default_media == NULL)
+     284                 :             :     {
+     285                 :          10 :       default_media = g_object_new (VALENT_TYPE_MEDIA,
+     286                 :             :                                     "plugin-domain", "media",
+     287                 :             :                                     "plugin-type",   VALENT_TYPE_MEDIA_ADAPTER,
+     288                 :             :                                     NULL);
+     289                 :             : 
+     290                 :          10 :       g_object_add_weak_pointer (G_OBJECT (default_media),
+     291                 :             :                                  (gpointer)&default_media);
+     292                 :             :     }
+     293                 :             : 
+     294                 :          23 :   return default_media;
+     295                 :             : }
+     296                 :             : 
+     297                 :             : /**
+     298                 :             :  * valent_media_export_player:
+     299                 :             :  * @media: a `ValentMedia`
+     300                 :             :  * @player: a `ValentMediaPlayer`
+     301                 :             :  *
+     302                 :             :  * Export @player on all adapters that support it.
+     303                 :             :  *
+     304                 :             :  * Since: 1.0
+     305                 :             :  */
+     306                 :             : void
+     307                 :           1 : valent_media_export_player (ValentMedia       *media,
+     308                 :             :                             ValentMediaPlayer *player)
+     309                 :             : {
+     310                 :           1 :   VALENT_ENTRY;
+     311                 :             : 
+     312         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_MEDIA (media));
+     313         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     314                 :             : 
+     315         [ -  + ]:           1 :   if (g_ptr_array_find (media->players, player, NULL))
+     316                 :             :     {
+     317                 :           0 :       g_critical ("%s(): known player %s (%s)",
+     318                 :             :                   G_STRFUNC,
+     319                 :             :                   G_OBJECT_TYPE_NAME (player),
+     320                 :             :                   valent_media_player_get_name (player));
+     321                 :           0 :       VALENT_EXIT;
+     322                 :             :     }
+     323                 :             : 
+     324                 :             :   // Starting at index `1` skips the exports GListModel
+     325         [ +  + ]:           3 :   for (unsigned int i = 1; i < media->adapters->len; i++)
+     326                 :             :     {
+     327                 :           2 :       ValentMediaAdapter *adapter = NULL;
+     328                 :             : 
+     329                 :           2 :       adapter = g_ptr_array_index (media->adapters, i);
+     330                 :           2 :       valent_media_adapter_export_player (adapter, player);
+     331                 :             :     }
+     332                 :             : 
+     333                 :           1 :   g_list_store_append (G_LIST_STORE (media->exports), player);
+     334                 :             : 
+     335                 :           1 :   VALENT_EXIT;
+     336                 :             : }
+     337                 :             : 
+     338                 :             : /**
+     339                 :             :  * valent_media_unexport_player:
+     340                 :             :  * @media: a `ValentMedia`
+     341                 :             :  * @player: a `ValentMediaPlayer`
+     342                 :             :  *
+     343                 :             :  * Unexport @player from all adapters that support it.
+     344                 :             :  *
+     345                 :             :  * Since: 1.0
+     346                 :             :  */
+     347                 :             : void
+     348                 :           1 : valent_media_unexport_player (ValentMedia       *media,
+     349                 :             :                               ValentMediaPlayer *player)
+     350                 :             : {
+     351                 :           1 :   unsigned int position = 0;
+     352                 :             : 
+     353                 :           1 :   VALENT_ENTRY;
+     354                 :             : 
+     355         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_MEDIA (media));
+     356         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_MEDIA_PLAYER (player));
+     357                 :             : 
+     358         [ -  + ]:           1 :   if (!g_list_store_find (G_LIST_STORE (media->exports), player, &position))
+     359                 :             :     {
+     360                 :           0 :       g_critical ("%s(): unknown player %s (%s)",
+     361                 :             :                   G_STRFUNC,
+     362                 :             :                   G_OBJECT_TYPE_NAME (player),
+     363                 :             :                   valent_media_player_get_name (player));
+     364                 :           0 :       VALENT_EXIT;
+     365                 :             :     }
+     366                 :             : 
+     367                 :             :   // Starting at index `1` skips the exports GListModel
+     368         [ +  + ]:           3 :   for (unsigned int i = 1; i < media->adapters->len; i++)
+     369                 :             :     {
+     370                 :           2 :       ValentMediaAdapter *adapter = NULL;
+     371                 :             : 
+     372                 :           2 :       adapter = g_ptr_array_index (media->adapters, i);
+     373                 :           2 :       valent_media_adapter_unexport_player (adapter, player);
+     374                 :             :     }
+     375                 :             : 
+     376                 :           1 :   g_list_store_remove (G_LIST_STORE (media->exports), position);
+     377                 :             : 
+     378                 :           1 :   VALENT_EXIT;
+     379                 :             : }
+     380                 :             : 
+     381                 :             : /**
+     382                 :             :  * valent_media_pause:
+     383                 :             :  * @media: a `ValentMedia`
+     384                 :             :  *
+     385                 :             :  * Pause any playing media players. Any player whose playback status is changed
+     386                 :             :  * will be tracked so that playback may be resumed with valent_media_play().
+     387                 :             :  *
+     388                 :             :  * Since: 1.0
+     389                 :             :  */
+     390                 :             : void
+     391                 :           3 : valent_media_pause (ValentMedia *media)
+     392                 :             : {
+     393                 :           3 :   ValentMediaPlayer *player;
+     394                 :             : 
+     395                 :           3 :   VALENT_ENTRY;
+     396                 :             : 
+     397         [ -  + ]:           3 :   g_return_if_fail (VALENT_IS_MEDIA (media));
+     398                 :             : 
+     399         [ +  + ]:           4 :   for (unsigned int i = 0; i < media->players->len; i++)
+     400                 :             :     {
+     401                 :           1 :       player = g_ptr_array_index (media->players, i);
+     402                 :             : 
+     403         [ +  - ]:           1 :       if (valent_media_player_get_state (player) == VALENT_MEDIA_STATE_PLAYING)
+     404                 :             :         {
+     405                 :           1 :           valent_media_player_pause (player);
+     406                 :           1 :           g_ptr_array_add (media->paused, player);
+     407                 :             :         }
+     408                 :             :     }
+     409                 :             : 
+     410                 :           3 :   VALENT_EXIT;
+     411                 :             : }
+     412                 :             : 
+     413                 :             : /**
+     414                 :             :  * valent_media_unpause:
+     415                 :             :  * @media: a `ValentMedia`
+     416                 :             :  *
+     417                 :             :  * Unpause any media players we previously paused.
+     418                 :             :  *
+     419                 :             :  * Since: 1.0
+     420                 :             :  */
+     421                 :             : void
+     422                 :           3 : valent_media_unpause (ValentMedia *media)
+     423                 :             : {
+     424                 :           3 :   ValentMediaPlayer *player;
+     425                 :             : 
+     426                 :           3 :   VALENT_ENTRY;
+     427                 :             : 
+     428         [ -  + ]:           3 :   g_return_if_fail (VALENT_IS_MEDIA (media));
+     429                 :             : 
+     430         [ +  + ]:           4 :   for (unsigned int i = 0; i < media->players->len; i++)
+     431                 :             :     {
+     432                 :           1 :       player = g_ptr_array_index (media->players, i);
+     433                 :             : 
+     434         [ +  - ]:           1 :       if (valent_media_player_get_state (player) == VALENT_MEDIA_STATE_PAUSED)
+     435                 :           1 :         valent_media_player_play (player);
+     436                 :             :     }
+     437                 :             : 
+     438                 :           3 :   g_ptr_array_remove_range (media->paused, 0, media->paused->len);
+     439                 :             : 
+     440                 :           3 :   VALENT_EXIT;
+     441                 :             : }
+     442                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media.h.func-c.html b/coverage/src/libvalent/media/valent-media.h.func-c.html new file mode 100644 index 00000000000..26a3da5d002 --- /dev/null +++ b/coverage/src/libvalent/media/valent-media.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA133
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media.h.func.html b/coverage/src/libvalent/media/valent-media.h.func.html new file mode 100644 index 00000000000..587781b8d3b --- /dev/null +++ b/coverage/src/libvalent/media/valent-media.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA133
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/media/valent-media.h.gcov.html b/coverage/src/libvalent/media/valent-media.h.gcov.html new file mode 100644 index 00000000000..a60abc0522f --- /dev/null +++ b/coverage/src/libvalent/media/valent-media.h.gcov.html @@ -0,0 +1,129 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/media/valent-media.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/media - valent-media.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : 
+      12                 :             : #include "../core/valent-component.h"
+      13                 :             : #include "valent-media-player.h"
+      14                 :             : 
+      15                 :             : G_BEGIN_DECLS
+      16                 :             : 
+      17                 :             : #define VALENT_TYPE_MEDIA (valent_media_get_type ())
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20   [ +  -  +  -  :         133 : G_DECLARE_FINAL_TYPE (ValentMedia, valent_media, VALENT, MEDIA, ValentComponent)
+                   -  + ]
+      21                 :             : 
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : ValentMedia * valent_media_get_default     (void);
+      24                 :             : VALENT_AVAILABLE_IN_1_0
+      25                 :             : void          valent_media_export_player   (ValentMedia       *media,
+      26                 :             :                                             ValentMediaPlayer *player);
+      27                 :             : VALENT_AVAILABLE_IN_1_0
+      28                 :             : void          valent_media_unexport_player (ValentMedia       *media,
+      29                 :             :                                             ValentMediaPlayer *player);
+      30                 :             : VALENT_AVAILABLE_IN_1_0
+      31                 :             : void          valent_media_pause           (ValentMedia       *media);
+      32                 :             : VALENT_AVAILABLE_IN_1_0
+      33                 :             : void          valent_media_unpause         (ValentMedia       *media);
+      34                 :             : 
+      35                 :             : G_END_DECLS
+      36                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-detail-sort-b.html b/coverage/src/libvalent/mixer/index-detail-sort-b.html new file mode 100644 index 00000000000..70e5484dfaa --- /dev/null +++ b/coverage/src/libvalent/mixer/index-detail-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-detail-sort-f.html b/coverage/src/libvalent/mixer/index-detail-sort-f.html new file mode 100644 index 00000000000..f2028762d46 --- /dev/null +++ b/coverage/src/libvalent/mixer/index-detail-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-detail-sort-l.html b/coverage/src/libvalent/mixer/index-detail-sort-l.html new file mode 100644 index 00000000000..2bdced5cb16 --- /dev/null +++ b/coverage/src/libvalent/mixer/index-detail-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-detail.html b/coverage/src/libvalent/mixer/index-detail.html new file mode 100644 index 00000000000..041d00d976b --- /dev/null +++ b/coverage/src/libvalent/mixer/index-detail.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-sort-b.html b/coverage/src/libvalent/mixer/index-sort-b.html new file mode 100644 index 00000000000..70e5484dfaa --- /dev/null +++ b/coverage/src/libvalent/mixer/index-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-sort-f.html b/coverage/src/libvalent/mixer/index-sort-f.html new file mode 100644 index 00000000000..f2028762d46 --- /dev/null +++ b/coverage/src/libvalent/mixer/index-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index-sort-l.html b/coverage/src/libvalent/mixer/index-sort-l.html new file mode 100644 index 00000000000..2bdced5cb16 --- /dev/null +++ b/coverage/src/libvalent/mixer/index-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/index.html b/coverage/src/libvalent/mixer/index.html new file mode 100644 index 00000000000..041d00d976b --- /dev/null +++ b/coverage/src/libvalent/mixer/index.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixerCoverageTotalHit
Test:Code CoverageLines:94.0 %365343
Test Date:2024-03-31 18:46:36Functions:96.5 %5755
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.9 %16297
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mixer-adapter.c +
94.5%94.5%
+
94.5 %11010454.8 %422394.4 %1817
valent-mixer-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mixer-stream.c +
96.6%96.6%
+
96.6 %11711363.9 %3623100.0 %1515
valent-mixer-stream.h +
100.0%
+
100.0 %1190.0 %109100.0 %11
valent-mixer.c +
91.1%91.1%
+
91.1 %13512358.1 %623695.2 %2120
valent-mixer.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-adapter.c.func-c.html b/coverage/src/libvalent/mixer/valent-mixer-adapter.c.func-c.html new file mode 100644 index 00000000000..deb24554e03 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-adapter.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.5 %110104
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.8 %4223
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mixer_adapter_get_item_type0
valent_mixer_adapter_get_property2
valent_mixer_adapter_set_property2
valent_mixer_adapter_stream_removed5
valent_mixer_adapter_destroy8
valent_mixer_adapter_init8
valent_mixer_adapter_get_n_items10
valent_mixer_adapter_set_default_input11
valent_mixer_adapter_get_default_input13
valent_mixer_adapter_set_default_output14
valent_mixer_adapter_stream_added23
valent_mixer_adapter_get_default_output25
valent_mixer_adapter_get_item50
g_list_model_iface_init66
valent_mixer_adapter_class_init66
valent_mixer_adapter_get_type577
valent_mixer_adapter_class_intern_init66
valent_mixer_adapter_get_type_once86
valent_mixer_adapter_get_type425
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-adapter.c.func.html b/coverage/src/libvalent/mixer/valent-mixer-adapter.c.func.html new file mode 100644 index 00000000000..ec577130043 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-adapter.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.5 %110104
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.8 %4223
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init66
valent_mixer_adapter_class_init66
valent_mixer_adapter_destroy8
valent_mixer_adapter_get_default_input13
valent_mixer_adapter_get_default_output25
valent_mixer_adapter_get_item50
valent_mixer_adapter_get_item_type0
valent_mixer_adapter_get_n_items10
valent_mixer_adapter_get_property2
valent_mixer_adapter_get_type577
valent_mixer_adapter_class_intern_init66
valent_mixer_adapter_get_type425
valent_mixer_adapter_get_type_once86
valent_mixer_adapter_init8
valent_mixer_adapter_set_default_input11
valent_mixer_adapter_set_default_output14
valent_mixer_adapter_set_property2
valent_mixer_adapter_stream_added23
valent_mixer_adapter_stream_removed5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-adapter.c.gcov.html b/coverage/src/libvalent/mixer/valent-mixer-adapter.c.gcov.html new file mode 100644 index 00000000000..d5945c0f61a --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-adapter.c.gcov.html @@ -0,0 +1,514 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.5 %110104
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.8 %4223
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mixer-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-mixer.h"
+      12                 :             : #include "valent-mixer-adapter.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentMixerAdapter
+      17                 :             :  *
+      18                 :             :  * An abstract base class for audio mixers.
+      19                 :             :  *
+      20                 :             :  * `ValentMixerAdapter` is a base class for plugins that provide an interface to
+      21                 :             :  * audio mixers and volume control. This usually means monitoring the available
+      22                 :             :  * input and output streams, changing properties on those streams, and selecting
+      23                 :             :  * which are the active input and output.
+      24                 :             :  *
+      25                 :             :  * ## `.plugin` File
+      26                 :             :  *
+      27                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      28                 :             :  *
+      29                 :             :  * - `X-MixerAdapterPriority`
+      30                 :             :  *
+      31                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      32                 :             :  *     lowest value will be used as the primary adapter.
+      33                 :             :  *
+      34                 :             :  * Since: 1.0
+      35                 :             :  */
+      36                 :             : 
+      37                 :             : typedef struct
+      38                 :             : {
+      39                 :             :   GPtrArray *streams;
+      40                 :             : } ValentMixerAdapterPrivate;
+      41                 :             : 
+      42                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      43                 :             : 
+      44   [ +  +  +  - ]:         681 : G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ValentMixerAdapter, valent_mixer_adapter, VALENT_TYPE_EXTENSION,
+      45                 :             :                                   G_ADD_PRIVATE (ValentMixerAdapter)
+      46                 :             :                                   G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      47                 :             : 
+      48                 :             : 
+      49                 :             : /**
+      50                 :             :  * ValentMixerAdapterClass:
+      51                 :             :  * @get_default_input: the virtual function pointer for valent_mixer_adapter_get_default_input()
+      52                 :             :  * @set_default_input: the virtual function pointer for valent_mixer_adapter_set_default_input()
+      53                 :             :  * @get_default_output: the virtual function pointer for valent_mixer_adapter_get_default_output()
+      54                 :             :  * @set_default_output: the virtual function pointer for valent_mixer_adapter_set_default_output()
+      55                 :             :  *
+      56                 :             :  * The virtual function table for `ValentMixerAdapter`.
+      57                 :             :  */
+      58                 :             : 
+      59                 :             : enum {
+      60                 :             :   PROP_0,
+      61                 :             :   PROP_DEFAULT_INPUT,
+      62                 :             :   PROP_DEFAULT_OUTPUT,
+      63                 :             :   N_PROPERTIES
+      64                 :             : };
+      65                 :             : 
+      66                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      67                 :             : 
+      68                 :             : 
+      69                 :             : /*
+      70                 :             :  * GListModel
+      71                 :             :  */
+      72                 :             : static gpointer
+      73                 :          50 : valent_mixer_adapter_get_item (GListModel   *list,
+      74                 :             :                                unsigned int  position)
+      75                 :             : {
+      76                 :          50 :   ValentMixerAdapter *self = VALENT_MIXER_ADAPTER (list);
+      77                 :          50 :   ValentMixerAdapterPrivate *priv = valent_mixer_adapter_get_instance_private (self);
+      78                 :             : 
+      79         [ +  - ]:          50 :   g_assert (VALENT_IS_MIXER_ADAPTER (self));
+      80                 :             : 
+      81         [ +  - ]:          50 :   if G_UNLIKELY (position >= priv->streams->len)
+      82                 :             :     return NULL;
+      83                 :             : 
+      84                 :          50 :   return g_object_ref (g_ptr_array_index (priv->streams, position));
+      85                 :             : }
+      86                 :             : 
+      87                 :             : static GType
+      88                 :           0 : valent_mixer_adapter_get_item_type (GListModel *list)
+      89                 :             : {
+      90                 :           0 :   return VALENT_TYPE_MIXER_STREAM;
+      91                 :             : }
+      92                 :             : 
+      93                 :             : static unsigned int
+      94                 :          10 : valent_mixer_adapter_get_n_items (GListModel *list)
+      95                 :             : {
+      96                 :          10 :   ValentMixerAdapter *self = VALENT_MIXER_ADAPTER (list);
+      97                 :          10 :   ValentMixerAdapterPrivate *priv = valent_mixer_adapter_get_instance_private (self);
+      98                 :             : 
+      99         [ +  - ]:          10 :   g_assert (VALENT_IS_MIXER_ADAPTER (self));
+     100                 :             : 
+     101                 :          10 :   return priv->streams->len;
+     102                 :             : }
+     103                 :             : 
+     104                 :             : static void
+     105                 :          66 : g_list_model_iface_init (GListModelInterface *iface)
+     106                 :             : {
+     107                 :          66 :   iface->get_item = valent_mixer_adapter_get_item;
+     108                 :          66 :   iface->get_item_type = valent_mixer_adapter_get_item_type;
+     109                 :          66 :   iface->get_n_items = valent_mixer_adapter_get_n_items;
+     110                 :          66 : }
+     111                 :             : 
+     112                 :             : /* LCOV_EXCL_START */
+     113                 :             : static ValentMixerStream *
+     114                 :             : valent_mixer_adapter_real_get_default_input (ValentMixerAdapter *adapter)
+     115                 :             : {
+     116                 :             :   g_assert (VALENT_IS_MIXER_ADAPTER (adapter));
+     117                 :             : 
+     118                 :             :   return NULL;
+     119                 :             : }
+     120                 :             : 
+     121                 :             : static void
+     122                 :             : valent_mixer_adapter_real_set_default_input (ValentMixerAdapter *adapter,
+     123                 :             :                                              ValentMixerStream  *stream)
+     124                 :             : {
+     125                 :             :   g_assert (VALENT_IS_MIXER_ADAPTER (adapter));
+     126                 :             :   g_assert (VALENT_IS_MIXER_STREAM (stream));
+     127                 :             : }
+     128                 :             : 
+     129                 :             : static ValentMixerStream *
+     130                 :             : valent_mixer_adapter_real_get_default_output (ValentMixerAdapter *adapter)
+     131                 :             : {
+     132                 :             :   g_assert (VALENT_IS_MIXER_ADAPTER (adapter));
+     133                 :             : 
+     134                 :             :   return NULL;
+     135                 :             : }
+     136                 :             : 
+     137                 :             : static void
+     138                 :             : valent_mixer_adapter_real_set_default_output (ValentMixerAdapter *adapter,
+     139                 :             :                                               ValentMixerStream  *stream)
+     140                 :             : {
+     141                 :             :   g_assert (VALENT_IS_MIXER_ADAPTER (adapter));
+     142                 :             :   g_assert (VALENT_IS_MIXER_STREAM (stream));
+     143                 :             : }
+     144                 :             : /* LCOV_EXCL_STOP */
+     145                 :             : 
+     146                 :             : /*
+     147                 :             :  * ValentObject
+     148                 :             :  */
+     149                 :             : static void
+     150                 :           8 : valent_mixer_adapter_destroy (ValentObject *object)
+     151                 :             : {
+     152                 :           8 :   ValentMixerAdapter *self = VALENT_MIXER_ADAPTER (object);
+     153                 :           8 :   ValentMixerAdapterPrivate *priv = valent_mixer_adapter_get_instance_private (self);
+     154                 :             : 
+     155         [ +  - ]:           8 :   g_clear_pointer (&priv->streams, g_ptr_array_unref);
+     156                 :             : 
+     157                 :           8 :   VALENT_OBJECT_CLASS (valent_mixer_adapter_parent_class)->destroy (object);
+     158                 :           8 : }
+     159                 :             : 
+     160                 :             : /*
+     161                 :             :  * GObject
+     162                 :             :  */
+     163                 :             : static void
+     164                 :           2 : valent_mixer_adapter_get_property (GObject    *object,
+     165                 :             :                                    guint       prop_id,
+     166                 :             :                                    GValue     *value,
+     167                 :             :                                    GParamSpec *pspec)
+     168                 :             : {
+     169                 :           2 :   ValentMixerAdapter *self = VALENT_MIXER_ADAPTER (object);
+     170                 :             : 
+     171      [ +  +  - ]:           2 :   switch (prop_id)
+     172                 :             :     {
+     173                 :           1 :     case PROP_DEFAULT_INPUT:
+     174                 :           1 :       g_value_set_object (value, valent_mixer_adapter_get_default_input (self));
+     175                 :           1 :       break;
+     176                 :             : 
+     177                 :           1 :     case PROP_DEFAULT_OUTPUT:
+     178                 :           1 :       g_value_set_object (value, valent_mixer_adapter_get_default_output (self));
+     179                 :           1 :       break;
+     180                 :             : 
+     181                 :           0 :     default:
+     182                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     183                 :             :     }
+     184                 :           2 : }
+     185                 :             : 
+     186                 :             : static void
+     187                 :           2 : valent_mixer_adapter_set_property (GObject      *object,
+     188                 :             :                                    guint         prop_id,
+     189                 :             :                                    const GValue *value,
+     190                 :             :                                    GParamSpec   *pspec)
+     191                 :             : {
+     192                 :           2 :   ValentMixerAdapter *self = VALENT_MIXER_ADAPTER (object);
+     193                 :             : 
+     194      [ +  +  - ]:           2 :   switch (prop_id)
+     195                 :             :     {
+     196                 :           1 :     case PROP_DEFAULT_INPUT:
+     197                 :           1 :       valent_mixer_adapter_set_default_input (self, g_value_get_object (value));
+     198                 :           1 :       break;
+     199                 :             : 
+     200                 :           1 :     case PROP_DEFAULT_OUTPUT:
+     201                 :           1 :       valent_mixer_adapter_set_default_output (self, g_value_get_object (value));
+     202                 :           1 :       break;
+     203                 :             : 
+     204                 :           0 :     default:
+     205                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     206                 :             :     }
+     207                 :           2 : }
+     208                 :             : 
+     209                 :             : static void
+     210                 :          66 : valent_mixer_adapter_class_init (ValentMixerAdapterClass *klass)
+     211                 :             : {
+     212                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     213                 :          66 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     214                 :             : 
+     215                 :          66 :   object_class->get_property = valent_mixer_adapter_get_property;
+     216                 :          66 :   object_class->set_property = valent_mixer_adapter_set_property;
+     217                 :             : 
+     218                 :          66 :   vobject_class->destroy = valent_mixer_adapter_destroy;
+     219                 :             : 
+     220                 :          66 :   klass->get_default_input = valent_mixer_adapter_real_get_default_input;
+     221                 :          66 :   klass->set_default_input = valent_mixer_adapter_real_set_default_input;
+     222                 :          66 :   klass->get_default_output = valent_mixer_adapter_real_get_default_output;
+     223                 :          66 :   klass->set_default_output = valent_mixer_adapter_real_set_default_output;
+     224                 :             : 
+     225                 :             :   /**
+     226                 :             :    * ValentMixerAdapter:default-input: (getter get_default_input) (setter set_default_input)
+     227                 :             :    *
+     228                 :             :    * The active input stream.
+     229                 :             :    *
+     230                 :             :    * Implementations should emit [signal@GObject.Object::notify] for this
+     231                 :             :    * property when the default stream changes.
+     232                 :             :    *
+     233                 :             :    * Since: 1.0
+     234                 :             :    */
+     235                 :         132 :   properties [PROP_DEFAULT_INPUT] =
+     236                 :          66 :     g_param_spec_object ("default-input", NULL, NULL,
+     237                 :             :                          VALENT_TYPE_MIXER_STREAM,
+     238                 :             :                          (G_PARAM_READWRITE |
+     239                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     240                 :             :                           G_PARAM_STATIC_STRINGS));
+     241                 :             : 
+     242                 :             :   /**
+     243                 :             :    * ValentMixerAdapter:default-output: (getter get_default_output) (setter set_default_output)
+     244                 :             :    *
+     245                 :             :    * The active output stream.
+     246                 :             :    *
+     247                 :             :    * Implementations should emit [signal@GObject.Object::notify] for this
+     248                 :             :    * property when the default stream changes.
+     249                 :             :    *
+     250                 :             :    * Since: 1.0
+     251                 :             :    */
+     252                 :         132 :   properties [PROP_DEFAULT_OUTPUT] =
+     253                 :          66 :     g_param_spec_object ("default-output", NULL, NULL,
+     254                 :             :                          VALENT_TYPE_MIXER_STREAM,
+     255                 :             :                          (G_PARAM_READWRITE |
+     256                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     257                 :             :                           G_PARAM_STATIC_STRINGS));
+     258                 :             : 
+     259                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     260                 :          66 : }
+     261                 :             : 
+     262                 :             : static void
+     263                 :           8 : valent_mixer_adapter_init (ValentMixerAdapter *self)
+     264                 :             : {
+     265                 :           8 :   ValentMixerAdapterPrivate *priv = valent_mixer_adapter_get_instance_private (self);
+     266                 :             : 
+     267                 :           8 :   priv->streams = g_ptr_array_new_with_free_func (g_object_unref);
+     268                 :           8 : }
+     269                 :             : 
+     270                 :             : /**
+     271                 :             :  * valent_mixer_adapter_stream_added:
+     272                 :             :  * @adapter: a `ValentMixerAdapter`
+     273                 :             :  * @stream: a `ValentMixerStream`
+     274                 :             :  *
+     275                 :             :  * Called when @stream has been added to the mixer.
+     276                 :             :  *
+     277                 :             :  * This method should only be called by implementations of
+     278                 :             :  * [class@Valent.MixerAdapter]. @adapter will hold a reference on @stream and
+     279                 :             :  * emit [signal@Gio.ListModel::items-changed].
+     280                 :             :  *
+     281                 :             :  * Since: 1.0
+     282                 :             :  */
+     283                 :             : void
+     284                 :          23 : valent_mixer_adapter_stream_added (ValentMixerAdapter *adapter,
+     285                 :             :                                    ValentMixerStream  *stream)
+     286                 :             : {
+     287                 :          23 :   ValentMixerAdapterPrivate *priv = valent_mixer_adapter_get_instance_private (adapter);
+     288                 :          23 :   unsigned int position = 0;
+     289                 :             : 
+     290         [ +  - ]:          23 :   g_return_if_fail (VALENT_IS_MIXER_ADAPTER (adapter));
+     291         [ -  + ]:          23 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     292                 :             : 
+     293                 :          23 :   position = priv->streams->len;
+     294                 :          23 :   g_ptr_array_add (priv->streams, g_object_ref (stream));
+     295                 :          23 :   g_list_model_items_changed (G_LIST_MODEL (adapter), position, 0, 1);
+     296                 :             : }
+     297                 :             : 
+     298                 :             : /**
+     299                 :             :  * valent_mixer_adapter_stream_removed:
+     300                 :             :  * @adapter: a `ValentMixerAdapter`
+     301                 :             :  * @stream: a `ValentMixerStream`
+     302                 :             :  *
+     303                 :             :  * Called when @stream has been removed from the mixer.
+     304                 :             :  *
+     305                 :             :  * This method should only be called by implementations of
+     306                 :             :  * [class@Valent.MixerAdapter]. @adapter will drop its reference on @stream and
+     307                 :             :  * emit [signal@Gio.ListModel::items-changed].
+     308                 :             :  *
+     309                 :             :  * Since: 1.0
+     310                 :             :  */
+     311                 :             : void
+     312                 :           5 : valent_mixer_adapter_stream_removed (ValentMixerAdapter *adapter,
+     313                 :             :                                      ValentMixerStream  *stream)
+     314                 :             : {
+     315                 :           5 :   ValentMixerAdapterPrivate *priv = valent_mixer_adapter_get_instance_private (adapter);
+     316                 :           5 :   g_autoptr (ValentMixerStream) item = NULL;
+     317                 :           5 :   unsigned int position = 0;
+     318                 :             : 
+     319         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_MIXER_ADAPTER (adapter));
+     320         [ -  + ]:           5 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     321                 :             : 
+     322         [ +  - ]:           5 :   if (!g_ptr_array_find (priv->streams, stream, &position))
+     323                 :             :     return;
+     324                 :             : 
+     325                 :           5 :   item = g_ptr_array_steal_index (priv->streams, position);
+     326         [ +  - ]:           5 :   g_list_model_items_changed (G_LIST_MODEL (adapter), position, 1, 0);
+     327                 :             : }
+     328                 :             : 
+     329                 :             : /**
+     330                 :             :  * valent_mixer_adapter_get_default_input: (get-property default-input) (virtual get_default_input)
+     331                 :             :  * @adapter: a `ValentMixerAdapter`
+     332                 :             :  *
+     333                 :             :  * Get the default input stream for @adapter.
+     334                 :             :  *
+     335                 :             :  * Returns: (transfer none): a `ValentMixerStream`
+     336                 :             :  *
+     337                 :             :  * Since: 1.0
+     338                 :             :  */
+     339                 :             : ValentMixerStream *
+     340                 :          13 : valent_mixer_adapter_get_default_input (ValentMixerAdapter *adapter)
+     341                 :             : {
+     342                 :          13 :   ValentMixerStream *ret;
+     343                 :             : 
+     344                 :          13 :   VALENT_ENTRY;
+     345                 :             : 
+     346         [ +  - ]:          13 :   g_return_val_if_fail (VALENT_IS_MIXER_ADAPTER (adapter), NULL);
+     347                 :             : 
+     348                 :          13 :   ret = VALENT_MIXER_ADAPTER_GET_CLASS (adapter)->get_default_input (adapter);
+     349                 :             : 
+     350                 :          13 :   VALENT_RETURN (ret);
+     351                 :             : }
+     352                 :             : 
+     353                 :             : /**
+     354                 :             :  * valent_mixer_adapter_set_default_input: (set-property default-input) (virtual set_default_input)
+     355                 :             :  * @adapter: a `ValentMixerAdapter`
+     356                 :             :  * @stream: a `ValentMixerStream`
+     357                 :             :  *
+     358                 :             :  * Set the default input stream for @adapter to @stream.
+     359                 :             :  *
+     360                 :             :  * Since: 1.0
+     361                 :             :  */
+     362                 :             : void
+     363                 :          11 : valent_mixer_adapter_set_default_input (ValentMixerAdapter *adapter,
+     364                 :             :                                         ValentMixerStream  *stream)
+     365                 :             : {
+     366                 :          11 :   VALENT_ENTRY;
+     367                 :             : 
+     368         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_MIXER_ADAPTER (adapter));
+     369         [ -  + ]:          11 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     370                 :             : 
+     371                 :          11 :   VALENT_MIXER_ADAPTER_GET_CLASS (adapter)->set_default_input (adapter, stream);
+     372                 :             : 
+     373                 :          11 :   VALENT_EXIT;
+     374                 :             : }
+     375                 :             : 
+     376                 :             : /**
+     377                 :             :  * valent_mixer_adapter_get_default_output: (get-property default-output) (virtual get_default_output)
+     378                 :             :  * @adapter: a `ValentMixerAdapter`
+     379                 :             :  *
+     380                 :             :  * Get the default output stream for @adapter.
+     381                 :             :  *
+     382                 :             :  * Returns: (transfer none): a `ValentMixerStream`
+     383                 :             :  *
+     384                 :             :  * Since: 1.0
+     385                 :             :  */
+     386                 :             : ValentMixerStream *
+     387                 :          25 : valent_mixer_adapter_get_default_output (ValentMixerAdapter *adapter)
+     388                 :             : {
+     389                 :          25 :   ValentMixerStream *ret;
+     390                 :             : 
+     391                 :          25 :   VALENT_ENTRY;
+     392                 :             : 
+     393         [ +  - ]:          25 :   g_return_val_if_fail (VALENT_IS_MIXER_ADAPTER (adapter), NULL);
+     394                 :             : 
+     395                 :          25 :   ret = VALENT_MIXER_ADAPTER_GET_CLASS (adapter)->get_default_output (adapter);
+     396                 :             : 
+     397                 :          25 :   VALENT_RETURN (ret);
+     398                 :             : }
+     399                 :             : 
+     400                 :             : /**
+     401                 :             :  * valent_mixer_adapter_set_default_output: (set-property default-output) (virtual set_default_output)
+     402                 :             :  * @adapter: a `ValentMixerAdapter`
+     403                 :             :  * @stream: a `ValentMixerStream`
+     404                 :             :  *
+     405                 :             :  * Set the default output stream for @adapter to @stream.
+     406                 :             :  *
+     407                 :             :  * Since: 1.0
+     408                 :             :  */
+     409                 :             : void
+     410                 :          14 : valent_mixer_adapter_set_default_output (ValentMixerAdapter *adapter,
+     411                 :             :                                          ValentMixerStream  *stream)
+     412                 :             : {
+     413                 :          14 :   VALENT_ENTRY;
+     414                 :             : 
+     415         [ +  - ]:          14 :   g_return_if_fail (VALENT_IS_MIXER_ADAPTER (adapter));
+     416         [ -  + ]:          14 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     417                 :             : 
+     418                 :          14 :   VALENT_MIXER_ADAPTER_GET_CLASS (adapter)->set_default_output (adapter, stream);
+     419                 :             : 
+     420                 :          14 :   VALENT_EXIT;
+     421                 :             : }
+     422                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-adapter.h.func-c.html b/coverage/src/libvalent/mixer/valent-mixer-adapter.h.func-c.html new file mode 100644 index 00000000000..ffd993b4303 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MIXER_ADAPTER195
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-adapter.h.func.html b/coverage/src/libvalent/mixer/valent-mixer-adapter.h.func.html new file mode 100644 index 00000000000..4137ee89de4 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MIXER_ADAPTER195
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-adapter.h.gcov.html b/coverage/src/libvalent/mixer/valent-mixer-adapter.h.gcov.html new file mode 100644 index 00000000000..32dc23d0caa --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-adapter.h.gcov.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : #include "valent-mixer-stream.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_MIXER_ADAPTER (valent_mixer_adapter_get_type())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :         258 : G_DECLARE_DERIVABLE_TYPE (ValentMixerAdapter, valent_mixer_adapter, VALENT, MIXER_ADAPTER, ValentExtension)
+                   +  - ]
+      19                 :             : 
+      20                 :             : struct _ValentMixerAdapterClass
+      21                 :             : {
+      22                 :             :   ValentExtensionClass   parent_class;
+      23                 :             : 
+      24                 :             :   /* virtual functions */
+      25                 :             :   ValentMixerStream    * (*get_default_input)  (ValentMixerAdapter *adapter);
+      26                 :             :   void                   (*set_default_input)  (ValentMixerAdapter *adapter,
+      27                 :             :                                                 ValentMixerStream  *stream);
+      28                 :             :   ValentMixerStream    * (*get_default_output) (ValentMixerAdapter *adapter);
+      29                 :             :   void                   (*set_default_output) (ValentMixerAdapter *adapter,
+      30                 :             :                                                 ValentMixerStream  *stream);
+      31                 :             : 
+      32                 :             :   /*< private >*/
+      33                 :             :   gpointer               padding[8];
+      34                 :             : };
+      35                 :             : 
+      36                 :             : VALENT_AVAILABLE_IN_1_0
+      37                 :             : void                valent_mixer_adapter_stream_added       (ValentMixerAdapter *adapter,
+      38                 :             :                                                              ValentMixerStream  *stream);
+      39                 :             : VALENT_AVAILABLE_IN_1_0
+      40                 :             : void                valent_mixer_adapter_stream_removed     (ValentMixerAdapter *adapter,
+      41                 :             :                                                              ValentMixerStream  *stream);
+      42                 :             : VALENT_AVAILABLE_IN_1_0
+      43                 :             : ValentMixerStream * valent_mixer_adapter_get_default_input  (ValentMixerAdapter *adapter);
+      44                 :             : VALENT_AVAILABLE_IN_1_0
+      45                 :             : void                valent_mixer_adapter_set_default_input  (ValentMixerAdapter *adapter,
+      46                 :             :                                                              ValentMixerStream  *stream);
+      47                 :             : VALENT_AVAILABLE_IN_1_0
+      48                 :             : ValentMixerStream * valent_mixer_adapter_get_default_output (ValentMixerAdapter *adapter);
+      49                 :             : VALENT_AVAILABLE_IN_1_0
+      50                 :             : void                valent_mixer_adapter_set_default_output (ValentMixerAdapter *adapter,
+      51                 :             :                                                              ValentMixerStream  *stream);
+      52                 :             : 
+      53                 :             : G_END_DECLS
+      54                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-stream.c.func-c.html b/coverage/src/libvalent/mixer/valent-mixer-stream.c.func-c.html new file mode 100644 index 00000000000..cf1779b917f --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-stream.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-stream.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-stream.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.6 %117113
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:63.9 %3623
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mixer_stream_class_init4
valent_mixer_stream_get_property5
valent_mixer_stream_get_description9
valent_mixer_stream_get_name9
valent_mixer_stream_set_muted21
valent_mixer_stream_finalize26
valent_mixer_stream_init26
valent_mixer_stream_get_direction27
valent_mixer_stream_set_level30
valent_mixer_stream_get_level49
valent_mixer_stream_get_muted53
valent_mixer_stream_set_property108
valent_mixer_stream_get_type611
valent_mixer_stream_class_intern_init4
valent_mixer_stream_get_type_once86
valent_mixer_stream_get_type521
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-stream.c.func.html b/coverage/src/libvalent/mixer/valent-mixer-stream.c.func.html new file mode 100644 index 00000000000..7ec26669ecc --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-stream.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-stream.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-stream.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.6 %117113
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:63.9 %3623
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mixer_stream_class_init4
valent_mixer_stream_finalize26
valent_mixer_stream_get_description9
valent_mixer_stream_get_direction27
valent_mixer_stream_get_level49
valent_mixer_stream_get_muted53
valent_mixer_stream_get_name9
valent_mixer_stream_get_property5
valent_mixer_stream_get_type611
valent_mixer_stream_class_intern_init4
valent_mixer_stream_get_type521
valent_mixer_stream_get_type_once86
valent_mixer_stream_init26
valent_mixer_stream_set_level30
valent_mixer_stream_set_muted21
valent_mixer_stream_set_property108
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-stream.c.gcov.html b/coverage/src/libvalent/mixer/valent-mixer-stream.c.gcov.html new file mode 100644 index 00000000000..1b93f79e7d9 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-stream.c.gcov.html @@ -0,0 +1,590 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-stream.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-stream.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.6 %117113
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:63.9 %3623
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mixer-stream"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libvalent-core.h>
+       9                 :             : 
+      10                 :             : #include "valent-mixer-enums.h"
+      11                 :             : #include "valent-mixer-stream.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentMixerStream:
+      16                 :             :  *
+      17                 :             :  * A base class for mixer streams.
+      18                 :             :  *
+      19                 :             :  * `ValentMixerStream` is a base class for mixer streams, intended for use by
+      20                 :             :  * implementations of [class@Valent.MixerAdapter].
+      21                 :             :  *
+      22                 :             :  * Since: 1.0
+      23                 :             :  */
+      24                 :             : 
+      25                 :             : typedef struct
+      26                 :             : {
+      27                 :             :   char                 *name;
+      28                 :             :   char                 *description;
+      29                 :             :   ValentMixerDirection  direction;
+      30                 :             :   unsigned int          level;
+      31                 :             :   unsigned int          muted : 1;
+      32                 :             : } ValentMixerStreamPrivate;
+      33                 :             : 
+      34   [ +  +  +  - ]:         943 : G_DEFINE_TYPE_WITH_PRIVATE (ValentMixerStream, valent_mixer_stream, G_TYPE_OBJECT)
+      35                 :             : 
+      36                 :             : enum {
+      37                 :             :   PROP_0,
+      38                 :             :   PROP_DESCRIPTION,
+      39                 :             :   PROP_DIRECTION,
+      40                 :             :   PROP_LEVEL,
+      41                 :             :   PROP_MUTED,
+      42                 :             :   PROP_NAME,
+      43                 :             :   N_PROPERTIES
+      44                 :             : };
+      45                 :             : 
+      46                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      47                 :             : 
+      48                 :             : /**
+      49                 :             :  * ValentMixerStreamClass:
+      50                 :             :  * @get_name: the virtual function pointer for valent_mixer_stream_get_name()
+      51                 :             :  * @get_description: the virtual function pointer for valent_mixer_stream_get_description()
+      52                 :             :  * @get_level: the virtual function pointer for valent_mixer_stream_get_level()
+      53                 :             :  * @set_level: the virtual function pointer for valent_mixer_stream_set_level()
+      54                 :             :  * @get_muted: the virtual function pointer for valent_mixer_stream_get_muted()
+      55                 :             :  * @set_muted: the virtual function pointer for valent_mixer_stream_set_muted()
+      56                 :             :  *
+      57                 :             :  * The virtual function table for `ValentMixerStream`.
+      58                 :             :  */
+      59                 :             : 
+      60                 :             : /* LCOV_EXCL_START */
+      61                 :             : static const char *
+      62                 :             : valent_mixer_stream_real_get_name (ValentMixerStream *stream)
+      63                 :             : {
+      64                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+      65                 :             : 
+      66                 :             :   if (priv->name == NULL)
+      67                 :             :     priv->name = g_uuid_string_random ();
+      68                 :             : 
+      69                 :             :   return priv->name;
+      70                 :             : }
+      71                 :             : 
+      72                 :             : static const char *
+      73                 :             : valent_mixer_stream_real_get_description (ValentMixerStream *stream)
+      74                 :             : {
+      75                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+      76                 :             : 
+      77                 :             :   if (priv->description == NULL)
+      78                 :             :     return "Unnamed Stream";
+      79                 :             : 
+      80                 :             :   return priv->description;
+      81                 :             : }
+      82                 :             : 
+      83                 :             : ValentMixerDirection
+      84                 :             : valent_mixer_stream_real_get_direction (ValentMixerStream *stream)
+      85                 :             : {
+      86                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+      87                 :             : 
+      88                 :             :   return priv->direction;
+      89                 :             : }
+      90                 :             : 
+      91                 :             : static unsigned int
+      92                 :             : valent_mixer_stream_real_get_level (ValentMixerStream *stream)
+      93                 :             : {
+      94                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+      95                 :             : 
+      96                 :             :   return priv->level;
+      97                 :             : }
+      98                 :             : 
+      99                 :             : static void
+     100                 :             : valent_mixer_stream_real_set_level (ValentMixerStream *stream,
+     101                 :             :                                     unsigned int       level)
+     102                 :             : {
+     103                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+     104                 :             : 
+     105                 :             :   if (priv->level == level)
+     106                 :             :     return;
+     107                 :             : 
+     108                 :             :   priv->level = level;
+     109                 :             :   g_object_notify_by_pspec (G_OBJECT (stream), properties [PROP_LEVEL]);
+     110                 :             : }
+     111                 :             : 
+     112                 :             : static gboolean
+     113                 :             : valent_mixer_stream_real_get_muted (ValentMixerStream *stream)
+     114                 :             : {
+     115                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+     116                 :             : 
+     117                 :             :   return priv->muted;
+     118                 :             : }
+     119                 :             : 
+     120                 :             : static void
+     121                 :             : valent_mixer_stream_real_set_muted (ValentMixerStream *stream,
+     122                 :             :                                     gboolean           mute)
+     123                 :             : {
+     124                 :             :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+     125                 :             : 
+     126                 :             :   if (priv->muted == mute)
+     127                 :             :     return;
+     128                 :             : 
+     129                 :             :   priv->muted = mute;
+     130                 :             :   g_object_notify_by_pspec (G_OBJECT (stream), properties [PROP_MUTED]);
+     131                 :             : }
+     132                 :             : /* LCOV_EXCL_STOP */
+     133                 :             : 
+     134                 :             : /*
+     135                 :             :  * GObject
+     136                 :             :  */
+     137                 :             : static void
+     138                 :          26 : valent_mixer_stream_finalize (GObject *object)
+     139                 :             : {
+     140                 :          26 :   ValentMixerStream *self = VALENT_MIXER_STREAM (object);
+     141                 :          26 :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (self);
+     142                 :             : 
+     143         [ +  - ]:          26 :   g_clear_pointer (&priv->name, g_free);
+     144         [ +  - ]:          26 :   g_clear_pointer (&priv->description, g_free);
+     145                 :             : 
+     146                 :          26 :   G_OBJECT_CLASS (valent_mixer_stream_parent_class)->finalize (object);
+     147                 :          26 : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :           5 : valent_mixer_stream_get_property (GObject    *object,
+     151                 :             :                                   guint       prop_id,
+     152                 :             :                                   GValue     *value,
+     153                 :             :                                   GParamSpec *pspec)
+     154                 :             : {
+     155                 :           5 :   ValentMixerStream *self = VALENT_MIXER_STREAM (object);
+     156                 :             : 
+     157   [ +  +  +  +  :           5 :   switch (prop_id)
+                   +  - ]
+     158                 :             :     {
+     159                 :           1 :     case PROP_DESCRIPTION:
+     160                 :           1 :       g_value_set_string (value, valent_mixer_stream_get_description (self));
+     161                 :           1 :       break;
+     162                 :             : 
+     163                 :           1 :     case PROP_DIRECTION:
+     164                 :           1 :       g_value_set_enum (value, valent_mixer_stream_get_direction (self));
+     165                 :           1 :       break;
+     166                 :             : 
+     167                 :           1 :     case PROP_LEVEL:
+     168                 :           1 :       g_value_set_uint (value, valent_mixer_stream_get_level (self));
+     169                 :           1 :       break;
+     170                 :             : 
+     171                 :           1 :     case PROP_MUTED:
+     172                 :           1 :       g_value_set_boolean (value, valent_mixer_stream_get_muted (self));
+     173                 :           1 :       break;
+     174                 :             : 
+     175                 :           1 :     case PROP_NAME:
+     176                 :           1 :       g_value_set_string (value, valent_mixer_stream_get_name (self));
+     177                 :           1 :       break;
+     178                 :             : 
+     179                 :           0 :     default:
+     180                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     181                 :             :     }
+     182                 :           5 : }
+     183                 :             : 
+     184                 :             : static void
+     185                 :         108 : valent_mixer_stream_set_property (GObject      *object,
+     186                 :             :                                   guint         prop_id,
+     187                 :             :                                   const GValue *value,
+     188                 :             :                                   GParamSpec   *pspec)
+     189                 :             : {
+     190                 :         108 :   ValentMixerStream *self = VALENT_MIXER_STREAM (object);
+     191                 :         108 :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (self);
+     192                 :             : 
+     193   [ +  +  +  +  :         108 :   switch (prop_id)
+                   +  - ]
+     194                 :             :     {
+     195                 :          26 :     case PROP_DESCRIPTION:
+     196                 :          26 :       priv->description = g_value_dup_string (value);
+     197                 :          26 :       break;
+     198                 :             : 
+     199                 :          26 :     case PROP_DIRECTION:
+     200                 :          26 :       priv->direction = g_value_get_enum (value);
+     201                 :          26 :       break;
+     202                 :             : 
+     203                 :          21 :     case PROP_LEVEL:
+     204                 :          21 :       valent_mixer_stream_set_level (self, g_value_get_uint (value));
+     205                 :          21 :       break;
+     206                 :             : 
+     207                 :           9 :     case PROP_MUTED:
+     208                 :           9 :       valent_mixer_stream_set_muted (self, g_value_get_boolean (value));
+     209                 :           9 :       break;
+     210                 :             : 
+     211                 :          26 :     case PROP_NAME:
+     212                 :          26 :       priv->name = g_value_dup_string (value);
+     213                 :          26 :       break;
+     214                 :             : 
+     215                 :           0 :     default:
+     216                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     217                 :             :     }
+     218                 :         108 : }
+     219                 :             : 
+     220                 :             : static void
+     221                 :           4 : valent_mixer_stream_class_init (ValentMixerStreamClass *klass)
+     222                 :             : {
+     223                 :           4 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     224                 :           4 :   ValentMixerStreamClass *stream_class = VALENT_MIXER_STREAM_CLASS (klass);
+     225                 :             : 
+     226                 :           4 :   object_class->finalize = valent_mixer_stream_finalize;
+     227                 :           4 :   object_class->get_property = valent_mixer_stream_get_property;
+     228                 :           4 :   object_class->set_property = valent_mixer_stream_set_property;
+     229                 :             : 
+     230                 :           4 :   stream_class->get_name = valent_mixer_stream_real_get_name;
+     231                 :           4 :   stream_class->get_description = valent_mixer_stream_real_get_description;
+     232                 :           4 :   stream_class->get_direction = valent_mixer_stream_real_get_direction;
+     233                 :           4 :   stream_class->get_level = valent_mixer_stream_real_get_level;
+     234                 :           4 :   stream_class->set_level = valent_mixer_stream_real_set_level;
+     235                 :           4 :   stream_class->get_muted = valent_mixer_stream_real_get_muted;
+     236                 :           4 :   stream_class->set_muted = valent_mixer_stream_real_set_muted;
+     237                 :             : 
+     238                 :             :   /**
+     239                 :             :    * ValentMixerStream:description: (getter get_description)
+     240                 :             :    *
+     241                 :             :    * The human-readable label of the stream.
+     242                 :             :    *
+     243                 :             :    * Implementation may emit [signal@GObject.Object::notify] for this property
+     244                 :             :    * if it changes.
+     245                 :             :    *
+     246                 :             :    * Since: 1.0
+     247                 :             :    */
+     248                 :           8 :   properties [PROP_DESCRIPTION] =
+     249                 :           4 :     g_param_spec_string ("description", NULL, NULL,
+     250                 :             :                          NULL,
+     251                 :             :                          (G_PARAM_READWRITE |
+     252                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     253                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     254                 :             :                           G_PARAM_STATIC_STRINGS));
+     255                 :             : 
+     256                 :             :   /**
+     257                 :             :    * ValentMixerStream:direction: (getter get_direction)
+     258                 :             :    *
+     259                 :             :    * The port direction of the stream.
+     260                 :             :    *
+     261                 :             :    * Since: 1.0
+     262                 :             :    */
+     263                 :           8 :   properties [PROP_DIRECTION] =
+     264                 :           4 :     g_param_spec_enum ("direction", NULL, NULL,
+     265                 :             :                        VALENT_TYPE_MIXER_DIRECTION,
+     266                 :             :                        VALENT_MIXER_INPUT,
+     267                 :             :                        (G_PARAM_CONSTRUCT_ONLY |
+     268                 :             :                         G_PARAM_READWRITE |
+     269                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     270                 :             :                         G_PARAM_STATIC_STRINGS));
+     271                 :             : 
+     272                 :             :   /**
+     273                 :             :    * ValentMixerStream:level: (getter get_level) (setter set_level)
+     274                 :             :    *
+     275                 :             :    * The input or output level of the stream.
+     276                 :             :    *
+     277                 :             :    * Since: 1.0
+     278                 :             :    */
+     279                 :           8 :   properties [PROP_LEVEL] =
+     280                 :           4 :     g_param_spec_uint ("level", NULL, NULL,
+     281                 :             :                        0, 100,
+     282                 :             :                        0,
+     283                 :             :                        (G_PARAM_READWRITE |
+     284                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     285                 :             :                         G_PARAM_STATIC_STRINGS));
+     286                 :             : 
+     287                 :             :   /**
+     288                 :             :    * ValentMixerStream:muted: (getter get_muted) (setter set_muted)
+     289                 :             :    *
+     290                 :             :    * Whether the stream is muted.
+     291                 :             :    *
+     292                 :             :    * Since: 1.0
+     293                 :             :    */
+     294                 :           8 :   properties [PROP_MUTED] =
+     295                 :           4 :     g_param_spec_boolean ("muted", NULL, NULL,
+     296                 :             :                           FALSE,
+     297                 :             :                           (G_PARAM_READWRITE |
+     298                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     299                 :             :                            G_PARAM_STATIC_STRINGS));
+     300                 :             : 
+     301                 :             :   /**
+     302                 :             :    * ValentMixerStream:name: (getter get_name)
+     303                 :             :    *
+     304                 :             :    * The unique name of the stream.
+     305                 :             :    *
+     306                 :             :    * Since: 1.0
+     307                 :             :    */
+     308                 :           8 :   properties [PROP_NAME] =
+     309                 :           4 :     g_param_spec_string ("name", NULL, NULL,
+     310                 :             :                          NULL,
+     311                 :             :                          (G_PARAM_READWRITE |
+     312                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     313                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     314                 :             :                           G_PARAM_STATIC_STRINGS));
+     315                 :             : 
+     316                 :           4 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     317                 :           4 : }
+     318                 :             : 
+     319                 :             : static void
+     320                 :          26 : valent_mixer_stream_init (ValentMixerStream *stream)
+     321                 :             : {
+     322                 :          26 : }
+     323                 :             : 
+     324                 :             : /**
+     325                 :             :  * valent_mixer_stream_get_name: (get-property name) (virtual get_name)
+     326                 :             :  * @stream: a `ValentMixerStream`
+     327                 :             :  *
+     328                 :             :  * Get the unique name of @stream.
+     329                 :             :  *
+     330                 :             :  * Returns: (transfer none): a unique name
+     331                 :             :  *
+     332                 :             :  * Since: 1.0
+     333                 :             :  */
+     334                 :             : const char *
+     335                 :           9 : valent_mixer_stream_get_name (ValentMixerStream *stream)
+     336                 :             : {
+     337                 :           9 :   const char *ret;
+     338                 :             : 
+     339                 :           9 :   VALENT_ENTRY;
+     340                 :             : 
+     341         [ +  - ]:           9 :   g_return_val_if_fail (VALENT_IS_MIXER_STREAM (stream), NULL);
+     342                 :             : 
+     343                 :           9 :   ret = VALENT_MIXER_STREAM_GET_CLASS (stream)->get_name (stream);
+     344                 :             : 
+     345                 :           9 :   VALENT_RETURN (ret);
+     346                 :             : }
+     347                 :             : 
+     348                 :             : /**
+     349                 :             :  * valent_mixer_stream_get_description: (get-property description) (virtual get_description)
+     350                 :             :  * @stream: a `ValentMixerStream`
+     351                 :             :  *
+     352                 :             :  * Get the human-readable label of @stream.
+     353                 :             :  *
+     354                 :             :  * Returns: (transfer none): a stream description
+     355                 :             :  *
+     356                 :             :  * Since: 1.0
+     357                 :             :  */
+     358                 :             : const char *
+     359                 :           9 : valent_mixer_stream_get_description (ValentMixerStream *stream)
+     360                 :             : {
+     361                 :           9 :   const char *ret;
+     362                 :             : 
+     363                 :           9 :   VALENT_ENTRY;
+     364                 :             : 
+     365         [ +  - ]:           9 :   g_return_val_if_fail (VALENT_IS_MIXER_STREAM (stream), NULL);
+     366                 :             : 
+     367                 :           9 :   ret = VALENT_MIXER_STREAM_GET_CLASS (stream)->get_description (stream);
+     368                 :             : 
+     369                 :           9 :   VALENT_RETURN (ret);
+     370                 :             : }
+     371                 :             : 
+     372                 :             : /**
+     373                 :             :  * valent_mixer_stream_get_direction: (get-property direction) (virtual get_direction)
+     374                 :             :  * @stream: a `ValentMixerStream`
+     375                 :             :  *
+     376                 :             :  * Get the port direction of @stream.
+     377                 :             :  *
+     378                 :             :  * Returns: the `ValentMixerDirection` of @stream
+     379                 :             :  *
+     380                 :             :  * Since: 1.0
+     381                 :             :  */
+     382                 :             : ValentMixerDirection
+     383                 :          27 : valent_mixer_stream_get_direction (ValentMixerStream *stream)
+     384                 :             : {
+     385                 :          27 :   ValentMixerStreamPrivate *priv = valent_mixer_stream_get_instance_private (stream);
+     386                 :             : 
+     387         [ +  - ]:          27 :   g_return_val_if_fail (VALENT_IS_MIXER_STREAM (stream), VALENT_MIXER_INPUT);
+     388                 :             : 
+     389                 :          27 :   return priv->direction;
+     390                 :             : }
+     391                 :             : 
+     392                 :             : /**
+     393                 :             :  * valent_mixer_stream_get_level: (get-property level) (virtual get_level)
+     394                 :             :  * @stream: a `ValentMixerStream`
+     395                 :             :  *
+     396                 :             :  * Get the level of @stream (eg. speaker volume, microphone sensitivity).
+     397                 :             :  *
+     398                 :             :  * Implementations that override this method should also override
+     399                 :             :  * [vfunc@Valent.MixerStream.set_level].
+     400                 :             :  *
+     401                 :             :  * Returns: a volume level between `0` and `100`
+     402                 :             :  *
+     403                 :             :  * Since: 1.0
+     404                 :             :  */
+     405                 :             : unsigned int
+     406                 :          49 : valent_mixer_stream_get_level (ValentMixerStream *stream)
+     407                 :             : {
+     408                 :          49 :   unsigned int ret;
+     409                 :             : 
+     410                 :          49 :   VALENT_ENTRY;
+     411                 :             : 
+     412         [ +  - ]:          49 :   g_return_val_if_fail (VALENT_IS_MIXER_STREAM (stream), 0);
+     413                 :             : 
+     414                 :          49 :   ret = VALENT_MIXER_STREAM_GET_CLASS (stream)->get_level (stream);
+     415                 :             : 
+     416                 :          49 :   VALENT_RETURN (ret);
+     417                 :             : }
+     418                 :             : 
+     419                 :             : /**
+     420                 :             :  * valent_mixer_stream_set_level: (set-property level) (virtual set_level)
+     421                 :             :  * @stream: a `ValentMixerStream`
+     422                 :             :  * @level: a volume level between `0` and `100`
+     423                 :             :  *
+     424                 :             :  * Set the level of @stream (eg. speaker volume, microphone sensitivity).
+     425                 :             :  *
+     426                 :             :  * Implementations that override this method should also override
+     427                 :             :  * [vfunc@Valent.MixerStream.get_level].
+     428                 :             :  *
+     429                 :             :  * Since: 1.0
+     430                 :             :  */
+     431                 :             : void
+     432                 :          30 : valent_mixer_stream_set_level (ValentMixerStream *stream,
+     433                 :             :                                unsigned int       level)
+     434                 :             : {
+     435                 :          30 :   VALENT_ENTRY;
+     436                 :             : 
+     437         [ +  - ]:          30 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     438         [ -  + ]:          30 :   g_return_if_fail (level <= 100);
+     439                 :             : 
+     440                 :          30 :   VALENT_MIXER_STREAM_GET_CLASS (stream)->set_level (stream, level);
+     441                 :             : 
+     442                 :          30 :   VALENT_EXIT;
+     443                 :             : }
+     444                 :             : 
+     445                 :             : /**
+     446                 :             :  * valent_mixer_stream_get_muted: (get-property muted) (virtual get_muted)
+     447                 :             :  * @stream: a `ValentMixerStream`
+     448                 :             :  *
+     449                 :             :  * Get the muted state of @stream.
+     450                 :             :  *
+     451                 :             :  * Implementations that override this method should also override
+     452                 :             :  * [vfunc@Valent.MixerStream.set_muted].
+     453                 :             :  *
+     454                 :             :  * Returns: %TRUE if the stream is muted, or %FALSE if not
+     455                 :             :  *
+     456                 :             :  * Since: 1.0
+     457                 :             :  */
+     458                 :             : gboolean
+     459                 :          53 : valent_mixer_stream_get_muted (ValentMixerStream *stream)
+     460                 :             : {
+     461                 :          53 :   gboolean ret;
+     462                 :             : 
+     463                 :          53 :   VALENT_ENTRY;
+     464                 :             : 
+     465         [ +  - ]:          53 :   g_return_val_if_fail (VALENT_IS_MIXER_STREAM (stream), FALSE);
+     466                 :             : 
+     467                 :          53 :   ret = VALENT_MIXER_STREAM_GET_CLASS (stream)->get_muted (stream);
+     468                 :             : 
+     469                 :          53 :   VALENT_RETURN (ret);
+     470                 :             : }
+     471                 :             : 
+     472                 :             : /**
+     473                 :             :  * valent_mixer_stream_set_muted: (set-property muted) (virtual set_muted)
+     474                 :             :  * @stream: a `ValentMixerStream`
+     475                 :             :  * @state: whether the stream should be muted
+     476                 :             :  *
+     477                 :             :  * Set the muted state of @stream.
+     478                 :             :  *
+     479                 :             :  * Implementations that override this method should also override
+     480                 :             :  * [vfunc@Valent.MixerStream.get_muted].
+     481                 :             :  *
+     482                 :             :  * Since: 1.0
+     483                 :             :  */
+     484                 :             : void
+     485                 :          21 : valent_mixer_stream_set_muted (ValentMixerStream *stream,
+     486                 :             :                                gboolean           state)
+     487                 :             : {
+     488                 :          21 :   VALENT_ENTRY;
+     489                 :             : 
+     490         [ +  - ]:          21 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     491                 :             : 
+     492                 :          21 :   VALENT_MIXER_STREAM_GET_CLASS (stream)->set_muted (stream, state);
+     493                 :             : 
+     494                 :          21 :   VALENT_EXIT;
+     495                 :             : }
+     496                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-stream.h.func-c.html b/coverage/src/libvalent/mixer/valent-mixer-stream.h.func-c.html new file mode 100644 index 00000000000..dbad62a458d --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-stream.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-stream.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-stream.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:90.0 %109
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MIXER_STREAM269
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-stream.h.func.html b/coverage/src/libvalent/mixer/valent-mixer-stream.h.func.html new file mode 100644 index 00000000000..37d9340d513 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-stream.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-stream.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-stream.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:90.0 %109
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MIXER_STREAM269
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer-stream.h.gcov.html b/coverage/src/libvalent/mixer/valent-mixer-stream.h.gcov.html new file mode 100644 index 00000000000..08758bfd274 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer-stream.h.gcov.html @@ -0,0 +1,166 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer-stream.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer-stream.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:90.0 %109
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-object.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentMixerDirection:
+      16                 :             :  * @VALENT_MIXER_INPUT: An input stream or "source" (eg. microphone)
+      17                 :             :  * @VALENT_MIXER_OUTPUT: An output stream or "sink" (eg. speakers)
+      18                 :             :  *
+      19                 :             :  * Enumeration of stream directions.
+      20                 :             :  *
+      21                 :             :  * Since: 1.0
+      22                 :             :  */
+      23                 :             : typedef enum
+      24                 :             : {
+      25                 :             :   VALENT_MIXER_INPUT,
+      26                 :             :   VALENT_MIXER_OUTPUT,
+      27                 :             : } ValentMixerDirection;
+      28                 :             : 
+      29                 :             : 
+      30                 :             : #define VALENT_TYPE_MIXER_STREAM (valent_mixer_stream_get_type())
+      31                 :             : 
+      32                 :             : VALENT_AVAILABLE_IN_1_0
+      33   [ +  +  +  +  :         513 : G_DECLARE_DERIVABLE_TYPE (ValentMixerStream, valent_mixer_stream, VALENT, MIXER_STREAM, GObject)
+          +  +  +  +  -  
+                      + ]
+      34                 :             : 
+      35                 :             : struct _ValentMixerStreamClass
+      36                 :             : {
+      37                 :             :   GObjectClass           parent_class;
+      38                 :             : 
+      39                 :             :   /* virtual functions */
+      40                 :             :   const char           * (*get_name)        (ValentMixerStream *stream);
+      41                 :             :   const char           * (*get_description) (ValentMixerStream *stream);
+      42                 :             :   ValentMixerDirection   (*get_direction)   (ValentMixerStream *stream);
+      43                 :             :   unsigned int           (*get_level)       (ValentMixerStream *stream);
+      44                 :             :   void                   (*set_level)       (ValentMixerStream *stream,
+      45                 :             :                                              unsigned int       level);
+      46                 :             :   gboolean               (*get_muted)       (ValentMixerStream *stream);
+      47                 :             :   void                   (*set_muted)       (ValentMixerStream *stream,
+      48                 :             :                                              gboolean           state);
+      49                 :             : 
+      50                 :             :   /*< private >*/
+      51                 :             :   gpointer               padding[8];
+      52                 :             : };
+      53                 :             : 
+      54                 :             : VALENT_AVAILABLE_IN_1_0
+      55                 :             : const char           * valent_mixer_stream_get_name        (ValentMixerStream *stream);
+      56                 :             : VALENT_AVAILABLE_IN_1_0
+      57                 :             : const char           * valent_mixer_stream_get_description (ValentMixerStream *stream);
+      58                 :             : VALENT_AVAILABLE_IN_1_0
+      59                 :             : ValentMixerDirection   valent_mixer_stream_get_direction   (ValentMixerStream *stream);
+      60                 :             : VALENT_AVAILABLE_IN_1_0
+      61                 :             : unsigned int           valent_mixer_stream_get_level       (ValentMixerStream *stream);
+      62                 :             : VALENT_AVAILABLE_IN_1_0
+      63                 :             : void                   valent_mixer_stream_set_level       (ValentMixerStream *stream,
+      64                 :             :                                                             unsigned int       level);
+      65                 :             : VALENT_AVAILABLE_IN_1_0
+      66                 :             : gboolean               valent_mixer_stream_get_muted       (ValentMixerStream *stream);
+      67                 :             : VALENT_AVAILABLE_IN_1_0
+      68                 :             : void                   valent_mixer_stream_set_muted       (ValentMixerStream *stream,
+      69                 :             :                                                             gboolean           state);
+      70                 :             : 
+      71                 :             : G_END_DECLS
+      72                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer.c.func-c.html b/coverage/src/libvalent/mixer/valent-mixer.c.func-c.html new file mode 100644 index 00000000000..ee59770b4c0 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer.c.func-c.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.1 %135123
Test Date:2024-03-31 18:46:36Functions:95.2 %2120
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.1 %6236
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mixer_get_item_type0
valent_mixer_get_property2
valent_mixer_set_default_input2
valent_mixer_set_property2
g_list_model_iface_init4
valent_mixer_class_init4
valent_mixer_get_n_items4
valent_mixer_set_default_output4
valent_mixer_bind_preferred8
valent_mixer_finalize8
valent_mixer_init8
valent_mixer_get_default_input9
on_default_input_changed11
valent_mixer_get_item11
on_default_output_changed14
valent_mixer_get_default_output19
valent_mixer_get_default25
on_items_changed36
valent_mixer_get_type279
valent_mixer_class_intern_init4
valent_mixer_get_type_once86
valent_mixer_get_type189
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer.c.func.html b/coverage/src/libvalent/mixer/valent-mixer.c.func.html new file mode 100644 index 00000000000..13a0ececae5 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer.c.func.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.1 %135123
Test Date:2024-03-31 18:46:36Functions:95.2 %2120
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.1 %6236
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init4
on_default_input_changed11
on_default_output_changed14
on_items_changed36
valent_mixer_bind_preferred8
valent_mixer_class_init4
valent_mixer_finalize8
valent_mixer_get_default25
valent_mixer_get_default_input9
valent_mixer_get_default_output19
valent_mixer_get_item11
valent_mixer_get_item_type0
valent_mixer_get_n_items4
valent_mixer_get_property2
valent_mixer_get_type279
valent_mixer_class_intern_init4
valent_mixer_get_type189
valent_mixer_get_type_once86
valent_mixer_init8
valent_mixer_set_default_input2
valent_mixer_set_default_output4
valent_mixer_set_property2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer.c.gcov.html b/coverage/src/libvalent/mixer/valent-mixer.c.gcov.html new file mode 100644 index 00000000000..9e680f3bba6 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer.c.gcov.html @@ -0,0 +1,541 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.1 %135123
Test Date:2024-03-31 18:46:36Functions:95.2 %2120
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.1 %6236
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mixer"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-mixer.h"
+      13                 :             : #include "valent-mixer-adapter.h"
+      14                 :             : #include "valent-mixer-stream.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentMixer:
+      19                 :             :  *
+      20                 :             :  * A class for monitoring and controlling the system volume.
+      21                 :             :  *
+      22                 :             :  * `ValentMixer` is an abstraction of volume mixers, intended for use by
+      23                 :             :  * [class@Valent.DevicePlugin] implementations.
+      24                 :             :  *
+      25                 :             :  * Plugins can implement [class@Valent.MixerAdapter] to provide an interface to
+      26                 :             :  * monitor and control audio streams.
+      27                 :             :  *
+      28                 :             :  * Since: 1.0
+      29                 :             :  */
+      30                 :             : 
+      31                 :             : struct _ValentMixer
+      32                 :             : {
+      33                 :             :   ValentComponent     parent_instance;
+      34                 :             : 
+      35                 :             :   ValentMixerAdapter *default_adapter;
+      36                 :             :   GPtrArray          *streams;
+      37                 :             : };
+      38                 :             : 
+      39                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      40                 :             : 
+      41   [ +  +  +  - ]:         279 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentMixer, valent_mixer, VALENT_TYPE_COMPONENT,
+      42                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      43                 :             : 
+      44                 :             : enum {
+      45                 :             :   PROP_0,
+      46                 :             :   PROP_DEFAULT_INPUT,
+      47                 :             :   PROP_DEFAULT_OUTPUT,
+      48                 :             :   N_PROPERTIES
+      49                 :             : };
+      50                 :             : 
+      51                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      52                 :             : 
+      53                 :             : static ValentMixer *default_mixer = NULL;
+      54                 :             : 
+      55                 :             : #if 0
+      56                 :             :   /* Translate the position */
+      57                 :             :   for (unsigned int i = 0; i < self->adapters->len; i++)
+      58                 :             :     {
+      59                 :             :       GListModel *adapter = g_ptr_array_index (self->adapters, i);
+      60                 :             : 
+      61                 :             :       if (adapter == list)
+      62                 :             :         break;
+      63                 :             : 
+      64                 :             :       offset += g_list_model_get_n_items (adapter);
+      65                 :             :     }
+      66                 :             : #endif
+      67                 :             : 
+      68                 :             : 
+      69                 :             : /*
+      70                 :             :  * ValentMixerAdapter Callbacks
+      71                 :             :  */
+      72                 :             : static void
+      73                 :          11 : on_default_input_changed (ValentMixerAdapter *adapter,
+      74                 :             :                           GParamSpec         *pspec,
+      75                 :             :                           ValentMixer        *self)
+      76                 :             : {
+      77         [ +  - ]:          11 :   if (self->default_adapter != adapter)
+      78                 :             :     return;
+      79                 :             : 
+      80                 :          11 :   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEFAULT_INPUT]);
+      81                 :             : }
+      82                 :             : 
+      83                 :             : static void
+      84                 :          14 : on_default_output_changed (ValentMixerAdapter *adapter,
+      85                 :             :                            GParamSpec         *pspec,
+      86                 :             :                            ValentMixer        *self)
+      87                 :             : {
+      88         [ +  - ]:          14 :   if (self->default_adapter != adapter)
+      89                 :             :     return;
+      90                 :             : 
+      91                 :          14 :   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEFAULT_OUTPUT]);
+      92                 :             : }
+      93                 :             : 
+      94                 :             : static void
+      95                 :          36 : on_items_changed (GListModel   *list,
+      96                 :             :                   unsigned int  position,
+      97                 :             :                   unsigned int  removed,
+      98                 :             :                   unsigned int  added,
+      99                 :             :                   ValentMixer  *self)
+     100                 :             : {
+     101         [ +  - ]:          36 :   g_assert (VALENT_IS_MIXER_ADAPTER (list));
+     102         [ +  - ]:          36 :   g_assert (VALENT_IS_MIXER (self));
+     103                 :             : 
+     104                 :             :   /* Remove items */
+     105         [ +  + ]:          41 :   while (removed--)
+     106                 :           5 :     g_ptr_array_remove_index (self->streams, position);
+     107                 :             : 
+     108                 :             :   /* Add items */
+     109         [ +  + ]:          59 :   for (unsigned int i = 0; i < added; i++)
+     110                 :             :     {
+     111                 :          23 :       g_autoptr (ValentMixerStream) stream = NULL;
+     112                 :             : 
+     113                 :          23 :       stream = g_list_model_get_item (list, position + i);
+     114                 :          23 :       g_ptr_array_insert (self->streams, position + i, g_steal_pointer (&stream));
+     115                 :             :     }
+     116                 :             : 
+     117                 :          36 :   g_list_model_items_changed (G_LIST_MODEL (self), position, removed, added);
+     118                 :          36 : }
+     119                 :             : 
+     120                 :             : /*
+     121                 :             :  * ValentComponent
+     122                 :             :  */
+     123                 :             : static void
+     124                 :           8 : valent_mixer_bind_preferred (ValentComponent *component,
+     125                 :             :                              GObject         *extension)
+     126                 :             : {
+     127                 :           8 :   ValentMixer *self = VALENT_MIXER (component);
+     128                 :           8 :   ValentMixerAdapter *adapter = VALENT_MIXER_ADAPTER (extension);
+     129                 :             : 
+     130                 :           8 :   VALENT_ENTRY;
+     131                 :             : 
+     132         [ +  - ]:           8 :   g_assert (VALENT_IS_MIXER (self));
+     133   [ +  -  -  + ]:           8 :   g_assert (adapter == NULL || VALENT_IS_MIXER_ADAPTER (adapter));
+     134                 :             : 
+     135         [ -  + ]:           8 :   if (self->default_adapter != NULL)
+     136                 :             :     {
+     137                 :           0 :       GListModel *list = G_LIST_MODEL (self->default_adapter);
+     138                 :             : 
+     139                 :           0 :       g_signal_handlers_disconnect_by_func (self->default_adapter,
+     140                 :             :                                             self,
+     141                 :             :                                             on_items_changed);
+     142                 :           0 :       g_signal_handlers_disconnect_by_func (self->default_adapter,
+     143                 :             :                                             self,
+     144                 :             :                                             on_default_input_changed);
+     145                 :           0 :       g_signal_handlers_disconnect_by_func (self->default_adapter,
+     146                 :             :                                             self,
+     147                 :             :                                             on_default_output_changed);
+     148                 :           0 :       on_items_changed (list, 0, g_list_model_get_n_items (list), 0, self);
+     149                 :           0 :       self->default_adapter = NULL;
+     150                 :             :     }
+     151                 :             : 
+     152         [ +  - ]:           8 :   if (adapter != NULL)
+     153                 :             :     {
+     154                 :           8 :       GListModel *list = G_LIST_MODEL (adapter);
+     155                 :             : 
+     156                 :           8 :       g_signal_connect_object (adapter,
+     157                 :             :                                "notify::default-input",
+     158                 :             :                                G_CALLBACK (on_default_input_changed),
+     159                 :             :                                self, 0);
+     160                 :           8 :       g_signal_connect_object (adapter,
+     161                 :             :                                "notify::default-output",
+     162                 :             :                                G_CALLBACK (on_default_output_changed),
+     163                 :             :                                self, 0);
+     164                 :           8 :       g_signal_connect_object (adapter,
+     165                 :             :                                "items-changed",
+     166                 :             :                                G_CALLBACK (on_items_changed),
+     167                 :             :                                self, 0);
+     168                 :           8 :       on_items_changed (list, 0, 0, g_list_model_get_n_items (list), self);
+     169                 :           8 :       g_object_notify (G_OBJECT (self), "default-input");
+     170                 :           8 :       g_object_notify (G_OBJECT (self), "default-output");
+     171                 :           8 :       self->default_adapter = adapter;
+     172                 :             :     }
+     173                 :             : 
+     174                 :           8 :   VALENT_EXIT;
+     175                 :             : }
+     176                 :             : 
+     177                 :             : /*
+     178                 :             :  * GListModel
+     179                 :             :  */
+     180                 :             : static gpointer
+     181                 :          11 : valent_mixer_get_item (GListModel   *list,
+     182                 :             :                        unsigned int  position)
+     183                 :             : {
+     184                 :          11 :   ValentMixer *self = VALENT_MIXER (list);
+     185                 :             : 
+     186         [ +  - ]:          11 :   g_assert (VALENT_IS_MIXER (self));
+     187                 :             : 
+     188         [ +  - ]:          11 :   if G_UNLIKELY (position >= self->streams->len)
+     189                 :             :     return NULL;
+     190                 :             : 
+     191                 :          11 :   return g_object_ref (g_ptr_array_index (self->streams, position));
+     192                 :             : }
+     193                 :             : 
+     194                 :             : static GType
+     195                 :           0 : valent_mixer_get_item_type (GListModel *list)
+     196                 :             : {
+     197                 :           0 :   return VALENT_TYPE_MIXER_STREAM;
+     198                 :             : }
+     199                 :             : 
+     200                 :             : static unsigned int
+     201                 :           4 : valent_mixer_get_n_items (GListModel *list)
+     202                 :             : {
+     203                 :           4 :   ValentMixer *self = VALENT_MIXER (list);
+     204                 :             : 
+     205         [ +  - ]:           4 :   g_assert (VALENT_IS_MIXER (self));
+     206                 :             : 
+     207                 :           4 :   return self->streams->len;
+     208                 :             : }
+     209                 :             : 
+     210                 :             : static void
+     211                 :           4 : g_list_model_iface_init (GListModelInterface *iface)
+     212                 :             : {
+     213                 :           4 :   iface->get_item = valent_mixer_get_item;
+     214                 :           4 :   iface->get_item_type = valent_mixer_get_item_type;
+     215                 :           4 :   iface->get_n_items = valent_mixer_get_n_items;
+     216                 :           4 : }
+     217                 :             : 
+     218                 :             : /*
+     219                 :             :  * GObject
+     220                 :             :  */
+     221                 :             : static void
+     222                 :           8 : valent_mixer_finalize (GObject *object)
+     223                 :             : {
+     224                 :           8 :   ValentMixer *self = VALENT_MIXER (object);
+     225                 :             : 
+     226         [ +  - ]:           8 :   g_clear_pointer (&self->streams, g_ptr_array_unref);
+     227                 :             : 
+     228                 :           8 :   G_OBJECT_CLASS (valent_mixer_parent_class)->finalize (object);
+     229                 :           8 : }
+     230                 :             : 
+     231                 :             : static void
+     232                 :           2 : valent_mixer_get_property (GObject    *object,
+     233                 :             :                            guint       prop_id,
+     234                 :             :                            GValue     *value,
+     235                 :             :                            GParamSpec *pspec)
+     236                 :             : {
+     237                 :           2 :   ValentMixer *self = VALENT_MIXER (object);
+     238                 :             : 
+     239      [ +  +  - ]:           2 :   switch (prop_id)
+     240                 :             :     {
+     241                 :           1 :     case PROP_DEFAULT_INPUT:
+     242                 :           1 :       g_value_set_object (value, valent_mixer_get_default_input (self));
+     243                 :           1 :       break;
+     244                 :             : 
+     245                 :           1 :     case PROP_DEFAULT_OUTPUT:
+     246                 :           1 :       g_value_set_object (value, valent_mixer_get_default_output (self));
+     247                 :           1 :       break;
+     248                 :             : 
+     249                 :           0 :     default:
+     250                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     251                 :             :     }
+     252                 :           2 : }
+     253                 :             : 
+     254                 :             : static void
+     255                 :           2 : valent_mixer_set_property (GObject      *object,
+     256                 :             :                            guint         prop_id,
+     257                 :             :                            const GValue *value,
+     258                 :             :                            GParamSpec   *pspec)
+     259                 :             : {
+     260                 :           2 :   ValentMixer *self = VALENT_MIXER (object);
+     261                 :             : 
+     262      [ +  +  - ]:           2 :   switch (prop_id)
+     263                 :             :     {
+     264                 :           1 :     case PROP_DEFAULT_INPUT:
+     265                 :           1 :       valent_mixer_set_default_input (self, g_value_get_object (value));
+     266                 :           1 :       break;
+     267                 :             : 
+     268                 :           1 :     case PROP_DEFAULT_OUTPUT:
+     269                 :           1 :       valent_mixer_set_default_output (self, g_value_get_object (value));
+     270                 :           1 :       break;
+     271                 :             : 
+     272                 :           0 :     default:
+     273                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     274                 :             :     }
+     275                 :           2 : }
+     276                 :             : 
+     277                 :             : static void
+     278                 :           4 : valent_mixer_class_init (ValentMixerClass *klass)
+     279                 :             : {
+     280                 :           4 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     281                 :           4 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     282                 :             : 
+     283                 :           4 :   object_class->finalize = valent_mixer_finalize;
+     284                 :           4 :   object_class->get_property = valent_mixer_get_property;
+     285                 :           4 :   object_class->set_property = valent_mixer_set_property;
+     286                 :             : 
+     287                 :           4 :   component_class->bind_preferred = valent_mixer_bind_preferred;
+     288                 :             : 
+     289                 :             :   /**
+     290                 :             :    * ValentMixer:default-input: (getter get_default_input) (setter set_default_input)
+     291                 :             :    *
+     292                 :             :    * The active input stream.
+     293                 :             :    *
+     294                 :             :    * Since: 1.0
+     295                 :             :    */
+     296                 :           8 :   properties [PROP_DEFAULT_INPUT] =
+     297                 :           4 :     g_param_spec_object ("default-input", NULL, NULL,
+     298                 :             :                          VALENT_TYPE_MIXER_STREAM,
+     299                 :             :                          (G_PARAM_READWRITE |
+     300                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     301                 :             :                           G_PARAM_STATIC_STRINGS));
+     302                 :             : 
+     303                 :             :   /**
+     304                 :             :    * ValentMixer:default-output: (getter get_default_output) (setter set_default_output)
+     305                 :             :    *
+     306                 :             :    * The active output stream.
+     307                 :             :    *
+     308                 :             :    * Since: 1.0
+     309                 :             :    */
+     310                 :           8 :   properties [PROP_DEFAULT_OUTPUT] =
+     311                 :           4 :     g_param_spec_object ("default-output", NULL, NULL,
+     312                 :             :                          VALENT_TYPE_MIXER_STREAM,
+     313                 :             :                          (G_PARAM_READWRITE |
+     314                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     315                 :             :                           G_PARAM_STATIC_STRINGS));
+     316                 :             : 
+     317                 :           4 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     318                 :           4 : }
+     319                 :             : 
+     320                 :             : static void
+     321                 :           8 : valent_mixer_init (ValentMixer *self)
+     322                 :             : {
+     323                 :           8 :   self->streams = g_ptr_array_new_with_free_func (g_object_unref);
+     324                 :           8 : }
+     325                 :             : 
+     326                 :             : /**
+     327                 :             :  * valent_mixer_get_default:
+     328                 :             :  *
+     329                 :             :  * Get the default [class@Valent.Mixer].
+     330                 :             :  *
+     331                 :             :  * Returns: (transfer none) (not nullable): a `ValentMixer`
+     332                 :             :  *
+     333                 :             :  * Since: 1.0
+     334                 :             :  */
+     335                 :             : ValentMixer *
+     336                 :          25 : valent_mixer_get_default (void)
+     337                 :             : {
+     338         [ +  + ]:          25 :   if (default_mixer == NULL)
+     339                 :             :     {
+     340                 :           8 :       default_mixer = g_object_new (VALENT_TYPE_MIXER,
+     341                 :             :                                     "plugin-domain", "mixer",
+     342                 :             :                                     "plugin-type",   VALENT_TYPE_MIXER_ADAPTER,
+     343                 :             :                                     NULL);
+     344                 :             : 
+     345                 :           8 :       g_object_add_weak_pointer (G_OBJECT (default_mixer),
+     346                 :             :                                  (gpointer)&default_mixer);
+     347                 :             :     }
+     348                 :             : 
+     349                 :          25 :   return default_mixer;
+     350                 :             : }
+     351                 :             : 
+     352                 :             : /**
+     353                 :             :  * valent_mixer_get_default_input: (get-property default-input)
+     354                 :             :  * @mixer: a `ValentMixer`
+     355                 :             :  *
+     356                 :             :  * Get the default input stream for the primary [class@Valent.MixerAdapter].
+     357                 :             :  *
+     358                 :             :  * Returns: (transfer none) (nullable): a `ValentMixerStream`
+     359                 :             :  *
+     360                 :             :  * Since: 1.0
+     361                 :             :  */
+     362                 :             : ValentMixerStream *
+     363                 :           9 : valent_mixer_get_default_input (ValentMixer *mixer)
+     364                 :             : {
+     365                 :           9 :   ValentMixerStream *ret = NULL;
+     366                 :             : 
+     367                 :           9 :   VALENT_ENTRY;
+     368                 :             : 
+     369         [ +  - ]:           9 :   g_return_val_if_fail (VALENT_IS_MIXER (mixer), NULL);
+     370                 :             : 
+     371         [ -  + ]:           9 :   if G_LIKELY (mixer->default_adapter != NULL)
+     372                 :           9 :     ret = valent_mixer_adapter_get_default_input (mixer->default_adapter);
+     373                 :             : 
+     374                 :           9 :   VALENT_RETURN (ret);
+     375                 :             : }
+     376                 :             : 
+     377                 :             : /**
+     378                 :             :  * valent_mixer_set_default_input: (set-property default-input)
+     379                 :             :  * @mixer: a `ValentMixer`
+     380                 :             :  * @stream: a `ValentMixerStream`
+     381                 :             :  *
+     382                 :             :  * Set the default input stream for the primary [class@Valent.MixerAdapter].
+     383                 :             :  *
+     384                 :             :  * Since: 1.0
+     385                 :             :  */
+     386                 :             : void
+     387                 :           2 : valent_mixer_set_default_input (ValentMixer       *mixer,
+     388                 :             :                                 ValentMixerStream *stream)
+     389                 :             : {
+     390                 :           2 :   VALENT_ENTRY;
+     391                 :             : 
+     392         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_MIXER (mixer));
+     393         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     394                 :             : 
+     395         [ +  - ]:           2 :   if G_LIKELY (mixer->default_adapter != NULL)
+     396                 :           2 :     valent_mixer_adapter_set_default_input (mixer->default_adapter, stream);
+     397                 :             : 
+     398                 :           2 :   VALENT_EXIT;
+     399                 :             : }
+     400                 :             : 
+     401                 :             : /**
+     402                 :             :  * valent_mixer_get_default_output: (get-property default-output)
+     403                 :             :  * @mixer: a `ValentMixer`
+     404                 :             :  *
+     405                 :             :  * Get the default output stream for the primary [class@Valent.MixerAdapter].
+     406                 :             :  *
+     407                 :             :  * Returns: (transfer none) (nullable): a `ValentMixerStream`
+     408                 :             :  *
+     409                 :             :  * Since: 1.0
+     410                 :             :  */
+     411                 :             : ValentMixerStream *
+     412                 :          19 : valent_mixer_get_default_output (ValentMixer *mixer)
+     413                 :             : {
+     414                 :          19 :   ValentMixerStream *ret = NULL;
+     415                 :             : 
+     416                 :          19 :   VALENT_ENTRY;
+     417                 :             : 
+     418         [ +  - ]:          19 :   g_return_val_if_fail (VALENT_IS_MIXER (mixer), NULL);
+     419                 :             : 
+     420         [ -  + ]:          19 :   if G_LIKELY (mixer->default_adapter != NULL)
+     421                 :          19 :     ret = valent_mixer_adapter_get_default_output (mixer->default_adapter);
+     422                 :             : 
+     423                 :          19 :   VALENT_RETURN (ret);
+     424                 :             : }
+     425                 :             : 
+     426                 :             : /**
+     427                 :             :  * valent_mixer_set_default_output: (set-property default-output)
+     428                 :             :  * @mixer: a `ValentMixer`
+     429                 :             :  * @stream: a `ValentMixerStream`
+     430                 :             :  *
+     431                 :             :  * Set the default output stream for the primary [class@Valent.MixerAdapter].
+     432                 :             :  *
+     433                 :             :  * Since: 1.0
+     434                 :             :  */
+     435                 :             : void
+     436                 :           4 : valent_mixer_set_default_output (ValentMixer       *mixer,
+     437                 :             :                                  ValentMixerStream *stream)
+     438                 :             : {
+     439                 :           4 :   VALENT_ENTRY;
+     440                 :             : 
+     441         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_MIXER (mixer));
+     442         [ -  + ]:           4 :   g_return_if_fail (VALENT_IS_MIXER_STREAM (stream));
+     443                 :             : 
+     444         [ +  - ]:           4 :   if G_LIKELY (mixer->default_adapter != NULL)
+     445                 :           4 :     valent_mixer_adapter_set_default_output (mixer->default_adapter, stream);
+     446                 :             : 
+     447                 :           4 :   VALENT_EXIT;
+     448                 :             : }
+     449                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer.h.func-c.html b/coverage/src/libvalent/mixer/valent-mixer.h.func-c.html new file mode 100644 index 00000000000..69f2e575578 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MIXER95
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer.h.func.html b/coverage/src/libvalent/mixer/valent-mixer.h.func.html new file mode 100644 index 00000000000..e29226e5dd8 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MIXER95
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/mixer/valent-mixer.h.gcov.html b/coverage/src/libvalent/mixer/valent-mixer.h.gcov.html new file mode 100644 index 00000000000..4d877a19e26 --- /dev/null +++ b/coverage/src/libvalent/mixer/valent-mixer.h.gcov.html @@ -0,0 +1,127 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/mixer/valent-mixer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/mixer - valent-mixer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : #include "valent-mixer-stream.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_MIXER (valent_mixer_get_type ())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :          95 : G_DECLARE_FINAL_TYPE (ValentMixer, valent_mixer, VALENT, MIXER, ValentComponent)
+                   -  + ]
+      19                 :             : 
+      20                 :             : VALENT_AVAILABLE_IN_1_0
+      21                 :             : ValentMixer       * valent_mixer_get_default        (void);
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : ValentMixerStream * valent_mixer_get_default_input  (ValentMixer       *mixer);
+      24                 :             : VALENT_AVAILABLE_IN_1_0
+      25                 :             : void                valent_mixer_set_default_input  (ValentMixer       *mixer,
+      26                 :             :                                                      ValentMixerStream *stream);
+      27                 :             : VALENT_AVAILABLE_IN_1_0
+      28                 :             : ValentMixerStream * valent_mixer_get_default_output (ValentMixer       *mixer);
+      29                 :             : VALENT_AVAILABLE_IN_1_0
+      30                 :             : void                valent_mixer_set_default_output (ValentMixer       *mixer,
+      31                 :             :                                                      ValentMixerStream *stream);
+      32                 :             : 
+      33                 :             : G_END_DECLS
+      34                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-detail-sort-b.html b/coverage/src/libvalent/notifications/index-detail-sort-b.html new file mode 100644 index 00000000000..6e4fba637a6 --- /dev/null +++ b/coverage/src/libvalent/notifications/index-detail-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-detail-sort-f.html b/coverage/src/libvalent/notifications/index-detail-sort-f.html new file mode 100644 index 00000000000..aa9e106ebc4 --- /dev/null +++ b/coverage/src/libvalent/notifications/index-detail-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-detail-sort-l.html b/coverage/src/libvalent/notifications/index-detail-sort-l.html new file mode 100644 index 00000000000..1da40050b7a --- /dev/null +++ b/coverage/src/libvalent/notifications/index-detail-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-detail.html b/coverage/src/libvalent/notifications/index-detail.html new file mode 100644 index 00000000000..27b277896a2 --- /dev/null +++ b/coverage/src/libvalent/notifications/index-detail.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-sort-b.html b/coverage/src/libvalent/notifications/index-sort-b.html new file mode 100644 index 00000000000..6e4fba637a6 --- /dev/null +++ b/coverage/src/libvalent/notifications/index-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-sort-f.html b/coverage/src/libvalent/notifications/index-sort-f.html new file mode 100644 index 00000000000..aa9e106ebc4 --- /dev/null +++ b/coverage/src/libvalent/notifications/index-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index-sort-l.html b/coverage/src/libvalent/notifications/index-sort-l.html new file mode 100644 index 00000000000..1da40050b7a --- /dev/null +++ b/coverage/src/libvalent/notifications/index-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/index.html b/coverage/src/libvalent/notifications/index.html new file mode 100644 index 00000000000..27b277896a2 --- /dev/null +++ b/coverage/src/libvalent/notifications/index.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notificationsCoverageTotalHit
Test:Code CoverageLines:90.0 %460414
Test Date:2024-03-31 18:46:36Functions:95.2 %6360
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.9 %339186
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification.c +
96.7%96.7%
+
96.7 %30729760.4 %225136100.0 %3535
valent-notification.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-notifications-adapter.c +
61.3%61.3%
+
61.3 %311931.2 %16577.8 %97
valent-notifications-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notifications.c +
79.8%79.8%
+
79.8 %1199540.5 %743093.8 %1615
valent-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notification.c.func-c.html b/coverage/src/libvalent/notifications/valent-notification.c.func-c.html new file mode 100644 index 00000000000..58bb32a0c3b --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notification.c.func-c.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notification.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notification.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.7 %307297
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.4 %225136
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notification_add_button1
valent_notification_equal1
valent_notification_serialize_button1
valent_notification_set_action1
notification_button_free2
valent_notification_add_button_with_target2
valent_notification_deserialize2
valent_notification_get_time2
valent_notification_hash2
valent_notification_set_action_and_target2
valent_notification_set_priority_nick2
valent_notification_get_priority3
valent_notification_get_priority_nick3
valent_notification_serialize3
valent_notification_new5
valent_notification_set_priority5
valent_notification_set_time5
valent_notification_class_init6
valent_notification_set_application7
valent_notification_get_id8
valent_notification_get_body9
valent_notification_get_title9
valent_notification_set_body9
valent_notification_finalize11
valent_notification_init11
valent_notification_set_icon11
valent_notification_set_id11
valent_notification_set_title12
valent_notification_get_property19
valent_notification_get_icon20
valent_notification_get_application24
valent_notification_set_property28
valent_notification_get_type429
valent_notification_class_intern_init6
valent_notification_get_type_once86
valent_notification_get_type337
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notification.c.func.html b/coverage/src/libvalent/notifications/valent-notification.c.func.html new file mode 100644 index 00000000000..85ccf5fd371 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notification.c.func.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notification.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notification.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.7 %307297
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.4 %225136
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
notification_button_free2
valent_notification_add_button1
valent_notification_add_button_with_target2
valent_notification_class_init6
valent_notification_deserialize2
valent_notification_equal1
valent_notification_finalize11
valent_notification_get_application24
valent_notification_get_body9
valent_notification_get_icon20
valent_notification_get_id8
valent_notification_get_priority3
valent_notification_get_priority_nick3
valent_notification_get_property19
valent_notification_get_time2
valent_notification_get_title9
valent_notification_get_type429
valent_notification_class_intern_init6
valent_notification_get_type337
valent_notification_get_type_once86
valent_notification_hash2
valent_notification_init11
valent_notification_new5
valent_notification_serialize3
valent_notification_serialize_button1
valent_notification_set_action1
valent_notification_set_action_and_target2
valent_notification_set_application7
valent_notification_set_body9
valent_notification_set_icon11
valent_notification_set_id11
valent_notification_set_priority5
valent_notification_set_priority_nick2
valent_notification_set_property28
valent_notification_set_time5
valent_notification_set_title12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notification.c.gcov.html b/coverage/src/libvalent/notifications/valent-notification.c.gcov.html new file mode 100644 index 00000000000..e6acb9695c4 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notification.c.gcov.html @@ -0,0 +1,1105 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notification.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notification.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.7 %307297
Test Date:2024-03-31 18:46:36Functions:100.0 %3535
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.4 %225136
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notifications"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-notification.h"
+      12                 :             : 
+      13                 :             : /**
+      14                 :             :  * ValentNotification:
+      15                 :             :  *
+      16                 :             :  * A class representing a notification.
+      17                 :             :  *
+      18                 :             :  * `ValentNotification` is a derivable, generic class for a notification.
+      19                 :             :  *
+      20                 :             :  * Since: 1.0
+      21                 :             :  */
+      22                 :             : 
+      23                 :             : struct _ValentNotification
+      24                 :             : {
+      25                 :             :   GObject                parent_instance;
+      26                 :             : 
+      27                 :             :   char                  *application;
+      28                 :             :   char                  *id;
+      29                 :             :   char                  *title;
+      30                 :             :   char                  *body;
+      31                 :             :   GIcon                 *icon;
+      32                 :             :   int64_t                time;
+      33                 :             :   char                  *default_action;
+      34                 :             :   GVariant              *default_action_target;
+      35                 :             :   GPtrArray             *buttons;
+      36                 :             :   GNotificationPriority  priority;
+      37                 :             : };
+      38                 :             : 
+      39                 :             : enum {
+      40                 :             :   PROP_0,
+      41                 :             :   PROP_ACTION,
+      42                 :             :   PROP_APPLICATION,
+      43                 :             :   PROP_BODY,
+      44                 :             :   PROP_ICON,
+      45                 :             :   PROP_ID,
+      46                 :             :   PROP_PRIORITY,
+      47                 :             :   PROP_TIME,
+      48                 :             :   PROP_TITLE,
+      49                 :             :   N_PROPERTIES
+      50                 :             : };
+      51                 :             : 
+      52   [ +  +  +  - ]:         429 : G_DEFINE_FINAL_TYPE (ValentNotification, valent_notification, G_TYPE_OBJECT)
+      53                 :             : 
+      54                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      55                 :             : 
+      56                 :             : 
+      57                 :             : /*
+      58                 :             :  * Notification Buttons
+      59                 :             :  */
+      60                 :             : typedef struct
+      61                 :             : {
+      62                 :             :   char     *label;
+      63                 :             :   char     *action;
+      64                 :             :   GVariant *target;
+      65                 :             : } Button;
+      66                 :             : 
+      67                 :             : static void
+      68                 :           2 : notification_button_free (gpointer data)
+      69                 :             : {
+      70                 :           2 :   Button *button = data;
+      71                 :             : 
+      72         [ +  - ]:           2 :   g_clear_pointer (&button->label, g_free);
+      73         [ +  - ]:           2 :   g_clear_pointer (&button->action, g_free);
+      74         [ +  - ]:           2 :   g_clear_pointer (&button->target, g_variant_unref);
+      75                 :           2 :   g_free (data);
+      76                 :           2 : }
+      77                 :             : 
+      78                 :             : 
+      79                 :             : /*
+      80                 :             :  * (De)serializing helpers
+      81                 :             :  */
+      82                 :             : static GVariant *
+      83                 :           1 : valent_notification_serialize_button (Button *button)
+      84                 :             : {
+      85                 :           1 :   GVariantBuilder builder;
+      86                 :             : 
+      87                 :           1 :   g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+      88                 :             : 
+      89                 :           1 :   g_variant_builder_add (&builder, "{sv}", "label", g_variant_new_string (button->label));
+      90                 :           1 :   g_variant_builder_add (&builder, "{sv}", "action", g_variant_new_string (button->action));
+      91                 :             : 
+      92         [ +  - ]:           1 :   if (button->target)
+      93                 :           1 :     g_variant_builder_add (&builder, "{sv}", "target", button->target);
+      94                 :             : 
+      95                 :           1 :   return g_variant_builder_end (&builder);
+      96                 :             : }
+      97                 :             : 
+      98                 :             : static GVariant *
+      99                 :           3 : valent_notification_get_priority_nick (ValentNotification *notification)
+     100                 :             : {
+     101                 :           6 :   g_autoptr (GEnumClass) enum_class = NULL;
+     102                 :           3 :   GEnumValue *enum_value;
+     103                 :             : 
+     104                 :           3 :   enum_class = g_type_class_ref (G_TYPE_NOTIFICATION_PRIORITY);
+     105                 :           3 :   enum_value = g_enum_get_value (enum_class, notification->priority);
+     106                 :             : 
+     107         [ +  - ]:           3 :   g_assert (enum_value != NULL);
+     108                 :             : 
+     109         [ +  - ]:           3 :   return g_variant_new_string (enum_value->value_nick);
+     110                 :             : }
+     111                 :             : 
+     112                 :             : static void
+     113                 :           2 : valent_notification_set_priority_nick (ValentNotification *notification,
+     114                 :             :                                        const char         *nick)
+     115                 :             : {
+     116                 :           4 :   g_autoptr (GEnumClass) enum_class = NULL;
+     117                 :           2 :   GEnumValue *enum_value;
+     118                 :             : 
+     119                 :           2 :   enum_class = g_type_class_ref (G_TYPE_NOTIFICATION_PRIORITY);
+     120                 :           2 :   enum_value = g_enum_get_value_by_nick (enum_class, nick);
+     121                 :             : 
+     122         [ +  - ]:           2 :   g_assert (enum_value != NULL);
+     123                 :             : 
+     124         [ +  - ]:           2 :   valent_notification_set_priority (notification, enum_value->value);
+     125                 :           2 : }
+     126                 :             : 
+     127                 :             : 
+     128                 :             : /*
+     129                 :             :  * GObject
+     130                 :             :  */
+     131                 :             : static void
+     132                 :          11 : valent_notification_finalize (GObject *object)
+     133                 :             : {
+     134                 :          11 :   ValentNotification *self = VALENT_NOTIFICATION (object);
+     135                 :             : 
+     136         [ +  + ]:          11 :   g_clear_pointer (&self->application, g_free);
+     137         [ +  - ]:          11 :   g_clear_pointer (&self->id, g_free);
+     138         [ +  - ]:          11 :   g_clear_pointer (&self->title, g_free);
+     139         [ +  + ]:          11 :   g_clear_pointer (&self->body, g_free);
+     140         [ +  + ]:          11 :   g_clear_object (&self->icon);
+     141                 :             : 
+     142         [ +  + ]:          11 :   g_clear_pointer (&self->default_action, g_free);
+     143         [ +  + ]:          11 :   g_clear_pointer (&self->default_action_target, g_variant_unref);
+     144         [ +  - ]:          11 :   g_clear_pointer (&self->buttons, g_ptr_array_unref);
+     145                 :             : 
+     146                 :          11 :   G_OBJECT_CLASS (valent_notification_parent_class)->finalize (object);
+     147                 :          11 : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :          19 : valent_notification_get_property (GObject    *object,
+     151                 :             :                                   guint       prop_id,
+     152                 :             :                                   GValue     *value,
+     153                 :             :                                   GParamSpec *pspec)
+     154                 :             : {
+     155                 :          19 :   ValentNotification *self = VALENT_NOTIFICATION (object);
+     156                 :             : 
+     157   [ +  +  +  +  :          19 :   switch (prop_id)
+             +  +  +  - ]
+     158                 :             :     {
+     159                 :           3 :     case PROP_APPLICATION:
+     160                 :           3 :       g_value_set_string (value, valent_notification_get_application (self));
+     161                 :           3 :       break;
+     162                 :             : 
+     163                 :           3 :     case PROP_BODY:
+     164                 :           3 :       g_value_set_string (value, valent_notification_get_body (self));
+     165                 :           3 :       break;
+     166                 :             : 
+     167                 :           3 :     case PROP_ID:
+     168                 :           3 :       g_value_set_string (value, valent_notification_get_id (self));
+     169                 :           3 :       break;
+     170                 :             : 
+     171                 :           3 :     case PROP_ICON:
+     172                 :           3 :       g_value_set_object (value, valent_notification_get_icon (self));
+     173                 :           3 :       break;
+     174                 :             : 
+     175                 :           3 :     case PROP_PRIORITY:
+     176                 :           3 :       g_value_set_enum (value, valent_notification_get_priority (self));
+     177                 :           3 :       break;
+     178                 :             : 
+     179                 :           1 :     case PROP_TIME:
+     180                 :           1 :       g_value_set_int64 (value, valent_notification_get_time (self));
+     181                 :           1 :       break;
+     182                 :             : 
+     183                 :           3 :     case PROP_TITLE:
+     184                 :           3 :       g_value_set_string (value, valent_notification_get_title (self));
+     185                 :           3 :       break;
+     186                 :             : 
+     187                 :           0 :     default:
+     188                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     189                 :             :     }
+     190                 :          19 : }
+     191                 :             : 
+     192                 :             : static void
+     193                 :          28 : valent_notification_set_property (GObject      *object,
+     194                 :             :                                   guint         prop_id,
+     195                 :             :                                   const GValue *value,
+     196                 :             :                                   GParamSpec   *pspec)
+     197                 :             : {
+     198                 :          28 :   ValentNotification *self = VALENT_NOTIFICATION (object);
+     199                 :             : 
+     200   [ +  +  +  +  :          28 :   switch (prop_id)
+             +  +  +  +  
+                      - ]
+     201                 :             :     {
+     202                 :           1 :     case PROP_ACTION:
+     203                 :           1 :       valent_notification_set_action (self, g_value_get_string (value));
+     204                 :           1 :       break;
+     205                 :             : 
+     206                 :           3 :     case PROP_APPLICATION:
+     207                 :           3 :       valent_notification_set_application (self, g_value_get_string (value));
+     208                 :           3 :       break;
+     209                 :             : 
+     210                 :           4 :     case PROP_BODY:
+     211                 :           4 :       valent_notification_set_body (self, g_value_get_string(value));
+     212                 :           4 :       break;
+     213                 :             : 
+     214                 :           4 :     case PROP_ICON:
+     215                 :           4 :       valent_notification_set_icon (self, g_value_get_object (value));
+     216                 :           4 :       break;
+     217                 :             : 
+     218                 :           6 :     case PROP_ID:
+     219                 :           6 :       valent_notification_set_id (self, g_value_get_string (value));
+     220                 :           6 :       break;
+     221                 :             : 
+     222                 :           1 :     case PROP_PRIORITY:
+     223                 :           1 :       valent_notification_set_priority (self, g_value_get_enum (value));
+     224                 :           1 :       break;
+     225                 :             : 
+     226                 :           2 :     case PROP_TIME:
+     227                 :           2 :       valent_notification_set_time (self, g_value_get_int64 (value));
+     228                 :           2 :       break;
+     229                 :             : 
+     230                 :           7 :     case PROP_TITLE:
+     231                 :           7 :       valent_notification_set_title (self, g_value_get_string (value));
+     232                 :           7 :       break;
+     233                 :             : 
+     234                 :           0 :     default:
+     235                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     236                 :             :     }
+     237                 :          28 : }
+     238                 :             : 
+     239                 :             : static void
+     240                 :          11 : valent_notification_init (ValentNotification *notification)
+     241                 :             : {
+     242                 :          11 :   notification->id = g_uuid_string_random ();
+     243                 :          11 :   notification->buttons = g_ptr_array_new_full (3, notification_button_free);
+     244                 :          11 : }
+     245                 :             : 
+     246                 :             : static void
+     247                 :           6 : valent_notification_class_init (ValentNotificationClass *klass)
+     248                 :             : {
+     249                 :           6 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     250                 :             : 
+     251                 :           6 :   object_class->finalize = valent_notification_finalize;
+     252                 :           6 :   object_class->get_property = valent_notification_get_property;
+     253                 :           6 :   object_class->set_property = valent_notification_set_property;
+     254                 :             : 
+     255                 :             :   /**
+     256                 :             :    * ValentNotification:action:
+     257                 :             :    *
+     258                 :             :    * The default notification action.
+     259                 :             :    *
+     260                 :             :    * Since: 1.0
+     261                 :             :    */
+     262                 :          12 :   properties [PROP_ACTION] =
+     263                 :           6 :     g_param_spec_string ("action", NULL, NULL,
+     264                 :             :                          NULL,
+     265                 :             :                          (G_PARAM_WRITABLE |
+     266                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     267                 :             :                           G_PARAM_STATIC_STRINGS));
+     268                 :             : 
+     269                 :             :   /**
+     270                 :             :    * ValentNotification:application: (getter get_application) (setter set_application)
+     271                 :             :    *
+     272                 :             :    * The notifying application.
+     273                 :             :    *
+     274                 :             :    * The semantics of this property are not well-defined. It may be the
+     275                 :             :    * application name (i.e. the `appName` argument passed to
+     276                 :             :    * `org.freedesktop.Notifications.Notify()`), the desktop application ID (i.e.
+     277                 :             :    * from `org.gtk.Notifications.AddNotification()`) or some other identifying
+     278                 :             :    * string.
+     279                 :             :    *
+     280                 :             :    * Since: 1.0
+     281                 :             :    */
+     282                 :          12 :   properties [PROP_APPLICATION] =
+     283                 :           6 :     g_param_spec_string ("application", NULL, NULL,
+     284                 :             :                          NULL,
+     285                 :             :                          (G_PARAM_READWRITE |
+     286                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     287                 :             :                           G_PARAM_STATIC_STRINGS));
+     288                 :             : 
+     289                 :             :   /**
+     290                 :             :    * ValentNotification:body: (getter get_body) (setter set_body)
+     291                 :             :    *
+     292                 :             :    * The notification body.
+     293                 :             :    *
+     294                 :             :    * Since: 1.0
+     295                 :             :    */
+     296                 :          12 :   properties [PROP_BODY] =
+     297                 :           6 :     g_param_spec_string ("body", NULL, NULL,
+     298                 :             :                          NULL,
+     299                 :             :                          (G_PARAM_READWRITE |
+     300                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     301                 :             :                           G_PARAM_STATIC_STRINGS));
+     302                 :             : 
+     303                 :             :   /**
+     304                 :             :    * ValentNotification:icon: (getter get_icon) (setter set_icon)
+     305                 :             :    *
+     306                 :             :    * The notification [iface@Gio.Icon].
+     307                 :             :    *
+     308                 :             :    * Since: 1.0
+     309                 :             :    */
+     310                 :          12 :   properties [PROP_ICON] =
+     311                 :           6 :     g_param_spec_object ("icon", NULL, NULL,
+     312                 :             :                          G_TYPE_ICON,
+     313                 :             :                          (G_PARAM_READWRITE |
+     314                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     315                 :             :                           G_PARAM_STATIC_STRINGS));
+     316                 :             : 
+     317                 :             :   /**
+     318                 :             :    * ValentNotification:id: (getter get_id) (setter set_id)
+     319                 :             :    *
+     320                 :             :    * The unique ID of the notification.
+     321                 :             :    *
+     322                 :             :    * Since: 1.0
+     323                 :             :    */
+     324                 :          12 :   properties [PROP_ID] =
+     325                 :           6 :     g_param_spec_string ("id", NULL, NULL,
+     326                 :             :                          NULL,
+     327                 :             :                          (G_PARAM_READWRITE |
+     328                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     329                 :             :                           G_PARAM_STATIC_STRINGS));
+     330                 :             : 
+     331                 :             :   /**
+     332                 :             :    * ValentNotification:priority: (getter get_priority) (setter set_priority)
+     333                 :             :    *
+     334                 :             :    * The notification priority.
+     335                 :             :    *
+     336                 :             :    * Since: 1.0
+     337                 :             :    */
+     338                 :          12 :   properties [PROP_PRIORITY] =
+     339                 :           6 :     g_param_spec_enum ("priority", NULL, NULL,
+     340                 :             :                        G_TYPE_NOTIFICATION_PRIORITY,
+     341                 :             :                        G_NOTIFICATION_PRIORITY_NORMAL,
+     342                 :             :                        (G_PARAM_READWRITE |
+     343                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     344                 :             :                         G_PARAM_STATIC_STRINGS));
+     345                 :             : 
+     346                 :             :   /**
+     347                 :             :    * ValentNotification:time: (getter get_time) (setter set_time)
+     348                 :             :    *
+     349                 :             :    * The posting time of the notification in milliseconds.
+     350                 :             :    *
+     351                 :             :    * Since: 1.0
+     352                 :             :    */
+     353                 :          12 :   properties [PROP_TIME] =
+     354                 :           6 :     g_param_spec_int64 ("time", NULL, NULL,
+     355                 :             :                         0, G_MAXINT64,
+     356                 :             :                         0,
+     357                 :             :                         (G_PARAM_READWRITE |
+     358                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     359                 :             :                          G_PARAM_STATIC_STRINGS));
+     360                 :             : 
+     361                 :             :   /**
+     362                 :             :    * ValentNotification:title: (getter get_title) (setter set_title)
+     363                 :             :    *
+     364                 :             :    * The title of the notification
+     365                 :             :    *
+     366                 :             :    * Since: 1.0
+     367                 :             :    */
+     368                 :          12 :   properties [PROP_TITLE] =
+     369                 :           6 :     g_param_spec_string ("title", NULL, NULL,
+     370                 :             :                          NULL,
+     371                 :             :                          (G_PARAM_READWRITE |
+     372                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     373                 :             :                           G_PARAM_STATIC_STRINGS));
+     374                 :             : 
+     375                 :           6 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     376                 :           6 : }
+     377                 :             : 
+     378                 :             : /**
+     379                 :             :  * valent_notification_new:
+     380                 :             :  * @title: (nullable): a notification title
+     381                 :             :  *
+     382                 :             :  * Create a new `ValentNotification`.
+     383                 :             :  *
+     384                 :             :  * A notification without a title (or primary text) is not strictly possible,
+     385                 :             :  * but this is allowed during construction for the case where it is more
+     386                 :             :  * convenient to set it later.
+     387                 :             :  *
+     388                 :             :  * Returns: (transfer full): a `ValentNotification`
+     389                 :             :  *
+     390                 :             :  * Since: 1.0
+     391                 :             :  */
+     392                 :             : ValentNotification *
+     393                 :           5 : valent_notification_new (const char *title)
+     394                 :             : {
+     395         [ +  - ]:           5 :   if (title == NULL)
+     396                 :           5 :     return g_object_new (VALENT_TYPE_NOTIFICATION, NULL);
+     397                 :             :   else
+     398                 :           0 :     return g_object_new (VALENT_TYPE_NOTIFICATION,
+     399                 :             :                          "title", title,
+     400                 :             :                          NULL);
+     401                 :             : }
+     402                 :             : 
+     403                 :             : /**
+     404                 :             :  * valent_notification_set_action:
+     405                 :             :  * @notification: a `ValentNotification`
+     406                 :             :  * @action: a detailed action
+     407                 :             :  *
+     408                 :             :  * Sets the default notification action.
+     409                 :             :  *
+     410                 :             :  * @action may be a detailed action as parsed by
+     411                 :             :  * [func@Gio.Action.parse_detailed_name].
+     412                 :             :  *
+     413                 :             :  * Since: 1.0
+     414                 :             :  */
+     415                 :             : void
+     416                 :           1 : valent_notification_set_action (ValentNotification *notification,
+     417                 :             :                                 const char         *action)
+     418                 :             : {
+     419                 :           1 :   g_autofree char *aname = NULL;
+     420                 :           1 :   g_autoptr (GVariant) atarget = NULL;
+     421   [ +  -  -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     422                 :             : 
+     423         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     424                 :             : 
+     425         [ -  + ]:           1 :   if (!g_action_parse_detailed_name (action, &aname, &atarget, &error))
+     426                 :             :     {
+     427                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     428                 :           0 :       return;
+     429                 :             :     }
+     430                 :             : 
+     431         [ -  + ]:           1 :   valent_notification_set_action_and_target (notification, aname, atarget);
+     432                 :             : }
+     433                 :             : 
+     434                 :             : /**
+     435                 :             :  * valent_notification_get_application: (get-property application)
+     436                 :             :  * @notification: a `ValentNotification`
+     437                 :             :  *
+     438                 :             :  * Get the notifying application.
+     439                 :             :  *
+     440                 :             :  * Returns: (transfer none) (nullable): the notifying application name
+     441                 :             :  *
+     442                 :             :  * Since: 1.0
+     443                 :             :  */
+     444                 :             : const char *
+     445                 :          24 : valent_notification_get_application (ValentNotification *notification)
+     446                 :             : {
+     447         [ +  - ]:          24 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), NULL);
+     448                 :             : 
+     449                 :          24 :   return notification->application;
+     450                 :             : }
+     451                 :             : 
+     452                 :             : /**
+     453                 :             :  * valent_notification_set_application: (set-property application)
+     454                 :             :  * @notification: a `ValentNotification`
+     455                 :             :  * @application: (nullable): the notifying application
+     456                 :             :  *
+     457                 :             :  * Set the notifying application.
+     458                 :             :  *
+     459                 :             :  * Since: 1.0
+     460                 :             :  */
+     461                 :             : void
+     462                 :           7 : valent_notification_set_application (ValentNotification *notification,
+     463                 :             :                                      const char         *application)
+     464                 :             : {
+     465         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     466                 :             : 
+     467         [ +  - ]:           7 :   if (g_set_str (&notification->application, application))
+     468                 :           7 :     g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_APPLICATION]);
+     469                 :             : }
+     470                 :             : 
+     471                 :             : /**
+     472                 :             :  * valent_notification_get_body: (get-property body)
+     473                 :             :  * @notification: a `ValentNotification`
+     474                 :             :  *
+     475                 :             :  * Get the notification body.
+     476                 :             :  *
+     477                 :             :  * Returns: (transfer none) (nullable): the notification body
+     478                 :             :  *
+     479                 :             :  * Since: 1.0
+     480                 :             :  */
+     481                 :             : const char *
+     482                 :           9 : valent_notification_get_body (ValentNotification *notification)
+     483                 :             : {
+     484         [ +  - ]:           9 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), NULL);
+     485                 :             : 
+     486                 :           9 :   return notification->body;
+     487                 :             : }
+     488                 :             : 
+     489                 :             : /**
+     490                 :             :  * valent_notification_set_body: (set-property body)
+     491                 :             :  * @notification: a `ValentNotification`
+     492                 :             :  * @body: (nullable): a notification body
+     493                 :             :  *
+     494                 :             :  * Set the notification body.
+     495                 :             :  *
+     496                 :             :  * Since: 1.0
+     497                 :             :  */
+     498                 :             : void
+     499                 :           9 : valent_notification_set_body (ValentNotification *notification,
+     500                 :             :                               const char         *body)
+     501                 :             : {
+     502         [ +  - ]:           9 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     503                 :             : 
+     504         [ +  - ]:           9 :   if (g_set_str (&notification->body, body))
+     505                 :           9 :     g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_BODY]);
+     506                 :             : }
+     507                 :             : 
+     508                 :             : /**
+     509                 :             :  * valent_notification_get_icon: (set-property icon)
+     510                 :             :  * @notification: a `ValentNotification`
+     511                 :             :  *
+     512                 :             :  * Get the notification icon.
+     513                 :             :  *
+     514                 :             :  * Returns: (transfer none) (nullable): a `GIcon`
+     515                 :             :  *
+     516                 :             :  * Since: 1.0
+     517                 :             :  */
+     518                 :             : GIcon *
+     519                 :          20 : valent_notification_get_icon (ValentNotification *notification)
+     520                 :             : {
+     521         [ +  - ]:          20 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), NULL);
+     522                 :             : 
+     523                 :          20 :   return notification->icon;
+     524                 :             : }
+     525                 :             : 
+     526                 :             : /**
+     527                 :             :  * valent_notification_set_icon: (set-property icon)
+     528                 :             :  * @notification: a `ValentNotification`
+     529                 :             :  * @icon: (nullable): a `GIcon`
+     530                 :             :  *
+     531                 :             :  * Set the notification icon.
+     532                 :             :  *
+     533                 :             :  * Since: 1.0
+     534                 :             :  */
+     535                 :             : void
+     536                 :          11 : valent_notification_set_icon (ValentNotification *notification,
+     537                 :             :                               GIcon              *icon)
+     538                 :             : {
+     539         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     540   [ +  +  +  -  :          11 :   g_return_if_fail (icon == NULL || G_IS_ICON (icon));
+             +  -  -  + ]
+     541                 :             : 
+     542         [ +  + ]:          11 :   if (g_icon_equal (notification->icon, icon))
+     543                 :             :     return;
+     544                 :             : 
+     545                 :          10 :   g_set_object (&notification->icon, icon);
+     546                 :          10 :   g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_ICON]);
+     547                 :             : }
+     548                 :             : 
+     549                 :             : /**
+     550                 :             :  * valent_notification_get_id: (get-property id)
+     551                 :             :  * @notification: a `ValentNotification`
+     552                 :             :  *
+     553                 :             :  * Get the notification ID.
+     554                 :             :  *
+     555                 :             :  * Returns: (transfer none) (not nullable): a unique ID
+     556                 :             :  *
+     557                 :             :  * Since: 1.0
+     558                 :             :  */
+     559                 :             : const char *
+     560                 :           8 : valent_notification_get_id (ValentNotification *notification)
+     561                 :             : {
+     562         [ +  - ]:           8 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), NULL);
+     563                 :             : 
+     564                 :           8 :   return notification->id;
+     565                 :             : }
+     566                 :             : 
+     567                 :             : /**
+     568                 :             :  * valent_notification_set_id: (set-property id)
+     569                 :             :  * @notification: a `ValentNotification`
+     570                 :             :  * @id: (not nullable): a unique ID
+     571                 :             :  *
+     572                 :             :  * Set the notification ID.
+     573                 :             :  *
+     574                 :             :  * Since: 1.0
+     575                 :             :  */
+     576                 :             : void
+     577                 :          11 : valent_notification_set_id (ValentNotification *notification,
+     578                 :             :                             const char         *id)
+     579                 :             : {
+     580         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     581   [ +  -  -  + ]:          11 :   g_return_if_fail (id != NULL && *id != '\0');
+     582                 :             : 
+     583         [ +  + ]:          11 :   if (g_set_str (&notification->id, id))
+     584                 :          10 :     g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_ID]);
+     585                 :             : }
+     586                 :             : 
+     587                 :             : /**
+     588                 :             :  * valent_notification_get_priority:
+     589                 :             :  * @notification: a `ValentNotification`
+     590                 :             :  *
+     591                 :             :  * Get the notification priority.
+     592                 :             :  *
+     593                 :             :  * Returns: a `GNotificationPriority`
+     594                 :             :  *
+     595                 :             :  * Since: 1.0
+     596                 :             :  */
+     597                 :             : GNotificationPriority
+     598                 :           3 : valent_notification_get_priority (ValentNotification *notification)
+     599                 :             : {
+     600         [ +  - ]:           3 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), G_NOTIFICATION_PRIORITY_NORMAL);
+     601                 :             : 
+     602                 :           3 :   return notification->priority;
+     603                 :             : }
+     604                 :             : 
+     605                 :             : /**
+     606                 :             :  * valent_notification_set_priority:
+     607                 :             :  * @notification: a `ValentNotification`
+     608                 :             :  * @priority: a `GNotificationPriority`
+     609                 :             :  *
+     610                 :             :  * Set the notification priority.
+     611                 :             :  *
+     612                 :             :  * Since: 1.0
+     613                 :             :  */
+     614                 :             : void
+     615                 :           5 : valent_notification_set_priority (ValentNotification    *notification,
+     616                 :             :                                   GNotificationPriority  priority)
+     617                 :             : {
+     618         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     619                 :             : 
+     620         [ +  - ]:           5 :   if (notification->priority == priority)
+     621                 :             :     return;
+     622                 :             : 
+     623                 :           5 :   notification->priority = priority;
+     624                 :           5 :   g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_PRIORITY]);
+     625                 :             : }
+     626                 :             : 
+     627                 :             : /**
+     628                 :             :  * valent_notification_get_time: (get-property time)
+     629                 :             :  * @notification: a `ValentNotification`
+     630                 :             :  *
+     631                 :             :  * Get the notification time.
+     632                 :             :  *
+     633                 :             :  * Returns: a UNIX epoch timestamp (ms)
+     634                 :             :  *
+     635                 :             :  * Since: 1.0
+     636                 :             :  */
+     637                 :             : int64_t
+     638                 :           2 : valent_notification_get_time (ValentNotification *notification)
+     639                 :             : {
+     640         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), 0);
+     641                 :             : 
+     642                 :           2 :   return notification->time;
+     643                 :             : }
+     644                 :             : 
+     645                 :             : /**
+     646                 :             :  * valent_notification_set_time: (set-property time)
+     647                 :             :  * @notification: a `ValentNotification`
+     648                 :             :  * @time: a UNIX epoch timestamp (ms)
+     649                 :             :  *
+     650                 :             :  * Set the notification time.
+     651                 :             :  *
+     652                 :             :  * Since: 1.0
+     653                 :             :  */
+     654                 :             : void
+     655                 :           5 : valent_notification_set_time (ValentNotification *notification,
+     656                 :             :                               int64_t             time)
+     657                 :             : {
+     658         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     659                 :             : 
+     660         [ +  - ]:           5 :   if (notification->time == time)
+     661                 :             :     return;
+     662                 :             : 
+     663                 :           5 :   notification->time = time;
+     664                 :           5 :   g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_TIME]);
+     665                 :             : }
+     666                 :             : 
+     667                 :             : /**
+     668                 :             :  * valent_notification_get_title: (get-property title)
+     669                 :             :  * @notification: a `ValentNotification`
+     670                 :             :  *
+     671                 :             :  * Get the notification title.
+     672                 :             :  *
+     673                 :             :  * Returns: (transfer none) (nullable): the notification title
+     674                 :             :  *
+     675                 :             :  * Since: 1.0
+     676                 :             :  */
+     677                 :             : const char *
+     678                 :           9 : valent_notification_get_title (ValentNotification *notification)
+     679                 :             : {
+     680         [ +  - ]:           9 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), NULL);
+     681                 :             : 
+     682                 :           9 :   return notification->title;
+     683                 :             : }
+     684                 :             : 
+     685                 :             : /**
+     686                 :             :  * valent_notification_set_title: (set-property title)
+     687                 :             :  * @notification: a `ValentNotification`
+     688                 :             :  * @title: (not nullable): a notification title
+     689                 :             :  *
+     690                 :             :  * Set the notification title.
+     691                 :             :  *
+     692                 :             :  * Since: 1.0
+     693                 :             :  */
+     694                 :             : void
+     695                 :          12 : valent_notification_set_title (ValentNotification *notification,
+     696                 :             :                                const char         *title)
+     697                 :             : {
+     698         [ +  - ]:          12 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     699         [ -  + ]:          12 :   g_return_if_fail (title != NULL);
+     700                 :             : 
+     701         [ +  + ]:          12 :   if (g_set_str (&notification->title, title))
+     702                 :          11 :     g_object_notify_by_pspec (G_OBJECT (notification), properties [PROP_TITLE]);
+     703                 :             : }
+     704                 :             : 
+     705                 :             : /**
+     706                 :             :  * valent_notification_add_button_with_target:
+     707                 :             :  * @notification: a `ValentNotification`
+     708                 :             :  * @label: a button label
+     709                 :             :  * @action: an action name
+     710                 :             :  * @target: (nullable): an action target
+     711                 :             :  *
+     712                 :             :  * Add a notification button.
+     713                 :             :  *
+     714                 :             :  * Since: 1.0
+     715                 :             :  */
+     716                 :             : void
+     717                 :           2 : valent_notification_add_button_with_target (ValentNotification *notification,
+     718                 :             :                                             const char         *label,
+     719                 :             :                                             const char         *action,
+     720                 :             :                                             GVariant           *target)
+     721                 :             : {
+     722                 :           2 :   Button *button;
+     723                 :             : 
+     724         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     725         [ -  + ]:           2 :   g_return_if_fail (label != NULL);
+     726   [ +  -  -  + ]:           2 :   g_return_if_fail (action != NULL && g_action_name_is_valid (action));
+     727         [ -  + ]:           2 :   g_return_if_fail (notification->buttons->len < 3);
+     728                 :             : 
+     729                 :           2 :   button = g_new0 (Button, 1);
+     730         [ -  + ]:           2 :   button->label = g_strdup (label);
+     731         [ -  + ]:           2 :   button->action = g_strdup (action);
+     732                 :             : 
+     733         [ +  - ]:           2 :   if (target)
+     734                 :           2 :     button->target = g_variant_ref_sink (target);
+     735                 :             : 
+     736                 :           2 :   g_ptr_array_add (notification->buttons, button);
+     737                 :             : }
+     738                 :             : 
+     739                 :             : /**
+     740                 :             :  * valent_notification_add_button:
+     741                 :             :  * @notification: a `ValentNotification`
+     742                 :             :  * @label: a button label
+     743                 :             :  * @action: an action name
+     744                 :             :  *
+     745                 :             :  * Add a notification button.
+     746                 :             :  *
+     747                 :             :  * Since: 1.0
+     748                 :             :  */
+     749                 :             : void
+     750                 :           1 : valent_notification_add_button (ValentNotification *notification,
+     751                 :             :                                 const char         *label,
+     752                 :             :                                 const char         *action)
+     753                 :             : {
+     754                 :           1 :   g_autofree char *name = NULL;
+     755                 :           1 :   g_autoptr (GVariant) target = NULL;
+     756   [ +  -  -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     757                 :             : 
+     758         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     759         [ -  + ]:           1 :   g_return_if_fail (label != NULL);
+     760         [ -  + ]:           1 :   g_return_if_fail (action != NULL);
+     761         [ -  + ]:           1 :   g_return_if_fail (notification->buttons->len < 3);
+     762                 :             : 
+     763         [ -  + ]:           1 :   if (!g_action_parse_detailed_name (action, &name, &target, &error))
+     764                 :             :     {
+     765                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     766                 :           0 :       return;
+     767                 :             :     }
+     768                 :             : 
+     769         [ -  + ]:           1 :   valent_notification_add_button_with_target (notification, label, name, target);
+     770                 :             : }
+     771                 :             : 
+     772                 :             : /**
+     773                 :             :  * valent_notification_set_action_and_target:
+     774                 :             :  * @notification: a `ValentNotification`
+     775                 :             :  * @action: an action name
+     776                 :             :  * @target: (nullable): a `GVariant` to use as @action's parameter
+     777                 :             :  *
+     778                 :             :  * Set the default notification action.
+     779                 :             :  *
+     780                 :             :  * If @target is non-%NULL, @action will be activated with @target as its
+     781                 :             :  * parameter.
+     782                 :             :  *
+     783                 :             :  * Since: 1.0
+     784                 :             :  */
+     785                 :             : void
+     786                 :           2 : valent_notification_set_action_and_target (ValentNotification *notification,
+     787                 :             :                                            const char         *action,
+     788                 :             :                                            GVariant           *target)
+     789                 :             : {
+     790         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     791   [ +  -  -  + ]:           2 :   g_return_if_fail (action != NULL && g_action_name_is_valid (action));
+     792                 :             : 
+     793                 :           2 :   g_set_str (&notification->default_action, action);
+     794         [ -  + ]:           2 :   g_clear_pointer (&notification->default_action_target, g_variant_unref);
+     795                 :             : 
+     796         [ +  - ]:           2 :   if (target)
+     797                 :           2 :     notification->default_action_target = g_variant_ref_sink (target);
+     798                 :             : }
+     799                 :             : 
+     800                 :             : /**
+     801                 :             :  * valent_notification_serialize:
+     802                 :             :  * @notification: a `ValentNotification`
+     803                 :             :  *
+     804                 :             :  * Serialize the notification into a variant of type `a{sv}`.
+     805                 :             :  *
+     806                 :             :  * Returns: (nullable): a floating `GVariant`
+     807                 :             :  *
+     808                 :             :  * Since: 1.0
+     809                 :             :  */
+     810                 :             : GVariant *
+     811                 :           3 : valent_notification_serialize (ValentNotification *notification)
+     812                 :             : {
+     813                 :           3 :   GVariantBuilder builder;
+     814                 :             : 
+     815         [ +  - ]:           3 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION (notification), NULL);
+     816                 :             : 
+     817                 :           3 :   g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+     818                 :             : 
+     819         [ +  - ]:           3 :   if (notification->id)
+     820                 :           3 :     g_variant_builder_add (&builder, "{sv}", "id",
+     821                 :             :                            g_variant_new_string (notification->id));
+     822                 :             : 
+     823         [ +  - ]:           3 :   if (notification->application)
+     824                 :           3 :     g_variant_builder_add (&builder, "{sv}", "application",
+     825                 :             :                            g_variant_new_string (notification->application));
+     826                 :             : 
+     827         [ +  - ]:           3 :   if (notification->title)
+     828                 :           3 :     g_variant_builder_add (&builder, "{sv}", "title",
+     829                 :             :                            g_variant_new_string (notification->title));
+     830                 :             : 
+     831         [ +  - ]:           3 :   if (notification->body)
+     832                 :           3 :     g_variant_builder_add (&builder, "{sv}", "body",
+     833                 :             :                            g_variant_new_string (notification->body));
+     834                 :             : 
+     835         [ +  + ]:           3 :   if (notification->icon)
+     836                 :             :     {
+     837                 :           5 :       g_autoptr (GVariant) serialized_icon = NULL;
+     838                 :             : 
+     839         [ +  - ]:           2 :       if ((serialized_icon = g_icon_serialize (notification->icon)))
+     840                 :           2 :         g_variant_builder_add (&builder, "{sv}", "icon", serialized_icon);
+     841                 :             :     }
+     842                 :             : 
+     843                 :           3 :   g_variant_builder_add (&builder, "{sv}", "priority",
+     844                 :             :                          valent_notification_get_priority_nick (notification));
+     845                 :             : 
+     846         [ +  + ]:           3 :   if (notification->default_action)
+     847                 :             :     {
+     848                 :           1 :       g_variant_builder_add (&builder, "{sv}", "default-action",
+     849                 :             :                              g_variant_new_string (notification->default_action));
+     850                 :             : 
+     851         [ +  - ]:           1 :       if (notification->default_action_target)
+     852                 :           1 :         g_variant_builder_add (&builder, "{sv}", "default-action-target",
+     853                 :             :                                notification->default_action_target);
+     854                 :             :     }
+     855                 :             : 
+     856         [ +  + ]:           3 :   if (notification->buttons->len > 0)
+     857                 :             :     {
+     858                 :           1 :       GVariantBuilder actions_builder;
+     859                 :             : 
+     860                 :           1 :       g_variant_builder_init (&actions_builder, G_VARIANT_TYPE ("aa{sv}"));
+     861                 :             : 
+     862         [ +  + ]:           2 :       for (unsigned int i = 0; i < notification->buttons->len; i++)
+     863                 :             :         {
+     864                 :           1 :           Button *button;
+     865                 :             : 
+     866                 :           1 :           button = g_ptr_array_index (notification->buttons, i);
+     867                 :           1 :           g_variant_builder_add (&actions_builder, "@a{sv}",
+     868                 :             :                                  valent_notification_serialize_button (button));
+     869                 :             :         }
+     870                 :             : 
+     871                 :           1 :       g_variant_builder_add (&builder, "{sv}", "buttons",
+     872                 :             :                              g_variant_builder_end (&actions_builder));
+     873                 :             :     }
+     874                 :             : 
+     875                 :           3 :   return g_variant_builder_end (&builder);
+     876                 :             : }
+     877                 :             : 
+     878                 :             : /**
+     879                 :             :  * valent_notification_deserialize:
+     880                 :             :  * @variant: a `GVariant`
+     881                 :             :  *
+     882                 :             :  * Deserializes @variant into a `ValentNotification`. Since `ValentNotification`
+     883                 :             :  * is effectively a super-set of `GNotification`, @variant may be a serialized
+     884                 :             :  * `GNotification` or `ValentNotification`.
+     885                 :             :  *
+     886                 :             :  * Returns: (transfer full) (nullable): a `ValentNotification`
+     887                 :             :  *
+     888                 :             :  * Since: 1.0
+     889                 :             :  */
+     890                 :             : ValentNotification *
+     891                 :           2 : valent_notification_deserialize (GVariant *variant)
+     892                 :             : {
+     893                 :           2 :   ValentNotification *notification;
+     894                 :           4 :   g_autoptr (GVariant) props = NULL;
+     895         [ +  - ]:           2 :   g_autoptr (GVariant) icon = NULL;
+     896         [ +  - ]:           2 :   g_autoptr (GVariant) buttons = NULL;
+     897                 :           2 :   const char *id, *title, *body, *priority, *application;
+     898                 :           2 :   const char *default_action;
+     899                 :             : 
+     900         [ +  - ]:           2 :   g_return_val_if_fail (g_variant_check_format_string (variant, "a{sv}", FALSE), NULL);
+     901                 :             : 
+     902                 :           2 :   notification = valent_notification_new (NULL);
+     903                 :             : 
+     904                 :           2 :   g_variant_get (variant, "@a{sv}", &props);
+     905                 :             : 
+     906         [ +  + ]:           2 :   if (g_variant_lookup (props, "id", "&s", &id))
+     907                 :           1 :     valent_notification_set_id (notification, id);
+     908                 :             : 
+     909         [ +  + ]:           2 :   if (g_variant_lookup (props, "application", "&s", &application))
+     910                 :           1 :     valent_notification_set_application (notification, application);
+     911                 :             : 
+     912         [ +  - ]:           2 :   if (g_variant_lookup (props, "title", "&s", &title))
+     913                 :           2 :     valent_notification_set_title (notification, title);
+     914                 :             : 
+     915         [ +  - ]:           2 :   if (g_variant_lookup (props, "body", "&s", &body))
+     916                 :           2 :     valent_notification_set_body (notification, body);
+     917                 :             : 
+     918         [ +  - ]:           2 :   if (g_variant_lookup (props, "icon", "@(sv)", &icon))
+     919                 :             :     {
+     920                 :           4 :       g_autoptr (GIcon) gicon = NULL;
+     921                 :             : 
+     922                 :           2 :       gicon = g_icon_deserialize (icon);
+     923         [ +  - ]:           2 :       valent_notification_set_icon (notification, gicon);
+     924                 :             :     }
+     925                 :             : 
+     926         [ +  - ]:           2 :   if (g_variant_lookup (props, "priority", "&s", &priority))
+     927                 :           2 :     valent_notification_set_priority_nick (notification, priority);
+     928                 :             : 
+     929         [ +  + ]:           2 :   if (g_variant_lookup (props, "default-action", "&s", &default_action))
+     930                 :             :     {
+     931                 :           3 :       g_autoptr (GVariant) default_action_target = NULL;
+     932                 :             : 
+     933                 :           1 :       default_action_target = g_variant_lookup_value (props,
+     934                 :             :                                                       "default-action-target",
+     935                 :             :                                                       NULL);
+     936         [ +  - ]:           1 :       valent_notification_set_action_and_target (notification,
+     937                 :             :                                                  default_action,
+     938                 :             :                                                  default_action_target);
+     939                 :             :     }
+     940                 :             : 
+     941         [ +  + ]:           2 :   if (g_variant_lookup (props, "buttons", "@aa{sv}", &buttons))
+     942                 :             :     {
+     943                 :           1 :       GVariantIter iter;
+     944                 :           1 :       size_t n_buttons;
+     945                 :           1 :       GVariant *button;
+     946                 :             : 
+     947                 :           1 :       n_buttons = g_variant_iter_init (&iter, buttons);
+     948         [ -  + ]:           1 :       g_warn_if_fail (n_buttons <= 3);
+     949                 :             : 
+     950         [ +  + ]:           2 :       while (g_variant_iter_next (&iter, "@a{sv}", &button))
+     951                 :             :         {
+     952                 :           1 :           const char *label, *action;
+     953                 :           1 :           g_autoptr (GVariant) target = NULL;
+     954                 :             : 
+     955                 :           1 :           g_variant_lookup (button, "label", "&s", &label);
+     956                 :           1 :           g_variant_lookup (button, "action", "&s", &action);
+     957                 :             : 
+     958         [ +  - ]:           1 :           if ((target = g_variant_lookup_value (button, "target", NULL)))
+     959                 :           1 :             valent_notification_add_button_with_target (notification, label, action, target);
+     960                 :             :           else
+     961                 :           0 :             valent_notification_add_button (notification, label, action);
+     962                 :             : 
+     963         [ +  - ]:           1 :           g_variant_unref (button);
+     964                 :             :         }
+     965                 :             :     }
+     966                 :             : 
+     967                 :             :   return notification;
+     968                 :             : }
+     969                 :             : 
+     970                 :             : /**
+     971                 :             :  * valent_notification_hash:
+     972                 :             :  * @notification: (type Valent.Notification): a `ValentNotification`
+     973                 :             :  *
+     974                 :             :  * Converts a notification to a hash value, using g_str_hash() on the ID.
+     975                 :             :  *
+     976                 :             :  * Returns: a hash value
+     977                 :             :  *
+     978                 :             :  * Since: 1.0
+     979                 :             :  */
+     980                 :             : unsigned int
+     981                 :           2 : valent_notification_hash (gconstpointer notification)
+     982                 :             : {
+     983         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION ((void *)notification), 0);
+     984                 :             : 
+     985                 :           2 :   return g_str_hash (((ValentNotification *)notification)->id);
+     986                 :             : }
+     987                 :             : 
+     988                 :             : /**
+     989                 :             :  * valent_notification_equal:
+     990                 :             :  * @notification1: (type Valent.Notification): a `ValentNotification`
+     991                 :             :  * @notification2: (type Valent.Notification): a `ValentNotification`
+     992                 :             :  *
+     993                 :             :  * Compare two notifications for equality by ID.
+     994                 :             :  *
+     995                 :             :  * Returns: %TRUE if equal, or %FALSE if not
+     996                 :             :  *
+     997                 :             :  * Since: 1.0
+     998                 :             :  */
+     999                 :             : gboolean
+    1000                 :           1 : valent_notification_equal (gconstpointer notification1,
+    1001                 :             :                            gconstpointer notification2)
+    1002                 :             : {
+    1003         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION ((void *)notification1), FALSE);
+    1004         [ -  + ]:           1 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION ((void *)notification2), FALSE);
+    1005                 :             : 
+    1006                 :           1 :   return g_strcmp0 (((ValentNotification *)notification1)->id,
+    1007                 :           1 :                     ((ValentNotification *)notification2)->id) == 0;
+    1008                 :             : }
+    1009                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notification.h.func-c.html b/coverage/src/libvalent/notifications/valent-notification.h.func-c.html new file mode 100644 index 00000000000..bf1556dbf27 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notification.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notification.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notification.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %129
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION167
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notification.h.func.html b/coverage/src/libvalent/notifications/valent-notification.h.func.html new file mode 100644 index 00000000000..335db83f347 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notification.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notification.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notification.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %129
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION167
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notification.h.gcov.html b/coverage/src/libvalent/notifications/valent-notification.h.gcov.html new file mode 100644 index 00000000000..488c3f362dd --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notification.h.gcov.html @@ -0,0 +1,177 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notification.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notification.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %129
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-object.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_NOTIFICATION (valent_notification_get_type())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  +  +  -  :         177 : G_DECLARE_FINAL_TYPE (ValentNotification, valent_notification, VALENT, NOTIFICATION, GObject)
+          +  +  +  +  +  
+                -  -  + ]
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20                 :             : ValentNotification    * valent_notification_new                    (const char            *title);
+      21                 :             : VALENT_AVAILABLE_IN_1_0
+      22                 :             : const char            * valent_notification_get_application        (ValentNotification    *notification);
+      23                 :             : VALENT_AVAILABLE_IN_1_0
+      24                 :             : void                    valent_notification_set_application        (ValentNotification    *notification,
+      25                 :             :                                                                     const char            *application);
+      26                 :             : VALENT_AVAILABLE_IN_1_0
+      27                 :             : const char            * valent_notification_get_body               (ValentNotification    *notification);
+      28                 :             : VALENT_AVAILABLE_IN_1_0
+      29                 :             : void                    valent_notification_set_body               (ValentNotification    *notification,
+      30                 :             :                                                                     const char            *body);
+      31                 :             : VALENT_AVAILABLE_IN_1_0
+      32                 :             : GIcon                 * valent_notification_get_icon               (ValentNotification    *notification);
+      33                 :             : VALENT_AVAILABLE_IN_1_0
+      34                 :             : void                    valent_notification_set_icon               (ValentNotification    *notification,
+      35                 :             :                                                                     GIcon                 *icon);
+      36                 :             : VALENT_AVAILABLE_IN_1_0
+      37                 :             : const char            * valent_notification_get_id                 (ValentNotification    *notification);
+      38                 :             : VALENT_AVAILABLE_IN_1_0
+      39                 :             : void                    valent_notification_set_id                 (ValentNotification    *notification,
+      40                 :             :                                                                     const char            *id);
+      41                 :             : VALENT_AVAILABLE_IN_1_0
+      42                 :             : GNotificationPriority   valent_notification_get_priority           (ValentNotification    *notification);
+      43                 :             : VALENT_AVAILABLE_IN_1_0
+      44                 :             : void                    valent_notification_set_priority           (ValentNotification    *notification,
+      45                 :             :                                                                     GNotificationPriority  priority);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : int64_t                 valent_notification_get_time               (ValentNotification    *notification);
+      48                 :             : VALENT_AVAILABLE_IN_1_0
+      49                 :             : void                    valent_notification_set_time               (ValentNotification    *notification,
+      50                 :             :                                                                     int64_t                time);
+      51                 :             : VALENT_AVAILABLE_IN_1_0
+      52                 :             : const char            * valent_notification_get_title              (ValentNotification    *notification);
+      53                 :             : VALENT_AVAILABLE_IN_1_0
+      54                 :             : void                    valent_notification_set_title              (ValentNotification    *notification,
+      55                 :             :                                                                     const char            *title);
+      56                 :             : 
+      57                 :             : VALENT_AVAILABLE_IN_1_0
+      58                 :             : void                    valent_notification_set_action             (ValentNotification    *notification,
+      59                 :             :                                                                     const char            *action);
+      60                 :             : VALENT_AVAILABLE_IN_1_0
+      61                 :             : void                    valent_notification_set_action_and_target  (ValentNotification    *notification,
+      62                 :             :                                                                     const char            *action,
+      63                 :             :                                                                     GVariant              *target);
+      64                 :             : VALENT_AVAILABLE_IN_1_0
+      65                 :             : void                    valent_notification_add_button             (ValentNotification    *notification,
+      66                 :             :                                                                     const char            *label,
+      67                 :             :                                                                     const char            *action);
+      68                 :             : VALENT_AVAILABLE_IN_1_0
+      69                 :             : void                    valent_notification_add_button_with_target (ValentNotification    *notification,
+      70                 :             :                                                                     const char            *label,
+      71                 :             :                                                                     const char            *action,
+      72                 :             :                                                                     GVariant              *target);
+      73                 :             : VALENT_AVAILABLE_IN_1_0
+      74                 :             : GVariant              * valent_notification_serialize              (ValentNotification    *notification);
+      75                 :             : VALENT_AVAILABLE_IN_1_0
+      76                 :             : ValentNotification    * valent_notification_deserialize            (GVariant              *variant);
+      77                 :             : VALENT_AVAILABLE_IN_1_0
+      78                 :             : unsigned int            valent_notification_hash                   (gconstpointer          notification);
+      79                 :             : VALENT_AVAILABLE_IN_1_0
+      80                 :             : gboolean                valent_notification_equal                  (gconstpointer          notification1,
+      81                 :             :                                                                     gconstpointer          notification2);
+      82                 :             : 
+      83                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications-adapter.c.func-c.html b/coverage/src/libvalent/notifications/valent-notifications-adapter.c.func-c.html new file mode 100644 index 00000000000..d1209f62b1b --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications-adapter.c.func-c.html @@ -0,0 +1,161 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:61.3 %3119
Test Date:2024-03-31 18:46:36Functions:77.8 %97
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:31.2 %165
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notifications_adapter_add_notification0
valent_notifications_adapter_remove_notification0
valent_notifications_adapter_notification_removed6
valent_notifications_adapter_init7
valent_notifications_adapter_notification_added11
valent_notifications_adapter_class_init66
valent_notifications_adapter_get_type438
valent_notifications_adapter_class_intern_init66
valent_notifications_adapter_get_type_once86
valent_notifications_adapter_get_type286
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications-adapter.c.func.html b/coverage/src/libvalent/notifications/valent-notifications-adapter.c.func.html new file mode 100644 index 00000000000..a0da00eb5a0 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications-adapter.c.func.html @@ -0,0 +1,161 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:61.3 %3119
Test Date:2024-03-31 18:46:36Functions:77.8 %97
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:31.2 %165
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notifications_adapter_add_notification0
valent_notifications_adapter_class_init66
valent_notifications_adapter_get_type438
valent_notifications_adapter_class_intern_init66
valent_notifications_adapter_get_type286
valent_notifications_adapter_get_type_once86
valent_notifications_adapter_init7
valent_notifications_adapter_notification_added11
valent_notifications_adapter_notification_removed6
valent_notifications_adapter_remove_notification0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications-adapter.c.gcov.html b/coverage/src/libvalent/notifications/valent-notifications-adapter.c.gcov.html new file mode 100644 index 00000000000..95411849d05 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications-adapter.c.gcov.html @@ -0,0 +1,319 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:61.3 %3119
Test Date:2024-03-31 18:46:36Functions:77.8 %97
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:31.2 %165
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notifications-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libvalent-core.h>
+       9                 :             : 
+      10                 :             : #include "valent-notification.h"
+      11                 :             : #include "valent-notifications-adapter.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentNotificationsAdapter:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for notification servers.
+      18                 :             :  *
+      19                 :             :  * `ValentNotificationsAdapter` is a base class for notification servers. This
+      20                 :             :  * usually means monitoring a D-Bus service for notifications being sent and
+      21                 :             :  * withdrawn.
+      22                 :             :  *
+      23                 :             :  * ## `.plugin` File
+      24                 :             :  *
+      25                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      26                 :             :  *
+      27                 :             :  * - `X-NotificationsAdapterPriority`
+      28                 :             :  *
+      29                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      30                 :             :  *     lowest value will be used as the primary adapter.
+      31                 :             :  *
+      32                 :             :  * Since: 1.0
+      33                 :             :  */
+      34                 :             : 
+      35                 :             : typedef struct
+      36                 :             : {
+      37                 :             :   GPtrArray *notifications;
+      38                 :             : } ValentNotificationsAdapterPrivate;
+      39                 :             : 
+      40   [ +  +  +  - ]:         438 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentNotificationsAdapter, valent_notifications_adapter, VALENT_TYPE_EXTENSION)
+      41                 :             : 
+      42                 :             : /**
+      43                 :             :  * ValentNotificationsAdapterClass:
+      44                 :             :  * @add_notification: the virtual function pointer for valent_notifications_adapter_add_notification()
+      45                 :             :  * @remove_notification: the virtual function pointer for valent_notifications_adapter_remove_notification()
+      46                 :             :  * @notification_added: the class closure for `ValentNotificationsAdapter`::notification-added signal
+      47                 :             :  * @notification_removed: the class closure for `ValentNotificationsAdapter`::notification-removed signal
+      48                 :             :  *
+      49                 :             :  * The virtual function table for `ValentNotificationsAdapter`.
+      50                 :             :  */
+      51                 :             : 
+      52                 :             : enum {
+      53                 :             :   NOTIFICATION_ADDED,
+      54                 :             :   NOTIFICATION_REMOVED,
+      55                 :             :   N_SIGNALS
+      56                 :             : };
+      57                 :             : 
+      58                 :             : static guint signals[N_SIGNALS] = { 0, };
+      59                 :             : 
+      60                 :             : 
+      61                 :             : /* LCOV_EXCL_START */
+      62                 :             : static void
+      63                 :             : valent_notifications_adapter_real_add_notification (ValentNotificationsAdapter *adapter,
+      64                 :             :                                                     ValentNotification         *notification)
+      65                 :             : {
+      66                 :             : }
+      67                 :             : 
+      68                 :             : static void
+      69                 :             : valent_notifications_adapter_real_remove_notification (ValentNotificationsAdapter *adapter,
+      70                 :             :                                                        const char                 *id)
+      71                 :             : {
+      72                 :             : }
+      73                 :             : /* LCOV_EXCL_STOP */
+      74                 :             : 
+      75                 :             : /*
+      76                 :             :  * GObject
+      77                 :             :  */
+      78                 :             : static void
+      79                 :          66 : valent_notifications_adapter_class_init (ValentNotificationsAdapterClass *klass)
+      80                 :             : {
+      81                 :          66 :   klass->add_notification = valent_notifications_adapter_real_add_notification;
+      82                 :          66 :   klass->remove_notification = valent_notifications_adapter_real_remove_notification;
+      83                 :             : 
+      84                 :             :   /**
+      85                 :             :    * ValentNotificationsAdapter::notification-added:
+      86                 :             :    * @adapter: a `ValentNotificationsAdapter`
+      87                 :             :    * @notification: a `ValentNotification`
+      88                 :             :    *
+      89                 :             :    * Emitted when a [class@Valent.Notification] is added to @adapter.
+      90                 :             :    *
+      91                 :             :    * Implementations must chain up if they override
+      92                 :             :    * [vfunc@Valent.NotificationsAdapter.notification_added].
+      93                 :             :    *
+      94                 :             :    * Since: 1.0
+      95                 :             :    */
+      96                 :         132 :   signals [NOTIFICATION_ADDED] =
+      97                 :          66 :     g_signal_new ("notification-added",
+      98                 :             :                   G_TYPE_FROM_CLASS (klass),
+      99                 :             :                   G_SIGNAL_RUN_LAST,
+     100                 :             :                   G_STRUCT_OFFSET (ValentNotificationsAdapterClass, notification_added),
+     101                 :             :                   NULL, NULL,
+     102                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     103                 :             :                   G_TYPE_NONE, 1, VALENT_TYPE_NOTIFICATION);
+     104                 :          66 :   g_signal_set_va_marshaller (signals [NOTIFICATION_ADDED],
+     105                 :             :                               G_TYPE_FROM_CLASS (klass),
+     106                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     107                 :             : 
+     108                 :             :   /**
+     109                 :             :    * ValentNotificationsAdapter::notification-removed:
+     110                 :             :    * @adapter: a `ValentNotificationsAdapter`
+     111                 :             :    * @notification: a `ValentNotification`
+     112                 :             :    *
+     113                 :             :    * Emitted when a [class@Valent.Notification] is removed from @adapter.
+     114                 :             :    *
+     115                 :             :    * Implementations must chain up if they override
+     116                 :             :    * [vfunc@Valent.NotificationsAdapter.notification_removed].
+     117                 :             :    *
+     118                 :             :    * Since: 1.0
+     119                 :             :    */
+     120                 :         132 :   signals [NOTIFICATION_REMOVED] =
+     121                 :          66 :     g_signal_new ("notification-removed",
+     122                 :             :                   G_TYPE_FROM_CLASS (klass),
+     123                 :             :                   G_SIGNAL_RUN_LAST,
+     124                 :             :                   G_STRUCT_OFFSET (ValentNotificationsAdapterClass, notification_removed),
+     125                 :             :                   NULL, NULL,
+     126                 :             :                   g_cclosure_marshal_VOID__STRING,
+     127                 :             :                   G_TYPE_NONE, 1, G_TYPE_STRING);
+     128                 :          66 :   g_signal_set_va_marshaller (signals [NOTIFICATION_REMOVED],
+     129                 :             :                               G_TYPE_FROM_CLASS (klass),
+     130                 :             :                               g_cclosure_marshal_VOID__STRINGv);
+     131                 :          66 : }
+     132                 :             : 
+     133                 :             : static void
+     134                 :           7 : valent_notifications_adapter_init (ValentNotificationsAdapter *adapter)
+     135                 :             : {
+     136                 :           7 : }
+     137                 :             : 
+     138                 :             : /**
+     139                 :             :  * valent_notifications_adapter_notification_added:
+     140                 :             :  * @adapter: a `ValentNotificationsAdapter`
+     141                 :             :  * @notification: a `ValentNotification`
+     142                 :             :  *
+     143                 :             :  * Emit [signal@Valent.NotificationsAdapter::notification-added] on @adapter.
+     144                 :             :  *
+     145                 :             :  * This method should only be called by implementations of
+     146                 :             :  * [class@Valent.NotificationsAdapter].
+     147                 :             :  *
+     148                 :             :  * Since: 1.0
+     149                 :             :  */
+     150                 :             : void
+     151                 :          11 : valent_notifications_adapter_notification_added (ValentNotificationsAdapter *adapter,
+     152                 :             :                                                  ValentNotification         *notification)
+     153                 :             : {
+     154         [ +  - ]:          11 :   g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     155                 :             : 
+     156                 :          11 :   g_signal_emit (G_OBJECT (adapter), signals [NOTIFICATION_ADDED], 0, notification);
+     157                 :             : }
+     158                 :             : 
+     159                 :             : /**
+     160                 :             :  * valent_notifications_adapter_notification_removed:
+     161                 :             :  * @adapter: a `ValentNotificationsAdapter`
+     162                 :             :  * @id: a notification id
+     163                 :             :  *
+     164                 :             :  * Emit [signal@Valent.NotificationsAdapter::notification-removed] on @adapter.
+     165                 :             :  *
+     166                 :             :  * This method should only be called by implementations of
+     167                 :             :  * [class@Valent.NotificationsAdapter].
+     168                 :             :  *
+     169                 :             :  * Since: 1.0
+     170                 :             :  */
+     171                 :             : void
+     172                 :           6 : valent_notifications_adapter_notification_removed (ValentNotificationsAdapter *adapter,
+     173                 :             :                                                    const char                 *id)
+     174                 :             : {
+     175         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     176                 :             : 
+     177                 :           6 :   g_signal_emit (G_OBJECT (adapter), signals [NOTIFICATION_REMOVED], 0, id);
+     178                 :             : }
+     179                 :             : 
+     180                 :             : /**
+     181                 :             :  * valent_notifications_adapter_add_notification: (virtual add_notification)
+     182                 :             :  * @adapter: a `ValentNotificationsAdapter`
+     183                 :             :  * @notification: a `ValentNotification`
+     184                 :             :  *
+     185                 :             :  * Send @notification to the @adapter.
+     186                 :             :  *
+     187                 :             :  * Since: 1.0
+     188                 :             :  */
+     189                 :             : void
+     190                 :           0 : valent_notifications_adapter_add_notification (ValentNotificationsAdapter *adapter,
+     191                 :             :                                                ValentNotification         *notification)
+     192                 :             : {
+     193                 :           0 :   VALENT_ENTRY;
+     194                 :             : 
+     195         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     196         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_NOTIFICATION (notification));
+     197                 :             : 
+     198                 :           0 :   VALENT_NOTIFICATIONS_ADAPTER_GET_CLASS (adapter)->add_notification (adapter,
+     199                 :             :                                                                       notification);
+     200                 :             : 
+     201                 :           0 :   VALENT_EXIT;
+     202                 :             : }
+     203                 :             : 
+     204                 :             : /**
+     205                 :             :  * valent_notifications_adapter_remove_notification: (virtual remove_notification)
+     206                 :             :  * @adapter: a `ValentNotificationsAdapter`
+     207                 :             :  * @id: a notification id
+     208                 :             :  *
+     209                 :             :  * Withdraw @id from @adapter.
+     210                 :             :  *
+     211                 :             :  * Since: 1.0
+     212                 :             :  */
+     213                 :             : void
+     214                 :           0 : valent_notifications_adapter_remove_notification (ValentNotificationsAdapter *adapter,
+     215                 :             :                                                   const char                 *id)
+     216                 :             : {
+     217                 :           0 :   VALENT_ENTRY;
+     218                 :             : 
+     219         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     220         [ #  # ]:           0 :   g_return_if_fail (id == NULL);
+     221                 :             : 
+     222                 :           0 :   VALENT_NOTIFICATIONS_ADAPTER_GET_CLASS (adapter)->remove_notification (adapter,
+     223                 :             :                                                                          id);
+     224                 :             : 
+     225                 :           0 :   VALENT_EXIT;
+     226                 :             : }
+     227                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications-adapter.h.func-c.html b/coverage/src/libvalent/notifications/valent-notifications-adapter.h.func-c.html new file mode 100644 index 00000000000..cb524e27b56 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATIONS_ADAPTER49
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications-adapter.h.func.html b/coverage/src/libvalent/notifications/valent-notifications-adapter.h.func.html new file mode 100644 index 00000000000..6587a2dfd8c --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATIONS_ADAPTER49
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications-adapter.h.gcov.html b/coverage/src/libvalent/notifications/valent-notifications-adapter.h.gcov.html new file mode 100644 index 00000000000..210d15705f6 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications-adapter.h.gcov.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : #include "valent-notification.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_NOTIFICATIONS_ADAPTER (valent_notifications_adapter_get_type())
+      16                 :             : 
+      17                 :             : VALENT_AVAILABLE_IN_1_0
+      18   [ +  -  +  -  :          49 : G_DECLARE_DERIVABLE_TYPE (ValentNotificationsAdapter, valent_notifications_adapter, VALENT, NOTIFICATIONS_ADAPTER, ValentExtension)
+                   +  - ]
+      19                 :             : 
+      20                 :             : struct _ValentNotificationsAdapterClass
+      21                 :             : {
+      22                 :             :   ValentExtensionClass   parent_class;
+      23                 :             : 
+      24                 :             :   /* virtual functions */
+      25                 :             :   void                   (*add_notification)     (ValentNotificationsAdapter  *adapter,
+      26                 :             :                                                   ValentNotification          *notification);
+      27                 :             :   void                   (*remove_notification)  (ValentNotificationsAdapter  *adapter,
+      28                 :             :                                                   const char                  *id);
+      29                 :             : 
+      30                 :             :   /* signals */
+      31                 :             :   void                   (*notification_added)   (ValentNotificationsAdapter  *adapter,
+      32                 :             :                                                   ValentNotification          *notification);
+      33                 :             :   void                   (*notification_removed) (ValentNotificationsAdapter  *adapter,
+      34                 :             :                                                   const char                  *id);
+      35                 :             : 
+      36                 :             :   /*< private >*/
+      37                 :             :   gpointer               padding[8];
+      38                 :             : };
+      39                 :             : 
+      40                 :             : VALENT_AVAILABLE_IN_1_0
+      41                 :             : void       valent_notifications_adapter_notification_added   (ValentNotificationsAdapter  *adapter,
+      42                 :             :                                                               ValentNotification          *notification);
+      43                 :             : VALENT_AVAILABLE_IN_1_0
+      44                 :             : void       valent_notifications_adapter_notification_removed (ValentNotificationsAdapter  *adapter,
+      45                 :             :                                                               const char                  *id);
+      46                 :             : VALENT_AVAILABLE_IN_1_0
+      47                 :             : void       valent_notifications_adapter_add_notification     (ValentNotificationsAdapter  *adapter,
+      48                 :             :                                                               ValentNotification          *notification);
+      49                 :             : VALENT_AVAILABLE_IN_1_0
+      50                 :             : void       valent_notifications_adapter_remove_notification  (ValentNotificationsAdapter  *adapter,
+      51                 :             :                                                               const char                  *id);
+      52                 :             : 
+      53                 :             : G_END_DECLS
+      54                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications.c.func-c.html b/coverage/src/libvalent/notifications/valent-notifications.c.func-c.html new file mode 100644 index 00000000000..eb1af0d007e --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.8 %11995
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.5 %7430
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
app_info_serialize0
valent_notifications_get_applications1
valent_notifications_finalize5
valent_notifications_unbind_extension5
on_notification_removed6
valent_notifications_class_init6
query_applications7
valent_notifications_bind_extension7
valent_notifications_init7
add_application11
notification_serialize11
on_notification_added11
valent_notifications_get_default41
valent_notifications_get_type227
valent_notifications_class_intern_init6
valent_notifications_get_type_once86
valent_notifications_get_type135
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications.c.func.html b/coverage/src/libvalent/notifications/valent-notifications.c.func.html new file mode 100644 index 00000000000..6a071b62680 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.8 %11995
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.5 %7430
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
add_application11
app_info_serialize0
notification_serialize11
on_notification_added11
on_notification_removed6
query_applications7
valent_notifications_bind_extension7
valent_notifications_class_init6
valent_notifications_finalize5
valent_notifications_get_applications1
valent_notifications_get_default41
valent_notifications_get_type227
valent_notifications_class_intern_init6
valent_notifications_get_type135
valent_notifications_get_type_once86
valent_notifications_init7
valent_notifications_unbind_extension5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications.c.gcov.html b/coverage/src/libvalent/notifications/valent-notifications.c.gcov.html new file mode 100644 index 00000000000..12994f3d060 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications.c.gcov.html @@ -0,0 +1,444 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.8 %11995
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.5 %7430
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notifications"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gio/gdesktopappinfo.h>
+      10                 :             : #include <libpeas.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : 
+      13                 :             : #include "valent-notification.h"
+      14                 :             : #include "valent-notifications.h"
+      15                 :             : #include "valent-notifications-adapter.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : /**
+      19                 :             :  * ValentNotifications:
+      20                 :             :  *
+      21                 :             :  * A class for sending and receiving notifications.
+      22                 :             :  *
+      23                 :             :  * `ValentNotifications` is an aggregator of notifications, intended for use by
+      24                 :             :  * [class@Valent.DevicePlugin] implementations.
+      25                 :             :  *
+      26                 :             :  * Plugins can implement [class@Valent.NotificationsAdapter] to provide an
+      27                 :             :  * interface to monitor, send and withdraw notifications.
+      28                 :             :  *
+      29                 :             :  * Since: 1.0
+      30                 :             :  */
+      31                 :             : 
+      32                 :             : struct _ValentNotifications
+      33                 :             : {
+      34                 :             :   ValentComponent  parent_instance;
+      35                 :             : 
+      36                 :             :   GVariant        *applications;
+      37                 :             : };
+      38                 :             : 
+      39   [ +  +  +  - ]:         227 : G_DEFINE_FINAL_TYPE (ValentNotifications, valent_notifications, VALENT_TYPE_COMPONENT)
+      40                 :             : 
+      41                 :             : enum {
+      42                 :             :   NOTIFICATION_ADDED,
+      43                 :             :   NOTIFICATION_REMOVED,
+      44                 :             :   N_SIGNALS
+      45                 :             : };
+      46                 :             : 
+      47                 :             : static guint signals[N_SIGNALS] = { 0, };
+      48                 :             : 
+      49                 :             : 
+      50                 :             : static ValentNotifications *default_listener = NULL;
+      51                 :             : 
+      52                 :             : 
+      53                 :             : static GVariant *
+      54                 :           0 : app_info_serialize (GAppInfo *info)
+      55                 :             : {
+      56                 :           0 :   GVariantDict dict;
+      57                 :           0 :   const char *name;
+      58                 :           0 :   GIcon *icon;
+      59                 :             : 
+      60   [ #  #  #  #  :           0 :   g_assert (G_IS_APP_INFO (info));
+             #  #  #  # ]
+      61                 :             : 
+      62                 :           0 :   g_variant_dict_init (&dict, NULL);
+      63                 :             : 
+      64         [ #  # ]:           0 :   if ((name = g_app_info_get_display_name (info)) != NULL)
+      65                 :           0 :     g_variant_dict_insert (&dict, "name", "s", name);
+      66                 :             : 
+      67         [ #  # ]:           0 :   if ((icon = g_app_info_get_icon (info)) != NULL)
+      68                 :             :     {
+      69                 :           0 :       g_autoptr (GVariant) iconv = NULL;
+      70                 :             : 
+      71                 :           0 :       iconv = g_icon_serialize (icon);
+      72         [ #  # ]:           0 :       g_variant_dict_insert_value (&dict, "icon", iconv);
+      73                 :             :     }
+      74                 :             : 
+      75                 :           0 :   return g_variant_dict_end (&dict);
+      76                 :             : }
+      77                 :             : 
+      78                 :             : static GVariant *
+      79                 :          11 : notification_serialize (ValentNotification *notification)
+      80                 :             : {
+      81                 :          11 :   GVariantDict dict;
+      82                 :          11 :   const char *app_name;
+      83                 :          11 :   GIcon *icon;
+      84                 :             : 
+      85                 :          11 :   g_variant_dict_init (&dict, NULL);
+      86                 :             : 
+      87         [ +  + ]:          11 :   if ((app_name = valent_notification_get_application (notification)) != NULL)
+      88                 :           7 :     g_variant_dict_insert (&dict, "name", "s", app_name);
+      89                 :             : 
+      90         [ +  + ]:          11 :   if ((icon = valent_notification_get_icon (notification)) != NULL)
+      91                 :             :     {
+      92                 :          18 :       g_autoptr (GVariant) iconv = NULL;
+      93                 :             : 
+      94                 :           7 :       iconv = g_icon_serialize (icon);
+      95         [ +  - ]:           7 :       g_variant_dict_insert_value (&dict, "icon", iconv);
+      96                 :             :     }
+      97                 :             : 
+      98                 :          11 :   return g_variant_dict_end (&dict);
+      99                 :             : }
+     100                 :             : 
+     101                 :             : static void
+     102                 :           7 : query_applications (ValentNotifications *self)
+     103                 :             : {
+     104                 :           7 :   GVariantDict dict;
+     105                 :          14 :   g_autolist (GAppInfo) infos = NULL;
+     106                 :             : 
+     107         [ +  - ]:           7 :   g_assert (VALENT_IS_NOTIFICATIONS (self));
+     108                 :             : 
+     109                 :           7 :   g_variant_dict_init (&dict, NULL);
+     110                 :           7 :   infos = g_app_info_get_all ();
+     111                 :             : 
+     112         [ -  + ]:           7 :   for (const GList *iter = infos; iter; iter = iter->next)
+     113                 :             :     {
+     114                 :           0 :       const char *desktop_id;
+     115                 :           0 :       const char *name;
+     116                 :             : 
+     117                 :           0 :       desktop_id = g_app_info_get_id (iter->data);
+     118                 :             : 
+     119   [ #  #  #  #  :           0 :       if G_UNLIKELY (g_str_has_prefix (desktop_id, APPLICATION_ID))
+                   #  # ]
+     120                 :           0 :         continue;
+     121                 :             : 
+     122         [ #  # ]:           0 :       if (!g_desktop_app_info_get_boolean (iter->data, "X-GNOME-UsesNotifications"))
+     123                 :           0 :         continue;
+     124                 :             : 
+     125                 :           0 :       name = g_app_info_get_display_name (iter->data);
+     126                 :           0 :       g_variant_dict_insert_value (&dict, name, app_info_serialize (iter->data));
+     127                 :             :     }
+     128                 :             : 
+     129                 :           7 :   self->applications = g_variant_ref_sink (g_variant_dict_end (&dict));
+     130                 :           7 : }
+     131                 :             : 
+     132                 :             : static void
+     133                 :          11 : add_application (ValentNotifications *self,
+     134                 :             :                  GVariant            *application)
+     135                 :             : {
+     136                 :          11 :   GVariantDict dict;
+     137                 :          11 :   const char *name;
+     138                 :             : 
+     139         [ -  + ]:          11 :   if (self->applications == NULL)
+     140                 :           0 :     query_applications (self);
+     141                 :             : 
+     142                 :          11 :   g_variant_dict_init (&dict, self->applications);
+     143                 :             : 
+     144         [ +  + ]:          11 :   if (g_variant_lookup (application, "name", "&s", &name))
+     145                 :           7 :     g_variant_dict_insert_value (&dict, name, g_variant_ref_sink (application));
+     146                 :          11 :   g_variant_unref (application);
+     147                 :             : 
+     148         [ +  - ]:          11 :   g_clear_pointer (&self->applications, g_variant_unref);
+     149                 :          11 :   self->applications = g_variant_ref_sink (g_variant_dict_end (&dict));
+     150                 :          11 : }
+     151                 :             : 
+     152                 :             : 
+     153                 :             : /*
+     154                 :             :  * ValentNotificationsAdapter Callbacks
+     155                 :             :  */
+     156                 :             : static void
+     157                 :          11 : on_notification_added (ValentNotificationsAdapter *adapter,
+     158                 :             :                        ValentNotification         *notification,
+     159                 :             :                        ValentNotifications        *self)
+     160                 :             : {
+     161         [ +  - ]:          11 :   g_assert (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     162         [ -  + ]:          11 :   g_assert (VALENT_IS_NOTIFICATION (notification));
+     163         [ -  + ]:          11 :   g_assert (VALENT_IS_NOTIFICATIONS (self));
+     164                 :             : 
+     165                 :          11 :   add_application (self, notification_serialize (notification));
+     166                 :             : 
+     167                 :          11 :   g_signal_emit (G_OBJECT (self), signals [NOTIFICATION_ADDED], 0, notification);
+     168                 :          11 : }
+     169                 :             : 
+     170                 :             : static void
+     171                 :           6 : on_notification_removed (ValentNotificationsAdapter *adapter,
+     172                 :             :                          const char                 *id,
+     173                 :             :                          ValentNotifications        *self)
+     174                 :             : {
+     175         [ +  - ]:           6 :   g_assert (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     176         [ -  + ]:           6 :   g_assert (id != NULL);
+     177         [ -  + ]:           6 :   g_assert (VALENT_IS_NOTIFICATIONS (self));
+     178                 :             : 
+     179                 :           6 :   g_signal_emit (G_OBJECT (self), signals [NOTIFICATION_REMOVED], 0, id);
+     180                 :           6 : }
+     181                 :             : 
+     182                 :             : 
+     183                 :             : /*
+     184                 :             :  * ValentComponent
+     185                 :             :  */
+     186                 :             : static void
+     187                 :           7 : valent_notifications_bind_extension (ValentComponent *component,
+     188                 :             :                                      GObject         *extension)
+     189                 :             : {
+     190                 :           7 :   ValentNotifications *self = VALENT_NOTIFICATIONS (component);
+     191                 :           7 :   ValentNotificationsAdapter *adapter = VALENT_NOTIFICATIONS_ADAPTER (extension);
+     192                 :             : 
+     193                 :           7 :   VALENT_ENTRY;
+     194                 :             : 
+     195         [ +  - ]:           7 :   g_assert (VALENT_IS_NOTIFICATIONS (self));
+     196         [ -  + ]:           7 :   g_assert (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     197                 :             : 
+     198                 :           7 :   g_signal_connect_object (adapter,
+     199                 :             :                            "notification-added",
+     200                 :             :                            G_CALLBACK (on_notification_added),
+     201                 :             :                            self, 0);
+     202                 :             : 
+     203                 :           7 :   g_signal_connect_object (adapter,
+     204                 :             :                            "notification-removed",
+     205                 :             :                            G_CALLBACK (on_notification_removed),
+     206                 :             :                            self, 0);
+     207                 :             : 
+     208                 :           7 :   VALENT_EXIT;
+     209                 :             : }
+     210                 :             : 
+     211                 :             : static void
+     212                 :           5 : valent_notifications_unbind_extension (ValentComponent *component,
+     213                 :             :                                        GObject         *extension)
+     214                 :             : {
+     215                 :           5 :   ValentNotifications *self = VALENT_NOTIFICATIONS (component);
+     216                 :           5 :   ValentNotificationsAdapter *adapter = VALENT_NOTIFICATIONS_ADAPTER (extension);
+     217                 :             : 
+     218         [ +  - ]:           5 :   g_assert (VALENT_IS_NOTIFICATIONS (self));
+     219         [ -  + ]:           5 :   g_assert (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     220                 :             : 
+     221                 :           5 :   g_signal_handlers_disconnect_by_func (adapter, on_notification_added, self);
+     222                 :           5 :   g_signal_handlers_disconnect_by_func (adapter, on_notification_removed, self);
+     223                 :           5 : }
+     224                 :             : 
+     225                 :             : 
+     226                 :             : /*
+     227                 :             :  * GObject
+     228                 :             :  */
+     229                 :             : static void
+     230                 :           5 : valent_notifications_finalize (GObject *object)
+     231                 :             : {
+     232                 :           5 :   ValentNotifications *self = VALENT_NOTIFICATIONS (object);
+     233                 :             : 
+     234         [ +  - ]:           5 :   g_clear_pointer (&self->applications, g_variant_unref);
+     235                 :             : 
+     236                 :           5 :   G_OBJECT_CLASS (valent_notifications_parent_class)->finalize (object);
+     237                 :           5 : }
+     238                 :             : 
+     239                 :             : static void
+     240                 :           6 : valent_notifications_class_init (ValentNotificationsClass *klass)
+     241                 :             : {
+     242                 :           6 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     243                 :           6 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     244                 :             : 
+     245                 :           6 :   object_class->finalize = valent_notifications_finalize;
+     246                 :             : 
+     247                 :           6 :   component_class->bind_extension = valent_notifications_bind_extension;
+     248                 :           6 :   component_class->unbind_extension = valent_notifications_unbind_extension;
+     249                 :             : 
+     250                 :             :   /**
+     251                 :             :    * ValentNotifications::notification-added:
+     252                 :             :    * @notifications: a `ValentNotifications`
+     253                 :             :    * @notification: a `ValentNotification`
+     254                 :             :    *
+     255                 :             :    * Emitted when a notification is added to a
+     256                 :             :    * [class@Valent.NotificationsAdapter].
+     257                 :             :    *
+     258                 :             :    * Since: 1.0
+     259                 :             :    */
+     260                 :          12 :   signals [NOTIFICATION_ADDED] =
+     261                 :           6 :     g_signal_new ("notification-added",
+     262                 :             :                   G_TYPE_FROM_CLASS (klass),
+     263                 :             :                   G_SIGNAL_RUN_FIRST,
+     264                 :             :                   0,
+     265                 :             :                   NULL, NULL,
+     266                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     267                 :             :                   G_TYPE_NONE, 1, VALENT_TYPE_NOTIFICATION);
+     268                 :           6 :   g_signal_set_va_marshaller (signals [NOTIFICATION_ADDED],
+     269                 :             :                               G_TYPE_FROM_CLASS (klass),
+     270                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     271                 :             : 
+     272                 :             :   /**
+     273                 :             :    * ValentNotifications::notification-removed:
+     274                 :             :    * @notifications: a `ValentNotifications`
+     275                 :             :    * @id: a notification id
+     276                 :             :    *
+     277                 :             :    * Emitted when a notification is removed from a
+     278                 :             :    * [class@Valent.NotificationsAdapter].
+     279                 :             :    *
+     280                 :             :    * Since: 1.0
+     281                 :             :    */
+     282                 :          12 :   signals [NOTIFICATION_REMOVED] =
+     283                 :           6 :     g_signal_new ("notification-removed",
+     284                 :             :                   G_TYPE_FROM_CLASS (klass),
+     285                 :             :                   G_SIGNAL_RUN_FIRST,
+     286                 :             :                   0,
+     287                 :             :                   NULL, NULL,
+     288                 :             :                   g_cclosure_marshal_VOID__STRING,
+     289                 :             :                   G_TYPE_NONE, 1, G_TYPE_STRING);
+     290                 :           6 :   g_signal_set_va_marshaller (signals [NOTIFICATION_REMOVED],
+     291                 :             :                               G_TYPE_FROM_CLASS (klass),
+     292                 :             :                               g_cclosure_marshal_VOID__STRINGv);
+     293                 :           6 : }
+     294                 :             : 
+     295                 :             : static void
+     296                 :           7 : valent_notifications_init (ValentNotifications *self)
+     297                 :             : {
+     298                 :           7 :   query_applications (self);
+     299                 :           7 : }
+     300                 :             : 
+     301                 :             : /**
+     302                 :             :  * valent_notifications_get_default:
+     303                 :             :  *
+     304                 :             :  * Get the default [class@Valent.Notifications].
+     305                 :             :  *
+     306                 :             :  * Returns: (transfer none) (not nullable): a `ValentNotifications`
+     307                 :             :  *
+     308                 :             :  * Since: 1.0
+     309                 :             :  */
+     310                 :             : ValentNotifications *
+     311                 :          41 : valent_notifications_get_default (void)
+     312                 :             : {
+     313         [ +  + ]:          41 :   if (default_listener == NULL)
+     314                 :             :     {
+     315                 :           7 :       default_listener = g_object_new (VALENT_TYPE_NOTIFICATIONS,
+     316                 :             :                                        "plugin-domain", "notifications",
+     317                 :             :                                        "plugin-type",   VALENT_TYPE_NOTIFICATIONS_ADAPTER,
+     318                 :             :                                        NULL);
+     319                 :             : 
+     320                 :           7 :       g_object_add_weak_pointer (G_OBJECT (default_listener),
+     321                 :             :                                  (gpointer)&default_listener);
+     322                 :             :     }
+     323                 :             : 
+     324                 :          41 :   return default_listener;
+     325                 :             : }
+     326                 :             : 
+     327                 :             : /**
+     328                 :             :  * valent_notifications_get_applications:
+     329                 :             :  * @notifications: (nullable): a `ValentNotifications`
+     330                 :             :  *
+     331                 :             :  * Get a dictionary of applications that are known to send notifications.
+     332                 :             :  *
+     333                 :             :  * Returns: (transfer none): a `GVariant`
+     334                 :             :  *
+     335                 :             :  * Since: 1.0
+     336                 :             :  */
+     337                 :             : GVariant *
+     338                 :           1 : valent_notifications_get_applications (ValentNotifications *notifications)
+     339                 :             : {
+     340   [ -  +  -  - ]:           1 :   g_return_val_if_fail (notifications == NULL || VALENT_IS_NOTIFICATIONS (notifications), NULL);
+     341                 :             : 
+     342         [ +  - ]:           1 :   if (notifications == NULL)
+     343                 :           1 :       notifications = valent_notifications_get_default ();
+     344                 :             : 
+     345         [ -  + ]:           1 :   if (notifications->applications == NULL)
+     346                 :           0 :     query_applications (notifications);
+     347                 :             : 
+     348                 :           1 :   return notifications->applications;
+     349                 :             : }
+     350                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications.h.func-c.html b/coverage/src/libvalent/notifications/valent-notifications.h.func-c.html new file mode 100644 index 00000000000..52d2b4de639 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATIONS42
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications.h.func.html b/coverage/src/libvalent/notifications/valent-notifications.h.func.html new file mode 100644 index 00000000000..faca1ae4e9f --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATIONS42
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/notifications/valent-notifications.h.gcov.html b/coverage/src/libvalent/notifications/valent-notifications.h.gcov.html new file mode 100644 index 00000000000..ab8e1e303c9 --- /dev/null +++ b/coverage/src/libvalent/notifications/valent-notifications.h.gcov.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/notifications/valent-notifications.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/notifications - valent-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_NOTIFICATIONS (valent_notifications_get_type ())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :          42 : G_DECLARE_FINAL_TYPE (ValentNotifications, valent_notifications, VALENT, NOTIFICATIONS, ValentComponent)
+                   -  + ]
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20                 :             : ValentNotifications * valent_notifications_get_default      (void);
+      21                 :             : 
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : GVariant            * valent_notifications_get_applications (ValentNotifications *notifications);
+      24                 :             : 
+      25                 :             : G_END_DECLS
+      26                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-detail-sort-b.html b/coverage/src/libvalent/session/index-detail-sort-b.html new file mode 100644 index 00000000000..1826d0c510d --- /dev/null +++ b/coverage/src/libvalent/session/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-detail-sort-f.html b/coverage/src/libvalent/session/index-detail-sort-f.html new file mode 100644 index 00000000000..18f0ab02d2d --- /dev/null +++ b/coverage/src/libvalent/session/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-detail-sort-l.html b/coverage/src/libvalent/session/index-detail-sort-l.html new file mode 100644 index 00000000000..5ed04560597 --- /dev/null +++ b/coverage/src/libvalent/session/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-detail.html b/coverage/src/libvalent/session/index-detail.html new file mode 100644 index 00000000000..d3cd307bbf6 --- /dev/null +++ b/coverage/src/libvalent/session/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-sort-b.html b/coverage/src/libvalent/session/index-sort-b.html new file mode 100644 index 00000000000..1826d0c510d --- /dev/null +++ b/coverage/src/libvalent/session/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-sort-f.html b/coverage/src/libvalent/session/index-sort-f.html new file mode 100644 index 00000000000..18f0ab02d2d --- /dev/null +++ b/coverage/src/libvalent/session/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index-sort-l.html b/coverage/src/libvalent/session/index-sort-l.html new file mode 100644 index 00000000000..5ed04560597 --- /dev/null +++ b/coverage/src/libvalent/session/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/index.html b/coverage/src/libvalent/session/index.html new file mode 100644 index 00000000000..d3cd307bbf6 --- /dev/null +++ b/coverage/src/libvalent/session/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/sessionCoverageTotalHit
Test:Code CoverageLines:94.4 %142134
Test Date:2024-03-31 18:46:36Functions:100.0 %2626
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.9 %6439
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-session-adapter.c +
92.6%92.6%
+
92.6 %545060.0 %159100.0 %1010
valent-session-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-session.c +
95.3%95.3%
+
95.3 %868264.9 %3724100.0 %1414
valent-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session-adapter.c.func-c.html b/coverage/src/libvalent/session/valent-session-adapter.c.func-c.html new file mode 100644 index 00000000000..4e8abd8cca4 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session-adapter.c.func-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.6 %5450
Test Date:2024-03-31 18:46:36Functions:100.0 %1010
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %159
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_session_adapter_set_property1
valent_session_adapter_get_property4
valent_session_adapter_set_locked5
valent_session_adapter_get_active7
valent_session_adapter_init7
valent_session_adapter_get_locked13
valent_session_adapter_class_init66
valent_session_adapter_get_type418
valent_session_adapter_class_intern_init66
valent_session_adapter_get_type_once86
valent_session_adapter_get_type266
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session-adapter.c.func.html b/coverage/src/libvalent/session/valent-session-adapter.c.func.html new file mode 100644 index 00000000000..2ae002dbf13 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session-adapter.c.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.6 %5450
Test Date:2024-03-31 18:46:36Functions:100.0 %1010
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %159
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_session_adapter_class_init66
valent_session_adapter_get_active7
valent_session_adapter_get_locked13
valent_session_adapter_get_property4
valent_session_adapter_get_type418
valent_session_adapter_class_intern_init66
valent_session_adapter_get_type266
valent_session_adapter_get_type_once86
valent_session_adapter_init7
valent_session_adapter_set_locked5
valent_session_adapter_set_property1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session-adapter.c.gcov.html b/coverage/src/libvalent/session/valent-session-adapter.c.gcov.html new file mode 100644 index 00000000000..5ce53450469 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session-adapter.c.gcov.html @@ -0,0 +1,353 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.6 %5450
Test Date:2024-03-31 18:46:36Functions:100.0 %1010
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %159
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-session-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-session-adapter.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentSessionAdapter:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for session managers.
+      18                 :             :  *
+      19                 :             :  * `ValentSessionAdapter` is a base class for plugins that provide an interface
+      20                 :             :  * to the desktop session manager. This usually means monitoring the idle state,
+      21                 :             :  * locking and unlocking the session.
+      22                 :             :  *
+      23                 :             :  * ## `.plugin` File
+      24                 :             :  *
+      25                 :             :  * Implementations may define the following extra fields in the `.plugin` file:
+      26                 :             :  *
+      27                 :             :  * - `X-SessionAdapterPriority`
+      28                 :             :  *
+      29                 :             :  *     An integer indicating the adapter priority. The implementation with the
+      30                 :             :  *     lowest value will be used as the primary adapter.
+      31                 :             :  *
+      32                 :             :  * Since: 1.0
+      33                 :             :  */
+      34                 :             : 
+      35                 :             : typedef struct
+      36                 :             : {
+      37                 :             :   uint8_t  active : 1;
+      38                 :             :   uint8_t  locked : 1;
+      39                 :             : } ValentSessionAdapterPrivate;
+      40                 :             : 
+      41   [ +  +  +  - ]:         418 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentSessionAdapter, valent_session_adapter, VALENT_TYPE_EXTENSION)
+      42                 :             : 
+      43                 :             : /**
+      44                 :             :  * ValentSessionAdapterClass:
+      45                 :             :  * @get_active: the virtual function pointer for valent_session_adapter_get_active()
+      46                 :             :  * @get_locked: the virtual function pointer for valent_session_adapter_get_locked()
+      47                 :             :  * @set_locked: the virtual function pointer for valent_session_adapter_set_locked()
+      48                 :             :  *
+      49                 :             :  * The virtual function table for `ValentSessionAdapter`.
+      50                 :             :  */
+      51                 :             : 
+      52                 :             : enum {
+      53                 :             :   PROP_0,
+      54                 :             :   PROP_ACTIVE,
+      55                 :             :   PROP_LOCKED,
+      56                 :             :   N_PROPERTIES
+      57                 :             : };
+      58                 :             : 
+      59                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      60                 :             : 
+      61                 :             : 
+      62                 :             : /* LCOV_EXCL_START */
+      63                 :             : static gboolean
+      64                 :             : valent_session_adapter_real_get_active (ValentSessionAdapter *adapter)
+      65                 :             : {
+      66                 :             :   ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
+      67                 :             : 
+      68                 :             :   g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
+      69                 :             : 
+      70                 :             :   return priv->active;
+      71                 :             : }
+      72                 :             : 
+      73                 :             : static gboolean
+      74                 :             : valent_session_adapter_real_get_locked (ValentSessionAdapter *adapter)
+      75                 :             : {
+      76                 :             :   ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
+      77                 :             : 
+      78                 :             :   g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
+      79                 :             : 
+      80                 :             :   return priv->locked;
+      81                 :             : }
+      82                 :             : 
+      83                 :             : static void
+      84                 :             : valent_session_adapter_real_set_locked (ValentSessionAdapter *adapter,
+      85                 :             :                                         gboolean              state)
+      86                 :             : {
+      87                 :             :   ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
+      88                 :             : 
+      89                 :             :   g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
+      90                 :             : 
+      91                 :             :   if (priv->active == !!state)
+      92                 :             :     return;
+      93                 :             : 
+      94                 :             :   priv->locked = !!state;
+      95                 :             :   g_object_notify_by_pspec (G_OBJECT (adapter), properties [PROP_LOCKED]);
+      96                 :             : }
+      97                 :             : /* LCOV_EXCL_STOP */
+      98                 :             : 
+      99                 :             : /*
+     100                 :             :  * GObject
+     101                 :             :  */
+     102                 :             : static void
+     103                 :           4 : valent_session_adapter_get_property (GObject    *object,
+     104                 :             :                                      guint       prop_id,
+     105                 :             :                                      GValue     *value,
+     106                 :             :                                      GParamSpec *pspec)
+     107                 :             : {
+     108                 :           4 :   ValentSessionAdapter *self = VALENT_SESSION_ADAPTER (object);
+     109                 :             : 
+     110      [ +  +  - ]:           4 :   switch (prop_id)
+     111                 :             :     {
+     112                 :           2 :     case PROP_ACTIVE:
+     113                 :           2 :       g_value_set_boolean (value, valent_session_adapter_get_active (self));
+     114                 :           2 :       break;
+     115                 :             : 
+     116                 :           2 :     case PROP_LOCKED:
+     117                 :           2 :       g_value_set_boolean (value, valent_session_adapter_get_locked (self));
+     118                 :           2 :       break;
+     119                 :             : 
+     120                 :           0 :     default:
+     121                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     122                 :             :     }
+     123                 :           4 : }
+     124                 :             : 
+     125                 :             : static void
+     126                 :           1 : valent_session_adapter_set_property (GObject      *object,
+     127                 :             :                                      guint         prop_id,
+     128                 :             :                                      const GValue *value,
+     129                 :             :                                      GParamSpec   *pspec)
+     130                 :             : {
+     131                 :           1 :   ValentSessionAdapter *self = VALENT_SESSION_ADAPTER (object);
+     132                 :             : 
+     133         [ +  - ]:           1 :   switch (prop_id)
+     134                 :             :     {
+     135                 :           1 :     case PROP_LOCKED:
+     136                 :           1 :       valent_session_adapter_set_locked (self, g_value_get_boolean (value));
+     137                 :           1 :       break;
+     138                 :             : 
+     139                 :           0 :     default:
+     140                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     141                 :             :     }
+     142                 :           1 : }
+     143                 :             : 
+     144                 :             : static void
+     145                 :          66 : valent_session_adapter_class_init (ValentSessionAdapterClass *klass)
+     146                 :             : {
+     147                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     148                 :             : 
+     149                 :          66 :   object_class->get_property = valent_session_adapter_get_property;
+     150                 :          66 :   object_class->set_property = valent_session_adapter_set_property;
+     151                 :             : 
+     152                 :          66 :   klass->get_active = valent_session_adapter_real_get_active;
+     153                 :          66 :   klass->get_locked = valent_session_adapter_real_get_locked;
+     154                 :          66 :   klass->set_locked = valent_session_adapter_real_set_locked;
+     155                 :             : 
+     156                 :             :   /**
+     157                 :             :    * ValentSessionAdapter:active: (getter get_active)
+     158                 :             :    *
+     159                 :             :    * Whether the session is active.
+     160                 :             :    *
+     161                 :             :    * Since: 1.0
+     162                 :             :    */
+     163                 :         132 :   properties [PROP_ACTIVE] =
+     164                 :          66 :     g_param_spec_boolean ("active", NULL, NULL,
+     165                 :             :                           FALSE,
+     166                 :             :                           (G_PARAM_READABLE |
+     167                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     168                 :             :                            G_PARAM_STATIC_STRINGS));
+     169                 :             : 
+     170                 :             :   /**
+     171                 :             :    * ValentSessionAdapter:locked: (getter get_locked) (setter set_locked)
+     172                 :             :    *
+     173                 :             :    * Whether the session is locked.
+     174                 :             :    *
+     175                 :             :    * Since: 1.0
+     176                 :             :    */
+     177                 :         132 :   properties [PROP_LOCKED] =
+     178                 :          66 :     g_param_spec_boolean ("locked", NULL, NULL,
+     179                 :             :                           FALSE,
+     180                 :             :                           (G_PARAM_READWRITE |
+     181                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     182                 :             :                            G_PARAM_STATIC_STRINGS));
+     183                 :             : 
+     184                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     185                 :          66 : }
+     186                 :             : 
+     187                 :             : static void
+     188                 :           7 : valent_session_adapter_init (ValentSessionAdapter *adapter)
+     189                 :             : {
+     190                 :           7 : }
+     191                 :             : 
+     192                 :             : /**
+     193                 :             :  * valent_session_adapter_get_active: (virtual get_active) (get-property active)
+     194                 :             :  * @adapter: a `ValentSessionAdapter`
+     195                 :             :  *
+     196                 :             :  * Get whether the session is active.
+     197                 :             :  *
+     198                 :             :  * Returns: %TRUE if active, %FALSE if idle
+     199                 :             :  *
+     200                 :             :  * Since: 1.0
+     201                 :             :  */
+     202                 :             : gboolean
+     203                 :           7 : valent_session_adapter_get_active (ValentSessionAdapter *adapter)
+     204                 :             : {
+     205                 :           7 :   gboolean ret;
+     206                 :             : 
+     207                 :           7 :   VALENT_ENTRY;
+     208                 :             : 
+     209         [ +  - ]:           7 :   g_return_val_if_fail (VALENT_IS_SESSION_ADAPTER (adapter), FALSE);
+     210                 :             : 
+     211                 :           7 :   ret = VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->get_active (adapter);
+     212                 :             : 
+     213                 :           7 :   VALENT_RETURN (ret);
+     214                 :             : }
+     215                 :             : 
+     216                 :             : /**
+     217                 :             :  * valent_session_adapter_get_locked: (virtual get_locked) (get-property locked)
+     218                 :             :  * @adapter: a `ValentSessionAdapter`
+     219                 :             :  *
+     220                 :             :  * Get whether the session is locked.
+     221                 :             :  *
+     222                 :             :  * Returns: %TRUE if locked, %FALSE if unlocked
+     223                 :             :  *
+     224                 :             :  * Since: 1.0
+     225                 :             :  */
+     226                 :             : gboolean
+     227                 :          13 : valent_session_adapter_get_locked (ValentSessionAdapter *adapter)
+     228                 :             : {
+     229                 :          13 :   gboolean ret;
+     230                 :             : 
+     231                 :          13 :   VALENT_ENTRY;
+     232                 :             : 
+     233         [ +  - ]:          13 :   g_return_val_if_fail (VALENT_IS_SESSION_ADAPTER (adapter), FALSE);
+     234                 :             : 
+     235                 :          13 :   ret = VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->get_locked (adapter);
+     236                 :             : 
+     237                 :          13 :   VALENT_RETURN (ret);
+     238                 :             : }
+     239                 :             : 
+     240                 :             : /**
+     241                 :             :  * valent_session_adapter_set_locked: (virtual set_locked) (set-property locked)
+     242                 :             :  * @adapter: a `ValentSessionAdapter`
+     243                 :             :  * @state: %TRUE to lock, %FALSE to unlock
+     244                 :             :  *
+     245                 :             :  * Set whether the session is locked.
+     246                 :             :  *
+     247                 :             :  * Since: 1.0
+     248                 :             :  */
+     249                 :             : void
+     250                 :           5 : valent_session_adapter_set_locked (ValentSessionAdapter *adapter,
+     251                 :             :                                    gboolean              state)
+     252                 :             : {
+     253                 :           5 :   VALENT_ENTRY;
+     254                 :             : 
+     255         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_SESSION_ADAPTER (adapter));
+     256                 :             : 
+     257                 :           5 :   VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->set_locked (adapter, state);
+     258                 :             : 
+     259                 :           5 :   VALENT_EXIT;
+     260                 :             : }
+     261                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session-adapter.h.func-c.html b/coverage/src/libvalent/session/valent-session-adapter.h.func-c.html new file mode 100644 index 00000000000..7aa55cc6f37 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SESSION_ADAPTER33
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session-adapter.h.func.html b/coverage/src/libvalent/session/valent-session-adapter.h.func.html new file mode 100644 index 00000000000..1eb1c9f951d --- /dev/null +++ b/coverage/src/libvalent/session/valent-session-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SESSION_ADAPTER33
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session-adapter.h.gcov.html b/coverage/src/libvalent/session/valent-session-adapter.h.gcov.html new file mode 100644 index 00000000000..7da80280e1b --- /dev/null +++ b/coverage/src/libvalent/session/valent-session-adapter.h.gcov.html @@ -0,0 +1,135 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-extension.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_SESSION_ADAPTER (valent_session_adapter_get_type())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :          58 : G_DECLARE_DERIVABLE_TYPE (ValentSessionAdapter, valent_session_adapter, VALENT, SESSION_ADAPTER, ValentExtension)
+                   +  - ]
+      18                 :             : 
+      19                 :             : struct _ValentSessionAdapterClass
+      20                 :             : {
+      21                 :             :   ValentExtensionClass   parent_class;
+      22                 :             : 
+      23                 :             :   /* virtual functions */
+      24                 :             :   gboolean               (*get_active) (ValentSessionAdapter *adapter);
+      25                 :             :   gboolean               (*get_locked) (ValentSessionAdapter *adapter);
+      26                 :             :   void                   (*set_locked) (ValentSessionAdapter *adapter,
+      27                 :             :                                         gboolean              state);
+      28                 :             : 
+      29                 :             :   /*< private >*/
+      30                 :             :   gpointer               padding[8];
+      31                 :             : };
+      32                 :             : 
+      33                 :             : VALENT_AVAILABLE_IN_1_0
+      34                 :             : gboolean   valent_session_adapter_get_active (ValentSessionAdapter *adapter);
+      35                 :             : VALENT_AVAILABLE_IN_1_0
+      36                 :             : gboolean   valent_session_adapter_get_locked (ValentSessionAdapter *adapter);
+      37                 :             : VALENT_AVAILABLE_IN_1_0
+      38                 :             : void       valent_session_adapter_set_locked (ValentSessionAdapter *adapter,
+      39                 :             :                                               gboolean              state);
+      40                 :             : 
+      41                 :             : G_END_DECLS
+      42                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session.c.func-c.html b/coverage/src/libvalent/session/valent-session.c.func-c.html new file mode 100644 index 00000000000..668c5da817b --- /dev/null +++ b/coverage/src/libvalent/session/valent-session.c.func-c.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.3 %8682
Test Date:2024-03-31 18:46:36Functions:100.0 %1414
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:64.9 %3724
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_session_set_property1
on_active_changed2
valent_session_get_property2
valent_session_get_active4
valent_session_set_locked4
on_locked_changed6
valent_session_class_init7
valent_session_init7
valent_session_get_locked8
valent_session_bind_preferred9
valent_session_get_default17
valent_session_get_type211
valent_session_class_intern_init7
valent_session_get_type_once86
valent_session_get_type118
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session.c.func.html b/coverage/src/libvalent/session/valent-session.c.func.html new file mode 100644 index 00000000000..eeb53def693 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session.c.func.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.3 %8682
Test Date:2024-03-31 18:46:36Functions:100.0 %1414
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:64.9 %3724
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_active_changed2
on_locked_changed6
valent_session_bind_preferred9
valent_session_class_init7
valent_session_get_active4
valent_session_get_default17
valent_session_get_locked8
valent_session_get_property2
valent_session_get_type211
valent_session_class_intern_init7
valent_session_get_type118
valent_session_get_type_once86
valent_session_init7
valent_session_set_locked4
valent_session_set_property1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session.c.gcov.html b/coverage/src/libvalent/session/valent-session.c.gcov.html new file mode 100644 index 00000000000..3b681ae30e3 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session.c.gcov.html @@ -0,0 +1,401 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.3 %8682
Test Date:2024-03-31 18:46:36Functions:100.0 %1414
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:64.9 %3724
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-session"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libpeas.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-session.h"
+      13                 :             : #include "valent-session-adapter.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : /**
+      17                 :             :  * ValentSession:
+      18                 :             :  *
+      19                 :             :  * A class for monitoring the session state.
+      20                 :             :  *
+      21                 :             :  * `ValentSession` is an abstraction of session managers, intended for use by
+      22                 :             :  * [class@Valent.DevicePlugin] implementations.
+      23                 :             :  *
+      24                 :             :  * Plugins can implement [class@Valent.SessionAdapter] to provide an interface
+      25                 :             :  * to monitor and control the session state.
+      26                 :             :  *
+      27                 :             :  * Since: 1.0
+      28                 :             :  */
+      29                 :             : 
+      30                 :             : struct _ValentSession
+      31                 :             : {
+      32                 :             :   ValentComponent       parent_instance;
+      33                 :             : 
+      34                 :             :   ValentSessionAdapter *default_adapter;
+      35                 :             : };
+      36                 :             : 
+      37   [ +  +  +  - ]:         211 : G_DEFINE_FINAL_TYPE (ValentSession, valent_session, VALENT_TYPE_COMPONENT)
+      38                 :             : 
+      39                 :             : enum {
+      40                 :             :   PROP_0,
+      41                 :             :   PROP_ACTIVE,
+      42                 :             :   PROP_LOCKED,
+      43                 :             :   N_PROPERTIES
+      44                 :             : };
+      45                 :             : 
+      46                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      47                 :             : 
+      48                 :             : static ValentSession *default_adapter = NULL;
+      49                 :             : 
+      50                 :             : 
+      51                 :             : static void
+      52                 :           2 : on_active_changed (ValentSessionAdapter *adapter,
+      53                 :             :                    GParamSpec           *pspec,
+      54                 :             :                    ValentSession        *self)
+      55                 :             : {
+      56                 :           2 :   VALENT_ENTRY;
+      57                 :             : 
+      58         [ +  - ]:           2 :   if (self->default_adapter == adapter)
+      59                 :           2 :     g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACTIVE]);
+      60                 :             : 
+      61                 :           2 :   VALENT_EXIT;
+      62                 :             : }
+      63                 :             : 
+      64                 :             : static void
+      65                 :           6 : on_locked_changed (ValentSessionAdapter *adapter,
+      66                 :             :                    GParamSpec           *pspec,
+      67                 :             :                    ValentSession        *self)
+      68                 :             : {
+      69                 :           6 :   VALENT_ENTRY;
+      70                 :             : 
+      71         [ +  - ]:           6 :   if (self->default_adapter == adapter)
+      72                 :           6 :     g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_LOCKED]);
+      73                 :             : 
+      74                 :           6 :   VALENT_EXIT;
+      75                 :             : }
+      76                 :             : 
+      77                 :             : /*
+      78                 :             :  * ValentComponent
+      79                 :             :  */
+      80                 :             : static void
+      81                 :           9 : valent_session_bind_preferred (ValentComponent *component,
+      82                 :             :                                GObject         *extension)
+      83                 :             : {
+      84                 :           9 :   ValentSession *self = VALENT_SESSION (component);
+      85                 :           9 :   ValentSessionAdapter *adapter = VALENT_SESSION_ADAPTER (extension);
+      86                 :             : 
+      87                 :           9 :   VALENT_ENTRY;
+      88                 :             : 
+      89         [ +  - ]:           9 :   g_assert (VALENT_IS_SESSION (self));
+      90   [ +  +  -  + ]:           9 :   g_assert (adapter == NULL || VALENT_IS_SESSION_ADAPTER (adapter));
+      91                 :             : 
+      92         [ +  + ]:           9 :   if (self->default_adapter != NULL)
+      93                 :             :     {
+      94                 :           1 :       g_signal_handlers_disconnect_by_func (self->default_adapter,
+      95                 :             :                                             self,
+      96                 :             :                                             on_active_changed);
+      97                 :           1 :       g_signal_handlers_disconnect_by_func (self->default_adapter,
+      98                 :             :                                             self,
+      99                 :             :                                             on_locked_changed);
+     100                 :           1 :       self->default_adapter = NULL;
+     101                 :             :     }
+     102                 :             : 
+     103         [ +  + ]:           9 :   if (adapter != NULL)
+     104                 :             :     {
+     105                 :           8 :       self->default_adapter = adapter;
+     106                 :           8 :       g_signal_connect_object (self->default_adapter,
+     107                 :             :                                "notify::active",
+     108                 :             :                                G_CALLBACK (on_active_changed),
+     109                 :             :                                self, 0);
+     110                 :           8 :       g_signal_connect_object (self->default_adapter,
+     111                 :             :                                "notify::locked",
+     112                 :             :                                G_CALLBACK (on_locked_changed),
+     113                 :             :                                self, 0);
+     114                 :             :     }
+     115                 :             : 
+     116                 :           9 :   VALENT_EXIT;
+     117                 :             : }
+     118                 :             : 
+     119                 :             : /*
+     120                 :             :  * GObject
+     121                 :             :  */
+     122                 :             : static void
+     123                 :           2 : valent_session_get_property (GObject    *object,
+     124                 :             :                              guint       prop_id,
+     125                 :             :                              GValue     *value,
+     126                 :             :                              GParamSpec *pspec)
+     127                 :             : {
+     128                 :           2 :   ValentSession *self = VALENT_SESSION (object);
+     129                 :             : 
+     130      [ +  +  - ]:           2 :   switch (prop_id)
+     131                 :             :     {
+     132                 :           1 :     case PROP_ACTIVE:
+     133                 :           1 :       g_value_set_boolean (value, valent_session_get_active (self));
+     134                 :           1 :       break;
+     135                 :             : 
+     136                 :           1 :     case PROP_LOCKED:
+     137                 :           1 :       g_value_set_boolean (value, valent_session_get_locked (self));
+     138                 :           1 :       break;
+     139                 :             : 
+     140                 :           0 :     default:
+     141                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     142                 :             :     }
+     143                 :           2 : }
+     144                 :             : 
+     145                 :             : static void
+     146                 :           1 : valent_session_set_property (GObject      *object,
+     147                 :             :                              guint         prop_id,
+     148                 :             :                              const GValue *value,
+     149                 :             :                              GParamSpec   *pspec)
+     150                 :             : {
+     151                 :           1 :   ValentSession *self = VALENT_SESSION (object);
+     152                 :             : 
+     153         [ +  - ]:           1 :   switch (prop_id)
+     154                 :             :     {
+     155                 :           1 :     case PROP_LOCKED:
+     156                 :           1 :       valent_session_set_locked (self, g_value_get_boolean (value));
+     157                 :           1 :       break;
+     158                 :             : 
+     159                 :           0 :     default:
+     160                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     161                 :             :     }
+     162                 :           1 : }
+     163                 :             : 
+     164                 :             : static void
+     165                 :           7 : valent_session_class_init (ValentSessionClass *klass)
+     166                 :             : {
+     167                 :           7 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     168                 :           7 :   ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
+     169                 :             : 
+     170                 :           7 :   object_class->get_property = valent_session_get_property;
+     171                 :           7 :   object_class->set_property = valent_session_set_property;
+     172                 :             : 
+     173                 :           7 :   component_class->bind_preferred = valent_session_bind_preferred;
+     174                 :             : 
+     175                 :             :   /**
+     176                 :             :    * ValentSession:active: (getter get_active)
+     177                 :             :    *
+     178                 :             :    * Whether the session is active.
+     179                 :             :    *
+     180                 :             :    * Since: 1.0
+     181                 :             :    */
+     182                 :          14 :   properties [PROP_ACTIVE] =
+     183                 :           7 :     g_param_spec_boolean ("active", NULL, NULL,
+     184                 :             :                           FALSE,
+     185                 :             :                           (G_PARAM_READABLE |
+     186                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     187                 :             :                            G_PARAM_STATIC_STRINGS));
+     188                 :             : 
+     189                 :             :   /**
+     190                 :             :    * ValentSession:locked: (getter get_locked) (setter set_locked)
+     191                 :             :    *
+     192                 :             :    * Whether the session is locked.
+     193                 :             :    *
+     194                 :             :    * Since: 1.0
+     195                 :             :    */
+     196                 :          14 :   properties [PROP_LOCKED] =
+     197                 :           7 :     g_param_spec_boolean ("locked", NULL, NULL,
+     198                 :             :                           FALSE,
+     199                 :             :                           (G_PARAM_READWRITE |
+     200                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     201                 :             :                            G_PARAM_STATIC_STRINGS));
+     202                 :             : 
+     203                 :           7 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     204                 :           7 : }
+     205                 :             : 
+     206                 :             : static void
+     207                 :           7 : valent_session_init (ValentSession *self)
+     208                 :             : {
+     209                 :           7 : }
+     210                 :             : 
+     211                 :             : /**
+     212                 :             :  * valent_session_get_default:
+     213                 :             :  *
+     214                 :             :  * Get the default [class@Valent.Session].
+     215                 :             :  *
+     216                 :             :  * Returns: (transfer none) (nullable): a `ValentSession`
+     217                 :             :  *
+     218                 :             :  * Since: 1.0
+     219                 :             :  */
+     220                 :             : ValentSession *
+     221                 :          17 : valent_session_get_default (void)
+     222                 :             : {
+     223         [ +  + ]:          17 :   if (default_adapter == NULL)
+     224                 :             :     {
+     225                 :           7 :       default_adapter = g_object_new (VALENT_TYPE_SESSION,
+     226                 :             :                                       "plugin-domain", "session",
+     227                 :             :                                       "plugin-type",   VALENT_TYPE_SESSION_ADAPTER,
+     228                 :             :                                       NULL);
+     229                 :             : 
+     230                 :           7 :       g_object_add_weak_pointer (G_OBJECT (default_adapter),
+     231                 :             :                                  (gpointer)&default_adapter);
+     232                 :             :     }
+     233                 :             : 
+     234                 :          17 :   return default_adapter;
+     235                 :             : }
+     236                 :             : 
+     237                 :             : /**
+     238                 :             :  * valent_session_get_active: (get-property active)
+     239                 :             :  * @session: a `ValentSession`
+     240                 :             :  *
+     241                 :             :  * Get the active state of the primary [class@Valent.SessionAdapter].
+     242                 :             :  *
+     243                 :             :  * Returns: %TRUE if the session is active, or %FALSE if not
+     244                 :             :  *
+     245                 :             :  * Since: 1.0
+     246                 :             :  */
+     247                 :             : gboolean
+     248                 :           4 : valent_session_get_active (ValentSession *session)
+     249                 :             : {
+     250                 :           4 :   gboolean ret = FALSE;
+     251                 :             : 
+     252                 :           4 :   VALENT_ENTRY;
+     253                 :             : 
+     254         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_SESSION (session), FALSE);
+     255                 :             : 
+     256         [ -  + ]:           4 :   if G_LIKELY (session->default_adapter != NULL)
+     257                 :           4 :     ret = valent_session_adapter_get_active (session->default_adapter);
+     258                 :             : 
+     259                 :           4 :   VALENT_RETURN (ret);
+     260                 :             : }
+     261                 :             : 
+     262                 :             : /**
+     263                 :             :  * valent_session_get_locked: (get-property locked)
+     264                 :             :  * @session: a `ValentSession`
+     265                 :             :  *
+     266                 :             :  * Get the locked state of the primary [class@Valent.SessionAdapter].
+     267                 :             :  *
+     268                 :             :  * Returns: %TRUE if the session is locked, or %FALSE if unlocked
+     269                 :             :  *
+     270                 :             :  * Since: 1.0
+     271                 :             :  */
+     272                 :             : gboolean
+     273                 :           8 : valent_session_get_locked (ValentSession *session)
+     274                 :             : {
+     275                 :           8 :   gboolean ret = FALSE;
+     276                 :             : 
+     277                 :           8 :   VALENT_ENTRY;
+     278                 :             : 
+     279         [ +  - ]:           8 :   g_return_val_if_fail (VALENT_IS_SESSION (session), FALSE);
+     280                 :             : 
+     281         [ -  + ]:           8 :   if G_LIKELY (session->default_adapter != NULL)
+     282                 :           8 :     ret = valent_session_adapter_get_locked (session->default_adapter);
+     283                 :             : 
+     284                 :           8 :   VALENT_RETURN (ret);
+     285                 :             : }
+     286                 :             : 
+     287                 :             : /**
+     288                 :             :  * valent_session_set_locked: (set-property locked)
+     289                 :             :  * @session: a `ValentSession`
+     290                 :             :  * @state: %TRUE to lock, or %FALSE to unlock
+     291                 :             :  *
+     292                 :             :  * Set the locked state of the primary [class@Valent.SessionAdapter].
+     293                 :             :  *
+     294                 :             :  * Since: 1.0
+     295                 :             :  */
+     296                 :             : void
+     297                 :           4 : valent_session_set_locked (ValentSession *session,
+     298                 :             :                            gboolean       state)
+     299                 :             : {
+     300                 :           4 :   VALENT_ENTRY;
+     301                 :             : 
+     302         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_SESSION (session));
+     303                 :             : 
+     304         [ +  - ]:           4 :   if G_LIKELY (session->default_adapter != NULL)
+     305                 :           4 :     valent_session_adapter_set_locked (session->default_adapter, state);
+     306                 :             : 
+     307                 :           4 :   VALENT_EXIT;
+     308                 :             : }
+     309                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session.h.func-c.html b/coverage/src/libvalent/session/valent-session.h.func-c.html new file mode 100644 index 00000000000..d3ff3b39f0a --- /dev/null +++ b/coverage/src/libvalent/session/valent-session.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SESSION25
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session.h.func.html b/coverage/src/libvalent/session/valent-session.h.func.html new file mode 100644 index 00000000000..4afa7c52760 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SESSION25
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/session/valent-session.h.gcov.html b/coverage/src/libvalent/session/valent-session.h.gcov.html new file mode 100644 index 00000000000..d1d9be28ba3 --- /dev/null +++ b/coverage/src/libvalent/session/valent-session.h.gcov.html @@ -0,0 +1,124 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/session/valent-session.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/session - valent-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include "../core/valent-component.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_SESSION (valent_session_get_type ())
+      15                 :             : 
+      16                 :             : VALENT_AVAILABLE_IN_1_0
+      17   [ +  -  +  -  :          25 : G_DECLARE_FINAL_TYPE (ValentSession, valent_session, VALENT, SESSION, ValentComponent)
+                   -  + ]
+      18                 :             : 
+      19                 :             : VALENT_AVAILABLE_IN_1_0
+      20                 :             : ValentSession * valent_session_get_default (void);
+      21                 :             : 
+      22                 :             : VALENT_AVAILABLE_IN_1_0
+      23                 :             : gboolean        valent_session_get_active  (ValentSession *session);
+      24                 :             : VALENT_AVAILABLE_IN_1_0
+      25                 :             : gboolean        valent_session_get_locked  (ValentSession *session);
+      26                 :             : VALENT_AVAILABLE_IN_1_0
+      27                 :             : void            valent_session_set_locked  (ValentSession *session,
+      28                 :             :                                             gboolean       state);
+      29                 :             : 
+      30                 :             : G_END_DECLS
+      31                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-detail-sort-b.html b/coverage/src/libvalent/ui/index-detail-sort-b.html new file mode 100644 index 00000000000..88183ae5c65 --- /dev/null +++ b/coverage/src/libvalent/ui/index-detail-sort-b.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-detail-sort-f.html b/coverage/src/libvalent/ui/index-detail-sort-f.html new file mode 100644 index 00000000000..db30a8cbe44 --- /dev/null +++ b/coverage/src/libvalent/ui/index-detail-sort-f.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-detail-sort-l.html b/coverage/src/libvalent/ui/index-detail-sort-l.html new file mode 100644 index 00000000000..5dbe14f76eb --- /dev/null +++ b/coverage/src/libvalent/ui/index-detail-sort-l.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-detail.html b/coverage/src/libvalent/ui/index-detail.html new file mode 100644 index 00000000000..998580c5fe9 --- /dev/null +++ b/coverage/src/libvalent/ui/index-detail.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-sort-b.html b/coverage/src/libvalent/ui/index-sort-b.html new file mode 100644 index 00000000000..88183ae5c65 --- /dev/null +++ b/coverage/src/libvalent/ui/index-sort-b.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-sort-f.html b/coverage/src/libvalent/ui/index-sort-f.html new file mode 100644 index 00000000000..db30a8cbe44 --- /dev/null +++ b/coverage/src/libvalent/ui/index-sort-f.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index-sort-l.html b/coverage/src/libvalent/ui/index-sort-l.html new file mode 100644 index 00000000000..5dbe14f76eb --- /dev/null +++ b/coverage/src/libvalent/ui/index-sort-l.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/index.html b/coverage/src/libvalent/ui/index.html new file mode 100644 index 00000000000..998580c5fe9 --- /dev/null +++ b/coverage/src/libvalent/ui/index.html @@ -0,0 +1,533 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/uiCoverageTotalHit
Test:Code CoverageLines:72.6 %19071385
Test Date:2024-03-31 18:46:36Functions:80.1 %211169
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:45.9 %968444
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
libvalent-ui.c +
100.0%
+
100.0 %44100.0 %22100.0 %11
valent-device-gadget.c +
87.9%87.9%
+
87.9 %332962.5 %85100.0 %77
valent-device-page.c +
89.6%89.6%
+
89.6 %15413860.7 %5634100.0 %1616
valent-device-page.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-dialog.c +
94.5%94.5%
+
94.5 %12812160.7 %5634100.0 %1414
valent-device-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-device-preferences-group.c +
89.9%89.9%
+
89.9 %696266.7 %2718100.0 %1010
valent-device-preferences-group.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-input-remote.c +
45.1%45.1%
+
45.1 %2049219.6 %921850.0 %2412
valent-input-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-media-remote.c +
83.2%83.2%
+
83.2 %32126759.1 %1549186.4 %2219
valent-media-remote.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-list.c +
70.1%70.1%
+
70.1 %25417847.6 %1708169.2 %2618
valent-menu-list.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-menu-stack.c +
53.6%53.6%
+
53.6 %563039.3 %281163.6 %117
valent-menu-stack.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-plugin-row.c +
89.4%89.4%
+
89.4 %665954.2 %2413100.0 %1111
valent-plugin-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-dialog.c +
85.7%85.7%
+
85.7 %16814438.3 %943680.0 %1512
valent-preferences-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-preferences-page.c +
89.5%89.5%
+
89.5 %383460.0 %106100.0 %88
valent-time-helpers.c +
60.0%60.0%
+
60.0 %352137.5 %249100.0 %11
valent-ui-main.c +
100.0%
+
100.0 %313150.0 %84100.0 %33
valent-ui-manager.c +
9.7%9.7%
+
9.7 %62610.7 %28330.0 %103
valent-ui-manager.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-ui-utils.c +
82.1%82.1%
+
82.1 %282375.0 %1612100.0 %22
valent-window.c +
55.5%55.5%
+
55.5 %24513635.2 %1053778.9 %1915
valent-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/libvalent-ui.c.func-c.html b/coverage/src/libvalent/ui/libvalent-ui.c.func-c.html new file mode 100644 index 00000000000..410ed9474f8 --- /dev/null +++ b/coverage/src/libvalent/ui/libvalent-ui.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/libvalent-ui.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - libvalent-ui.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:100.0 %22
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
libvalent_ui_register_types65
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/libvalent-ui.c.func.html b/coverage/src/libvalent/ui/libvalent-ui.c.func.html new file mode 100644 index 00000000000..8bce10da5cd --- /dev/null +++ b/coverage/src/libvalent/ui/libvalent-ui.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/libvalent-ui.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - libvalent-ui.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:100.0 %22
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
libvalent_ui_register_types65
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/libvalent-ui.c.gcov.html b/coverage/src/libvalent/ui/libvalent-ui.c.gcov.html new file mode 100644 index 00000000000..62fa0d8e9e0 --- /dev/null +++ b/coverage/src/libvalent/ui/libvalent-ui.c.gcov.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/libvalent-ui.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - libvalent-ui.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:100.0 %22
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : #include <gtk/gtk.h>
+       8                 :             : #include <libpeas.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-ui-manager.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : _VALENT_EXTERN void
+      15                 :          65 : libvalent_ui_register_types (PeasObjectModule *module)
+      16                 :             : {
+      17         [ +  + ]:          65 :   if (gtk_is_initialized ())
+      18                 :             :     {
+      19                 :          29 :       peas_object_module_register_extension_type (module,
+      20                 :             :                                                   VALENT_TYPE_APPLICATION_PLUGIN,
+      21                 :             :                                                   VALENT_TYPE_UI_MANAGER);
+      22                 :             :     }
+      23                 :          65 : }
+      24                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-gadget.c.func-c.html b/coverage/src/libvalent/ui/valent-device-gadget.c.func-c.html new file mode 100644 index 00000000000..3618d4794e1 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-gadget.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.9 %3329
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_gadget_get_property5
valent_device_gadget_init7
valent_device_gadget_set_property7
valent_device_gadget_class_init66
valent_device_gadget_get_type339
valent_device_gadget_class_intern_init66
valent_device_gadget_get_type_once75
valent_device_gadget_get_type198
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-gadget.c.func.html b/coverage/src/libvalent/ui/valent-device-gadget.c.func.html new file mode 100644 index 00000000000..06d019b8f25 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-gadget.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.9 %3329
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_gadget_class_init66
valent_device_gadget_get_property5
valent_device_gadget_get_type339
valent_device_gadget_class_intern_init66
valent_device_gadget_get_type198
valent_device_gadget_get_type_once75
valent_device_gadget_init7
valent_device_gadget_set_property7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-gadget.c.gcov.html b/coverage/src/libvalent/ui/valent-device-gadget.c.gcov.html new file mode 100644 index 00000000000..eb285bea365 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-gadget.c.gcov.html @@ -0,0 +1,214 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-gadget.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.9 %3329
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device-gadget"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gtk/gtk.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : #include <libvalent-device.h>
+      11                 :             : 
+      12                 :             : #include "valent-device-gadget.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentDeviceGadget:
+      17                 :             :  *
+      18                 :             :  * An abstract base class for device plugin gadgets.
+      19                 :             :  *
+      20                 :             :  * `ValentDeviceGadget` is an base class for [class@Valent.DevicePlugin]
+      21                 :             :  * implementations that want to provide a small widget to display or control a
+      22                 :             :  * simple state (e.g. battery level).
+      23                 :             :  *
+      24                 :             :  * Since: 1.0
+      25                 :             :  */
+      26                 :             : 
+      27                 :             : typedef struct
+      28                 :             : {
+      29                 :             :   GtkWidget     parent_instance;
+      30                 :             : 
+      31                 :             :   ValentDevice *device;
+      32                 :             : } ValentDeviceGadgetPrivate;
+      33                 :             : 
+      34   [ +  +  +  - ]:         351 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentDeviceGadget, valent_device_gadget, GTK_TYPE_WIDGET)
+      35                 :             : 
+      36                 :             : 
+      37                 :             : enum {
+      38                 :             :   PROP_0,
+      39                 :             :   PROP_DEVICE,
+      40                 :             :   N_PROPERTIES
+      41                 :             : };
+      42                 :             : 
+      43                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      44                 :             : 
+      45                 :             : 
+      46                 :             : /*
+      47                 :             :  * GObject
+      48                 :             :  */
+      49                 :             : static void
+      50                 :           5 : valent_device_gadget_get_property (GObject    *object,
+      51                 :             :                                    guint       prop_id,
+      52                 :             :                                    GValue     *value,
+      53                 :             :                                    GParamSpec *pspec)
+      54                 :             : {
+      55                 :           5 :   ValentDeviceGadget *self = VALENT_DEVICE_GADGET (object);
+      56                 :           5 :   ValentDeviceGadgetPrivate *priv = valent_device_gadget_get_instance_private (self);
+      57                 :             : 
+      58         [ +  - ]:           5 :   switch (prop_id)
+      59                 :             :     {
+      60                 :           5 :     case PROP_DEVICE:
+      61                 :           5 :       g_value_set_object (value, priv->device);
+      62                 :           5 :       break;
+      63                 :             : 
+      64                 :           0 :     default:
+      65                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      66                 :             :     }
+      67                 :           5 : }
+      68                 :             : 
+      69                 :             : static void
+      70                 :           7 : valent_device_gadget_set_property (GObject      *object,
+      71                 :             :                                    guint         prop_id,
+      72                 :             :                                    const GValue *value,
+      73                 :             :                                    GParamSpec   *pspec)
+      74                 :             : {
+      75                 :           7 :   ValentDeviceGadget *self = VALENT_DEVICE_GADGET (object);
+      76                 :           7 :   ValentDeviceGadgetPrivate *priv = valent_device_gadget_get_instance_private (self);
+      77                 :             : 
+      78         [ +  - ]:           7 :   switch (prop_id)
+      79                 :             :     {
+      80                 :           7 :     case PROP_DEVICE:
+      81                 :           7 :       priv->device = g_value_get_object (value);
+      82                 :           7 :       break;
+      83                 :             : 
+      84                 :           0 :     default:
+      85                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      86                 :             :     }
+      87                 :           7 : }
+      88                 :             : 
+      89                 :             : static void
+      90                 :          66 : valent_device_gadget_class_init (ValentDeviceGadgetClass *klass)
+      91                 :             : {
+      92                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      93                 :          66 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+      94                 :             : 
+      95                 :          66 :   object_class->get_property = valent_device_gadget_get_property;
+      96                 :          66 :   object_class->set_property = valent_device_gadget_set_property;
+      97                 :             : 
+      98                 :             :   /**
+      99                 :             :    * ValentDeviceGadget:device:
+     100                 :             :    *
+     101                 :             :    * The [class@Valent.Device] this gadget is for.
+     102                 :             :    *
+     103                 :             :    * Since: 1.0
+     104                 :             :    */
+     105                 :         132 :   properties [PROP_DEVICE] =
+     106                 :          66 :     g_param_spec_object ("device", NULL, NULL,
+     107                 :             :                          VALENT_TYPE_DEVICE,
+     108                 :             :                          (G_PARAM_READWRITE |
+     109                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     110                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     111                 :             :                           G_PARAM_STATIC_STRINGS));
+     112                 :             : 
+     113                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     114                 :             : 
+     115                 :          66 :   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+     116                 :          66 : }
+     117                 :             : 
+     118                 :             : static void
+     119                 :           7 : valent_device_gadget_init (ValentDeviceGadget *self)
+     120                 :             : {
+     121                 :           7 : }
+     122                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-page.c.func-c.html b/coverage/src/libvalent/ui/valent-device-page.c.func-c.html new file mode 100644 index 00000000000..0c4bd28f189 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-page.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-page.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-page.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.6 %154138
Test Date:2024-03-31 18:46:36Functions:100.0 %1616
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
page_pair_action1
page_unpair_action1
valent_device_page_get_property1
page_preferences_action2
valent_device_page_class_init3
valent_device_page_constructed5
valent_device_page_dispose5
valent_device_page_init5
valent_device_page_set_property5
on_plugins_changed6
on_state_changed9
plugin_data_free9
valent_device_page_add_plugin9
valent_device_page_get_type98
valent_device_page_class_intern_init3
valent_device_page_get_type_once35
valent_device_page_get_type60
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-page.c.func.html b/coverage/src/libvalent/ui/valent-device-page.c.func.html new file mode 100644 index 00000000000..2f8f92169d9 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-page.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-page.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-page.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.6 %154138
Test Date:2024-03-31 18:46:36Functions:100.0 %1616
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_plugins_changed6
on_state_changed9
page_pair_action1
page_preferences_action2
page_unpair_action1
plugin_data_free9
valent_device_page_add_plugin9
valent_device_page_class_init3
valent_device_page_constructed5
valent_device_page_dispose5
valent_device_page_get_property1
valent_device_page_get_type98
valent_device_page_class_intern_init3
valent_device_page_get_type60
valent_device_page_get_type_once35
valent_device_page_init5
valent_device_page_set_property5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-page.c.gcov.html b/coverage/src/libvalent/ui/valent-device-page.c.gcov.html new file mode 100644 index 00000000000..77882878416 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-page.c.gcov.html @@ -0,0 +1,476 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-page.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-page.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.6 %154138
Test Date:2024-03-31 18:46:36Functions:100.0 %1616
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <glib/gi18n.h>
+       7                 :             : #include <adwaita.h>
+       8                 :             : #include <gtk/gtk.h>
+       9                 :             : #include <pango/pango.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : #include <libvalent-device.h>
+      12                 :             : 
+      13                 :             : #include "valent-device-gadget.h"
+      14                 :             : #include "valent-device-page.h"
+      15                 :             : #include "valent-device-preferences-dialog.h"
+      16                 :             : #include "valent-menu-list.h"
+      17                 :             : #include "valent-menu-stack.h"
+      18                 :             : 
+      19                 :             : 
+      20                 :             : struct _ValentDevicePage
+      21                 :             : {
+      22                 :             :   AdwNavigationPage  parent_instance;
+      23                 :             : 
+      24                 :             :   ValentDevice      *device;
+      25                 :             :   GHashTable        *plugins;
+      26                 :             :   AdwDialog         *preferences;
+      27                 :             : 
+      28                 :             :   /* template */
+      29                 :             :   GtkStack          *stack;
+      30                 :             : 
+      31                 :             :   GtkWidget         *pair_request;
+      32                 :             :   GtkSpinner        *pair_spinner;
+      33                 :             :   GtkWidget         *verification_key;
+      34                 :             : 
+      35                 :             :   GtkWidget         *gadgets;
+      36                 :             :   ValentMenuStack   *menu_actions;
+      37                 :             : };
+      38                 :             : 
+      39   [ +  +  +  - ]:          98 : G_DEFINE_FINAL_TYPE (ValentDevicePage, valent_device_page, ADW_TYPE_NAVIGATION_PAGE)
+      40                 :             : 
+      41                 :             : enum {
+      42                 :             :   PROP_0,
+      43                 :             :   PROP_DEVICE,
+      44                 :             :   N_PROPERTIES
+      45                 :             : };
+      46                 :             : 
+      47                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      48                 :             : 
+      49                 :             : 
+      50                 :             : /*
+      51                 :             :  * Plugin Callbacks
+      52                 :             :  */
+      53                 :             : typedef struct
+      54                 :             : {
+      55                 :             :   GtkWidget *gadgets;
+      56                 :             :   GtkWidget *gadget;
+      57                 :             : } PluginData;
+      58                 :             : 
+      59                 :             : static void
+      60                 :           9 : plugin_data_free (gpointer data)
+      61                 :             : {
+      62                 :           9 :   PluginData *plugin = (PluginData *)data;
+      63                 :             : 
+      64   [ +  +  +  - ]:           9 :   if (plugin->gadgets != NULL && plugin->gadget != NULL)
+      65                 :           4 :     gtk_box_remove (GTK_BOX (plugin->gadgets), plugin->gadget);
+      66                 :             : 
+      67                 :           9 :   g_free (plugin);
+      68                 :           9 : }
+      69                 :             : 
+      70                 :             : static void
+      71                 :           9 : valent_device_page_add_plugin (ValentDevicePage *self,
+      72                 :             :                                const char       *module)
+      73                 :             : {
+      74                 :           9 :   PeasEngine *engine;
+      75                 :           9 :   PeasPluginInfo *info;
+      76                 :           9 :   PluginData *plugin;
+      77                 :             : 
+      78         [ +  - ]:           9 :   g_assert (VALENT_IS_DEVICE_PAGE (self));
+      79   [ +  -  -  + ]:           9 :   g_assert (module != NULL && *module != '\0');
+      80                 :             : 
+      81                 :           9 :   engine = valent_get_plugin_engine ();
+      82                 :           9 :   info = peas_engine_get_plugin_info (engine, module);
+      83                 :           9 :   plugin = g_new0 (PluginData, 1);
+      84                 :             : 
+      85                 :             :   /* Gadgets (eg. HeaderBar widgets) */
+      86         [ +  + ]:           9 :   if (peas_engine_provides_extension (engine, info, VALENT_TYPE_DEVICE_GADGET))
+      87                 :             :     {
+      88                 :           4 :       GObject *gadget;
+      89                 :             : 
+      90                 :           4 :       gadget = peas_engine_create_extension (engine,
+      91                 :             :                                              info,
+      92                 :             :                                              VALENT_TYPE_DEVICE_GADGET,
+      93                 :             :                                              "device", self->device,
+      94                 :             :                                              NULL);
+      95                 :             : 
+      96         [ +  - ]:           4 :       if (gadget != NULL)
+      97                 :             :         {
+      98                 :           4 :           gtk_box_append (GTK_BOX (self->gadgets), GTK_WIDGET (gadget));
+      99                 :           4 :           plugin->gadgets = GTK_WIDGET (self->gadgets);
+     100                 :           4 :           plugin->gadget = GTK_WIDGET (gadget);
+     101                 :             :         }
+     102                 :             :     }
+     103                 :             : 
+     104         [ -  + ]:           9 :   g_hash_table_replace (self->plugins,
+     105                 :           9 :                         g_strdup (module),
+     106                 :             :                         g_steal_pointer (&plugin));
+     107                 :           9 : }
+     108                 :             : 
+     109                 :             : static void
+     110                 :           6 : on_plugins_changed (ValentDevice     *device,
+     111                 :             :                     GParamSpec       *pspec,
+     112                 :             :                     ValentDevicePage *self)
+     113                 :             : {
+     114                 :          12 :   g_auto (GStrv) plugins = NULL;
+     115                 :           6 :   GHashTableIter iter;
+     116                 :           6 :   const char *module;
+     117                 :             : 
+     118                 :           6 :   plugins = valent_device_get_plugins (device);
+     119                 :           6 :   g_hash_table_iter_init (&iter, self->plugins);
+     120                 :             : 
+     121         [ +  + ]:          14 :   while (g_hash_table_iter_next (&iter, (void **)&module, NULL))
+     122                 :             :     {
+     123         [ +  + ]:           2 :       if (!g_strv_contains ((const char * const *)plugins, module))
+     124                 :           1 :         g_hash_table_iter_remove (&iter);
+     125                 :             :     }
+     126                 :             : 
+     127         [ +  + ]:          16 :   for (unsigned int i = 0; plugins[i] != NULL; i++)
+     128                 :             :     {
+     129         [ +  + ]:          10 :       if (!g_hash_table_contains (self->plugins, plugins[i]))
+     130                 :           9 :         valent_device_page_add_plugin (self, plugins[i]);
+     131                 :             :     }
+     132                 :           6 : }
+     133                 :             : 
+     134                 :             : /*
+     135                 :             :  * Pairing
+     136                 :             :  */
+     137                 :             : static void
+     138                 :           9 : on_state_changed (ValentDevice     *device,
+     139                 :             :                   GParamSpec       *pspec,
+     140                 :             :                   ValentDevicePage *self)
+     141                 :             : {
+     142                 :           9 :   ValentDeviceState state = VALENT_DEVICE_STATE_NONE;
+     143                 :           9 :   gboolean connected, paired;
+     144                 :             : 
+     145         [ +  - ]:           9 :   g_assert (VALENT_IS_DEVICE (device));
+     146         [ -  + ]:           9 :   g_assert (VALENT_IS_DEVICE_PAGE (self));
+     147                 :             : 
+     148                 :           9 :   state = valent_device_get_state (self->device);
+     149                 :           9 :   connected = (state & VALENT_DEVICE_STATE_CONNECTED) != 0;
+     150                 :           9 :   paired = (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     151                 :             : 
+     152                 :             :   /* Ensure the proper controls are displayed */
+     153                 :           9 :   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.pair", !paired);
+     154                 :           9 :   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.unpair", paired);
+     155                 :             : 
+     156         [ +  + ]:           9 :   if (!connected)
+     157                 :             :     {
+     158                 :           7 :       gtk_stack_set_visible_child_name (self->stack, "disconnected");
+     159                 :             :     }
+     160         [ -  + ]:           2 :   else if (!paired)
+     161                 :             :     {
+     162                 :           9 :       g_autoptr (ValentChannel) channel = NULL;
+     163                 :           0 :       const char *verification_key = NULL;
+     164                 :           0 :       gboolean pair_incoming, pair_outgoing;
+     165                 :             : 
+     166                 :             :       /* Get the channel verification key */
+     167         [ #  # ]:           0 :       if ((channel = valent_device_ref_channel (self->device)) != NULL)
+     168                 :           0 :         verification_key = valent_channel_get_verification_key (channel);
+     169                 :             :       else
+     170                 :           0 :         verification_key = _("Unavailable");
+     171                 :             : 
+     172                 :           0 :       gtk_label_set_text (GTK_LABEL (self->verification_key), verification_key);
+     173                 :             : 
+     174                 :             :       /* Adjust the actions */
+     175                 :           0 :       pair_incoming = (state & VALENT_DEVICE_STATE_PAIR_INCOMING) != 0;
+     176                 :           0 :       pair_outgoing = (state & VALENT_DEVICE_STATE_PAIR_OUTGOING) != 0;
+     177                 :             : 
+     178                 :           0 :       gtk_widget_set_visible (self->pair_request, !pair_incoming);
+     179                 :           0 :       gtk_widget_set_sensitive (self->pair_request, !pair_outgoing);
+     180                 :           0 :       gtk_spinner_set_spinning (self->pair_spinner, pair_outgoing);
+     181                 :             : 
+     182         [ #  # ]:           0 :       gtk_stack_set_visible_child_name (self->stack, "pairing");
+     183                 :             :     }
+     184                 :             :   else
+     185                 :             :     {
+     186                 :           2 :       gtk_stack_set_visible_child_name (self->stack, "connected");
+     187                 :             :     }
+     188                 :           9 : }
+     189                 :             : 
+     190                 :             : static void
+     191                 :           2 : page_preferences_action (GtkWidget  *widget,
+     192                 :             :                          const char *action_name,
+     193                 :             :                          GVariant   *parameter)
+     194                 :             : {
+     195                 :           2 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (widget);
+     196                 :           2 :   GtkRoot *window = gtk_widget_get_root (widget);
+     197                 :             : 
+     198         [ +  - ]:           2 :   if (self->preferences == NULL)
+     199                 :             :     {
+     200                 :             : 
+     201                 :             : 
+     202                 :           2 :       self->preferences = g_object_new (VALENT_TYPE_DEVICE_PREFERENCES_DIALOG,
+     203                 :             :                                         "device",         self->device,
+     204                 :             :                                         NULL);
+     205                 :             : 
+     206                 :           2 :       g_object_add_weak_pointer (G_OBJECT (self->preferences),
+     207                 :           2 :                                  (gpointer)&self->preferences);
+     208                 :             :     }
+     209                 :             : 
+     210                 :           2 :   adw_dialog_present (ADW_DIALOG (self->preferences), GTK_WIDGET (window));
+     211                 :           2 : }
+     212                 :             : 
+     213                 :             : static void
+     214                 :           1 : page_pair_action (GtkWidget  *widget,
+     215                 :             :                   const char *action_name,
+     216                 :             :                   GVariant   *parameter)
+     217                 :             : {
+     218                 :           1 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (widget);
+     219                 :             : 
+     220         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE (self->device));
+     221                 :             : 
+     222                 :           1 :   g_action_group_activate_action (G_ACTION_GROUP (self->device), "pair", NULL);
+     223                 :           1 : }
+     224                 :             : 
+     225                 :             : static void
+     226                 :           1 : page_unpair_action (GtkWidget  *widget,
+     227                 :             :                     const char *action_name,
+     228                 :             :                     GVariant   *parameter)
+     229                 :             : {
+     230                 :           1 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (widget);
+     231                 :             : 
+     232         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE (self->device));
+     233                 :             : 
+     234                 :           1 :   g_action_group_activate_action (G_ACTION_GROUP (self->device), "unpair", NULL);
+     235                 :           1 : }
+     236                 :             : 
+     237                 :             : /*
+     238                 :             :  * GObject
+     239                 :             :  */
+     240                 :             : static void
+     241                 :           5 : valent_device_page_constructed (GObject *object)
+     242                 :             : {
+     243                 :           5 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (object);
+     244                 :           5 :   GMenuModel *menu;
+     245                 :             : 
+     246                 :           5 :   g_object_bind_property (self->device, "id",
+     247                 :             :                           self,         "tag",
+     248                 :             :                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+     249                 :           5 :   g_object_bind_property (self->device, "name",
+     250                 :             :                           self,         "title",
+     251                 :             :                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+     252                 :             : 
+     253                 :             :   /* Actions & Menu */
+     254                 :           5 :   gtk_widget_insert_action_group (GTK_WIDGET (self),
+     255                 :             :                                   "device",
+     256                 :           5 :                                   G_ACTION_GROUP (self->device));
+     257                 :             : 
+     258                 :           5 :   menu = valent_device_get_menu (self->device);
+     259                 :           5 :   valent_menu_stack_set_menu_model (self->menu_actions, menu);
+     260                 :             : 
+     261                 :             :   /* Pair Section */
+     262                 :           5 :   g_signal_connect_object (self->device,
+     263                 :             :                            "notify::state",
+     264                 :             :                            G_CALLBACK (on_state_changed),
+     265                 :             :                            self, 0);
+     266                 :           5 :   on_state_changed (self->device, NULL, self);
+     267                 :             : 
+     268                 :             :   /* Plugin Gadgets */
+     269                 :           5 :   g_signal_connect_object (self->device,
+     270                 :             :                            "notify::plugins",
+     271                 :             :                            G_CALLBACK (on_plugins_changed),
+     272                 :             :                            self, 0);
+     273                 :           5 :   on_plugins_changed (self->device, NULL, self);
+     274                 :             : 
+     275                 :           5 :   G_OBJECT_CLASS (valent_device_page_parent_class)->constructed (object);
+     276                 :           5 : }
+     277                 :             : 
+     278                 :             : static void
+     279                 :           5 : valent_device_page_dispose (GObject *object)
+     280                 :             : {
+     281                 :           5 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (object);
+     282                 :             : 
+     283         [ +  - ]:           5 :   g_clear_object (&self->device);
+     284         [ +  - ]:           5 :   g_clear_pointer (&self->plugins, g_hash_table_unref);
+     285         [ -  + ]:           5 :   g_clear_pointer (&self->preferences, adw_dialog_force_close);
+     286                 :             : 
+     287                 :           5 :   gtk_widget_dispose_template (GTK_WIDGET (object), VALENT_TYPE_DEVICE_PAGE);
+     288                 :             : 
+     289                 :           5 :   G_OBJECT_CLASS (valent_device_page_parent_class)->dispose (object);
+     290                 :           5 : }
+     291                 :             : 
+     292                 :             : static void
+     293                 :           1 : valent_device_page_get_property (GObject    *object,
+     294                 :             :                                  guint       prop_id,
+     295                 :             :                                  GValue     *value,
+     296                 :             :                                  GParamSpec *pspec)
+     297                 :             : {
+     298                 :           1 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (object);
+     299                 :             : 
+     300         [ +  - ]:           1 :   switch (prop_id)
+     301                 :             :     {
+     302                 :           1 :     case PROP_DEVICE:
+     303                 :           1 :       g_value_set_object (value, self->device);
+     304                 :           1 :       break;
+     305                 :             : 
+     306                 :           0 :     default:
+     307                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     308                 :             :     }
+     309                 :           1 : }
+     310                 :             : 
+     311                 :             : static void
+     312                 :           5 : valent_device_page_set_property (GObject      *object,
+     313                 :             :                                  guint         prop_id,
+     314                 :             :                                  const GValue *value,
+     315                 :             :                                  GParamSpec   *pspec)
+     316                 :             : {
+     317                 :           5 :   ValentDevicePage *self = VALENT_DEVICE_PAGE (object);
+     318                 :             : 
+     319         [ +  - ]:           5 :   switch (prop_id)
+     320                 :             :     {
+     321                 :           5 :     case PROP_DEVICE:
+     322                 :           5 :       self->device = g_value_dup_object (value);
+     323                 :           5 :       break;
+     324                 :             : 
+     325                 :           0 :     default:
+     326                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     327                 :             :     }
+     328                 :           5 : }
+     329                 :             : 
+     330                 :             : static void
+     331                 :           3 : valent_device_page_class_init (ValentDevicePageClass *klass)
+     332                 :             : {
+     333                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     334                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     335                 :             : 
+     336                 :           3 :   object_class->constructed = valent_device_page_constructed;
+     337                 :           3 :   object_class->dispose = valent_device_page_dispose;
+     338                 :           3 :   object_class->get_property = valent_device_page_get_property;
+     339                 :           3 :   object_class->set_property = valent_device_page_set_property;
+     340                 :             : 
+     341                 :             :   /* template */
+     342                 :           3 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-device-page.ui");
+     343                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePage, gadgets);
+     344                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePage, stack);
+     345                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePage, pair_request);
+     346                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePage, pair_spinner);
+     347                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePage, verification_key);
+     348                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePage, menu_actions);
+     349                 :             : 
+     350                 :           3 :   gtk_widget_class_install_action (widget_class, "page.preferences", NULL, page_preferences_action);
+     351                 :           3 :   gtk_widget_class_install_action (widget_class, "page.pair", NULL, page_pair_action);
+     352                 :           3 :   gtk_widget_class_install_action (widget_class, "page.unpair", NULL, page_unpair_action);
+     353                 :             : 
+     354                 :             :   /**
+     355                 :             :    * ValentDevicePage:device:
+     356                 :             :    *
+     357                 :             :    * The device this panel controls and represents.
+     358                 :             :    */
+     359                 :           6 :   properties [PROP_DEVICE] =
+     360                 :           3 :     g_param_spec_object ("device", NULL, NULL,
+     361                 :             :                          VALENT_TYPE_DEVICE,
+     362                 :             :                          (G_PARAM_READWRITE |
+     363                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     364                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     365                 :             :                           G_PARAM_STATIC_STRINGS));
+     366                 :             : 
+     367                 :           3 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     368                 :             : 
+     369                 :             :   /* Ensure the private types we need are ready */
+     370                 :           3 :   g_type_ensure (VALENT_TYPE_MENU_LIST);
+     371                 :           3 :   g_type_ensure (VALENT_TYPE_MENU_STACK);
+     372                 :           3 : }
+     373                 :             : 
+     374                 :             : static void
+     375                 :           5 : valent_device_page_init (ValentDevicePage *self)
+     376                 :             : {
+     377                 :           5 :   gtk_widget_init_template (GTK_WIDGET (self));
+     378                 :             : 
+     379                 :           5 :   self->plugins = g_hash_table_new_full (g_str_hash,
+     380                 :             :                                          g_str_equal,
+     381                 :             :                                          g_free,
+     382                 :             :                                          plugin_data_free);
+     383                 :           5 : }
+     384                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-page.h.func-c.html b/coverage/src/libvalent/ui/valent-device-page.h.func-c.html new file mode 100644 index 00000000000..f2aa5e9bea9 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-page.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-page.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-page.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PAGE18
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-page.h.func.html b/coverage/src/libvalent/ui/valent-device-page.h.func.html new file mode 100644 index 00000000000..88fe2a71294 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-page.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-page.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-page.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PAGE18
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-page.h.gcov.html b/coverage/src/libvalent/ui/valent-device-page.h.gcov.html new file mode 100644 index 00000000000..6145e40d39a --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-page.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-page.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-page.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_DEVICE_PAGE (valent_device_page_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          18 : G_DECLARE_FINAL_TYPE (ValentDevicePage, valent_device_page, VALENT, DEVICE_PAGE, AdwNavigationPage)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.func-c.html b/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.func-c.html new file mode 100644 index 00000000000..f64cf0367f6 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.func-c.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.5 %128121
Test Date:2024-03-31 18:46:36Functions:100.0 %1414
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_preferences_dialog_get_property1
valent_device_preferences_dialog_class_init2
plugin_list_sort3
plugin_sort3
valent_device_preferences_dialog_constructed3
valent_device_preferences_dialog_dispose3
valent_device_preferences_dialog_init3
valent_device_preferences_dialog_set_property3
on_plugins_changed6
plugin_data_free6
valent_device_preferences_dialog_add_plugin6
valent_device_preferences_dialog_get_type89
valent_device_preferences_dialog_class_intern_init2
valent_device_preferences_dialog_get_type_once35
valent_device_preferences_dialog_get_type52
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.func.html b/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.func.html new file mode 100644 index 00000000000..5c5cb5af17d --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.func.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.5 %128121
Test Date:2024-03-31 18:46:36Functions:100.0 %1414
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_plugins_changed6
plugin_data_free6
plugin_list_sort3
plugin_sort3
valent_device_preferences_dialog_add_plugin6
valent_device_preferences_dialog_class_init2
valent_device_preferences_dialog_constructed3
valent_device_preferences_dialog_dispose3
valent_device_preferences_dialog_get_property1
valent_device_preferences_dialog_get_type89
valent_device_preferences_dialog_class_intern_init2
valent_device_preferences_dialog_get_type52
valent_device_preferences_dialog_get_type_once35
valent_device_preferences_dialog_init3
valent_device_preferences_dialog_set_property3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.gcov.html b/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.gcov.html new file mode 100644 index 00000000000..29de97e2ec1 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-dialog.c.gcov.html @@ -0,0 +1,416 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-dialog.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.5 %128121
Test Date:2024-03-31 18:46:36Functions:100.0 %1414
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device-preferences-dialog"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : #include <libvalent-device.h>
+      13                 :             : 
+      14                 :             : #include "valent-device-preferences-group.h"
+      15                 :             : #include "valent-device-preferences-dialog.h"
+      16                 :             : #include "valent-plugin-row.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : struct _ValentDevicePreferencesDialog
+      20                 :             : {
+      21                 :             :   AdwPreferencesDialog  parent_instance;
+      22                 :             : 
+      23                 :             :   ValentDevice         *device;
+      24                 :             :   GHashTable           *plugins;
+      25                 :             : 
+      26                 :             :   /* template */
+      27                 :             :   AdwPreferencesPage   *status_page;
+      28                 :             :   AdwPreferencesPage   *sync_page;
+      29                 :             :   AdwPreferencesPage   *other_page;
+      30                 :             :   AdwPreferencesPage   *plugin_page;
+      31                 :             :   AdwPreferencesGroup  *plugin_group;
+      32                 :             :   GtkListBox           *plugin_list;
+      33                 :             : };
+      34                 :             : 
+      35   [ +  +  +  - ]:          89 : G_DEFINE_FINAL_TYPE (ValentDevicePreferencesDialog, valent_device_preferences_dialog, ADW_TYPE_PREFERENCES_DIALOG)
+      36                 :             : 
+      37                 :             : enum {
+      38                 :             :   PROP_0,
+      39                 :             :   PROP_DEVICE,
+      40                 :             :   N_PROPERTIES
+      41                 :             : };
+      42                 :             : 
+      43                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      44                 :             : 
+      45                 :             : 
+      46                 :             : static int
+      47                 :           3 : plugin_list_sort (GtkListBoxRow *row1,
+      48                 :             :                   GtkListBoxRow *row2,
+      49                 :             :                   gpointer       user_data)
+      50                 :             : {
+      51   [ +  -  -  + ]:           3 :   if G_UNLIKELY (!ADW_IS_PREFERENCES_ROW (row1) ||
+      52                 :             :                  !ADW_IS_PREFERENCES_ROW (row2))
+      53                 :           0 :     return 0;
+      54                 :             : 
+      55                 :           3 :   return g_utf8_collate (adw_preferences_row_get_title ((AdwPreferencesRow *)row1),
+      56                 :           3 :                          adw_preferences_row_get_title ((AdwPreferencesRow *)row2));
+      57                 :             : }
+      58                 :             : 
+      59                 :             : /*
+      60                 :             :  * Plugin Callbacks
+      61                 :             :  */
+      62                 :             : typedef struct
+      63                 :             : {
+      64                 :             :   AdwPreferencesDialog *window;
+      65                 :             :   AdwPreferencesPage   *page;
+      66                 :             :   AdwPreferencesGroup  *group;
+      67                 :             :   GtkWidget            *row;
+      68                 :             : } PluginData;
+      69                 :             : 
+      70                 :             : static void
+      71                 :           6 : plugin_data_free (gpointer data)
+      72                 :             : {
+      73                 :           6 :   PluginData *plugin = (PluginData *)data;
+      74                 :           6 :   ValentDevicePreferencesDialog *self = VALENT_DEVICE_PREFERENCES_DIALOG (plugin->window);
+      75                 :             : 
+      76         [ +  - ]:           6 :   g_assert (VALENT_IS_DEVICE_PREFERENCES_DIALOG (self));
+      77                 :             : 
+      78   [ +  +  +  - ]:           6 :   if (plugin->page != NULL && plugin->group != NULL)
+      79                 :           3 :     adw_preferences_page_remove (plugin->page, plugin->group);
+      80                 :             : 
+      81         [ +  - ]:           6 :   if (plugin->row != NULL)
+      82                 :           6 :     gtk_list_box_remove (self->plugin_list, plugin->row);
+      83                 :             : 
+      84                 :           6 :   g_free (plugin);
+      85                 :           6 : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           6 : valent_device_preferences_dialog_add_plugin (ValentDevicePreferencesDialog *self,
+      89                 :             :                                              const char                    *module)
+      90                 :             : {
+      91                 :           6 :   ValentContext *context = NULL;
+      92                 :          12 :   g_autoptr (ValentContext) plugin_context = NULL;
+      93                 :           6 :   PeasEngine *engine;
+      94                 :           6 :   PeasPluginInfo *info;
+      95                 :           6 :   PluginData *plugin;
+      96                 :           6 :   const char *title;
+      97                 :           6 :   const char *subtitle;
+      98                 :             : 
+      99         [ +  - ]:           6 :   g_assert (VALENT_IS_DEVICE_PREFERENCES_DIALOG (self));
+     100   [ +  -  -  + ]:           6 :   g_assert (module != NULL && *module != '\0');
+     101                 :             : 
+     102                 :           6 :   engine = valent_get_plugin_engine ();
+     103                 :           6 :   info = peas_engine_get_plugin_info (engine, module);
+     104                 :           6 :   plugin = g_new0 (PluginData, 1);
+     105                 :           6 :   plugin->window = ADW_PREFERENCES_DIALOG (self);
+     106                 :             : 
+     107                 :           6 :   title = peas_plugin_info_get_name (info);
+     108                 :           6 :   subtitle = peas_plugin_info_get_description (info);
+     109                 :             : 
+     110                 :             :   /* Plugin Row */
+     111                 :           6 :   context = valent_device_get_context (self->device);
+     112                 :           6 :   plugin_context = valent_context_get_plugin_context (context, info);
+     113                 :           6 :   plugin->row = g_object_new (VALENT_TYPE_PLUGIN_ROW,
+     114                 :             :                               "context",     plugin_context,
+     115                 :             :                               "plugin-info", info,
+     116                 :             :                               "title",       title,
+     117                 :             :                               "subtitle",    subtitle,
+     118                 :             :                               NULL);
+     119                 :           6 :   gtk_list_box_insert (self->plugin_list, plugin->row, -1);
+     120                 :             : 
+     121                 :             :   /* Preferences Page */
+     122         [ +  + ]:           6 :   if (peas_engine_provides_extension (engine,
+     123                 :             :                                       info,
+     124                 :             :                                       VALENT_TYPE_DEVICE_PREFERENCES_GROUP))
+     125                 :             :     {
+     126                 :           3 :       GObject *group;
+     127                 :           3 :       const char *category;
+     128                 :             : 
+     129                 :           3 :       group = peas_engine_create_extension (engine,
+     130                 :             :                                             info,
+     131                 :             :                                             VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+     132                 :             :                                             "context",     plugin_context,
+     133                 :             :                                             "name",        module,
+     134                 :             :                                             "title",       title,
+     135                 :             :                                             "description", subtitle,
+     136                 :             :                                             NULL);
+     137                 :             : 
+     138   [ -  +  -  - ]:           3 :       g_return_if_fail (VALENT_IS_DEVICE_PREFERENCES_GROUP (group));
+     139                 :           3 :       plugin->group = ADW_PREFERENCES_GROUP (group);
+     140                 :             : 
+     141                 :           3 :       category = peas_plugin_info_get_external_data (info,
+     142                 :             :                                                      "X-DevicePluginCategory");
+     143                 :             : 
+     144   [ +  -  -  + ]:           6 :       if (g_strcmp0 (category, "Network;FileTransfer;") == 0 ||
+     145                 :           3 :           g_strcmp0 (category, "Network;RemoteAccess;") == 0)
+     146                 :           0 :         plugin->page = self->sync_page;
+     147   [ +  -  -  + ]:           6 :       else if (g_strcmp0 (category, "System;Monitor;") == 0 ||
+     148                 :           3 :           g_strcmp0 (category, "Network;Telephony;") == 0)
+     149                 :           0 :         plugin->page = self->status_page;
+     150                 :             :       else
+     151                 :           3 :         plugin->page = self->other_page;
+     152                 :             : 
+     153                 :           3 :       adw_preferences_page_add (plugin->page, plugin->group);
+     154                 :             :     }
+     155                 :             : 
+     156   [ -  +  +  - ]:          12 :   g_hash_table_replace (self->plugins,
+     157                 :           6 :                         g_strdup (module),
+     158                 :             :                         g_steal_pointer (&plugin));
+     159                 :             : }
+     160                 :             : 
+     161                 :             : static int
+     162                 :           3 : plugin_sort (gconstpointer a,
+     163                 :             :              gconstpointer b)
+     164                 :             : {
+     165                 :           3 :   const char *a_ = *(char **)a;
+     166                 :           3 :   const char *b_ = *(char **)b;
+     167                 :             : 
+     168                 :           3 :   return strcmp (a_, b_);
+     169                 :             : }
+     170                 :             : 
+     171                 :             : static void
+     172                 :           6 : on_plugins_changed (ValentDevice                  *device,
+     173                 :             :                     GParamSpec                    *pspec,
+     174                 :             :                     ValentDevicePreferencesDialog *self)
+     175                 :             : {
+     176                 :          12 :   g_auto (GStrv) plugins = NULL;
+     177                 :           6 :   GHashTableIter iter;
+     178                 :           6 :   const char *module;
+     179                 :             : 
+     180                 :           6 :   plugins = valent_device_get_plugins (device);
+     181                 :           6 :   qsort (plugins, g_strv_length (plugins), sizeof (char *), plugin_sort);
+     182                 :             : 
+     183                 :             :   /* Remove */
+     184                 :           6 :   g_hash_table_iter_init (&iter, self->plugins);
+     185                 :             : 
+     186         [ +  + ]:          17 :   while (g_hash_table_iter_next (&iter, (void **)&module, NULL))
+     187                 :             :     {
+     188         [ +  + ]:           5 :       if (!g_strv_contains ((const char * const *)plugins, module))
+     189                 :           2 :         g_hash_table_iter_remove (&iter);
+     190                 :             :     }
+     191                 :             : 
+     192         [ +  + ]:          15 :   for (unsigned int i = 0; plugins[i] != NULL; i++)
+     193                 :             :     {
+     194         [ +  + ]:           9 :       if (!g_hash_table_contains (self->plugins, plugins[i]))
+     195                 :           6 :         valent_device_preferences_dialog_add_plugin (self, plugins[i]);
+     196                 :             :     }
+     197                 :           6 : }
+     198                 :             : 
+     199                 :             : /*
+     200                 :             :  * GObject
+     201                 :             :  */
+     202                 :             : static void
+     203                 :           3 : valent_device_preferences_dialog_constructed (GObject *object)
+     204                 :             : {
+     205                 :           3 :   ValentDevicePreferencesDialog *self = VALENT_DEVICE_PREFERENCES_DIALOG (object);
+     206                 :             : 
+     207                 :             :   /* Device */
+     208                 :           3 :   g_object_bind_property (self->device, "name",
+     209                 :             :                           self,         "title",
+     210                 :             :                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+     211                 :             : 
+     212                 :           3 :   gtk_widget_insert_action_group (GTK_WIDGET (self),
+     213                 :             :                                   "device",
+     214                 :           3 :                                   G_ACTION_GROUP (self->device));
+     215                 :             : 
+     216                 :             :   /* Device_plugins */
+     217                 :           3 :   g_signal_connect_object (self->device,
+     218                 :             :                            "notify::plugins",
+     219                 :             :                            G_CALLBACK (on_plugins_changed),
+     220                 :             :                            self, 0);
+     221                 :           3 :   on_plugins_changed (self->device, NULL, self);
+     222                 :             : 
+     223                 :           3 :   G_OBJECT_CLASS (valent_device_preferences_dialog_parent_class)->constructed (object);
+     224                 :           3 : }
+     225                 :             : 
+     226                 :             : static void
+     227                 :           3 : valent_device_preferences_dialog_dispose (GObject *object)
+     228                 :             : {
+     229                 :           3 :   ValentDevicePreferencesDialog *self = VALENT_DEVICE_PREFERENCES_DIALOG (object);
+     230                 :             : 
+     231         [ +  - ]:           3 :   g_clear_object (&self->device);
+     232         [ +  - ]:           3 :   g_clear_pointer (&self->plugins, g_hash_table_unref);
+     233                 :             : 
+     234                 :           3 :   gtk_widget_dispose_template (GTK_WIDGET (object),
+     235                 :             :                                VALENT_TYPE_DEVICE_PREFERENCES_DIALOG);
+     236                 :             : 
+     237                 :           3 :   G_OBJECT_CLASS (valent_device_preferences_dialog_parent_class)->dispose (object);
+     238                 :           3 : }
+     239                 :             : 
+     240                 :             : static void
+     241                 :           1 : valent_device_preferences_dialog_get_property (GObject    *object,
+     242                 :             :                                                guint       prop_id,
+     243                 :             :                                                GValue     *value,
+     244                 :             :                                                GParamSpec *pspec)
+     245                 :             : {
+     246                 :           1 :   ValentDevicePreferencesDialog *self = VALENT_DEVICE_PREFERENCES_DIALOG (object);
+     247                 :             : 
+     248         [ +  - ]:           1 :   switch (prop_id)
+     249                 :             :     {
+     250                 :           1 :     case PROP_DEVICE:
+     251                 :           1 :       g_value_set_object (value, self->device);
+     252                 :           1 :       break;
+     253                 :             : 
+     254                 :           0 :     default:
+     255                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     256                 :             :     }
+     257                 :           1 : }
+     258                 :             : 
+     259                 :             : static void
+     260                 :           3 : valent_device_preferences_dialog_set_property (GObject      *object,
+     261                 :             :                                                guint         prop_id,
+     262                 :             :                                                const GValue *value,
+     263                 :             :                                                GParamSpec   *pspec)
+     264                 :             : {
+     265                 :           3 :   ValentDevicePreferencesDialog *self = VALENT_DEVICE_PREFERENCES_DIALOG (object);
+     266                 :             : 
+     267         [ +  - ]:           3 :   switch (prop_id)
+     268                 :             :     {
+     269                 :           3 :     case PROP_DEVICE:
+     270                 :           3 :       self->device = g_value_dup_object (value);
+     271                 :           3 :       break;
+     272                 :             : 
+     273                 :           0 :     default:
+     274                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     275                 :             :     }
+     276                 :           3 : }
+     277                 :             : 
+     278                 :             : static void
+     279                 :           2 : valent_device_preferences_dialog_class_init (ValentDevicePreferencesDialogClass *klass)
+     280                 :             : {
+     281                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     282                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     283                 :             : 
+     284                 :           2 :   object_class->constructed = valent_device_preferences_dialog_constructed;
+     285                 :           2 :   object_class->dispose = valent_device_preferences_dialog_dispose;
+     286                 :           2 :   object_class->get_property = valent_device_preferences_dialog_get_property;
+     287                 :           2 :   object_class->set_property = valent_device_preferences_dialog_set_property;
+     288                 :             : 
+     289                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-device-preferences-dialog.ui");
+     290                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePreferencesDialog, status_page);
+     291                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePreferencesDialog, sync_page);
+     292                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePreferencesDialog, other_page);
+     293                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePreferencesDialog, plugin_page);
+     294                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePreferencesDialog, plugin_group);
+     295                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentDevicePreferencesDialog, plugin_list);
+     296                 :             : 
+     297                 :             :   /**
+     298                 :             :    * ValentDevicePreferencesDialog:device:
+     299                 :             :    *
+     300                 :             :    * The device this panel controls and represents.
+     301                 :             :    */
+     302                 :           4 :   properties [PROP_DEVICE] =
+     303                 :           2 :     g_param_spec_object ("device", NULL, NULL,
+     304                 :             :                          VALENT_TYPE_DEVICE,
+     305                 :             :                          (G_PARAM_READWRITE |
+     306                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     307                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     308                 :             :                           G_PARAM_STATIC_STRINGS));
+     309                 :             : 
+     310                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     311                 :           2 : }
+     312                 :             : 
+     313                 :             : static void
+     314                 :           3 : valent_device_preferences_dialog_init (ValentDevicePreferencesDialog *self)
+     315                 :             : {
+     316                 :           3 :   gtk_widget_init_template (GTK_WIDGET (self));
+     317                 :             : 
+     318                 :           3 :   gtk_list_box_set_sort_func (self->plugin_list, plugin_list_sort, NULL, NULL);
+     319                 :           3 :   self->plugins = g_hash_table_new_full (g_str_hash,
+     320                 :             :                                          g_str_equal,
+     321                 :             :                                          g_free,
+     322                 :             :                                          plugin_data_free);
+     323                 :           3 : }
+     324                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.func-c.html b/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.func-c.html new file mode 100644 index 00000000000..d2ad72d55b6 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PREFERENCES_DIALOG12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.func.html b/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.func.html new file mode 100644 index 00000000000..ba1642980a3 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PREFERENCES_DIALOG12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.gcov.html b/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.gcov.html new file mode 100644 index 00000000000..95eef8d6376 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-dialog.h.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-dialog.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : #include "../core/valent-object.h"
+       9                 :             : 
+      10                 :             : G_BEGIN_DECLS
+      11                 :             : 
+      12                 :             : #define VALENT_TYPE_DEVICE_PREFERENCES_DIALOG (valent_device_preferences_dialog_get_type())
+      13                 :             : 
+      14   [ +  -  +  -  :          12 : G_DECLARE_FINAL_TYPE (ValentDevicePreferencesDialog, valent_device_preferences_dialog, VALENT, DEVICE_PREFERENCES_DIALOG, AdwPreferencesDialog)
+                   -  + ]
+      15                 :             : 
+      16                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-group.c.func-c.html b/coverage/src/libvalent/ui/valent-device-preferences-group.c.func-c.html new file mode 100644 index 00000000000..c4e6d3b81f8 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-group.c.func-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-group.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-group.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.9 %6962
Test Date:2024-03-31 18:46:36Functions:100.0 %1010
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %2718
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_preferences_group_get_property2
valent_device_preferences_group_get_context11
valent_device_preferences_group_finalize13
valent_device_preferences_group_get_settings13
valent_device_preferences_group_init13
valent_device_preferences_group_set_property26
valent_device_preferences_group_class_init66
valent_device_preferences_group_get_type401
valent_device_preferences_group_class_intern_init66
valent_device_preferences_group_get_type_once75
valent_device_preferences_group_get_type260
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-group.c.func.html b/coverage/src/libvalent/ui/valent-device-preferences-group.c.func.html new file mode 100644 index 00000000000..aeecee785a7 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-group.c.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-group.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-group.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.9 %6962
Test Date:2024-03-31 18:46:36Functions:100.0 %1010
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %2718
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_device_preferences_group_class_init66
valent_device_preferences_group_finalize13
valent_device_preferences_group_get_context11
valent_device_preferences_group_get_property2
valent_device_preferences_group_get_settings13
valent_device_preferences_group_get_type401
valent_device_preferences_group_class_intern_init66
valent_device_preferences_group_get_type260
valent_device_preferences_group_get_type_once75
valent_device_preferences_group_init13
valent_device_preferences_group_set_property26
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-group.c.gcov.html b/coverage/src/libvalent/ui/valent-device-preferences-group.c.gcov.html new file mode 100644 index 00000000000..d48051ec9f9 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-group.c.gcov.html @@ -0,0 +1,326 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-group.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-group.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.9 %6962
Test Date:2024-03-31 18:46:36Functions:100.0 %1010
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %2718
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-device-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <adwaita.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : #include <libvalent-device.h>
+      13                 :             : 
+      14                 :             : #include "valent-device-preferences-group.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : /**
+      18                 :             :  * ValentDevicePreferencesGroup:
+      19                 :             :  *
+      20                 :             :  * An abstract base class for device plugin preferences.
+      21                 :             :  *
+      22                 :             :  * `ValentDevicePreferencesGroup` is a base class for [class@Valent.DevicePlugin]
+      23                 :             :  * implementations that want to provide a group of preferences.
+      24                 :             :  *
+      25                 :             :  * Since: 1.0
+      26                 :             :  */
+      27                 :             : 
+      28                 :             : typedef struct
+      29                 :             : {
+      30                 :             :   ValentContext  *context;
+      31                 :             :   PeasPluginInfo *plugin_info;
+      32                 :             :   GSettings      *settings;
+      33                 :             : } ValentDevicePreferencesGroupPrivate;
+      34                 :             : 
+      35   [ +  +  +  - ]:         466 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentDevicePreferencesGroup, valent_device_preferences_group, ADW_TYPE_PREFERENCES_GROUP)
+      36                 :             : 
+      37                 :             : enum {
+      38                 :             :   PROP_0,
+      39                 :             :   PROP_CONTEXT,
+      40                 :             :   PROP_PLUGIN_INFO,
+      41                 :             :   PROP_SETTINGS,
+      42                 :             :   N_PROPERTIES
+      43                 :             : };
+      44                 :             : 
+      45                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      46                 :             : 
+      47                 :             : 
+      48                 :             : /*
+      49                 :             :  * GObject
+      50                 :             :  */
+      51                 :             : static void
+      52                 :          13 : valent_device_preferences_group_finalize (GObject *object)
+      53                 :             : {
+      54                 :          13 :   ValentDevicePreferencesGroup *self = VALENT_DEVICE_PREFERENCES_GROUP (object);
+      55                 :          13 :   ValentDevicePreferencesGroupPrivate *priv = valent_device_preferences_group_get_instance_private (self);
+      56                 :             : 
+      57         [ +  - ]:          13 :   g_clear_object (&priv->context);
+      58         [ +  - ]:          13 :   g_clear_object (&priv->plugin_info);
+      59         [ +  + ]:          13 :   g_clear_object (&priv->settings);
+      60                 :             : 
+      61                 :          13 :   G_OBJECT_CLASS (valent_device_preferences_group_parent_class)->finalize (object);
+      62                 :          13 : }
+      63                 :             : 
+      64                 :             : static void
+      65                 :           2 : valent_device_preferences_group_get_property (GObject    *object,
+      66                 :             :                                               guint       prop_id,
+      67                 :             :                                               GValue     *value,
+      68                 :             :                                               GParamSpec *pspec)
+      69                 :             : {
+      70                 :           2 :   ValentDevicePreferencesGroup *self = VALENT_DEVICE_PREFERENCES_GROUP (object);
+      71                 :           2 :   ValentDevicePreferencesGroupPrivate *priv = valent_device_preferences_group_get_instance_private (self);
+      72                 :             : 
+      73   [ -  +  +  - ]:           2 :   switch (prop_id)
+      74                 :             :     {
+      75                 :           0 :     case PROP_CONTEXT:
+      76                 :           0 :       g_value_set_object (value, valent_device_preferences_group_get_context (self));
+      77                 :           0 :       break;
+      78                 :             : 
+      79                 :           1 :     case PROP_PLUGIN_INFO:
+      80                 :           1 :       g_value_set_object (value, priv->plugin_info);
+      81                 :           1 :       break;
+      82                 :             : 
+      83                 :           1 :     case PROP_SETTINGS:
+      84                 :           1 :       g_value_set_object (value, valent_device_preferences_group_get_settings (self));
+      85                 :           1 :       break;
+      86                 :             : 
+      87                 :           0 :     default:
+      88                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      89                 :             :     }
+      90                 :           2 : }
+      91                 :             : 
+      92                 :             : static void
+      93                 :          26 : valent_device_preferences_group_set_property (GObject      *object,
+      94                 :             :                                               guint         prop_id,
+      95                 :             :                                               const GValue *value,
+      96                 :             :                                               GParamSpec   *pspec)
+      97                 :             : {
+      98                 :          26 :   ValentDevicePreferencesGroup *self = VALENT_DEVICE_PREFERENCES_GROUP (object);
+      99                 :          26 :   ValentDevicePreferencesGroupPrivate *priv = valent_device_preferences_group_get_instance_private (self);
+     100                 :             : 
+     101      [ +  +  - ]:          26 :   switch (prop_id)
+     102                 :             :     {
+     103                 :          13 :     case PROP_CONTEXT:
+     104                 :          13 :       priv->context = g_value_dup_object (value);
+     105                 :          13 :       break;
+     106                 :             : 
+     107                 :          13 :     case PROP_PLUGIN_INFO:
+     108                 :          13 :       priv->plugin_info = g_value_dup_object (value);
+     109                 :          13 :       break;
+     110                 :             : 
+     111                 :           0 :     default:
+     112                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     113                 :             :     }
+     114                 :          26 : }
+     115                 :             : 
+     116                 :             : static void
+     117                 :          66 : valent_device_preferences_group_class_init (ValentDevicePreferencesGroupClass *klass)
+     118                 :             : {
+     119                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     120                 :             : 
+     121                 :          66 :   object_class->finalize = valent_device_preferences_group_finalize;
+     122                 :          66 :   object_class->get_property = valent_device_preferences_group_get_property;
+     123                 :          66 :   object_class->set_property = valent_device_preferences_group_set_property;
+     124                 :             : 
+     125                 :             :   /**
+     126                 :             :    * ValentDevicePreferencesGroup:context: (getter get_context)
+     127                 :             :    *
+     128                 :             :    * The [class@Valent.Context] for the [class@Valent.DevicePlugin].
+     129                 :             :    *
+     130                 :             :    * Since: 1.0
+     131                 :             :    */
+     132                 :         132 :   properties [PROP_CONTEXT] =
+     133                 :          66 :     g_param_spec_object ("context", NULL, NULL,
+     134                 :             :                          VALENT_TYPE_CONTEXT,
+     135                 :             :                          (G_PARAM_READWRITE |
+     136                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     137                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     138                 :             :                           G_PARAM_STATIC_STRINGS));
+     139                 :             : 
+     140                 :             :   /**
+     141                 :             :    * ValentDevicePreferencesGroup:plugin-info:
+     142                 :             :    *
+     143                 :             :    * The [class@Peas.PluginInfo] describing this plugin.
+     144                 :             :    *
+     145                 :             :    * Since: 1.0
+     146                 :             :    */
+     147                 :         132 :   properties [PROP_PLUGIN_INFO] =
+     148                 :          66 :     g_param_spec_object ("plugin-info", NULL, NULL,
+     149                 :             :                          PEAS_TYPE_PLUGIN_INFO,
+     150                 :             :                          (G_PARAM_READWRITE |
+     151                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     152                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     153                 :             :                           G_PARAM_STATIC_STRINGS));
+     154                 :             : 
+     155                 :             :   /**
+     156                 :             :    * ValentDevicePreferencesGroup:settings: (getter get_settings)
+     157                 :             :    *
+     158                 :             :    * The [class@Gio.Settings] for the [class@Valent.DevicePlugin].
+     159                 :             :    *
+     160                 :             :    * Since: 1.0
+     161                 :             :    */
+     162                 :         132 :   properties [PROP_SETTINGS] =
+     163                 :          66 :     g_param_spec_object ("settings", NULL, NULL,
+     164                 :             :                          G_TYPE_SETTINGS,
+     165                 :             :                          (G_PARAM_READABLE |
+     166                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     167                 :             :                           G_PARAM_STATIC_STRINGS));
+     168                 :             : 
+     169                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     170                 :          66 : }
+     171                 :             : 
+     172                 :             : static void
+     173                 :          13 : valent_device_preferences_group_init (ValentDevicePreferencesGroup *self)
+     174                 :             : {
+     175                 :          13 : }
+     176                 :             : 
+     177                 :             : /**
+     178                 :             :  * valent_device_preferences_group_get_context:
+     179                 :             :  * @group: a `ValentDevicePreferencesGroup`
+     180                 :             :  *
+     181                 :             :  * Get the [class@Valent.Context] for the [class@Valent.DevicePlugin].
+     182                 :             :  *
+     183                 :             :  * Returns: (transfer none) (nullable): a `ValentContext`
+     184                 :             :  *
+     185                 :             :  * Since: 1.0
+     186                 :             :  */
+     187                 :             : ValentContext *
+     188                 :          11 : valent_device_preferences_group_get_context (ValentDevicePreferencesGroup *group)
+     189                 :             : {
+     190                 :          11 :   ValentDevicePreferencesGroupPrivate *priv = valent_device_preferences_group_get_instance_private (group);
+     191                 :             : 
+     192         [ +  - ]:          11 :   g_return_val_if_fail (VALENT_IS_DEVICE_PREFERENCES_GROUP (group), NULL);
+     193                 :             : 
+     194         [ +  + ]:          11 :   if (priv->context == NULL)
+     195                 :             :     {
+     196                 :          21 :       g_autoptr (ValentContext) context = NULL;
+     197                 :             : 
+     198                 :          10 :       context = valent_context_new (NULL, "device", "default");
+     199         [ +  - ]:          10 :       priv->context = valent_context_get_plugin_context (context, priv->plugin_info);
+     200                 :             :     }
+     201                 :             : 
+     202                 :          11 :   return priv->context;
+     203                 :             : }
+     204                 :             : 
+     205                 :             : /**
+     206                 :             :  * valent_device_preferences_group_get_settings:
+     207                 :             :  * @group: a `ValentDevicePreferencesGroup`
+     208                 :             :  *
+     209                 :             :  * Get the [class@Gio.Settings] for the [class@Valent.DevicePlugin].
+     210                 :             :  *
+     211                 :             :  * Returns: (transfer none) (nullable): a `GSettings`
+     212                 :             :  *
+     213                 :             :  * Since: 1.0
+     214                 :             :  */
+     215                 :             : GSettings *
+     216                 :          13 : valent_device_preferences_group_get_settings (ValentDevicePreferencesGroup *group)
+     217                 :             : {
+     218                 :          13 :   ValentDevicePreferencesGroupPrivate *priv = valent_device_preferences_group_get_instance_private (group);
+     219                 :             : 
+     220         [ +  - ]:          13 :   g_return_val_if_fail (VALENT_IS_DEVICE_PREFERENCES_GROUP (group), NULL);
+     221                 :             : 
+     222         [ +  + ]:          13 :   if (priv->settings == NULL)
+     223                 :             :     {
+     224                 :          10 :       ValentContext *context = NULL;
+     225                 :             : 
+     226                 :          10 :       context = valent_device_preferences_group_get_context (group);
+     227                 :          10 :       priv->settings = valent_context_get_plugin_settings (context,
+     228                 :             :                                                            priv->plugin_info,
+     229                 :             :                                                            "X-DevicePluginSettings");
+     230                 :             :     }
+     231                 :             : 
+     232                 :          13 :   return priv->settings;
+     233                 :             : }
+     234                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-group.h.func-c.html b/coverage/src/libvalent/ui/valent-device-preferences-group.h.func-c.html new file mode 100644 index 00000000000..275e6b65919 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-group.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-group.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-group.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PREFERENCES_GROUP27
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-group.h.func.html b/coverage/src/libvalent/ui/valent-device-preferences-group.h.func.html new file mode 100644 index 00000000000..ca6d9ff248f --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-group.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-group.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-group.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DEVICE_PREFERENCES_GROUP27
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-device-preferences-group.h.gcov.html b/coverage/src/libvalent/ui/valent-device-preferences-group.h.gcov.html new file mode 100644 index 00000000000..f1ae3efd16e --- /dev/null +++ b/coverage/src/libvalent/ui/valent-device-preferences-group.h.gcov.html @@ -0,0 +1,128 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-device-preferences-group.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-device-preferences-group.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #if !defined (VALENT_INSIDE) && !defined (VALENT_COMPILATION)
+       7                 :             : # error "Only <valent.h> can be included directly."
+       8                 :             : #endif
+       9                 :             : 
+      10                 :             : #include <adwaita.h>
+      11                 :             : 
+      12                 :             : #include "../core/valent-context.h"
+      13                 :             : 
+      14                 :             : G_BEGIN_DECLS
+      15                 :             : 
+      16                 :             : #define VALENT_TYPE_DEVICE_PREFERENCES_GROUP (valent_device_preferences_group_get_type ())
+      17                 :             : 
+      18                 :             : VALENT_AVAILABLE_IN_1_0
+      19   [ +  -  +  -  :          27 : G_DECLARE_DERIVABLE_TYPE (ValentDevicePreferencesGroup, valent_device_preferences_group, VALENT, DEVICE_PREFERENCES_GROUP, AdwPreferencesGroup)
+                   +  - ]
+      20                 :             : 
+      21                 :             : struct _ValentDevicePreferencesGroupClass
+      22                 :             : {
+      23                 :             :   AdwPreferencesGroupClass   parent_class;
+      24                 :             : 
+      25                 :             :   /*< private >*/
+      26                 :             :   gpointer                   padding[8];
+      27                 :             : };
+      28                 :             : 
+      29                 :             : VALENT_AVAILABLE_IN_1_0
+      30                 :             : ValentContext * valent_device_preferences_group_get_context   (ValentDevicePreferencesGroup *group);
+      31                 :             : VALENT_AVAILABLE_IN_1_0
+      32                 :             : GSettings     * valent_device_preferences_group_get_settings (ValentDevicePreferencesGroup *group);
+      33                 :             : 
+      34                 :             : G_END_DECLS
+      35                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-input-remote.c.func-c.html b/coverage/src/libvalent/ui/valent-input-remote.c.func-c.html new file mode 100644 index 00000000000..ba626e1ea0c --- /dev/null +++ b/coverage/src/libvalent/ui/valent-input-remote.c.func-c.html @@ -0,0 +1,266 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-input-remote.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-input-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:45.1 %20492
Test Date:2024-03-31 18:46:36Functions:50.0 %2412
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:19.6 %9218
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
calculate_delta0
get_last_update_time0
on_double_begin0
on_double_end0
on_key_pressed0
on_key_released0
on_scroll0
on_single_begin0
on_single_end0
on_single_update0
on_triple_begin0
on_triple_end0
valent_input_remote_class_init1
valent_input_remote_constructed1
valent_input_remote_dispose1
valent_input_remote_get_property1
valent_input_remote_init1
valent_input_remote_set_property1
dup_adapter_name2
valent_input_remote_check_adapter2
on_selected_item3
valent_input_remote_get_type77
valent_input_remote_class_intern_init1
valent_input_remote_get_type_once35
valent_input_remote_get_type41
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-input-remote.c.func.html b/coverage/src/libvalent/ui/valent-input-remote.c.func.html new file mode 100644 index 00000000000..b5c003bae24 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-input-remote.c.func.html @@ -0,0 +1,266 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-input-remote.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-input-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:45.1 %20492
Test Date:2024-03-31 18:46:36Functions:50.0 %2412
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:19.6 %9218
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
calculate_delta0
dup_adapter_name2
get_last_update_time0
on_double_begin0
on_double_end0
on_key_pressed0
on_key_released0
on_scroll0
on_selected_item3
on_single_begin0
on_single_end0
on_single_update0
on_triple_begin0
on_triple_end0
valent_input_remote_check_adapter2
valent_input_remote_class_init1
valent_input_remote_constructed1
valent_input_remote_dispose1
valent_input_remote_get_property1
valent_input_remote_get_type77
valent_input_remote_class_intern_init1
valent_input_remote_get_type41
valent_input_remote_get_type_once35
valent_input_remote_init1
valent_input_remote_set_property1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-input-remote.c.gcov.html b/coverage/src/libvalent/ui/valent-input-remote.c.gcov.html new file mode 100644 index 00000000000..077419a8fae --- /dev/null +++ b/coverage/src/libvalent/ui/valent-input-remote.c.gcov.html @@ -0,0 +1,628 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-input-remote.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-input-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:45.1 %20492
Test Date:2024-03-31 18:46:36Functions:50.0 %2412
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:19.6 %9218
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-input-remote"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : #include <libvalent-input.h>
+      13                 :             : 
+      14                 :             : #include "valent-input-remote.h"
+      15                 :             : #include "valent-ui-utils.h"
+      16                 :             : #include "valent-ui-utils-private.h"
+      17                 :             : 
+      18                 :             : #define CAPTURE_THRESHOLD_MS 50
+      19                 :             : 
+      20                 :             : 
+      21                 :             : struct _ValentInputRemote
+      22                 :             : {
+      23                 :             :   AdwWindow           parent_instance;
+      24                 :             : 
+      25                 :             :   GListModel         *adapters;
+      26                 :             :   ValentInputAdapter *adapter;
+      27                 :             : 
+      28                 :             :   /* Pointer State */
+      29                 :             :   unsigned int        claimed : 1;
+      30                 :             :   uint32_t            timestamp;
+      31                 :             : 
+      32                 :             :   double              last_x;
+      33                 :             :   double              last_y;
+      34                 :             :   double              last_v;
+      35                 :             :   int                 scale;
+      36                 :             : 
+      37                 :             :   /* template */
+      38                 :             :   GtkDropDown        *input_adapter;
+      39                 :             :   GtkWidget          *editor;
+      40                 :             :   GtkEventController *keyboard;
+      41                 :             :   GtkWidget          *touchpad;
+      42                 :             :   GtkGesture         *pointer_scroll;
+      43                 :             :   GtkGesture         *touch_single;
+      44                 :             :   GtkGesture         *touch_double;
+      45                 :             :   GtkGesture         *touch_triple;
+      46                 :             : };
+      47                 :             : 
+      48   [ +  +  +  - ]:          77 : G_DEFINE_FINAL_TYPE (ValentInputRemote, valent_input_remote, ADW_TYPE_WINDOW)
+      49                 :             : 
+      50                 :             : enum {
+      51                 :             :   PROP_0,
+      52                 :             :   PROP_ADAPTERS,
+      53                 :             :   N_PROPERTIES
+      54                 :             : };
+      55                 :             : 
+      56                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      57                 :             : 
+      58                 :             : 
+      59                 :             : static inline gboolean
+      60                 :           2 : valent_input_remote_check_adapter (ValentInputRemote *self)
+      61                 :             : {
+      62         [ +  - ]:           2 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+      63                 :             : 
+      64         [ +  + ]:           2 :   if G_UNLIKELY (self->adapter == NULL)
+      65                 :             :     {
+      66                 :           1 :       self->claimed = FALSE;
+      67                 :           1 :       self->timestamp = 0;
+      68                 :           1 :       self->last_x = 0.0;
+      69                 :           1 :       self->last_y = 0.0;
+      70                 :           1 :       self->last_v = 0.0;
+      71                 :             : 
+      72                 :           1 :       return FALSE;
+      73                 :             :     }
+      74                 :             : 
+      75                 :             :   return TRUE;
+      76                 :             : }
+      77                 :             : 
+      78                 :             : /*
+      79                 :             :  * Keyboard Input
+      80                 :             :  */
+      81                 :             : static gboolean
+      82                 :           0 : on_key_pressed (GtkEventControllerKey *controller,
+      83                 :             :                 unsigned int           keyval,
+      84                 :             :                 unsigned int           keycode,
+      85                 :             :                 GdkModifierType        state,
+      86                 :             :                 ValentInputRemote     *self)
+      87                 :             : {
+      88         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+      89                 :             : 
+      90         [ #  # ]:           0 :   if (valent_input_remote_check_adapter (self))
+      91                 :           0 :     valent_input_adapter_keyboard_keysym (self->adapter, keyval, TRUE);
+      92                 :             : 
+      93                 :           0 :   return TRUE;
+      94                 :             : }
+      95                 :             : 
+      96                 :             : static gboolean
+      97                 :           0 : on_key_released (GtkEventControllerKey *controller,
+      98                 :             :                  unsigned int           keyval,
+      99                 :             :                  unsigned int           keycode,
+     100                 :             :                  GdkModifierType        state,
+     101                 :             :                  ValentInputRemote     *self)
+     102                 :             : {
+     103         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     104                 :             : 
+     105         [ #  # ]:           0 :   if (valent_input_remote_check_adapter (self))
+     106                 :           0 :     valent_input_adapter_keyboard_keysym (self->adapter, keyval, FALSE);
+     107                 :             : 
+     108                 :           0 :   return TRUE;
+     109                 :             : }
+     110                 :             : 
+     111                 :             : /*
+     112                 :             :  * Pointer Input
+     113                 :             :  */
+     114                 :             : static inline void
+     115                 :           0 : get_last_update_time (GtkGesture       *gesture,
+     116                 :             :                       GdkEventSequence *sequence,
+     117                 :             :                       uint32_t          *timestamp)
+     118                 :             : {
+     119                 :           0 :   GdkEvent *event = NULL;
+     120                 :             : 
+     121         [ #  # ]:           0 :   if (sequence != NULL)
+     122                 :           0 :     event = gtk_gesture_get_last_event (gesture, sequence);
+     123                 :             : 
+     124         [ #  # ]:           0 :   if (event != NULL)
+     125                 :           0 :     *timestamp = gdk_event_get_time (event);
+     126                 :           0 : }
+     127                 :             : 
+     128                 :             : static inline gboolean
+     129                 :           0 : calculate_delta (ValentInputRemote *self,
+     130                 :             :                  double             dx,
+     131                 :             :                  double             dy,
+     132                 :             :                  uint32_t           dt,
+     133                 :             :                  double            *cx,
+     134                 :             :                  double            *cy)
+     135                 :             : {
+     136                 :           0 :   double dr, v, m;
+     137                 :             : 
+     138                 :           0 :   dr = sqrt (pow (dx, 2) + pow (dy, 2));
+     139                 :           0 :   v = dr / dt;
+     140                 :             : 
+     141   [ #  #  #  # ]:           0 :   if (!G_APPROX_VALUE (self->last_v, 0.0, 0.01))
+     142                 :           0 :     self->last_v = (v + self->last_v) / 2;
+     143                 :             :   else
+     144                 :           0 :     self->last_v = v;
+     145                 :             : 
+     146                 :             :   // TODO: acceleration setting
+     147                 :           0 :   m = pow (self->last_v, 1.0);
+     148                 :           0 :   m = fmin (4.0, fmax (m, 0.25));
+     149                 :             : 
+     150                 :           0 :   *cx = round (dx * m);
+     151                 :           0 :   *cy = round (dy * m);
+     152                 :             : 
+     153                 :           0 :   return dt >= CAPTURE_THRESHOLD_MS;
+     154                 :             : }
+     155                 :             : 
+     156                 :             : static inline void
+     157                 :           0 : valent_input_remote_pointer_reset (ValentInputRemote *self)
+     158                 :             : {
+     159                 :           0 :   self->claimed = FALSE;
+     160                 :           0 :   self->last_v = 0.0;
+     161                 :           0 :   self->last_x = 0.0;
+     162                 :           0 :   self->last_y = 0.0;
+     163                 :           0 :   self->timestamp = 0;
+     164                 :           0 : }
+     165                 :             : 
+     166                 :             : /*
+     167                 :             :  * Scroll Mapping
+     168                 :             :  */
+     169                 :             : static gboolean
+     170                 :           0 : on_scroll (GtkEventControllerScroll *controller,
+     171                 :             :            double                    dx,
+     172                 :             :            double                    dy,
+     173                 :             :            ValentInputRemote        *self)
+     174                 :             : {
+     175         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     176                 :             : 
+     177         [ #  # ]:           0 :   if (valent_input_remote_check_adapter (self))
+     178                 :           0 :     valent_input_adapter_pointer_axis (self->adapter, dx, dy);
+     179                 :             : 
+     180                 :           0 :   return TRUE;
+     181                 :             : }
+     182                 :             : 
+     183                 :             : /*
+     184                 :             :  * Pointer Button Mapping
+     185                 :             :  *
+     186                 :             :  * This gesture maps pointer button presses and releases directly, except in the
+     187                 :             :  * case of a press-move sequence of the primary button, which is used to emulate
+     188                 :             :  * touchpad motion.
+     189                 :             :  */
+     190                 :             : static void
+     191                 :           0 : on_single_begin (GtkGestureDrag    *gesture,
+     192                 :             :                  double             start_x,
+     193                 :             :                  double             start_y,
+     194                 :             :                  ValentInputRemote *self)
+     195                 :             : {
+     196                 :           0 :   GtkGestureSingle *single = GTK_GESTURE_SINGLE (gesture);
+     197                 :           0 :   unsigned int button = 0;
+     198                 :             : 
+     199         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     200                 :             : 
+     201         [ #  # ]:           0 :   if (!valent_input_remote_check_adapter (self))
+     202                 :             :     return;
+     203                 :             : 
+     204                 :             :   /* Relative pointer motion is only emulated for the primary button, otherwise
+     205                 :             :    * presses and releases are mapped directly to the adapter. */
+     206                 :           0 :   button = gtk_gesture_single_get_current_button (single);
+     207                 :             : 
+     208         [ #  # ]:           0 :   if (button == GDK_BUTTON_PRIMARY)
+     209                 :             :     {
+     210                 :           0 :       GdkEventSequence *sequence = NULL;
+     211                 :           0 :       uint32_t timestamp = 0;
+     212                 :             : 
+     213                 :           0 :       sequence = gtk_gesture_single_get_current_sequence (single);
+     214                 :           0 :       get_last_update_time (GTK_GESTURE (gesture), sequence, &timestamp);
+     215                 :             : 
+     216                 :           0 :       self->last_x = start_x;
+     217                 :           0 :       self->last_y = start_y;
+     218                 :           0 :       self->timestamp = timestamp;
+     219                 :             :     }
+     220                 :             : 
+     221                 :             :   /* Always pass through the button press, since pointer motion is only
+     222                 :             :    * emulated behaviour. */
+     223                 :           0 :   valent_input_adapter_pointer_button (self->adapter, button, TRUE);
+     224                 :             : }
+     225                 :             : 
+     226                 :             : static void
+     227                 :           0 : on_single_update (GtkGesture        *gesture,
+     228                 :             :                   GdkEventSequence  *sequence,
+     229                 :             :                   ValentInputRemote *self)
+     230                 :             : {
+     231                 :           0 :   unsigned int button = 0;
+     232                 :           0 :   uint32_t timestamp = 0;
+     233                 :           0 :   double x, y;
+     234                 :           0 :   double dx, dy, dt;
+     235                 :           0 :   double cx, cy;
+     236                 :             : 
+     237         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     238                 :             : 
+     239         [ #  # ]:           0 :   if (!valent_input_remote_check_adapter (self))
+     240                 :           0 :     return;
+     241                 :             : 
+     242                 :           0 :   button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+     243                 :             : 
+     244         [ #  # ]:           0 :   if (button != GDK_BUTTON_PRIMARY)
+     245                 :             :     return;
+     246                 :             : 
+     247                 :           0 :   get_last_update_time (gesture, sequence, &timestamp);
+     248                 :           0 :   gtk_gesture_get_point (gesture, sequence, &x, &y);
+     249                 :             : 
+     250                 :           0 :   dt = timestamp - self->timestamp;
+     251                 :           0 :   dx = (x - self->last_x) * self->scale;
+     252                 :           0 :   dy = (y - self->last_y) * self->scale;
+     253                 :             : 
+     254         [ #  # ]:           0 :   if (!calculate_delta (self, dx, dy, dt, &cx, &cy))
+     255                 :             :     return;
+     256                 :             : 
+     257   [ #  #  #  #  :           0 :   if (dx >= 1.0 || dx <= -1.0 || dy >= 1.0 || dy <= -1.0)
+             #  #  #  # ]
+     258                 :             :     {
+     259                 :           0 :       self->claimed = TRUE;
+     260                 :           0 :       gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
+     261                 :             : 
+     262                 :           0 :       self->last_x = x;
+     263                 :           0 :       self->last_y = y;
+     264                 :           0 :       self->timestamp = timestamp;
+     265                 :             : 
+     266                 :           0 :       valent_input_adapter_pointer_motion (self->adapter, cx, cy);
+     267                 :             :     }
+     268                 :             : }
+     269                 :             : 
+     270                 :             : static void
+     271                 :           0 : on_single_end (GtkGestureDrag    *gesture,
+     272                 :             :                double             offset_x,
+     273                 :             :                double             offset_y,
+     274                 :             :                ValentInputRemote *self)
+     275                 :             : {
+     276                 :           0 :   unsigned int button = 0;
+     277                 :             : 
+     278         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     279                 :             : 
+     280         [ #  # ]:           0 :   if (!valent_input_remote_check_adapter (self))
+     281                 :             :     return;
+     282                 :             : 
+     283                 :           0 :   button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+     284                 :           0 :   valent_input_adapter_pointer_button (self->adapter, button, FALSE);
+     285                 :           0 :   valent_input_remote_pointer_reset (self);
+     286                 :             : }
+     287                 :             : 
+     288                 :             : /*
+     289                 :             :  * Touchpad Emulation
+     290                 :             :  *
+     291                 :             :  * These callbacks map gestures on the "touchpad" area to events including:
+     292                 :             :  *
+     293                 :             :  * - two-finger tap   -> right click
+     294                 :             :  * - three-finger tap -> middle click
+     295                 :             :  */
+     296                 :             : static void
+     297                 :           0 : on_double_begin (GtkGestureDrag    *gesture,
+     298                 :             :                  double             start_x,
+     299                 :             :                  double             start_y,
+     300                 :             :                  ValentInputRemote *self)
+     301                 :             : {
+     302         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     303                 :             : 
+     304                 :             :   // TODO: In order to map two-finger presses directly to the input adapter,
+     305                 :             :   //       the implementation has to handle unpaired press-release sequences.
+     306                 :             : #if 0
+     307                 :             :   if (!valent_input_remote_check_adapter (self))
+     308                 :             :     return;
+     309                 :             : 
+     310                 :             :   valent_input_adapter_pointer_button (self->adapter,
+     311                 :             :                                        GDK_BUTTON_SECONDARY,
+     312                 :             :                                        TRUE);
+     313                 :             : #endif
+     314                 :           0 : }
+     315                 :             : 
+     316                 :             : static void
+     317                 :           0 : on_double_end (GtkGestureDrag    *gesture,
+     318                 :             :                double             offset_x,
+     319                 :             :                double             offset_y,
+     320                 :             :                ValentInputRemote *self)
+     321                 :             : {
+     322         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     323                 :             : 
+     324         [ #  # ]:           0 :   if (!valent_input_remote_check_adapter (self))
+     325                 :             :     return;
+     326                 :             : 
+     327                 :             :   /* If the two-finger press wasn't claimed as a scroll event on the y-axis,
+     328                 :             :    * simulate a right click by pressing and releasing the secondary button. */
+     329                 :           0 :   valent_input_adapter_pointer_button (self->adapter,
+     330                 :             :                                        GDK_BUTTON_SECONDARY,
+     331                 :             :                                        TRUE);
+     332                 :           0 :   valent_input_adapter_pointer_button (self->adapter,
+     333                 :             :                                        GDK_BUTTON_SECONDARY,
+     334                 :             :                                        FALSE);
+     335                 :             : }
+     336                 :             : 
+     337                 :             : static void
+     338                 :           0 : on_triple_begin (GtkGestureDrag    *gesture,
+     339                 :             :                  double             offset_x,
+     340                 :             :                  double             offset_y,
+     341                 :             :                  ValentInputRemote *self)
+     342                 :             : {
+     343         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     344                 :             : 
+     345         [ #  # ]:           0 :   if (!valent_input_remote_check_adapter (self))
+     346                 :             :     return;
+     347                 :             : 
+     348                 :             :   /* Since there is no high-level event for three-finger drags, three-finger
+     349                 :             :    * presses and releases can be mapped directly. */
+     350                 :           0 :   gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+     351                 :           0 :   valent_input_adapter_pointer_button (self->adapter,
+     352                 :             :                                        GDK_BUTTON_MIDDLE,
+     353                 :             :                                        TRUE);
+     354                 :             : }
+     355                 :             : 
+     356                 :             : static void
+     357                 :           0 : on_triple_end (GtkGestureDrag    *gesture,
+     358                 :             :                double             offset_x,
+     359                 :             :                double             offset_y,
+     360                 :             :                ValentInputRemote *self)
+     361                 :             : {
+     362         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     363                 :             : 
+     364         [ #  # ]:           0 :   if (!valent_input_remote_check_adapter (self))
+     365                 :             :     return;
+     366                 :             : 
+     367                 :           0 :   valent_input_adapter_pointer_button (self->adapter,
+     368                 :             :                                        GDK_BUTTON_MIDDLE,
+     369                 :             :                                        FALSE);
+     370                 :             : }
+     371                 :             : 
+     372                 :             : static void
+     373                 :           3 : on_selected_item (GObject           *object,
+     374                 :             :                   GParamSpec        *pspec,
+     375                 :             :                   ValentInputRemote *self)
+     376                 :             : {
+     377                 :           3 :   ValentInputAdapter *adapter = NULL;
+     378                 :             : 
+     379         [ +  - ]:           3 :   g_assert (VALENT_IS_INPUT_REMOTE (self));
+     380                 :             : 
+     381                 :           3 :   adapter = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (object));
+     382                 :             : 
+     383         [ +  + ]:           3 :   if (g_set_object (&self->adapter, adapter))
+     384                 :           2 :     valent_input_remote_check_adapter (self);
+     385                 :           3 : }
+     386                 :             : 
+     387                 :             : static char *
+     388                 :           2 : dup_adapter_name (ValentInputAdapter *adapter)
+     389                 :             : {
+     390                 :           2 :   GObject *object = NULL;
+     391                 :           2 :   GParamSpec *pspec = NULL;
+     392                 :           4 :   g_autofree char *name = NULL;
+     393                 :             : 
+     394         [ +  - ]:           2 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     395                 :             : 
+     396                 :           2 :   object = valent_extension_get_object (VALENT_EXTENSION (adapter));
+     397                 :             : 
+     398         [ -  + ]:           2 :   if (object != NULL)
+     399                 :           0 :     pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), "name");
+     400                 :             : 
+     401         [ #  # ]:           0 :   if (pspec != NULL)
+     402                 :           0 :     g_object_get (object, "name", &name, NULL);
+     403                 :             : 
+     404         [ +  - ]:           2 :   if (name == NULL)
+     405         [ -  + ]:           4 :     return g_strdup (G_OBJECT_TYPE_NAME (adapter));
+     406                 :             : 
+     407                 :           0 :   return g_steal_pointer (&name);
+     408                 :             : }
+     409                 :             : 
+     410                 :             : /*
+     411                 :             :  * GObject
+     412                 :             :  */
+     413                 :             : static void
+     414                 :           1 : valent_input_remote_constructed (GObject *object)
+     415                 :             : {
+     416                 :           1 :   ValentInputRemote *self = VALENT_INPUT_REMOTE (object);
+     417                 :           2 :   g_autoptr (GtkExpression) expression = NULL;
+     418                 :             : 
+     419                 :           1 :   expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
+     420                 :             :                                             0, NULL,
+     421                 :             :                                             G_CALLBACK (dup_adapter_name),
+     422                 :             :                                             NULL, NULL);
+     423                 :             : 
+     424                 :           1 :   gtk_drop_down_set_expression (self->input_adapter, expression);
+     425                 :           1 :   gtk_drop_down_set_model (self->input_adapter, self->adapters);
+     426                 :             : 
+     427         [ +  - ]:           1 :   G_OBJECT_CLASS (valent_input_remote_parent_class)->constructed (object);
+     428                 :           1 : }
+     429                 :             : 
+     430                 :             : static void
+     431                 :           1 : valent_input_remote_dispose (GObject *object)
+     432                 :             : {
+     433                 :           1 :   ValentInputRemote *self = VALENT_INPUT_REMOTE (object);
+     434                 :             : 
+     435         [ -  + ]:           1 :   g_clear_object (&self->adapter);
+     436         [ +  - ]:           1 :   g_clear_object (&self->adapters);
+     437                 :             : 
+     438                 :           1 :   gtk_widget_dispose_template (GTK_WIDGET (object), VALENT_TYPE_INPUT_REMOTE);
+     439                 :             : 
+     440                 :           1 :   G_OBJECT_CLASS (valent_input_remote_parent_class)->dispose (object);
+     441                 :           1 : }
+     442                 :             : 
+     443                 :             : static void
+     444                 :           1 : valent_input_remote_get_property (GObject    *object,
+     445                 :             :                                   guint       prop_id,
+     446                 :             :                                   GValue     *value,
+     447                 :             :                                   GParamSpec *pspec)
+     448                 :             : {
+     449                 :           1 :   ValentInputRemote *self = VALENT_INPUT_REMOTE (object);
+     450                 :             : 
+     451         [ +  - ]:           1 :   switch (prop_id)
+     452                 :             :     {
+     453                 :           1 :     case PROP_ADAPTERS:
+     454                 :           1 :       g_value_set_object (value, self->adapters);
+     455                 :           1 :       break;
+     456                 :             : 
+     457                 :           0 :     default:
+     458                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     459                 :             :     }
+     460                 :           1 : }
+     461                 :             : 
+     462                 :             : static void
+     463                 :           1 : valent_input_remote_set_property (GObject      *object,
+     464                 :             :                                   guint         prop_id,
+     465                 :             :                                   const GValue *value,
+     466                 :             :                                   GParamSpec   *pspec)
+     467                 :             : {
+     468                 :           1 :   ValentInputRemote *self = VALENT_INPUT_REMOTE (object);
+     469                 :             : 
+     470         [ +  - ]:           1 :   switch (prop_id)
+     471                 :             :     {
+     472                 :           1 :     case PROP_ADAPTERS:
+     473                 :           1 :       self->adapters = g_value_dup_object (value);
+     474                 :           1 :       break;
+     475                 :             : 
+     476                 :           0 :     default:
+     477                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     478                 :             :     }
+     479                 :           1 : }
+     480                 :             : 
+     481                 :             : static void
+     482                 :           1 : valent_input_remote_class_init (ValentInputRemoteClass *klass)
+     483                 :             : {
+     484                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     485                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     486                 :             : 
+     487                 :           1 :   object_class->constructed = valent_input_remote_constructed;
+     488                 :           1 :   object_class->dispose = valent_input_remote_dispose;
+     489                 :           1 :   object_class->get_property = valent_input_remote_get_property;
+     490                 :           1 :   object_class->set_property = valent_input_remote_set_property;
+     491                 :             : 
+     492                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-input-remote.ui");
+     493                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, input_adapter);
+     494                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, editor);
+     495                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, keyboard);
+     496                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, pointer_scroll);
+     497                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, touchpad);
+     498                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, touch_single);
+     499                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, touch_double);
+     500                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentInputRemote, touch_triple);
+     501                 :             : 
+     502                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_selected_item);
+     503                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_key_pressed);
+     504                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_key_released);
+     505                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_scroll);
+     506                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_single_begin);
+     507                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_single_update);
+     508                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_single_end);
+     509                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_double_begin);
+     510                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_double_end);
+     511                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_triple_begin);
+     512                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_triple_end);
+     513                 :             : 
+     514                 :           2 :   properties [PROP_ADAPTERS] =
+     515                 :           1 :     g_param_spec_object ("adapters", NULL, NULL,
+     516                 :             :                          G_TYPE_LIST_MODEL,
+     517                 :             :                          (G_PARAM_READWRITE |
+     518                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     519                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     520                 :             :                           G_PARAM_STATIC_STRINGS));
+     521                 :             : 
+     522                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     523                 :           1 : }
+     524                 :             : 
+     525                 :             : static void
+     526                 :           1 : valent_input_remote_init (ValentInputRemote *self)
+     527                 :             : {
+     528                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     529                 :             : 
+     530                 :           1 :   gtk_gesture_group (self->touch_single, self->touch_double);
+     531                 :           1 :   gtk_gesture_group (self->touch_single, self->touch_triple);
+     532                 :             : 
+     533                 :           1 :   self->scale = gtk_widget_get_scale_factor (GTK_WIDGET (self));
+     534                 :           1 : }
+     535                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-input-remote.h.func-c.html b/coverage/src/libvalent/ui/valent-input-remote.h.func-c.html new file mode 100644 index 00000000000..4ebadcd453a --- /dev/null +++ b/coverage/src/libvalent/ui/valent-input-remote.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-input-remote.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-input-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_INPUT_REMOTE5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-input-remote.h.func.html b/coverage/src/libvalent/ui/valent-input-remote.h.func.html new file mode 100644 index 00000000000..d535b24489e --- /dev/null +++ b/coverage/src/libvalent/ui/valent-input-remote.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-input-remote.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-input-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_INPUT_REMOTE5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-input-remote.h.gcov.html b/coverage/src/libvalent/ui/valent-input-remote.h.gcov.html new file mode 100644 index 00000000000..09a08962ecc --- /dev/null +++ b/coverage/src/libvalent/ui/valent-input-remote.h.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-input-remote.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-input-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : #include "../core/valent-object.h"
+       9                 :             : 
+      10                 :             : G_BEGIN_DECLS
+      11                 :             : 
+      12                 :             : #define VALENT_TYPE_INPUT_REMOTE (valent_input_remote_get_type())
+      13                 :             : 
+      14   [ +  -  +  -  :           5 : G_DECLARE_FINAL_TYPE (ValentInputRemote, valent_input_remote, VALENT, INPUT_REMOTE, AdwWindow)
+                   -  + ]
+      15                 :             : 
+      16                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-media-remote.c.func-c.html b/coverage/src/libvalent/ui/valent-media-remote.c.func-c.html new file mode 100644 index 00000000000..f97ed0efde0 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-media-remote.c.func-c.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-media-remote.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-media-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.2 %321267
Test Date:2024-03-31 18:46:36Functions:86.4 %2219
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:59.1 %15491
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_change_value0
on_change_value_cb0
valent_media_remote_timer_tick0
on_volume_changed1
valent_media_remote_class_init1
valent_media_remote_dispose1
valent_media_remote_init1
valent_media_remote_update_volume1
valent_media_remote_clear2
on_selected_item3
valent_media_remote_set_property3
valent_media_remote_update_shuffle3
valent_media_remote_update_repeat4
valent_media_remote_update_flags6
valent_media_remote_update_state9
remote_player_action10
valent_media_remote_get_property10
valent_media_remote_update_metadata15
valent_media_remote_update_position18
valent_media_remote_get_type142
valent_media_remote_class_intern_init1
valent_media_remote_get_type_once35
valent_media_remote_get_type106
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-media-remote.c.func.html b/coverage/src/libvalent/ui/valent-media-remote.c.func.html new file mode 100644 index 00000000000..68d1fbfd303 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-media-remote.c.func.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-media-remote.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-media-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.2 %321267
Test Date:2024-03-31 18:46:36Functions:86.4 %2219
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:59.1 %15491
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_change_value0
on_change_value_cb0
on_selected_item3
on_volume_changed1
remote_player_action10
valent_media_remote_class_init1
valent_media_remote_clear2
valent_media_remote_dispose1
valent_media_remote_get_property10
valent_media_remote_get_type142
valent_media_remote_class_intern_init1
valent_media_remote_get_type106
valent_media_remote_get_type_once35
valent_media_remote_init1
valent_media_remote_set_property3
valent_media_remote_timer_tick0
valent_media_remote_update_flags6
valent_media_remote_update_metadata15
valent_media_remote_update_position18
valent_media_remote_update_repeat4
valent_media_remote_update_shuffle3
valent_media_remote_update_state9
valent_media_remote_update_volume1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-media-remote.c.gcov.html b/coverage/src/libvalent/ui/valent-media-remote.c.gcov.html new file mode 100644 index 00000000000..77a01c18f85 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-media-remote.c.gcov.html @@ -0,0 +1,760 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-media-remote.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-media-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.2 %321267
Test Date:2024-03-31 18:46:36Functions:86.4 %2219
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:59.1 %15491
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-media-remote"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : #include <libvalent-media.h>
+      13                 :             : 
+      14                 :             : #include "valent-media-remote.h"
+      15                 :             : #include "valent-ui-utils.h"
+      16                 :             : #include "valent-ui-utils-private.h"
+      17                 :             : 
+      18                 :             : /* Time (ms) to delay the seek command when moving the position slider. Minimal
+      19                 :             :  * testing indicates values in the 50-100ms work well. */
+      20                 :             : #define MEDIA_SEEK_DELAY (75)
+      21                 :             : 
+      22                 :             : 
+      23                 :             : struct _ValentMediaRemote
+      24                 :             : {
+      25                 :             :   AdwWindow          parent_instance;
+      26                 :             : 
+      27                 :             :   GListModel        *players;
+      28                 :             :   ValentMediaPlayer *player;
+      29                 :             :   unsigned int       timer_id;
+      30                 :             :   unsigned int       seek_id;
+      31                 :             : 
+      32                 :             :   /* template */
+      33                 :             :   GtkDropDown       *media_player;
+      34                 :             :   GtkStack          *media_art_stack;
+      35                 :             :   GtkImage          *media_art;
+      36                 :             :   GtkLabel          *media_title;
+      37                 :             :   GtkLabel          *media_artist;
+      38                 :             :   GtkLabel          *media_album;
+      39                 :             :   GtkScale          *media_position;
+      40                 :             :   GtkAdjustment     *media_position_adjustment;
+      41                 :             :   GtkLabel          *media_position_current;
+      42                 :             :   GtkLabel          *media_position_length;
+      43                 :             :   GtkButton         *play_pause_button;
+      44                 :             :   GtkImage          *repeat_button;
+      45                 :             :   GtkImage          *repeat_image;
+      46                 :             :   GtkVolumeButton   *volume_button;
+      47                 :             : };
+      48                 :             : 
+      49   [ +  +  +  - ]:         142 : G_DEFINE_FINAL_TYPE (ValentMediaRemote, valent_media_remote, ADW_TYPE_WINDOW)
+      50                 :             : 
+      51                 :             : enum {
+      52                 :             :   PROP_0,
+      53                 :             :   PROP_PLAYERS,
+      54                 :             :   PROP_SHUFFLE,
+      55                 :             :   N_PROPERTIES
+      56                 :             : };
+      57                 :             : 
+      58                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      59                 :             : 
+      60                 :             : 
+      61                 :             : static gboolean
+      62                 :           0 : valent_media_remote_timer_tick (gpointer data)
+      63                 :             : {
+      64                 :           0 :   ValentMediaRemote *self = VALENT_MEDIA_REMOTE (data);
+      65                 :           0 :   g_autofree char *length = NULL;
+      66                 :           0 :   g_autofree char *current = NULL;
+      67                 :           0 :   double value = 0.0;
+      68                 :           0 :   double upper = 0.0;
+      69                 :             : 
+      70         [ #  # ]:           0 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+      71                 :             : 
+      72                 :           0 :   value = gtk_adjustment_get_value (self->media_position_adjustment);
+      73                 :           0 :   upper = gtk_adjustment_get_upper (self->media_position_adjustment);
+      74                 :             : 
+      75                 :           0 :   current = valent_media_time_to_string (value * 1000L, TOTEM_TIME_FLAG_NONE);
+      76                 :           0 :   gtk_label_set_label (self->media_position_current, current);
+      77                 :             : 
+      78                 :           0 :   length = valent_media_time_to_string (upper * 1000L, TOTEM_TIME_FLAG_NONE);
+      79                 :           0 :   gtk_label_set_label (self->media_position_length, length);
+      80                 :             : 
+      81                 :           0 :   gtk_adjustment_set_value (self->media_position_adjustment, value + 1.0);
+      82                 :             : 
+      83                 :           0 :   return G_SOURCE_CONTINUE;
+      84                 :             : }
+      85                 :             : 
+      86                 :             : /*
+      87                 :             :  * Interface
+      88                 :             :  */
+      89                 :             : static void
+      90                 :           2 : valent_media_remote_clear (ValentMediaRemote *self)
+      91                 :             : {
+      92                 :           2 :   GtkWidget *widget = GTK_WIDGET (self);
+      93                 :             : 
+      94                 :           2 :   gtk_image_set_from_icon_name (self->media_art, "valent-media-albumart-symbolic");
+      95                 :             : 
+      96                 :           2 :   gtk_stack_set_visible_child_name (self->media_art_stack, "fallback");
+      97                 :           2 :   gtk_label_set_label (self->media_artist, "");
+      98                 :           2 :   gtk_label_set_label (self->media_title, "");
+      99                 :           2 :   gtk_label_set_label (self->media_album, "");
+     100                 :             : 
+     101                 :           2 :   gtk_adjustment_set_value (self->media_position_adjustment, 0.0);
+     102                 :           2 :   gtk_adjustment_set_upper (self->media_position_adjustment, 0.0);
+     103                 :           2 :   gtk_label_set_label (self->media_position_current, "");
+     104                 :           2 :   gtk_label_set_label (self->media_position_length, "");
+     105                 :             : 
+     106                 :           2 :   gtk_widget_action_set_enabled (widget, "remote.next", FALSE);
+     107                 :           2 :   gtk_widget_action_set_enabled (widget, "remote.pause", FALSE);
+     108                 :           2 :   gtk_widget_action_set_enabled (widget, "remote.play", FALSE);
+     109                 :           2 :   gtk_widget_action_set_enabled (widget, "remote.previous", FALSE);
+     110                 :           2 :   gtk_widget_action_set_enabled (widget, "remote.seek", FALSE);
+     111                 :           2 :   gtk_widget_action_set_enabled (widget, "remote.stop", FALSE);
+     112                 :           2 : }
+     113                 :             : 
+     114                 :             : static void
+     115                 :           6 : valent_media_remote_update_flags (ValentMediaRemote *self)
+     116                 :             : {
+     117                 :           6 :   GtkWidget *widget = GTK_WIDGET (self);
+     118                 :           6 :   ValentMediaActions flags = VALENT_MEDIA_ACTION_NONE;
+     119                 :             : 
+     120         [ +  - ]:           6 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     121                 :             : 
+     122         [ -  + ]:           6 :   if (self->player == NULL)
+     123                 :           0 :     return valent_media_remote_clear (self);
+     124                 :             : 
+     125                 :           6 :   flags = valent_media_player_get_flags (self->player);
+     126                 :             : 
+     127                 :           6 :   gtk_widget_action_set_enabled (widget, "remote.next",
+     128                 :           6 :                                  (flags & VALENT_MEDIA_ACTION_NEXT) != 0);
+     129                 :           6 :   gtk_widget_action_set_enabled (widget, "remote.pause",
+     130                 :           6 :                                  (flags & VALENT_MEDIA_ACTION_PAUSE) != 0);
+     131                 :           6 :   gtk_widget_action_set_enabled (widget, "remote.play",
+     132                 :             :                                  (flags & VALENT_MEDIA_ACTION_PLAY) != 0);
+     133                 :           6 :   gtk_widget_action_set_enabled (widget, "remote.previous",
+     134                 :           6 :                                  (flags & VALENT_MEDIA_ACTION_PREVIOUS) != 0);
+     135                 :           6 :   gtk_widget_action_set_enabled (widget, "remote.seek",
+     136                 :           6 :                                  (flags & VALENT_MEDIA_ACTION_SEEK) != 0);
+     137                 :           6 :   gtk_widget_action_set_enabled (widget, "remote.stop",
+     138                 :           6 :                                  (flags & VALENT_MEDIA_ACTION_STOP) != 0);
+     139                 :             : }
+     140                 :             : 
+     141                 :             : static void
+     142                 :          18 : valent_media_remote_update_position (ValentMediaRemote *self)
+     143                 :             : {
+     144                 :          18 :   double position = 0.0;
+     145                 :          18 :   g_autofree char *position_str = NULL;
+     146                 :             : 
+     147         [ +  - ]:          18 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     148                 :             : 
+     149         [ -  + ]:          18 :   if (self->player == NULL)
+     150                 :           0 :     return valent_media_remote_clear (self);
+     151                 :             : 
+     152                 :          18 :   position = valent_media_player_get_position (self->player);
+     153                 :          18 :   gtk_adjustment_set_value (self->media_position_adjustment, position);
+     154                 :             : 
+     155                 :          18 :   position_str = valent_media_time_to_string (position * 1000L, TOTEM_TIME_FLAG_NONE);
+     156                 :          18 :   gtk_label_set_label (self->media_position_current, position_str);
+     157                 :             : }
+     158                 :             : 
+     159                 :             : static void
+     160                 :          15 : valent_media_remote_update_metadata (ValentMediaRemote *self)
+     161                 :             : {
+     162                 :          15 :   g_autoptr (GVariant) metadata = NULL;
+     163         [ +  - ]:          15 :   g_autoptr (GIcon) icon = NULL;
+     164         [ -  + ]:          15 :   g_autofree const char **artists = NULL;
+     165                 :          15 :   g_autofree char *length_str = NULL;
+     166                 :          15 :   const char *title;
+     167                 :          15 :   const char *album;
+     168                 :          15 :   const char *art_url;
+     169                 :          15 :   int64_t length_us = 0;
+     170                 :          15 :   double length = -1.0;
+     171                 :             : 
+     172         [ +  - ]:          15 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     173                 :             : 
+     174         [ -  + ]:          15 :   if (self->player == NULL)
+     175                 :           0 :     return valent_media_remote_clear (self);
+     176                 :             : 
+     177                 :          15 :   metadata = valent_media_player_get_metadata (self->player);
+     178                 :             : 
+     179         [ +  + ]:          15 :   if (g_variant_lookup (metadata, "xesam:artist", "^a&s", &artists) &&
+     180   [ +  -  +  - ]:          10 :       artists[0] != NULL && *artists[0] != '\0')
+     181                 :          10 :     {
+     182                 :          10 :       g_autofree char *artist = NULL;
+     183                 :             : 
+     184                 :          10 :       artist = g_strjoinv (", ", (char **)artists);
+     185                 :          10 :       gtk_label_set_label (self->media_artist, artist);
+     186                 :             :     }
+     187                 :             :   else
+     188                 :             :     {
+     189                 :           5 :       gtk_label_set_label (self->media_artist, "");
+     190                 :             :     }
+     191                 :             : 
+     192         [ +  + ]:          15 :   if (g_variant_lookup (metadata, "xesam:album", "&s", &album))
+     193                 :          10 :     gtk_label_set_label (self->media_album, album);
+     194                 :             :   else
+     195                 :           5 :     gtk_label_set_label (self->media_album, "");
+     196                 :             : 
+     197         [ +  + ]:          15 :   if (g_variant_lookup (metadata, "xesam:title", "&s", &title))
+     198                 :          10 :     gtk_label_set_label (self->media_title, title);
+     199                 :             :   else
+     200                 :           5 :     gtk_label_set_label (self->media_title, "");
+     201                 :             : 
+     202         [ -  + ]:          15 :   if (g_variant_lookup (metadata, "mpris:artUrl", "&s", &art_url))
+     203                 :             :     {
+     204                 :          15 :       g_autoptr (GFile) file = NULL;
+     205                 :             : 
+     206                 :           0 :       file = g_file_new_for_uri (art_url);
+     207                 :             : 
+     208         [ #  # ]:           0 :       if (g_file_query_exists (file, NULL))
+     209                 :           0 :         icon = g_file_icon_new (file);
+     210                 :             :     }
+     211                 :             : 
+     212                 :          15 :   gtk_image_set_from_gicon (self->media_art, icon);
+     213         [ +  - ]:          30 :   gtk_stack_set_visible_child_name (self->media_art_stack,
+     214                 :             :                                     icon != NULL ? "art" : "fallback");
+     215                 :             : 
+     216                 :             :   /* Convert microseconds to seconds */
+     217         [ +  + ]:          15 :   if (g_variant_lookup (metadata, "mpris:length", "x", &length_us))
+     218                 :          10 :     length = length_us / G_TIME_SPAN_SECOND;
+     219                 :             : 
+     220                 :          15 :   gtk_adjustment_set_upper (self->media_position_adjustment, length);
+     221                 :          15 :   length_str = valent_media_time_to_string (length * 1000L, TOTEM_TIME_FLAG_NONE);
+     222                 :          15 :   gtk_label_set_label (self->media_position_length, length_str);
+     223                 :             : 
+     224                 :          15 :   valent_media_remote_update_position (self);
+     225                 :             : }
+     226                 :             : 
+     227                 :             : static void
+     228                 :           4 : valent_media_remote_update_repeat (ValentMediaRemote *self)
+     229                 :             : {
+     230                 :           4 :   ValentMediaRepeat repeat = VALENT_MEDIA_REPEAT_NONE;
+     231                 :             : 
+     232         [ +  - ]:           4 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     233                 :             : 
+     234         [ +  - ]:           4 :   if (self->player != NULL)
+     235                 :           4 :      repeat = valent_media_player_get_repeat (self->player);
+     236                 :             : 
+     237   [ +  +  +  - ]:           4 :   switch (repeat)
+     238                 :             :     {
+     239                 :           2 :     case VALENT_MEDIA_REPEAT_NONE:
+     240                 :           2 :       gtk_image_set_from_icon_name (self->repeat_image,
+     241                 :             :                                     "media-playlist-consecutive-symbolic");
+     242                 :           2 :       gtk_accessible_update_property (GTK_ACCESSIBLE (self->repeat_button),
+     243                 :             :                                       GTK_ACCESSIBLE_PROPERTY_LABEL, _("Enable Repeat"),
+     244                 :             :                                       -1);
+     245                 :           2 :       break;
+     246                 :             : 
+     247                 :           1 :     case VALENT_MEDIA_REPEAT_ALL:
+     248                 :           1 :       gtk_image_set_from_icon_name (self->repeat_image,
+     249                 :             :                                     "media-playlist-repeat-symbolic");
+     250                 :           1 :       gtk_accessible_update_property (GTK_ACCESSIBLE (self->repeat_button),
+     251                 :             :                                       GTK_ACCESSIBLE_PROPERTY_LABEL, _("Repeat All"),
+     252                 :             :                                       -1);
+     253                 :           1 :       break;
+     254                 :             : 
+     255                 :           1 :     case VALENT_MEDIA_REPEAT_ONE:
+     256                 :           1 :       gtk_image_set_from_icon_name (self->repeat_image,
+     257                 :             :                                     "media-playlist-repeat-song-symbolic");
+     258                 :           1 :       gtk_accessible_update_property (GTK_ACCESSIBLE (self->repeat_button),
+     259                 :             :                                       GTK_ACCESSIBLE_PROPERTY_LABEL, _("Repeat One"),
+     260                 :             :                                       -1);
+     261                 :           1 :       break;
+     262                 :             :     }
+     263                 :           4 : }
+     264                 :             : 
+     265                 :             : static void
+     266                 :           9 : valent_media_remote_update_state (ValentMediaRemote *self)
+     267                 :             : {
+     268                 :           9 :   GtkWidget *child;
+     269                 :           9 :   ValentMediaState state;
+     270                 :             : 
+     271         [ +  - ]:           9 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     272                 :             : 
+     273         [ -  + ]:           9 :   if (self->player == NULL)
+     274                 :           0 :     return valent_media_remote_clear (self);
+     275                 :             : 
+     276                 :           9 :   child = gtk_button_get_child (self->play_pause_button);
+     277                 :           9 :   state = valent_media_player_get_state (self->player);
+     278                 :             : 
+     279         [ +  + ]:           9 :   if (state == VALENT_MEDIA_STATE_PLAYING)
+     280                 :             :     {
+     281                 :           2 :       gtk_actionable_set_action_name (GTK_ACTIONABLE (self->play_pause_button),
+     282                 :             :                                       "remote.pause");
+     283                 :           2 :       gtk_image_set_from_icon_name (GTK_IMAGE (child),
+     284                 :             :                                     "media-playback-pause-symbolic");
+     285                 :           2 :       gtk_accessible_update_property (GTK_ACCESSIBLE (self->play_pause_button),
+     286                 :             :                                       GTK_ACCESSIBLE_PROPERTY_LABEL, _("Pause"),
+     287                 :             :                                       -1);
+     288                 :             : 
+     289         [ +  + ]:           2 :       if (self->timer_id == 0)
+     290                 :           1 :         self->timer_id = g_timeout_add_seconds (1, valent_media_remote_timer_tick, self);
+     291                 :             :     }
+     292                 :             :   else
+     293                 :             :     {
+     294                 :           7 :       gtk_actionable_set_action_name (GTK_ACTIONABLE (self->play_pause_button),
+     295                 :             :                                       "remote.play");
+     296                 :           7 :       gtk_image_set_from_icon_name (GTK_IMAGE (child),
+     297                 :             :                                     "media-playback-start-symbolic");
+     298                 :           7 :       gtk_widget_set_tooltip_text (GTK_WIDGET (self->play_pause_button),
+     299                 :           7 :                                    _("Play"));
+     300                 :           7 :       gtk_accessible_update_property (GTK_ACCESSIBLE (self->play_pause_button),
+     301                 :             :                                       GTK_ACCESSIBLE_PROPERTY_LABEL, _("Play"),
+     302                 :             :                                       -1);
+     303         [ +  + ]:           7 :       g_clear_handle_id (&self->timer_id, g_source_remove);
+     304                 :             :     }
+     305                 :             : 
+     306         [ +  + ]:           9 :   if (state == VALENT_MEDIA_STATE_STOPPED)
+     307                 :             :     {
+     308                 :           3 :       g_object_freeze_notify (G_OBJECT (self->media_position_adjustment));
+     309                 :           3 :       gtk_adjustment_set_value (self->media_position_adjustment, 0.0);
+     310                 :           3 :       gtk_adjustment_set_upper (self->media_position_adjustment, 0.0);
+     311                 :           3 :       g_object_thaw_notify (G_OBJECT (self->media_position_adjustment));
+     312                 :             :     }
+     313                 :             : 
+     314                 :           9 :   valent_media_remote_update_metadata (self);
+     315                 :             : }
+     316                 :             : 
+     317                 :             : static void
+     318                 :           3 : valent_media_remote_update_shuffle (ValentMediaRemote *self)
+     319                 :             : {
+     320         [ +  - ]:           3 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     321                 :             : 
+     322                 :           3 :   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SHUFFLE]);
+     323                 :           3 : }
+     324                 :             : 
+     325                 :             : static void
+     326                 :           1 : valent_media_remote_update_volume (ValentMediaRemote *self)
+     327                 :             : {
+     328                 :           1 :   double volume = 0.0;
+     329                 :             : 
+     330         [ +  - ]:           1 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     331                 :             : 
+     332         [ +  - ]:           1 :   if (self->player == NULL)
+     333                 :             :     return;
+     334                 :             : 
+     335                 :           1 :   volume = valent_media_player_get_volume (self->player);
+     336                 :           1 :   gtk_scale_button_set_value (GTK_SCALE_BUTTON (self->volume_button), volume);
+     337                 :             : }
+     338                 :             : 
+     339                 :             : static void
+     340                 :           3 : on_selected_item (GObject           *object,
+     341                 :             :                   GParamSpec        *pspec,
+     342                 :             :                   ValentMediaRemote *self)
+     343                 :             : {
+     344                 :           3 :   ValentMediaPlayer *player;
+     345                 :             : 
+     346         [ +  - ]:           3 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     347                 :             : 
+     348         [ +  + ]:           3 :   if (self->player != NULL)
+     349                 :             :     {
+     350         [ -  + ]:           1 :       g_clear_handle_id (&self->seek_id, g_source_remove);
+     351         [ -  + ]:           1 :       g_clear_handle_id (&self->timer_id, g_source_remove);
+     352                 :           1 :       g_signal_handlers_disconnect_by_data (self->player, self);
+     353         [ +  - ]:           1 :       g_clear_object (&self->player);
+     354                 :             :     }
+     355                 :             : 
+     356                 :           3 :   player = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (object));
+     357                 :             : 
+     358         [ +  + ]:           3 :   if (g_set_object (&self->player, player))
+     359                 :             :     {
+     360                 :           1 :       g_signal_connect_object (self->player,
+     361                 :             :                                "notify::flags",
+     362                 :             :                                G_CALLBACK (valent_media_remote_update_flags),
+     363                 :             :                                self, G_CONNECT_SWAPPED);
+     364                 :           1 :       g_signal_connect_object (self->player,
+     365                 :             :                                "notify::metadata",
+     366                 :             :                                G_CALLBACK (valent_media_remote_update_metadata),
+     367                 :             :                                self, G_CONNECT_SWAPPED);
+     368                 :           1 :       g_signal_connect_object (self->player,
+     369                 :             :                                "notify::position",
+     370                 :             :                                G_CALLBACK (valent_media_remote_update_position),
+     371                 :             :                                self, G_CONNECT_SWAPPED);
+     372                 :           1 :       g_signal_connect_object (self->player,
+     373                 :             :                                "notify::repeat",
+     374                 :             :                                G_CALLBACK (valent_media_remote_update_repeat),
+     375                 :             :                                self, G_CONNECT_SWAPPED);
+     376                 :           1 :       g_signal_connect_object (self->player,
+     377                 :             :                                "notify::shuffle",
+     378                 :             :                                G_CALLBACK (valent_media_remote_update_shuffle),
+     379                 :             :                                self, G_CONNECT_SWAPPED);
+     380                 :           1 :       g_signal_connect_object (self->player,
+     381                 :             :                                "notify::state",
+     382                 :             :                                G_CALLBACK (valent_media_remote_update_state),
+     383                 :             :                                self, G_CONNECT_SWAPPED);
+     384                 :           1 :       g_signal_connect_object (self->player,
+     385                 :             :                                "notify::volume",
+     386                 :             :                                G_CALLBACK (valent_media_remote_update_volume),
+     387                 :             :                                self, G_CONNECT_SWAPPED);
+     388                 :             :     }
+     389                 :             :   else
+     390                 :             :     {
+     391                 :           2 :       valent_media_remote_clear (self);
+     392                 :           2 :       return;
+     393                 :             :     }
+     394                 :             : 
+     395                 :           1 :   valent_media_remote_update_flags (self);
+     396                 :           1 :   valent_media_remote_update_metadata (self);
+     397                 :           1 :   valent_media_remote_update_position (self);
+     398                 :           1 :   valent_media_remote_update_repeat (self);
+     399                 :           1 :   valent_media_remote_update_shuffle (self);
+     400                 :           1 :   valent_media_remote_update_state (self);
+     401                 :           1 :   valent_media_remote_update_volume (self);
+     402                 :             : }
+     403                 :             : 
+     404                 :             : static gboolean
+     405                 :           0 : on_change_value_cb (gpointer data)
+     406                 :             : {
+     407                 :           0 :   ValentMediaRemote *self = VALENT_MEDIA_REMOTE (data);
+     408                 :           0 :   double lower, upper, value, page_size;
+     409                 :             : 
+     410         [ #  # ]:           0 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     411                 :             : 
+     412                 :           0 :   self->seek_id = 0;
+     413                 :             : 
+     414         [ #  # ]:           0 :   if (self->player == NULL)
+     415                 :             :     return G_SOURCE_REMOVE;
+     416                 :             : 
+     417                 :           0 :   lower = gtk_adjustment_get_lower (self->media_position_adjustment);
+     418                 :           0 :   upper = gtk_adjustment_get_upper (self->media_position_adjustment);
+     419                 :           0 :   value = gtk_adjustment_get_value (self->media_position_adjustment);
+     420                 :           0 :   page_size = gtk_adjustment_get_page_size (self->media_position_adjustment);
+     421         [ #  # ]:           0 :   value = CLAMP (value, lower, (upper - page_size));
+     422                 :             : 
+     423                 :           0 :   valent_media_player_set_position (self->player, value);
+     424                 :             : 
+     425                 :           0 :   return G_SOURCE_REMOVE;
+     426                 :             : }
+     427                 :             : 
+     428                 :             : static gboolean
+     429                 :           0 : on_change_value (GtkRange          *range,
+     430                 :             :                  GtkScrollType      scroll,
+     431                 :             :                  double             value,
+     432                 :             :                  ValentMediaRemote *self)
+     433                 :             : {
+     434                 :           0 :   double lower, upper, page_size;
+     435                 :             : 
+     436         [ #  # ]:           0 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     437                 :             : 
+     438         [ #  # ]:           0 :   if (self->player == NULL)
+     439                 :             :     return GDK_EVENT_STOP;
+     440                 :             : 
+     441         [ #  # ]:           0 :   g_clear_handle_id (&self->seek_id, g_source_remove);
+     442                 :           0 :   self->seek_id = g_timeout_add (MEDIA_SEEK_DELAY, on_change_value_cb, self);
+     443                 :             : 
+     444                 :           0 :   lower = gtk_adjustment_get_lower (self->media_position_adjustment);
+     445                 :           0 :   upper = gtk_adjustment_get_upper (self->media_position_adjustment);
+     446                 :           0 :   page_size = gtk_adjustment_get_page_size (self->media_position_adjustment);
+     447         [ #  # ]:           0 :   value = CLAMP (value, lower, (upper - page_size));
+     448                 :             : 
+     449                 :           0 :   gtk_adjustment_set_value (self->media_position_adjustment, value);
+     450                 :             : 
+     451                 :           0 :   return GDK_EVENT_STOP;
+     452                 :             : }
+     453                 :             : 
+     454                 :             : static void
+     455                 :           1 : on_volume_changed (GtkScaleButton    *button,
+     456                 :             :                    double             value,
+     457                 :             :                    ValentMediaRemote *self)
+     458                 :             : {
+     459         [ +  - ]:           1 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     460                 :             : 
+     461         [ +  - ]:           1 :   if (self->player == NULL)
+     462                 :             :     return;
+     463                 :             : 
+     464   [ -  +  -  + ]:           1 :   if (!G_APPROX_VALUE (valent_media_player_get_volume (self->player), value, 0.01))
+     465                 :           0 :     valent_media_player_set_volume (self->player, value);
+     466                 :             : }
+     467                 :             : 
+     468                 :             : /*
+     469                 :             :  * GAction
+     470                 :             :  */
+     471                 :             : static void
+     472                 :          10 : remote_player_action (GtkWidget  *widget,
+     473                 :             :                       const char *action_name,
+     474                 :             :                       GVariant   *parameter)
+     475                 :             : {
+     476                 :          10 :   ValentMediaRemote *self = VALENT_MEDIA_REMOTE (widget);
+     477                 :             : 
+     478         [ +  - ]:          10 :   g_assert (VALENT_IS_MEDIA_REMOTE (self));
+     479                 :             : 
+     480   [ +  -  +  - ]:          10 :   if (self->player == NULL || action_name == NULL)
+     481                 :             :     return;
+     482                 :             : 
+     483         [ +  + ]:          10 :   else if (g_str_equal (action_name, "remote.next"))
+     484                 :           1 :     valent_media_player_next (self->player);
+     485                 :             : 
+     486         [ +  + ]:           9 :   else if (g_str_equal (action_name, "remote.pause"))
+     487                 :           1 :     valent_media_player_pause (self->player);
+     488                 :             : 
+     489         [ +  + ]:           8 :   else if (g_str_equal (action_name, "remote.play"))
+     490                 :           1 :     valent_media_player_play (self->player);
+     491                 :             : 
+     492         [ +  + ]:           7 :   else if (g_str_equal (action_name, "remote.previous"))
+     493                 :           1 :     valent_media_player_previous (self->player);
+     494                 :             : 
+     495         [ +  + ]:           6 :   else if (g_str_equal (action_name, "remote.repeat"))
+     496                 :             :     {
+     497                 :           3 :       const char *icon_name = gtk_image_get_icon_name (self->repeat_image);
+     498                 :             : 
+     499         [ +  + ]:           3 :       if (g_str_equal (icon_name, "media-playlist-consecutive-symbolic"))
+     500                 :           1 :         valent_media_player_set_repeat (self->player, VALENT_MEDIA_REPEAT_ALL);
+     501                 :             : 
+     502         [ +  + ]:           2 :       else if (g_str_equal (icon_name, "media-playlist-repeat-symbolic"))
+     503                 :           1 :         valent_media_player_set_repeat (self->player, VALENT_MEDIA_REPEAT_ONE);
+     504                 :             : 
+     505         [ +  - ]:           1 :       else if (g_str_equal (icon_name, "media-playlist-repeat-song-symbolic"))
+     506                 :           1 :         valent_media_player_set_repeat (self->player, VALENT_MEDIA_REPEAT_NONE);
+     507                 :             :     }
+     508                 :             : 
+     509         [ +  + ]:           3 :   else if (g_str_equal (action_name, "remote.seek"))
+     510                 :           2 :     valent_media_player_seek (self->player, g_variant_get_double (parameter));
+     511                 :             : 
+     512         [ +  - ]:           1 :   else if (g_str_equal (action_name, "remote.stop"))
+     513                 :           1 :     valent_media_player_stop (self->player);
+     514                 :             : }
+     515                 :             : 
+     516                 :             : /*
+     517                 :             :  * GObject
+     518                 :             :  */
+     519                 :             : static void
+     520                 :           1 : valent_media_remote_dispose (GObject *object)
+     521                 :             : {
+     522                 :           1 :   ValentMediaRemote *self = VALENT_MEDIA_REMOTE (object);
+     523                 :             : 
+     524         [ -  + ]:           1 :   g_clear_handle_id (&self->seek_id, g_source_remove);
+     525         [ -  + ]:           1 :   g_clear_handle_id (&self->timer_id, g_source_remove);
+     526                 :             : 
+     527         [ -  + ]:           1 :   if (self->player != NULL)
+     528                 :             :     {
+     529                 :           0 :       g_signal_handlers_disconnect_by_data (self->player, self);
+     530         [ #  # ]:           0 :       g_clear_object (&self->player);
+     531                 :             :     }
+     532                 :             : 
+     533         [ +  - ]:           1 :   g_clear_object (&self->players);
+     534                 :             : 
+     535                 :           1 :   gtk_widget_dispose_template (GTK_WIDGET (object), VALENT_TYPE_MEDIA_REMOTE);
+     536                 :             : 
+     537                 :           1 :   G_OBJECT_CLASS (valent_media_remote_parent_class)->dispose (object);
+     538                 :           1 : }
+     539                 :             : 
+     540                 :             : static void
+     541                 :          10 : valent_media_remote_get_property (GObject    *object,
+     542                 :             :                                   guint       prop_id,
+     543                 :             :                                   GValue     *value,
+     544                 :             :                                   GParamSpec *pspec)
+     545                 :             : {
+     546                 :          10 :   ValentMediaRemote *self = VALENT_MEDIA_REMOTE (object);
+     547                 :             : 
+     548      [ +  +  - ]:          10 :   switch (prop_id)
+     549                 :             :     {
+     550                 :           3 :     case PROP_PLAYERS:
+     551                 :           3 :       g_value_set_object (value, self->players);
+     552                 :           3 :       break;
+     553                 :             : 
+     554                 :           7 :     case PROP_SHUFFLE:
+     555         [ +  + ]:           7 :       if (self->player != NULL)
+     556                 :           5 :         g_value_set_boolean (value, valent_media_player_get_shuffle (self->player));
+     557                 :             :       else
+     558                 :           2 :         g_value_set_boolean (value, FALSE);
+     559                 :             :       break;
+     560                 :             : 
+     561                 :           0 :     default:
+     562                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     563                 :             :     }
+     564                 :          10 : }
+     565                 :             : 
+     566                 :             : static void
+     567                 :           3 : valent_media_remote_set_property (GObject      *object,
+     568                 :             :                                   guint         prop_id,
+     569                 :             :                                   const GValue *value,
+     570                 :             :                                   GParamSpec   *pspec)
+     571                 :             : {
+     572                 :           3 :   ValentMediaRemote *self = VALENT_MEDIA_REMOTE (object);
+     573                 :             : 
+     574      [ +  +  - ]:           3 :   switch (prop_id)
+     575                 :             :     {
+     576                 :           1 :     case PROP_PLAYERS:
+     577                 :           1 :       self->players = g_value_dup_object (value);
+     578                 :           1 :       break;
+     579                 :             : 
+     580                 :           2 :     case PROP_SHUFFLE:
+     581         [ +  - ]:           2 :       if (self->player != NULL)
+     582                 :           2 :         valent_media_player_set_shuffle (self->player, g_value_get_boolean (value));
+     583                 :             :       break;
+     584                 :             : 
+     585                 :           0 :     default:
+     586                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     587                 :             :     }
+     588                 :           3 : }
+     589                 :             : 
+     590                 :             : static void
+     591                 :           1 : valent_media_remote_class_init (ValentMediaRemoteClass *klass)
+     592                 :             : {
+     593                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     594                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     595                 :             : 
+     596                 :           1 :   object_class->dispose = valent_media_remote_dispose;
+     597                 :           1 :   object_class->get_property = valent_media_remote_get_property;
+     598                 :           1 :   object_class->set_property = valent_media_remote_set_property;
+     599                 :             : 
+     600                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-media-remote.ui");
+     601                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_player);
+     602                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_art_stack);
+     603                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_art);
+     604                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_title);
+     605                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_artist);
+     606                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_album);
+     607                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_position);
+     608                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_position_adjustment);
+     609                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_position_current);
+     610                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, media_position_length);
+     611                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, play_pause_button);
+     612                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, repeat_button);
+     613                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, repeat_image);
+     614                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentMediaRemote, volume_button);
+     615                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_selected_item);
+     616                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_change_value);
+     617                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_volume_changed);
+     618                 :             : 
+     619                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.next", NULL, remote_player_action);
+     620                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.pause", NULL, remote_player_action);
+     621                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.play", NULL, remote_player_action);
+     622                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.previous", NULL, remote_player_action);
+     623                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.repeat", NULL, remote_player_action);
+     624                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.seek", "d", remote_player_action);
+     625                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.stop", NULL, remote_player_action);
+     626                 :             : 
+     627                 :           2 :   properties [PROP_PLAYERS] =
+     628                 :           1 :     g_param_spec_object ("players", NULL, NULL,
+     629                 :             :                          G_TYPE_LIST_MODEL,
+     630                 :             :                          (G_PARAM_READWRITE |
+     631                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     632                 :             :                           G_PARAM_STATIC_STRINGS));
+     633                 :             : 
+     634                 :           2 :   properties [PROP_SHUFFLE] =
+     635                 :           1 :     g_param_spec_boolean ("shuffle", NULL, NULL,
+     636                 :             :                           FALSE,
+     637                 :             :                           (G_PARAM_READWRITE |
+     638                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     639                 :             :                            G_PARAM_STATIC_STRINGS));
+     640                 :             : 
+     641                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     642                 :             : 
+     643                 :           1 :   gtk_widget_class_install_property_action (widget_class, "remote.shuffle", "shuffle");
+     644                 :           1 : }
+     645                 :             : 
+     646                 :             : static void
+     647                 :           1 : valent_media_remote_init (ValentMediaRemote *self)
+     648                 :             : {
+     649                 :           1 :   GtkWidget *child;
+     650                 :             : 
+     651                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     652                 :             : 
+     653                 :           1 :   for (child = gtk_widget_get_first_child (GTK_WIDGET (self->volume_button));
+     654         [ +  + ]:           3 :        child != NULL;
+     655                 :           2 :        child = gtk_widget_get_next_sibling (child))
+     656                 :             :     {
+     657   [ +  -  +  +  :           2 :       if (!GTK_IS_TOGGLE_BUTTON (child))
+                   +  - ]
+     658                 :           1 :         continue;
+     659                 :             : 
+     660                 :           1 :       gtk_widget_set_css_classes (child, (const char *[]){
+     661                 :             :                                             "circular",
+     662                 :             :                                             "flat",
+     663                 :             :                                             "toggle",
+     664                 :             :                                             NULL
+     665                 :             :                                          });
+     666                 :             :     }
+     667                 :           1 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-media-remote.h.func-c.html b/coverage/src/libvalent/ui/valent-media-remote.h.func-c.html new file mode 100644 index 00000000000..9a12d4e6e90 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-media-remote.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-media-remote.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-media-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA_REMOTE70
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-media-remote.h.func.html b/coverage/src/libvalent/ui/valent-media-remote.h.func.html new file mode 100644 index 00000000000..862f0336e72 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-media-remote.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-media-remote.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-media-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MEDIA_REMOTE70
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-media-remote.h.gcov.html b/coverage/src/libvalent/ui/valent-media-remote.h.gcov.html new file mode 100644 index 00000000000..812fd260aae --- /dev/null +++ b/coverage/src/libvalent/ui/valent-media-remote.h.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-media-remote.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-media-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : #include "../core/valent-object.h"
+       9                 :             : 
+      10                 :             : G_BEGIN_DECLS
+      11                 :             : 
+      12                 :             : #define VALENT_TYPE_MEDIA_REMOTE (valent_media_remote_get_type())
+      13                 :             : 
+      14   [ +  -  +  -  :          70 : G_DECLARE_FINAL_TYPE (ValentMediaRemote, valent_media_remote, VALENT, MEDIA_REMOTE, AdwWindow)
+                   -  + ]
+      15                 :             : 
+      16                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-list.c.func-c.html b/coverage/src/libvalent/ui/valent-menu-list.c.func-c.html new file mode 100644 index 00000000000..11ca299f7a9 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-list.c.func-c.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-list.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-list.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:70.1 %254178
Test Date:2024-03-31 18:46:36Functions:69.2 %2618
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:47.6 %17081
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
menu_submenu_action0
on_gesture_pressed0
on_gesture_released0
on_key_pressed0
valent_menu_list_get_menu_model0
valent_menu_list_get_property0
valent_menu_list_get_submenu_of0
valent_menu_list_item_activate0
on_submenu_removed1
valent_menu_list_add_section1
valent_menu_list_add_submenu1
valent_menu_list_class_init3
valent_menu_list_remove4
valent_menu_list_new6
valent_menu_list_dispose7
valent_menu_list_finalize7
valent_menu_list_init7
valent_menu_list_set_submenu_of7
valent_menu_list_set_menu_model12
on_items_changed14
valent_menu_list_add14
valent_menu_list_add_row14
valent_menu_list_set_property14
valent_menu_list_get_type140
valent_menu_list_class_intern_init3
valent_menu_list_get_type_once35
valent_menu_list_get_type102
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-list.c.func.html b/coverage/src/libvalent/ui/valent-menu-list.c.func.html new file mode 100644 index 00000000000..13ce58be58d --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-list.c.func.html @@ -0,0 +1,280 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-list.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-list.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:70.1 %254178
Test Date:2024-03-31 18:46:36Functions:69.2 %2618
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:47.6 %17081
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
menu_submenu_action0
on_gesture_pressed0
on_gesture_released0
on_items_changed14
on_key_pressed0
on_submenu_removed1
valent_menu_list_add14
valent_menu_list_add_row14
valent_menu_list_add_section1
valent_menu_list_add_submenu1
valent_menu_list_class_init3
valent_menu_list_dispose7
valent_menu_list_finalize7
valent_menu_list_get_menu_model0
valent_menu_list_get_property0
valent_menu_list_get_submenu_of0
valent_menu_list_get_type140
valent_menu_list_class_intern_init3
valent_menu_list_get_type102
valent_menu_list_get_type_once35
valent_menu_list_init7
valent_menu_list_item_activate0
valent_menu_list_new6
valent_menu_list_remove4
valent_menu_list_set_menu_model12
valent_menu_list_set_property14
valent_menu_list_set_submenu_of7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-list.c.gcov.html b/coverage/src/libvalent/ui/valent-menu-list.c.gcov.html new file mode 100644 index 00000000000..92104d4b4c1 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-list.c.gcov.html @@ -0,0 +1,773 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-list.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-list.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:70.1 %254178
Test Date:2024-03-31 18:46:36Functions:69.2 %2618
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:47.6 %17081
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-menu-list"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <libvalent-core.h>
+      12                 :             : 
+      13                 :             : #include "valent-menu-list.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentMenuList
+      17                 :             : {
+      18                 :             :   GtkWidget       parent_instance;
+      19                 :             : 
+      20                 :             :   GMenuModel     *model;
+      21                 :             :   ValentMenuList *parent;
+      22                 :             : 
+      23                 :             :   GtkWidget      *list;
+      24                 :             :   GtkWidget      *active_row;
+      25                 :             : };
+      26                 :             : 
+      27   [ +  +  +  - ]:         140 : G_DEFINE_FINAL_TYPE (ValentMenuList, valent_menu_list, GTK_TYPE_WIDGET)
+      28                 :             : 
+      29                 :             : enum {
+      30                 :             :   PROP_0,
+      31                 :             :   PROP_MENU_MODEL,
+      32                 :             :   PROP_SUBMENU_OF,
+      33                 :             :   N_PROPERTIES
+      34                 :             : };
+      35                 :             : 
+      36                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      37                 :             : 
+      38                 :             : 
+      39                 :             : static void
+      40                 :           0 : valent_menu_list_item_activate (GtkListBoxRow *row)
+      41                 :             : {
+      42                 :           0 :   GtkWidget *stack = NULL;
+      43                 :           0 :   GtkWidget *submenu = NULL;
+      44                 :             : 
+      45   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX_ROW (row));
+             #  #  #  # ]
+      46                 :             : 
+      47                 :           0 :   submenu = g_object_get_data (G_OBJECT (row), "valent-submenu-item");
+      48                 :             : 
+      49         [ #  # ]:           0 :   if (submenu != NULL)
+      50                 :           0 :     stack = gtk_widget_get_ancestor (GTK_WIDGET (submenu), GTK_TYPE_STACK);
+      51                 :             : 
+      52         [ #  # ]:           0 :   if (stack != NULL)
+      53                 :           0 :     gtk_stack_set_visible_child (GTK_STACK (stack), submenu);
+      54                 :           0 : }
+      55                 :             : 
+      56                 :             : static void
+      57                 :           0 : on_key_pressed (GtkEventControllerKey *controller,
+      58                 :             :                 unsigned int           keyval,
+      59                 :             :                 unsigned int           keycode,
+      60                 :             :                 GdkModifierType        state,
+      61                 :             :                 ValentMenuList        *self)
+      62                 :             : {
+      63                 :           0 :   GtkWidget *row = NULL;
+      64                 :           0 :   static uint32_t activate_keys[] = {
+      65                 :             :     GDK_KEY_space,
+      66                 :             :     GDK_KEY_KP_Space,
+      67                 :             :     GDK_KEY_Return,
+      68                 :             :     GDK_KEY_ISO_Enter,
+      69                 :             :     GDK_KEY_KP_Enter,
+      70                 :             :   };
+      71                 :             : 
+      72         [ #  # ]:           0 :   g_assert (VALENT_IS_MENU_LIST (self));
+      73                 :             : 
+      74         [ #  # ]:           0 :   for (size_t i = 0; i < G_N_ELEMENTS (activate_keys); i++)
+      75                 :             :     {
+      76         [ #  # ]:           0 :       if (activate_keys[i] != keyval)
+      77                 :           0 :         continue;
+      78                 :             : 
+      79                 :           0 :       row = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller));
+      80                 :           0 :       valent_menu_list_item_activate (GTK_LIST_BOX_ROW (row));
+      81                 :           0 :       self->active_row = NULL;
+      82                 :             : 
+      83                 :           0 :       break;
+      84                 :             :     }
+      85                 :           0 : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           0 : on_gesture_pressed (GtkGestureClick *gesture,
+      89                 :             :                     unsigned int     n_press,
+      90                 :             :                     double           x,
+      91                 :             :                     double           y,
+      92                 :             :                     ValentMenuList  *self)
+      93                 :             : {
+      94                 :           0 :   GtkWidget *row = NULL;
+      95                 :             : 
+      96         [ #  # ]:           0 :   g_assert (VALENT_IS_MENU_LIST (self));
+      97                 :             : 
+      98                 :           0 :   row = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+      99                 :             : 
+     100         [ #  # ]:           0 :   if (gtk_widget_is_sensitive (row))
+     101                 :           0 :     self->active_row = row;
+     102                 :             :   else
+     103                 :           0 :     self->active_row = NULL;
+     104                 :           0 : }
+     105                 :             : 
+     106                 :             : static void
+     107                 :           0 : on_gesture_released (GtkGestureClick *gesture,
+     108                 :             :                      unsigned int     n_press,
+     109                 :             :                      double           x,
+     110                 :             :                      double           y,
+     111                 :             :                      ValentMenuList  *self)
+     112                 :             : {
+     113                 :           0 :   GtkWidget *row = NULL;
+     114                 :             : 
+     115         [ #  # ]:           0 :   g_assert (VALENT_IS_MENU_LIST (self));
+     116                 :             : 
+     117                 :           0 :   row = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+     118                 :             : 
+     119         [ #  # ]:           0 :   if (self->active_row == row)
+     120                 :           0 :     valent_menu_list_item_activate (GTK_LIST_BOX_ROW (row));
+     121                 :             : 
+     122                 :           0 :   self->active_row = NULL;
+     123                 :           0 : }
+     124                 :             : 
+     125                 :             : static void
+     126                 :           1 : on_submenu_removed (GtkListBoxRow  *row,
+     127                 :             :                     ValentMenuList *self)
+     128                 :             : {
+     129                 :           1 :   GtkWidget *stack;
+     130                 :           1 :   GtkWidget *main;
+     131                 :           1 :   GtkWidget *submenu;
+     132                 :             : 
+     133   [ +  -  +  -  :           1 :   g_assert (GTK_IS_WIDGET (row));
+             +  -  -  + ]
+     134         [ -  + ]:           1 :   g_assert (VALENT_MENU_LIST (self));
+     135                 :             : 
+     136                 :           1 :   submenu = g_object_get_data (G_OBJECT (row), "valent-submenu-item");
+     137   [ +  -  +  -  :           1 :   g_return_if_fail (GTK_IS_WIDGET (submenu));
+             +  -  -  + ]
+     138                 :             : 
+     139                 :             :   /* If the parent is being destroyed, the stack or page may not exist */
+     140         [ -  + ]:           1 :   if ((stack = gtk_widget_get_ancestor (submenu, GTK_TYPE_STACK)) == NULL)
+     141                 :             :     return;
+     142                 :             : 
+     143         [ #  # ]:           0 :   if ((main = gtk_stack_get_child_by_name (GTK_STACK (stack), "main")) == NULL)
+     144                 :             :     return;
+     145                 :             : 
+     146         [ #  # ]:           0 :   if (gtk_stack_get_visible_child (GTK_STACK (stack)) == submenu)
+     147                 :           0 :     gtk_stack_set_visible_child (GTK_STACK (stack), main);
+     148                 :             : 
+     149                 :           0 :   gtk_stack_remove (GTK_STACK (stack), submenu);
+     150                 :             : }
+     151                 :             : 
+     152                 :             : /*
+     153                 :             :  * GMenuModel Callbacks
+     154                 :             :  */
+     155                 :             : static void
+     156                 :          14 : valent_menu_list_add_row (ValentMenuList *self,
+     157                 :             :                           int             index_)
+     158                 :             : {
+     159                 :          14 :   GtkWidget *row;
+     160                 :          14 :   GtkWidget *row_icon;
+     161                 :          14 :   g_autofree char *hidden_when = NULL;
+     162                 :          14 :   g_autofree char *label = NULL;
+     163                 :          14 :   g_autofree char *action_name = NULL;
+     164                 :          14 :   g_autoptr (GVariant) action_target = NULL;
+     165         [ -  + ]:          14 :   g_autoptr (GVariant) vicon = NULL;
+     166         [ +  + ]:          14 :   g_autoptr (GIcon) gicon = NULL;
+     167                 :          14 :   unsigned int position = index_;
+     168                 :             : 
+     169                 :             :   /* Offset for "Previous" item */
+     170         [ +  + ]:          14 :   if (self->parent != NULL)
+     171                 :           1 :     position++;
+     172                 :             : 
+     173                 :             :   /* Row Label */
+     174         [ -  + ]:          14 :   if (!g_menu_model_get_item_attribute (self->model, index_,
+     175                 :             :                                         "label", "s", &label))
+     176                 :             :     {
+     177                 :           0 :       g_warning ("%s: menu item without label at %d", G_STRFUNC, index_);
+     178                 :           0 :       return;
+     179                 :             :     }
+     180                 :             : 
+     181                 :             :   /* GAction */
+     182         [ +  + ]:          14 :   if (g_menu_model_get_item_attribute (self->model, index_,
+     183                 :             :                                        "action", "s", &action_name))
+     184                 :             :     {
+     185                 :          12 :       action_target = g_menu_model_get_item_attribute_value (self->model,
+     186                 :             :                                                              index_,
+     187                 :             :                                                              "target",
+     188                 :             :                                                              NULL);
+     189                 :             :     }
+     190                 :             : 
+     191                 :             :   /* Icon */
+     192                 :          14 :   vicon = g_menu_model_get_item_attribute_value (self->model,
+     193                 :             :                                                  index_,
+     194                 :             :                                                  "icon",
+     195                 :             :                                                  NULL);
+     196                 :             : 
+     197         [ +  + ]:          14 :   if (vicon != NULL)
+     198                 :          12 :     gicon = g_icon_deserialize (vicon);
+     199                 :             : 
+     200                 :          14 :   row = g_object_new (ADW_TYPE_ACTION_ROW,
+     201                 :             :                       "action-target",  action_target,
+     202                 :             :                       "action-name",    action_name,
+     203                 :             :                       "activatable",    TRUE,
+     204                 :             :                       "selectable",     FALSE,
+     205                 :             :                       "title",          label,
+     206                 :             :                       "height-request", 56,
+     207                 :             :                       NULL);
+     208                 :             : 
+     209                 :          14 :   row_icon = g_object_new (GTK_TYPE_IMAGE,
+     210                 :             :                            "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
+     211                 :             :                            "gicon",           gicon,
+     212                 :             :                            "icon-size",       GTK_ICON_SIZE_NORMAL,
+     213                 :             :                            NULL);
+     214                 :          14 :   adw_action_row_add_prefix (ADW_ACTION_ROW (row), row_icon);
+     215                 :             : 
+     216                 :          14 :   gtk_list_box_insert (GTK_LIST_BOX (self->list), GTK_WIDGET (row), position);
+     217                 :             : 
+     218                 :             :   /* NOTE: this must be done after the row is added to the list, otherwise it
+     219                 :             :    *       may be in a "realized" state and fail an assertion check.
+     220                 :             :    */
+     221         [ +  + ]:          14 :   if (g_menu_model_get_item_attribute (self->model, index_,
+     222                 :             :                                        "hidden-when", "s", &hidden_when))
+     223                 :             :     {
+     224         [ +  - ]:          12 :       if (g_strcmp0 (hidden_when, "action-disabled") == 0)
+     225                 :          12 :         g_object_bind_property (G_OBJECT (row), "sensitive",
+     226                 :             :                                 G_OBJECT (row), "visible",
+     227                 :             :                                 G_BINDING_SYNC_CREATE);
+     228                 :             :     }
+     229                 :             : }
+     230                 :             : 
+     231                 :             : static void
+     232                 :           1 : valent_menu_list_add_section (ValentMenuList *self,
+     233                 :             :                               int             index_,
+     234                 :             :                               GMenuModel     *model)
+     235                 :             : {
+     236                 :           1 :   ValentMenuList *section;
+     237                 :           1 :   unsigned int position = index_;
+     238                 :             : 
+     239         [ +  - ]:           1 :   g_assert (VALENT_IS_MENU_LIST (self));
+     240   [ +  -  +  -  :           1 :   g_assert (G_IS_MENU_MODEL (model));
+             +  -  -  + ]
+     241                 :             : 
+     242                 :             :   /* Offset for "Previous" item */
+     243         [ -  + ]:           1 :   if (self->parent != NULL)
+     244                 :           0 :     position++;
+     245                 :             : 
+     246                 :           1 :   section = valent_menu_list_new (model);
+     247                 :           1 :   gtk_list_box_insert (GTK_LIST_BOX (self->list), GTK_WIDGET (section), position);
+     248                 :           1 : }
+     249                 :             : 
+     250                 :             : static void
+     251                 :           1 : valent_menu_list_add_submenu (ValentMenuList *self,
+     252                 :             :                               int             index_,
+     253                 :             :                               GMenuModel     *model)
+     254                 :             : {
+     255                 :           1 :   GtkWidget *stack;
+     256                 :           1 :   ValentMenuList *submenu;
+     257                 :           1 :   GtkListBoxRow *row;
+     258                 :           1 :   GtkWidget *arrow;
+     259                 :           1 :   GtkEventController *controller;
+     260                 :           1 :   unsigned int position = index_;
+     261                 :             : 
+     262         [ +  - ]:           1 :   g_assert (VALENT_IS_MENU_LIST (self));
+     263   [ +  -  +  -  :           1 :   g_assert (G_IS_MENU_MODEL (model));
+             +  -  -  + ]
+     264                 :             : 
+     265                 :             :   /* Offset for "Previous" item */
+     266         [ -  + ]:           1 :   if (self->parent != NULL)
+     267                 :           0 :     position++;
+     268                 :             : 
+     269                 :           1 :   row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->list), position);
+     270         [ -  + ]:           1 :   g_return_if_fail (ADW_IS_ACTION_ROW (row));
+     271                 :             : 
+     272                 :             :   /* Add an arrow the the row */
+     273                 :           1 :   arrow = gtk_image_new_from_icon_name ("go-next-symbolic");
+     274                 :           1 :   gtk_widget_add_css_class (arrow, "dim-label");
+     275                 :           1 :   adw_action_row_add_suffix (ADW_ACTION_ROW (row), arrow);
+     276                 :             : 
+     277                 :             :   /* Add a submenu to the stack, tied to the lifetime of the row */
+     278                 :           1 :   submenu = g_object_new (VALENT_TYPE_MENU_LIST,
+     279                 :             :                           "menu-model", model,
+     280                 :             :                           "submenu-of", self,
+     281                 :             :                           NULL);
+     282                 :           1 :   g_object_set_data (G_OBJECT (row), "valent-submenu-item", submenu);
+     283                 :             : 
+     284                 :           1 :   stack = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_STACK);
+     285                 :           1 :   gtk_stack_add_child (GTK_STACK (stack), GTK_WIDGET (submenu));
+     286                 :             : 
+     287                 :           1 :   g_signal_connect_object (row,
+     288                 :             :                            "destroy",
+     289                 :             :                            G_CALLBACK (on_submenu_removed),
+     290                 :             :                            self, 0);
+     291                 :             : 
+     292                 :             :   /* Side-step GtkListBox to catch row activation; it will not be emitted if
+     293                 :             :    * this row has an action set (and it should).  */
+     294                 :           1 :   controller = g_object_new (GTK_TYPE_GESTURE_CLICK,
+     295                 :             :                              "button",            GDK_BUTTON_PRIMARY,
+     296                 :             :                              "propagation-phase", GTK_PHASE_BUBBLE,
+     297                 :             :                              "touch-only",        FALSE,
+     298                 :             :                              NULL);
+     299                 :           1 :   g_signal_connect_object (controller,
+     300                 :             :                            "pressed",
+     301                 :             :                            G_CALLBACK (on_gesture_pressed),
+     302                 :             :                            self, 0);
+     303                 :           1 :   g_signal_connect_object (controller,
+     304                 :             :                            "released",
+     305                 :             :                            G_CALLBACK (on_gesture_released),
+     306                 :             :                            self, 0);
+     307                 :           1 :   gtk_widget_add_controller (GTK_WIDGET (row), g_steal_pointer (&controller));
+     308                 :             : 
+     309                 :           1 :   controller = g_object_new (GTK_TYPE_EVENT_CONTROLLER_KEY,
+     310                 :             :                              "propagation-phase", GTK_PHASE_BUBBLE,
+     311                 :             :                              NULL);
+     312                 :           1 :   g_signal_connect_object (controller,
+     313                 :             :                            "key-pressed",
+     314                 :             :                            G_CALLBACK (on_key_pressed),
+     315                 :             :                            self, 0);
+     316                 :           1 :   gtk_widget_add_controller (GTK_WIDGET (row), g_steal_pointer (&controller));
+     317                 :             : }
+     318                 :             : 
+     319                 :             : static void
+     320                 :          14 : valent_menu_list_add (ValentMenuList *self,
+     321                 :             :                       int             index_)
+     322                 :             : {
+     323                 :          28 :   g_autoptr (GMenuLinkIter) iter = NULL;
+     324                 :          14 :   const char *link_name;
+     325                 :          14 :   GMenuModel *link_value;
+     326                 :             : 
+     327         [ +  - ]:          14 :   g_assert (VALENT_IS_MENU_LIST (self));
+     328                 :             : 
+     329                 :          14 :   valent_menu_list_add_row (self, index_);
+     330                 :             : 
+     331                 :             :   //
+     332                 :          14 :   iter = g_menu_model_iterate_item_links (self->model, index_);
+     333                 :             : 
+     334         [ +  + ]:          30 :   while (g_menu_link_iter_get_next (iter, &link_name, &link_value))
+     335                 :             :     {
+     336         [ +  + ]:           2 :       if (g_strcmp0 (link_name, G_MENU_LINK_SECTION) == 0)
+     337                 :           1 :         valent_menu_list_add_section (self, index_, link_value);
+     338                 :             : 
+     339         [ +  - ]:           1 :       else if (g_strcmp0 (link_name, G_MENU_LINK_SUBMENU) == 0)
+     340                 :           1 :         valent_menu_list_add_submenu (self, index_, link_value);
+     341                 :             : 
+     342         [ -  + ]:          18 :       g_clear_object (&link_value);
+     343                 :             :     }
+     344                 :          14 : }
+     345                 :             : 
+     346                 :             : static void
+     347                 :           4 : valent_menu_list_remove (ValentMenuList *self,
+     348                 :             :                          int             index_)
+     349                 :             : {
+     350                 :           4 :   GtkListBoxRow *row = NULL;
+     351                 :           4 :   unsigned int position = index_;
+     352                 :             : 
+     353         [ +  - ]:           4 :   g_assert (VALENT_IS_MENU_LIST (self));
+     354                 :             : 
+     355                 :             :   /* Offset for "Previous" item */
+     356         [ -  + ]:           4 :   if (self->parent != NULL)
+     357                 :           0 :     position++;
+     358                 :             : 
+     359                 :           4 :   row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->list), position);
+     360                 :             : 
+     361         [ +  - ]:           4 :   if (row != NULL)
+     362                 :           4 :     gtk_list_box_remove (GTK_LIST_BOX (self->list), GTK_WIDGET (row));
+     363                 :           4 : }
+     364                 :             : 
+     365                 :             : static void
+     366                 :          14 : on_items_changed (GMenuModel     *model,
+     367                 :             :                   int             position,
+     368                 :             :                   int             removed,
+     369                 :             :                   int             added,
+     370                 :             :                   ValentMenuList *self)
+     371                 :             : {
+     372   [ +  -  +  -  :          14 :   g_assert (G_IS_MENU_MODEL (model));
+             +  -  -  + ]
+     373         [ -  + ]:          14 :   g_assert (VALENT_IS_MENU_LIST (self));
+     374                 :             : 
+     375         [ +  + ]:          18 :   while (removed-- > 0)
+     376                 :           4 :     valent_menu_list_remove (self, position);
+     377                 :             : 
+     378         [ +  + ]:          28 :   for (int i = 0; i < added; i++)
+     379                 :          14 :     valent_menu_list_add (self, position + i);
+     380                 :          14 : }
+     381                 :             : 
+     382                 :             : /*
+     383                 :             :  * GActions
+     384                 :             :  */
+     385                 :             : static void
+     386                 :           0 : menu_submenu_action (GtkWidget  *widget,
+     387                 :             :                      const char *name,
+     388                 :             :                      GVariant   *parameter)
+     389                 :             : {
+     390                 :           0 :   GtkWidget *stack;
+     391                 :           0 :   const char *child_name;
+     392                 :             : 
+     393                 :           0 :   stack = gtk_widget_get_ancestor (widget, GTK_TYPE_STACK);
+     394                 :           0 :   child_name = g_variant_get_string (parameter, NULL);
+     395                 :           0 :   gtk_stack_set_visible_child_name (GTK_STACK (stack), child_name);
+     396                 :           0 : }
+     397                 :             : 
+     398                 :             : /*
+     399                 :             :  * GObject
+     400                 :             :  */
+     401                 :             : static void
+     402                 :           7 : valent_menu_list_dispose (GObject *object)
+     403                 :             : {
+     404                 :           7 :   ValentMenuList *self = VALENT_MENU_LIST (object);
+     405                 :             : 
+     406         [ +  - ]:           7 :   if (self->model != NULL)
+     407                 :           7 :     g_signal_handlers_disconnect_by_data (self->model, self);
+     408                 :             : 
+     409         [ +  - ]:           7 :   g_clear_pointer (&self->list, gtk_widget_unparent);
+     410         [ +  + ]:           7 :   g_clear_object (&self->parent);
+     411                 :             : 
+     412                 :           7 :   G_OBJECT_CLASS (valent_menu_list_parent_class)->dispose (object);
+     413                 :           7 : }
+     414                 :             : 
+     415                 :             : static void
+     416                 :           7 : valent_menu_list_finalize (GObject *object)
+     417                 :             : {
+     418                 :           7 :   ValentMenuList *self = VALENT_MENU_LIST (object);
+     419                 :             : 
+     420         [ +  - ]:           7 :   g_clear_object (&self->model);
+     421                 :             : 
+     422                 :           7 :   G_OBJECT_CLASS (valent_menu_list_parent_class)->finalize (object);
+     423                 :           7 : }
+     424                 :             : 
+     425                 :             : static void
+     426                 :           0 : valent_menu_list_get_property (GObject    *object,
+     427                 :             :                                guint       prop_id,
+     428                 :             :                                GValue     *value,
+     429                 :             :                                GParamSpec *pspec)
+     430                 :             : {
+     431                 :           0 :   ValentMenuList *self = VALENT_MENU_LIST (object);
+     432                 :             : 
+     433      [ #  #  # ]:           0 :   switch (prop_id)
+     434                 :             :     {
+     435                 :           0 :     case PROP_MENU_MODEL:
+     436                 :           0 :       g_value_set_object (value, self->model);
+     437                 :           0 :       break;
+     438                 :             : 
+     439                 :           0 :     case PROP_SUBMENU_OF:
+     440                 :           0 :       g_value_set_object (value, self->parent);
+     441                 :           0 :       break;
+     442                 :             : 
+     443                 :           0 :     default:
+     444                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     445                 :             :     }
+     446                 :           0 : }
+     447                 :             : 
+     448                 :             : static void
+     449                 :          14 : valent_menu_list_set_property (GObject      *object,
+     450                 :             :                                guint         prop_id,
+     451                 :             :                                const GValue *value,
+     452                 :             :                                GParamSpec   *pspec)
+     453                 :             : {
+     454                 :          14 :   ValentMenuList *self = VALENT_MENU_LIST (object);
+     455                 :             : 
+     456      [ +  +  - ]:          14 :   switch (prop_id)
+     457                 :             :     {
+     458                 :           7 :     case PROP_MENU_MODEL:
+     459                 :           7 :       valent_menu_list_set_menu_model (self, g_value_get_object (value));
+     460                 :           7 :       break;
+     461                 :             : 
+     462                 :           7 :     case PROP_SUBMENU_OF:
+     463                 :           7 :       valent_menu_list_set_submenu_of (self, g_value_get_object (value));
+     464                 :           7 :       break;
+     465                 :             : 
+     466                 :           0 :     default:
+     467                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     468                 :             :     }
+     469                 :          14 : }
+     470                 :             : 
+     471                 :             : static void
+     472                 :           3 : valent_menu_list_class_init (ValentMenuListClass *klass)
+     473                 :             : {
+     474                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     475                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     476                 :             : 
+     477                 :           3 :   object_class->dispose = valent_menu_list_dispose;
+     478                 :           3 :   object_class->finalize = valent_menu_list_finalize;
+     479                 :           3 :   object_class->get_property = valent_menu_list_get_property;
+     480                 :           3 :   object_class->set_property = valent_menu_list_set_property;
+     481                 :             : 
+     482                 :           3 :   gtk_widget_class_install_action (widget_class, "menu.submenu", "s", menu_submenu_action);
+     483                 :           3 :   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT);
+     484                 :             : 
+     485                 :             :   /**
+     486                 :             :    * ValentMenuList:menu-model:
+     487                 :             :    *
+     488                 :             :    * The "model" property holds the `GMenuModel` used to build this list.
+     489                 :             :    */
+     490                 :           6 :   properties [PROP_MENU_MODEL] =
+     491                 :           3 :     g_param_spec_object ("menu-model", NULL, NULL,
+     492                 :             :                          G_TYPE_MENU_MODEL,
+     493                 :             :                          (G_PARAM_READWRITE |
+     494                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     495                 :             :                           G_PARAM_STATIC_STRINGS));
+     496                 :             : 
+     497                 :             :   /**
+     498                 :             :    * ValentMenuList:submenu-of:
+     499                 :             :    *
+     500                 :             :    * The parent `ValentMenuList` this is a submenu for.
+     501                 :             :    */
+     502                 :           6 :   properties [PROP_SUBMENU_OF] =
+     503                 :           3 :     g_param_spec_object ("submenu-of", NULL, NULL,
+     504                 :             :                          VALENT_TYPE_MENU_LIST,
+     505                 :             :                          (G_PARAM_READWRITE |
+     506                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     507                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     508                 :             :                           G_PARAM_STATIC_STRINGS));
+     509                 :             : 
+     510                 :           3 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     511                 :           3 : }
+     512                 :             : 
+     513                 :             : static void
+     514                 :           7 : valent_menu_list_init (ValentMenuList *self)
+     515                 :             : {
+     516                 :           7 :   GtkWidget *placeholder;
+     517                 :             : 
+     518                 :             :   /* Item List */
+     519                 :          14 :   self->list = g_object_new (GTK_TYPE_LIST_BOX,
+     520                 :           7 :                              "css-classes",     VALENT_STRV_INIT ("boxed-list",
+     521                 :             :                                                                   "boxed-list-placeholder"),
+     522                 :             :                              "hexpand",         TRUE,
+     523                 :             :                              "show-separators", TRUE,
+     524                 :             :                              NULL);
+     525                 :           7 :   gtk_widget_set_parent (self->list, GTK_WIDGET (self));
+     526                 :           7 :   gtk_widget_insert_after (self->list, GTK_WIDGET (self), NULL);
+     527                 :             : 
+     528                 :             :   /* Placeholder */
+     529                 :           7 :   placeholder = g_object_new (GTK_TYPE_LABEL,
+     530                 :             :                               "label",         _("No Actions"),
+     531                 :             :                               "margin-top",    18,
+     532                 :             :                               "margin-bottom", 18,
+     533                 :             :                               NULL);
+     534                 :           7 :   gtk_widget_add_css_class (placeholder, "dim-label");
+     535                 :           7 :   gtk_list_box_set_placeholder (GTK_LIST_BOX (self->list), placeholder);
+     536                 :           7 : }
+     537                 :             : 
+     538                 :             : /**
+     539                 :             :  * valent_menu_list_new:
+     540                 :             :  * @model: (nullable): a `GMenuModel`
+     541                 :             :  *
+     542                 :             :  * Create a new `ValentMenuList`.
+     543                 :             :  *
+     544                 :             :  * Returns: (transfer full): a `ValentMenuList`
+     545                 :             :  */
+     546                 :             : ValentMenuList *
+     547                 :           6 : valent_menu_list_new (GMenuModel *model)
+     548                 :             : {
+     549                 :           6 :   return g_object_new (VALENT_TYPE_MENU_LIST,
+     550                 :             :                        "menu-model", model,
+     551                 :             :                        NULL);
+     552                 :             : }
+     553                 :             : 
+     554                 :             : /**
+     555                 :             :  * valent_menu_list_get_menu_model:
+     556                 :             :  * @self: a `ValentMenuList`
+     557                 :             :  *
+     558                 :             :  * Get the `GMenuModel` for @self.
+     559                 :             :  *
+     560                 :             :  * Returns: (transfer none): a `GMenuModel`
+     561                 :             :  */
+     562                 :             : GMenuModel *
+     563                 :           0 : valent_menu_list_get_menu_model (ValentMenuList *self)
+     564                 :             : {
+     565         [ #  # ]:           0 :   g_assert (VALENT_IS_MENU_LIST (self));
+     566                 :             : 
+     567                 :           0 :   return self->model;
+     568                 :             : }
+     569                 :             : 
+     570                 :             : /**
+     571                 :             :  * valent_menu_list_set_menu_model:
+     572                 :             :  * @self: a `ValentMenuList`
+     573                 :             :  * @model: (nullable): a `GMenuModel`
+     574                 :             :  *
+     575                 :             :  * Set the `GMenuModel` for @self.
+     576                 :             :  */
+     577                 :             : void
+     578                 :          12 : valent_menu_list_set_menu_model (ValentMenuList *list,
+     579                 :             :                                  GMenuModel     *model)
+     580                 :             : {
+     581                 :          12 :   unsigned int n_items;
+     582                 :             : 
+     583         [ +  - ]:          12 :   g_return_if_fail (VALENT_IS_MENU_LIST (list));
+     584   [ +  +  +  -  :          12 :   g_return_if_fail (model == NULL || G_IS_MENU_MODEL (model));
+             +  -  -  + ]
+     585                 :             : 
+     586         [ -  + ]:          12 :   if (list->model != NULL)
+     587                 :             :     {
+     588                 :           0 :       g_signal_handlers_disconnect_by_data (list->model, list);
+     589         [ #  # ]:           0 :       g_clear_object (&list->model);
+     590                 :             :     }
+     591                 :             : 
+     592         [ +  + ]:          12 :   if (g_set_object (&list->model, model))
+     593                 :             :     {
+     594                 :           7 :       g_signal_connect_object (list->model,
+     595                 :             :                                "items-changed",
+     596                 :             :                                G_CALLBACK (on_items_changed),
+     597                 :             :                                list, 0);
+     598                 :             : 
+     599                 :           7 :       n_items = g_menu_model_get_n_items (model);
+     600                 :           7 :       on_items_changed (model, 0, 0, n_items, list);
+     601                 :             :     }
+     602                 :             : }
+     603                 :             : 
+     604                 :             : /**
+     605                 :             :  * valent_menu_list_get_submenu_of:
+     606                 :             :  * @self: a `ValentMenuList`
+     607                 :             :  *
+     608                 :             :  * Get the parent `ValentMenuList`.
+     609                 :             :  *
+     610                 :             :  * Returns: (transfer none) (nullable): a `ValentMenuList`
+     611                 :             :  */
+     612                 :             : ValentMenuList *
+     613                 :           0 : valent_menu_list_get_submenu_of (ValentMenuList *self)
+     614                 :             : {
+     615         [ #  # ]:           0 :   g_assert (VALENT_IS_MENU_LIST (self));
+     616                 :             : 
+     617                 :           0 :   return self->parent;
+     618                 :             : }
+     619                 :             : 
+     620                 :             : /**
+     621                 :             :  * valent_menu_list_set_submenu_of:
+     622                 :             :  * @self: a `ValentMenuList`
+     623                 :             :  * @parent: (nullable): a `GMenuModel`
+     624                 :             :  *
+     625                 :             :  * Set the `GMenuModel` for @self.
+     626                 :             :  */
+     627                 :             : void
+     628                 :           7 : valent_menu_list_set_submenu_of (ValentMenuList *self,
+     629                 :             :                                  ValentMenuList *parent)
+     630                 :             : {
+     631                 :           7 :   GtkWidget *row;
+     632                 :           7 :   GtkWidget *box;
+     633                 :           7 :   GtkWidget *icon;
+     634                 :           7 :   GtkWidget *label;
+     635                 :             : 
+     636         [ +  - ]:           7 :   g_assert (VALENT_IS_MENU_LIST (self));
+     637   [ +  +  -  + ]:           7 :   g_assert (parent == NULL || VALENT_IS_MENU_LIST (parent));
+     638                 :             : 
+     639   [ +  +  +  - ]:           7 :   if (!g_set_object (&self->parent, parent) || parent == NULL)
+     640                 :             :     return;
+     641                 :             : 
+     642                 :           1 :   row = g_object_new (GTK_TYPE_LIST_BOX_ROW,
+     643                 :             :                       "action-target",  g_variant_new_string ("main"),
+     644                 :             :                       "action-name",    "menu.submenu",
+     645                 :             :                       "height-request", 56,
+     646                 :             :                       "selectable",     FALSE,
+     647                 :             :                       NULL);
+     648                 :           1 :   gtk_widget_add_css_class (row, "accent");
+     649                 :             : 
+     650                 :           1 :   box = g_object_new (GTK_TYPE_CENTER_BOX,
+     651                 :             :                       "margin-start",  12,
+     652                 :             :                       "margin-end",    12,
+     653                 :             :                       "margin-bottom", 8,
+     654                 :             :                       "margin-top",    8,
+     655                 :             :                       NULL);
+     656                 :           1 :   gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), GTK_WIDGET (box));
+     657                 :             : 
+     658                 :           1 :   icon = g_object_new (GTK_TYPE_IMAGE,
+     659                 :             :                        "icon-name", "go-previous-symbolic",
+     660                 :             :                        "icon-size", GTK_ICON_SIZE_NORMAL,
+     661                 :             :                        NULL);
+     662                 :           1 :   gtk_center_box_set_start_widget (GTK_CENTER_BOX (box), icon);
+     663                 :             : 
+     664                 :           1 :   label = g_object_new (GTK_TYPE_LABEL,
+     665                 :             :                         "label",   _("Previous"),
+     666                 :             :                         "halign",  GTK_ALIGN_CENTER,
+     667                 :             :                         "hexpand", TRUE,
+     668                 :             :                         "valign",  GTK_ALIGN_CENTER,
+     669                 :             :                         "vexpand", TRUE,
+     670                 :             :                         NULL);
+     671                 :           1 :   gtk_center_box_set_center_widget (GTK_CENTER_BOX (box), label);
+     672                 :           1 :   gtk_list_box_insert (GTK_LIST_BOX (self->list), GTK_WIDGET (row), 0);
+     673                 :             : }
+     674                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-list.h.func-c.html b/coverage/src/libvalent/ui/valent-menu-list.h.func-c.html new file mode 100644 index 00000000000..8f82e3c75ca --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-list.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-list.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-list.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MENU_LIST54
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-list.h.func.html b/coverage/src/libvalent/ui/valent-menu-list.h.func.html new file mode 100644 index 00000000000..405c00eb656 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-list.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-list.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-list.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MENU_LIST54
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-list.h.gcov.html b/coverage/src/libvalent/ui/valent-menu-list.h.gcov.html new file mode 100644 index 00000000000..753a0532270 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-list.h.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-list.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-list.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MENU_LIST (valent_menu_list_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          54 : G_DECLARE_FINAL_TYPE (ValentMenuList, valent_menu_list, VALENT, MENU_LIST, GtkWidget)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentMenuList * valent_menu_list_new            (GMenuModel     *model);
+      15                 :             : GMenuModel     * valent_menu_list_get_menu_model (ValentMenuList *self);
+      16                 :             : void             valent_menu_list_set_menu_model (ValentMenuList *self,
+      17                 :             :                                                   GMenuModel     *model);
+      18                 :             : ValentMenuList * valent_menu_list_get_submenu_of (ValentMenuList *self);
+      19                 :             : void             valent_menu_list_set_submenu_of (ValentMenuList *self,
+      20                 :             :                                                   ValentMenuList *parent);
+      21                 :             : 
+      22                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-stack.c.func-c.html b/coverage/src/libvalent/ui/valent-menu-stack.c.func-c.html new file mode 100644 index 00000000000..c4e2e16c7d8 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-stack.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-stack.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-stack.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:53.6 %5630
Test Date:2024-03-31 18:46:36Functions:63.6 %117
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:39.3 %2811
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_menu_stack_get_menu_model0
valent_menu_stack_get_property0
valent_menu_stack_new0
valent_menu_stack_set_property0
valent_menu_stack_class_init3
valent_menu_stack_dispose5
valent_menu_stack_init5
valent_menu_stack_set_menu_model5
valent_menu_stack_get_type81
valent_menu_stack_class_intern_init3
valent_menu_stack_get_type_once35
valent_menu_stack_get_type43
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-stack.c.func.html b/coverage/src/libvalent/ui/valent-menu-stack.c.func.html new file mode 100644 index 00000000000..e850ac74720 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-stack.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-stack.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-stack.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:53.6 %5630
Test Date:2024-03-31 18:46:36Functions:63.6 %117
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:39.3 %2811
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_menu_stack_class_init3
valent_menu_stack_dispose5
valent_menu_stack_get_menu_model0
valent_menu_stack_get_property0
valent_menu_stack_get_type81
valent_menu_stack_class_intern_init3
valent_menu_stack_get_type43
valent_menu_stack_get_type_once35
valent_menu_stack_init5
valent_menu_stack_new0
valent_menu_stack_set_menu_model5
valent_menu_stack_set_property0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-stack.c.gcov.html b/coverage/src/libvalent/ui/valent-menu-stack.c.gcov.html new file mode 100644 index 00000000000..781f657beda --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-stack.c.gcov.html @@ -0,0 +1,281 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-stack.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-stack.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:53.6 %5630
Test Date:2024-03-31 18:46:36Functions:63.6 %117
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:39.3 %2811
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-menu-stack"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gtk/gtk.h>
+       9                 :             : 
+      10                 :             : #include "valent-menu-list.h"
+      11                 :             : #include "valent-menu-stack.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : struct _ValentMenuStack
+      15                 :             : {
+      16                 :             :   GtkWidget       parent_instance;
+      17                 :             : 
+      18                 :             :   GtkWidget      *stack;
+      19                 :             :   ValentMenuList *main;
+      20                 :             : };
+      21                 :             : 
+      22   [ +  +  +  - ]:          81 : G_DEFINE_FINAL_TYPE (ValentMenuStack, valent_menu_stack, GTK_TYPE_WIDGET)
+      23                 :             : 
+      24                 :             : enum {
+      25                 :             :   PROP_0,
+      26                 :             :   PROP_MENU_MODEL,
+      27                 :             :   N_PROPERTIES
+      28                 :             : };
+      29                 :             : 
+      30                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      31                 :             : 
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * GObject
+      35                 :             :  */
+      36                 :             : static void
+      37                 :           5 : valent_menu_stack_dispose (GObject *object)
+      38                 :             : {
+      39                 :           5 :   ValentMenuStack *self = VALENT_MENU_STACK (object);
+      40                 :             : 
+      41         [ +  - ]:           5 :   g_clear_pointer (&self->stack, gtk_widget_unparent);
+      42                 :             : 
+      43                 :           5 :   G_OBJECT_CLASS (valent_menu_stack_parent_class)->dispose (object);
+      44                 :           5 : }
+      45                 :             : 
+      46                 :             : static void
+      47                 :           0 : valent_menu_stack_get_property (GObject    *object,
+      48                 :             :                                 guint       prop_id,
+      49                 :             :                                 GValue     *value,
+      50                 :             :                                 GParamSpec *pspec)
+      51                 :             : {
+      52                 :           0 :   ValentMenuStack *self = VALENT_MENU_STACK (object);
+      53                 :             : 
+      54         [ #  # ]:           0 :   switch (prop_id)
+      55                 :             :     {
+      56                 :           0 :     case PROP_MENU_MODEL:
+      57                 :           0 :       g_value_set_object (value, valent_menu_stack_get_menu_model (self));
+      58                 :           0 :       break;
+      59                 :             : 
+      60                 :           0 :     default:
+      61                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      62                 :             :     }
+      63                 :           0 : }
+      64                 :             : 
+      65                 :             : static void
+      66                 :           0 : valent_menu_stack_set_property (GObject      *object,
+      67                 :             :                                 guint         prop_id,
+      68                 :             :                                 const GValue *value,
+      69                 :             :                                 GParamSpec   *pspec)
+      70                 :             : {
+      71                 :           0 :   ValentMenuStack *self = VALENT_MENU_STACK (object);
+      72                 :             : 
+      73         [ #  # ]:           0 :   switch (prop_id)
+      74                 :             :     {
+      75                 :           0 :     case PROP_MENU_MODEL:
+      76                 :           0 :       valent_menu_stack_set_menu_model (self, g_value_get_object (value));
+      77                 :           0 :       break;
+      78                 :             : 
+      79                 :           0 :     default:
+      80                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      81                 :             :     }
+      82                 :           0 : }
+      83                 :             : 
+      84                 :             : static void
+      85                 :           3 : valent_menu_stack_class_init (ValentMenuStackClass *klass)
+      86                 :             : {
+      87                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      88                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+      89                 :             : 
+      90                 :           3 :   object_class->dispose = valent_menu_stack_dispose;
+      91                 :           3 :   object_class->get_property = valent_menu_stack_get_property;
+      92                 :           3 :   object_class->set_property = valent_menu_stack_set_property;
+      93                 :             : 
+      94                 :           3 :   gtk_widget_class_set_css_name (widget_class, "valent-menu-stack");
+      95                 :           3 :   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+      96                 :             : 
+      97                 :             :   /**
+      98                 :             :    * ValentMenuStack:model:
+      99                 :             :    *
+     100                 :             :    * The `GMenuModel` for this `ValentMenuStack`.
+     101                 :             :    */
+     102                 :           6 :   properties [PROP_MENU_MODEL] =
+     103                 :           3 :     g_param_spec_object ("menu-model", NULL, NULL,
+     104                 :             :                          G_TYPE_MENU_MODEL,
+     105                 :             :                          (G_PARAM_READWRITE |
+     106                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     107                 :             :                           G_PARAM_STATIC_STRINGS));
+     108                 :             : 
+     109                 :           3 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     110                 :           3 : }
+     111                 :             : 
+     112                 :             : static void
+     113                 :           5 : valent_menu_stack_init (ValentMenuStack *self)
+     114                 :             : {
+     115                 :           5 :   self->stack = g_object_new (GTK_TYPE_STACK,
+     116                 :             :                               "interpolate-size", TRUE,
+     117                 :             :                               "transition-type",  GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT,
+     118                 :             :                               "vhomogeneous",     FALSE,
+     119                 :             :                               NULL);
+     120                 :           5 :   gtk_widget_insert_before (self->stack, GTK_WIDGET (self), NULL);
+     121                 :           5 : }
+     122                 :             : 
+     123                 :             : /**
+     124                 :             :  * valent_menu_stack_new:
+     125                 :             :  * @menu_model: (nullable): a `GMenuModel`
+     126                 :             :  *
+     127                 :             :  * Create a new `ValentMenuStack`.
+     128                 :             :  *
+     129                 :             :  * Returns: a `GtkWidget`
+     130                 :             :  */
+     131                 :             : GtkWidget *
+     132                 :           0 : valent_menu_stack_new (GMenuModel *menu_model)
+     133                 :             : {
+     134                 :           0 :   return g_object_new (VALENT_TYPE_MENU_STACK,
+     135                 :             :                        "menu-model", menu_model,
+     136                 :             :                        NULL);
+     137                 :             : }
+     138                 :             : 
+     139                 :             : /**
+     140                 :             :  * valent_menu_stack_get_model:
+     141                 :             :  * @stack: a `ValentMenuStack`
+     142                 :             :  *
+     143                 :             :  * Get the `GMenuModel` for @stack.
+     144                 :             :  *
+     145                 :             :  * Returns: (transfer none) (nullable): a `GMenuModel`
+     146                 :             :  */
+     147                 :             : GMenuModel *
+     148                 :           0 : valent_menu_stack_get_menu_model (ValentMenuStack *stack)
+     149                 :             : {
+     150         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_MENU_STACK (stack), NULL);
+     151                 :             : 
+     152         [ #  # ]:           0 :   if (stack->main == NULL)
+     153                 :             :     return NULL;
+     154                 :             : 
+     155                 :           0 :   return valent_menu_list_get_menu_model (stack->main);
+     156                 :             : }
+     157                 :             : 
+     158                 :             : /**
+     159                 :             :  * valent_menu_stack_set_model:
+     160                 :             :  * @stack: a `ValentMenuStack`
+     161                 :             :  * @menu_model: (nullable): a `GMenuModel`
+     162                 :             :  *
+     163                 :             :  * Set the `GMenuModel` for @stack to @menu_model.
+     164                 :             :  */
+     165                 :             : void
+     166                 :           5 : valent_menu_stack_set_menu_model (ValentMenuStack *stack,
+     167                 :             :                                   GMenuModel      *menu_model)
+     168                 :             : {
+     169         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_MENU_STACK (stack));
+     170   [ +  -  +  -  :           5 :   g_return_if_fail (menu_model == NULL || G_IS_MENU_MODEL (menu_model));
+             +  -  -  + ]
+     171                 :             : 
+     172                 :             :   /* Destroy any existing menu lists */
+     173         [ -  + ]:           5 :   if (stack->main != NULL)
+     174                 :             :     {
+     175                 :           0 :       gtk_stack_remove (GTK_STACK (stack->stack), GTK_WIDGET (stack->main));
+     176                 :           0 :       stack->main = NULL;
+     177                 :             :     }
+     178                 :             : 
+     179         [ +  - ]:           5 :   if (menu_model != NULL)
+     180                 :             :     {
+     181                 :           5 :       stack->main = valent_menu_list_new (NULL);
+     182                 :           5 :       gtk_stack_add_named (GTK_STACK (stack->stack),
+     183                 :             :                            GTK_WIDGET (stack->main),
+     184                 :             :                            "main");
+     185                 :           5 :       valent_menu_list_set_menu_model (stack->main, menu_model);
+     186                 :             :     }
+     187                 :             : }
+     188                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-stack.h.func-c.html b/coverage/src/libvalent/ui/valent-menu-stack.h.func-c.html new file mode 100644 index 00000000000..48e7e9a10b0 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-stack.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-stack.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-stack.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MENU_STACK5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-stack.h.func.html b/coverage/src/libvalent/ui/valent-menu-stack.h.func.html new file mode 100644 index 00000000000..00a0b5cbd6e --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-stack.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-stack.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-stack.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MENU_STACK5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-menu-stack.h.gcov.html b/coverage/src/libvalent/ui/valent-menu-stack.h.gcov.html new file mode 100644 index 00000000000..cbfd662cffa --- /dev/null +++ b/coverage/src/libvalent/ui/valent-menu-stack.h.gcov.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-menu-stack.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-menu-stack.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MENU_STACK (valent_menu_stack_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           5 : G_DECLARE_FINAL_TYPE (ValentMenuStack, valent_menu_stack, VALENT, MENU_STACK, GtkWidget)
+                   -  + ]
+      13                 :             : 
+      14                 :             : GtkWidget  * valent_menu_stack_new            (GMenuModel      *menu_model);
+      15                 :             : GMenuModel * valent_menu_stack_get_menu_model (ValentMenuStack *stack);
+      16                 :             : void         valent_menu_stack_set_menu_model (ValentMenuStack *stack,
+      17                 :             :                                                GMenuModel      *menu_model);
+      18                 :             : 
+      19                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-plugin-row.c.func-c.html b/coverage/src/libvalent/ui/valent-plugin-row.c.func-c.html new file mode 100644 index 00000000000..643eac897af --- /dev/null +++ b/coverage/src/libvalent/ui/valent-plugin-row.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-plugin-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-plugin-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.4 %6659
Test Date:2024-03-31 18:46:36Functions:100.0 %1111
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.2 %2413
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_plugin_row_class_init2
strv_to_str6
valent_plugin_row_dispose6
valent_plugin_row_finalize6
valent_plugin_row_init6
valent_plugin_row_set_context6
valent_plugin_row_set_property12
valent_plugin_row_get_type22
valent_plugin_row_class_intern_init2
valent_plugin_row_get_type_once2
valent_plugin_row_get_type18
valent_plugin_row_get_property120
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-plugin-row.c.func.html b/coverage/src/libvalent/ui/valent-plugin-row.c.func.html new file mode 100644 index 00000000000..d13ab5a6cc5 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-plugin-row.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-plugin-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-plugin-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.4 %6659
Test Date:2024-03-31 18:46:36Functions:100.0 %1111
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.2 %2413
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
strv_to_str6
valent_plugin_row_class_init2
valent_plugin_row_dispose6
valent_plugin_row_finalize6
valent_plugin_row_get_property120
valent_plugin_row_get_type22
valent_plugin_row_class_intern_init2
valent_plugin_row_get_type18
valent_plugin_row_get_type_once2
valent_plugin_row_init6
valent_plugin_row_set_context6
valent_plugin_row_set_property12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-plugin-row.c.gcov.html b/coverage/src/libvalent/ui/valent-plugin-row.c.gcov.html new file mode 100644 index 00000000000..bc1fab36c9b --- /dev/null +++ b/coverage/src/libvalent/ui/valent-plugin-row.c.gcov.html @@ -0,0 +1,279 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-plugin-row.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-plugin-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.4 %6659
Test Date:2024-03-31 18:46:36Functions:100.0 %1111
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:54.2 %2413
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-plugin-row"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-plugin-row.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentPluginRow:
+      16                 :             :  *
+      17                 :             :  * A [class@Gtk.ListBoxRow] used to toggle plugins.
+      18                 :             :  */
+      19                 :             : 
+      20                 :             : struct _ValentPluginRow
+      21                 :             : {
+      22                 :             :   AdwExpanderRow  parent;
+      23                 :             : 
+      24                 :             :   ValentContext  *context;
+      25                 :             :   PeasPluginInfo *plugin_info;
+      26                 :             :   GSettings      *settings;
+      27                 :             : 
+      28                 :             :   /* template */
+      29                 :             :   GtkSwitch      *plugin_enabled;
+      30                 :             : };
+      31                 :             : 
+      32   [ +  +  +  - ]:          22 : G_DEFINE_FINAL_TYPE (ValentPluginRow, valent_plugin_row, ADW_TYPE_EXPANDER_ROW)
+      33                 :             : 
+      34                 :             : enum {
+      35                 :             :   PROP_0,
+      36                 :             :   PROP_CONTEXT,
+      37                 :             :   PROP_PLUGIN_INFO,
+      38                 :             :   N_PROPERTIES
+      39                 :             : };
+      40                 :             : 
+      41                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      42                 :             : 
+      43                 :             : static char *
+      44                 :           6 : strv_to_str (GObject            *object,
+      45                 :             :              const char * const *strv)
+      46                 :             : {
+      47                 :           6 :   return g_strjoinv (", ", (GStrv)strv);
+      48                 :             : }
+      49                 :             : 
+      50                 :             : static void
+      51                 :           6 : valent_plugin_row_set_context (ValentPluginRow *self,
+      52                 :             :                                ValentContext   *context)
+      53                 :             : {
+      54         [ +  - ]:           6 :   g_assert (VALENT_IS_PLUGIN_ROW (self));
+      55   [ +  -  -  + ]:           6 :   g_assert (context == NULL || VALENT_IS_CONTEXT (context));
+      56                 :             : 
+      57         [ +  - ]:           6 :   if (!g_set_object (&self->context, context))
+      58                 :             :     return;
+      59                 :             : 
+      60                 :           6 :   self->settings = valent_context_create_settings (self->context,
+      61                 :             :                                                    "ca.andyholmes.Valent.Plugin");
+      62                 :           6 :   g_settings_bind (self->settings,       "enabled",
+      63                 :           6 :                    self->plugin_enabled, "active",
+      64                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      65                 :           6 :   gtk_switch_set_active (self->plugin_enabled,
+      66                 :             :                          g_settings_get_boolean (self->settings, "enabled"));
+      67                 :             : }
+      68                 :             : 
+      69                 :             : /*
+      70                 :             :  * GObject
+      71                 :             :  */
+      72                 :             : static void
+      73                 :           6 : valent_plugin_row_dispose (GObject *object)
+      74                 :             : {
+      75                 :           6 :   ValentPluginRow *self = VALENT_PLUGIN_ROW (object);
+      76                 :             : 
+      77                 :           6 :   gtk_widget_dispose_template (GTK_WIDGET (self), VALENT_TYPE_PLUGIN_ROW);
+      78                 :             : 
+      79                 :           6 :   G_OBJECT_CLASS (valent_plugin_row_parent_class)->dispose (object);
+      80                 :           6 : }
+      81                 :             : 
+      82                 :             : static void
+      83                 :           6 : valent_plugin_row_finalize (GObject *object)
+      84                 :             : {
+      85                 :           6 :   ValentPluginRow *self = VALENT_PLUGIN_ROW (object);
+      86                 :             : 
+      87         [ +  - ]:           6 :   g_clear_object (&self->context);
+      88         [ +  - ]:           6 :   g_clear_object (&self->plugin_info);
+      89         [ +  - ]:           6 :   g_clear_object (&self->settings);
+      90                 :             : 
+      91                 :           6 :   G_OBJECT_CLASS (valent_plugin_row_parent_class)->finalize (object);
+      92                 :           6 : }
+      93                 :             : 
+      94                 :             : static void
+      95                 :         120 : valent_plugin_row_get_property (GObject    *object,
+      96                 :             :                                 guint       prop_id,
+      97                 :             :                                 GValue     *value,
+      98                 :             :                                 GParamSpec *pspec)
+      99                 :             : {
+     100                 :         120 :   ValentPluginRow *self = VALENT_PLUGIN_ROW (object);
+     101                 :             : 
+     102      [ -  +  - ]:         120 :   switch (prop_id)
+     103                 :             :     {
+     104                 :           0 :     case PROP_CONTEXT:
+     105                 :           0 :       g_value_set_object (value, self->context);
+     106                 :           0 :       break;
+     107                 :             : 
+     108                 :         120 :     case PROP_PLUGIN_INFO:
+     109                 :         120 :       g_value_set_object (value, self->plugin_info);
+     110                 :         120 :       break;
+     111                 :             : 
+     112                 :           0 :     default:
+     113                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     114                 :             :     }
+     115                 :         120 : }
+     116                 :             : 
+     117                 :             : static void
+     118                 :          12 : valent_plugin_row_set_property (GObject      *object,
+     119                 :             :                                 guint         prop_id,
+     120                 :             :                                 const GValue *value,
+     121                 :             :                                 GParamSpec   *pspec)
+     122                 :             : {
+     123                 :          12 :   ValentPluginRow *self = VALENT_PLUGIN_ROW (object);
+     124                 :             : 
+     125      [ +  +  - ]:          12 :   switch (prop_id)
+     126                 :             :     {
+     127                 :           6 :     case PROP_CONTEXT:
+     128                 :           6 :       valent_plugin_row_set_context (self, g_value_get_object (value));
+     129                 :           6 :       break;
+     130                 :             : 
+     131                 :           6 :     case PROP_PLUGIN_INFO:
+     132                 :           6 :       self->plugin_info = g_value_dup_object (value);
+     133                 :           6 :       break;
+     134                 :             : 
+     135                 :           0 :     default:
+     136                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     137                 :             :     }
+     138                 :          12 : }
+     139                 :             : 
+     140                 :             : static void
+     141                 :           2 : valent_plugin_row_class_init (ValentPluginRowClass *klass)
+     142                 :             : {
+     143                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     144                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     145                 :             : 
+     146                 :           2 :   object_class->dispose = valent_plugin_row_dispose;
+     147                 :           2 :   object_class->finalize = valent_plugin_row_finalize;
+     148                 :           2 :   object_class->get_property = valent_plugin_row_get_property;
+     149                 :           2 :   object_class->set_property = valent_plugin_row_set_property;
+     150                 :             : 
+     151                 :             :   /**
+     152                 :             :    * ValentPluginRow:context:
+     153                 :             :    *
+     154                 :             :    * The [class@Valent.Context] for the [class@Valent.Extension].
+     155                 :             :    */
+     156                 :           4 :   properties [PROP_CONTEXT] =
+     157                 :           2 :     g_param_spec_object ("context", NULL, NULL,
+     158                 :             :                          VALENT_TYPE_CONTEXT,
+     159                 :             :                          (G_PARAM_READWRITE |
+     160                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     161                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     162                 :             :                           G_PARAM_STATIC_STRINGS));
+     163                 :             : 
+     164                 :             :   /**
+     165                 :             :    * ValentPluginRow:plugin-info:
+     166                 :             :    *
+     167                 :             :    * The [class@Peas.PluginInfo] describing the plugin.
+     168                 :             :    */
+     169                 :           4 :   properties [PROP_PLUGIN_INFO] =
+     170                 :           2 :     g_param_spec_object ("plugin-info", NULL, NULL,
+     171                 :             :                          PEAS_TYPE_PLUGIN_INFO,
+     172                 :             :                          (G_PARAM_READWRITE |
+     173                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     174                 :             :                           G_PARAM_STATIC_STRINGS));
+     175                 :             : 
+     176                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     177                 :             : 
+     178                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-plugin-row.ui");
+     179                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentPluginRow, plugin_enabled);
+     180                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, strv_to_str);
+     181                 :           2 : }
+     182                 :             : 
+     183                 :             : static void
+     184                 :           6 : valent_plugin_row_init (ValentPluginRow *self)
+     185                 :             : {
+     186                 :           6 :   gtk_widget_init_template (GTK_WIDGET (self));
+     187                 :           6 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-plugin-row.h.func-c.html b/coverage/src/libvalent/ui/valent-plugin-row.h.func-c.html new file mode 100644 index 00000000000..4195a7b787a --- /dev/null +++ b/coverage/src/libvalent/ui/valent-plugin-row.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-plugin-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-plugin-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PLUGIN_ROW6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-plugin-row.h.func.html b/coverage/src/libvalent/ui/valent-plugin-row.h.func.html new file mode 100644 index 00000000000..c71e705a677 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-plugin-row.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-plugin-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-plugin-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PLUGIN_ROW6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-plugin-row.h.gcov.html b/coverage/src/libvalent/ui/valent-plugin-row.h.gcov.html new file mode 100644 index 00000000000..d4840597fe9 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-plugin-row.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-plugin-row.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-plugin-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_PLUGIN_ROW (valent_plugin_row_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           6 : G_DECLARE_FINAL_TYPE (ValentPluginRow, valent_plugin_row, VALENT, PLUGIN_ROW, AdwExpanderRow)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-dialog.c.func-c.html b/coverage/src/libvalent/ui/valent-preferences-dialog.c.func-c.html new file mode 100644 index 00000000000..d7bba7e6038 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-dialog.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:85.7 %168144
Test Date:2024-03-31 18:46:36Functions:80.0 %1512
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.3 %9436
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_name_apply0
on_settings_changed0
plugin_list_sort0
on_unload_plugin1
page_action1
valent_preferences_dialog_class_init2
valent_preferences_dialog_constructed4
valent_preferences_dialog_dispose4
valent_preferences_dialog_finalize4
valent_preferences_dialog_init4
plugin_row_add_extensions5
on_load_plugin17
valent_preferences_dialog_get_type94
valent_preferences_dialog_class_intern_init2
valent_preferences_dialog_get_type_once35
valent_preferences_dialog_get_type57
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-dialog.c.func.html b/coverage/src/libvalent/ui/valent-preferences-dialog.c.func.html new file mode 100644 index 00000000000..80ac527b821 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-dialog.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:85.7 %168144
Test Date:2024-03-31 18:46:36Functions:80.0 %1512
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.3 %9436
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_load_plugin17
on_name_apply0
on_settings_changed0
on_unload_plugin1
page_action1
plugin_list_sort0
plugin_row_add_extensions5
valent_preferences_dialog_class_init2
valent_preferences_dialog_constructed4
valent_preferences_dialog_dispose4
valent_preferences_dialog_finalize4
valent_preferences_dialog_get_type94
valent_preferences_dialog_class_intern_init2
valent_preferences_dialog_get_type57
valent_preferences_dialog_get_type_once35
valent_preferences_dialog_init4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-dialog.c.gcov.html b/coverage/src/libvalent/ui/valent-preferences-dialog.c.gcov.html new file mode 100644 index 00000000000..2fbd9d8996b --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-dialog.c.gcov.html @@ -0,0 +1,545 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-dialog.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:85.7 %168144
Test Date:2024-03-31 18:46:36Functions:80.0 %1512
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.3 %9436
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-preferences-dialog"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <pango/pango.h>
+      12                 :             : #include <libvalent-core.h>
+      13                 :             : #include <libvalent-clipboard.h>
+      14                 :             : #include <libvalent-contacts.h>
+      15                 :             : #include <libvalent-device.h>
+      16                 :             : #include <libvalent-input.h>
+      17                 :             : #include <libvalent-media.h>
+      18                 :             : #include <libvalent-mixer.h>
+      19                 :             : #include <libvalent-notifications.h>
+      20                 :             : #include <libvalent-session.h>
+      21                 :             : 
+      22                 :             : #include "valent-preferences-page.h"
+      23                 :             : #include "valent-preferences-dialog.h"
+      24                 :             : 
+      25                 :             : 
+      26                 :             : struct _ValentPreferencesDialog
+      27                 :             : {
+      28                 :             :   AdwPreferencesDialog  parent_instance;
+      29                 :             : 
+      30                 :             :   GSettings            *settings;
+      31                 :             :   GHashTable           *pages;
+      32                 :             :   GHashTable           *rows;
+      33                 :             : 
+      34                 :             :   /* template */
+      35                 :             :   AdwPreferencesPage   *main_page;
+      36                 :             : 
+      37                 :             :   AdwPreferencesGroup  *general_group;
+      38                 :             :   AdwEntryRow          *name_entry;
+      39                 :             : 
+      40                 :             :   AdwPreferencesGroup  *plugin_group;
+      41                 :             :   GtkListBox           *plugin_list;
+      42                 :             : };
+      43                 :             : 
+      44   [ +  +  +  - ]:          94 : G_DEFINE_FINAL_TYPE (ValentPreferencesDialog, valent_preferences_dialog, ADW_TYPE_PREFERENCES_DIALOG)
+      45                 :             : 
+      46                 :             : 
+      47                 :             : typedef struct
+      48                 :             : {
+      49                 :             :   GType  gtype;
+      50                 :             :   char  *title;
+      51                 :             :   char  *domain;
+      52                 :             : } ExtensionDescription;
+      53                 :             : 
+      54                 :             : enum {
+      55                 :             :   EXTEN_APPLICATION_PLUGIN,
+      56                 :             :   EXTEN_CHANNEL_SERVICE,
+      57                 :             :   EXTEN_CLIPBOARD_ADAPTER,
+      58                 :             :   EXTEN_CONTACTS_ADAPTER,
+      59                 :             :   EXTEN_INPUT_ADAPTER,
+      60                 :             :   EXTEN_MEDIA_ADAPTER,
+      61                 :             :   EXTEN_MIXER_ADAPTER,
+      62                 :             :   EXTEN_NOTIFICATION_ADAPTER,
+      63                 :             :   EXTEN_SESSION_ADAPTER,
+      64                 :             :   N_EXTENSIONS,
+      65                 :             : };
+      66                 :             : 
+      67                 :             : static ExtensionDescription extensions[N_EXTENSIONS] = { 0, };
+      68                 :             : 
+      69                 :             : 
+      70                 :             : static int
+      71                 :           0 : plugin_list_sort (GtkListBoxRow *row1,
+      72                 :             :                   GtkListBoxRow *row2,
+      73                 :             :                   gpointer       user_data)
+      74                 :             : {
+      75   [ #  #  #  # ]:           0 :   if G_UNLIKELY (!ADW_IS_PREFERENCES_ROW (row1) ||
+      76                 :             :                  !ADW_IS_PREFERENCES_ROW (row2))
+      77                 :           0 :     return 0;
+      78                 :             : 
+      79                 :           0 :   return g_utf8_collate (adw_preferences_row_get_title ((AdwPreferencesRow *)row1),
+      80                 :           0 :                          adw_preferences_row_get_title ((AdwPreferencesRow *)row2));
+      81                 :             : }
+      82                 :             : 
+      83                 :             : /*
+      84                 :             :  * Device Name Callbacks
+      85                 :             :  */
+      86                 :             : static void
+      87                 :           0 : on_name_apply (GtkEditable             *editable,
+      88                 :             :                ValentPreferencesDialog *self)
+      89                 :             : {
+      90                 :           0 :   const char *name = NULL;
+      91                 :             : 
+      92   [ #  #  #  #  :           0 :   g_assert (GTK_IS_EDITABLE (editable));
+             #  #  #  # ]
+      93         [ #  # ]:           0 :   g_assert (VALENT_IS_PREFERENCES_DIALOG (self));
+      94                 :             : 
+      95                 :           0 :   name = gtk_editable_get_text (editable);
+      96                 :             : 
+      97   [ #  #  #  # ]:           0 :   if (name == NULL || *name == '\0')
+      98                 :             :     return;
+      99                 :             : 
+     100                 :           0 :   g_settings_set_string (self->settings, "name", name);
+     101                 :             : }
+     102                 :             : 
+     103                 :             : static void
+     104                 :           0 : on_settings_changed (GSettings               *settings,
+     105                 :             :                      const char              *key,
+     106                 :             :                      ValentPreferencesDialog *self)
+     107                 :             : {
+     108                 :           0 :   const char *text = NULL;
+     109                 :           0 :   g_autofree char *name = NULL;
+     110                 :             : 
+     111   [ #  #  #  #  :           0 :   g_assert (G_IS_SETTINGS (settings));
+             #  #  #  # ]
+     112   [ #  #  #  # ]:           0 :   g_assert (key != NULL && *key != '\0');
+     113         [ #  # ]:           0 :   g_assert (VALENT_IS_PREFERENCES_DIALOG (self));
+     114                 :             : 
+     115                 :           0 :   name = g_settings_get_string (self->settings, "name");
+     116                 :           0 :   text = gtk_editable_get_text (GTK_EDITABLE (self->name_entry));
+     117                 :             : 
+     118         [ #  # ]:           0 :   if (g_strcmp0 (text, name) != 0)
+     119                 :           0 :     gtk_editable_set_text (GTK_EDITABLE (self->name_entry), name);
+     120                 :           0 : }
+     121                 :             : 
+     122                 :             : /*
+     123                 :             :  * PeasEngine Callbacks
+     124                 :             :  */
+     125                 :             : static void
+     126                 :           5 : plugin_row_add_extensions (AdwExpanderRow *plugin_row,
+     127                 :             :                            PeasPluginInfo *info)
+     128                 :             : {
+     129                 :           5 :   PeasEngine *engine = valent_get_plugin_engine ();
+     130                 :           5 :   GtkWidget *row;
+     131                 :             : 
+     132         [ +  + ]:          50 :   for (unsigned int i = 0; i < N_EXTENSIONS; i++)
+     133                 :             :     {
+     134                 :          45 :       ExtensionDescription extension = extensions[i];
+     135                 :          45 :       g_autoptr (ValentContext) domain = NULL;
+     136         [ +  - ]:          45 :       g_autoptr (ValentContext) context = NULL;
+     137         [ +  - ]:          45 :       g_autoptr (GSettings) settings = NULL;
+     138                 :             : 
+     139         [ -  + ]:          45 :       if (!peas_engine_provides_extension (engine, info, extension.gtype))
+     140                 :           0 :         continue;
+     141                 :             : 
+     142                 :          45 :       row = g_object_new (ADW_TYPE_SWITCH_ROW,
+     143                 :             :                           "title",      _(extension.title),
+     144                 :             :                           "selectable", FALSE,
+     145                 :             :                           NULL);
+     146                 :          45 :       adw_expander_row_add_row (ADW_EXPANDER_ROW (plugin_row), row);
+     147                 :             : 
+     148                 :          45 :       domain = valent_context_new (NULL, extension.domain, NULL);
+     149                 :          45 :       context = valent_context_get_plugin_context (domain, info);
+     150                 :          45 :       settings = valent_context_create_settings (context,
+     151                 :             :                                                  "ca.andyholmes.Valent.Plugin");
+     152                 :          45 :       g_settings_bind (settings, "enabled",
+     153                 :             :                        row,      "active",
+     154                 :             :                        G_SETTINGS_BIND_DEFAULT);
+     155                 :          45 :       adw_switch_row_set_active (ADW_SWITCH_ROW (row),
+     156                 :             :                                  g_settings_get_boolean (settings, "enabled"));
+     157         [ +  - ]:          45 :       g_object_set_data_full (G_OBJECT (row),
+     158                 :             :                               "plugin-settings",
+     159                 :             :                               g_steal_pointer (&settings),
+     160                 :             :                               g_object_unref);
+     161                 :             :     }
+     162                 :           5 : }
+     163                 :             : 
+     164                 :             : static void
+     165                 :          17 : on_load_plugin (PeasEngine              *engine,
+     166                 :             :                 PeasPluginInfo          *info,
+     167                 :             :                 ValentPreferencesDialog *self)
+     168                 :             : {
+     169                 :          17 :   GtkWidget *row = NULL;
+     170                 :          17 :   const char *module;
+     171                 :          17 :   const char *title;
+     172                 :          17 :   const char *subtitle;
+     173                 :          17 :   const char *icon_name;
+     174                 :             : 
+     175         [ +  - ]:          17 :   g_assert (PEAS_IS_ENGINE (engine));
+     176         [ -  + ]:          17 :   g_assert (info != NULL);
+     177         [ -  + ]:          17 :   g_assert (VALENT_IS_PREFERENCES_DIALOG (self));
+     178                 :             : 
+     179         [ +  + ]:          17 :   if (peas_plugin_info_is_hidden (info))
+     180                 :             :     return;
+     181                 :             : 
+     182                 :           9 :   engine = valent_get_plugin_engine ();
+     183                 :           9 :   module = peas_plugin_info_get_module_name (info);
+     184                 :           9 :   title = peas_plugin_info_get_name (info);
+     185                 :           9 :   subtitle = peas_plugin_info_get_description (info);
+     186                 :           9 :   icon_name = peas_plugin_info_get_icon_name (info);
+     187                 :             : 
+     188   [ +  +  +  - ]:          13 :   if (peas_engine_provides_extension (engine, info, VALENT_TYPE_APPLICATION_PLUGIN) ||
+     189         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_CLIPBOARD_ADAPTER) ||
+     190         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_CHANNEL_SERVICE) ||
+     191         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_CONTACTS_ADAPTER) ||
+     192         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_INPUT_ADAPTER) ||
+     193         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_MEDIA_ADAPTER) ||
+     194         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_MIXER_ADAPTER) ||
+     195         [ +  - ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_NOTIFICATIONS_ADAPTER) ||
+     196         [ -  + ]:           8 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_SESSION_ADAPTER) ||
+     197                 :           4 :       peas_engine_provides_extension (engine, info, VALENT_TYPE_PREFERENCES_PAGE))
+     198                 :             :     {
+     199                 :           5 :       GtkWidget *icon;
+     200                 :             : 
+     201                 :           5 :       row = g_object_new (ADW_TYPE_EXPANDER_ROW,
+     202                 :             :                           "title",      title,
+     203                 :             :                           "subtitle",   subtitle,
+     204                 :             :                           "selectable", FALSE,
+     205                 :             :                           NULL);
+     206                 :           5 :       icon = g_object_new (GTK_TYPE_IMAGE,
+     207                 :             :                            "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
+     208                 :             :                            "icon-name",       icon_name,
+     209                 :             :                            NULL);
+     210                 :           5 :       adw_expander_row_add_prefix (ADW_EXPANDER_ROW (row), icon);
+     211                 :             : 
+     212                 :           5 :       plugin_row_add_extensions (ADW_EXPANDER_ROW (row), info);
+     213                 :             : 
+     214                 :           5 :       gtk_list_box_insert (self->plugin_list, row, -1);
+     215                 :           5 :       g_hash_table_insert (self->rows, info, g_object_ref (row));
+     216                 :             :     }
+     217                 :             : 
+     218                 :             :   /* Preferences Page */
+     219         [ +  + ]:           9 :   if (peas_engine_provides_extension (engine,
+     220                 :             :                                       info,
+     221                 :             :                                       VALENT_TYPE_PREFERENCES_PAGE))
+     222                 :             :     {
+     223                 :           5 :       GObject *page;
+     224                 :           5 :       GtkWidget *button;
+     225                 :             : 
+     226                 :           5 :       button = g_object_new (GTK_TYPE_BUTTON,
+     227                 :             :                              "action-target", g_variant_new_string (module),
+     228                 :             :                              "action-name",   "win.page",
+     229                 :             :                              "icon-name",     "emblem-system-symbolic",
+     230                 :             :                              "valign",        GTK_ALIGN_CENTER,
+     231                 :             :                              NULL);
+     232                 :             : #if ADW_CHECK_VERSION (1, 4, 0)
+     233                 :           5 :       adw_expander_row_add_suffix (ADW_EXPANDER_ROW (row), button);
+     234                 :             : #else
+     235                 :             :       adw_expander_row_add_action (ADW_EXPANDER_ROW (row), button);
+     236                 :             : #endif
+     237                 :             : 
+     238                 :           5 :       page = peas_engine_create_extension (engine,
+     239                 :             :                                            info,
+     240                 :             :                                            VALENT_TYPE_PREFERENCES_PAGE,
+     241                 :             :                                            "name",      module,
+     242                 :             :                                            "icon-name", icon_name,
+     243                 :             :                                            "title",     title,
+     244                 :             :                                            NULL);
+     245                 :           5 :       adw_preferences_dialog_add (ADW_PREFERENCES_DIALOG (self),
+     246                 :             :                                   ADW_PREFERENCES_PAGE (page));
+     247                 :           5 :       g_hash_table_insert (self->pages, info, g_object_ref (page));
+     248                 :             :     }
+     249                 :             : }
+     250                 :             : 
+     251                 :             : static void
+     252                 :           1 : on_unload_plugin (PeasEngine              *engine,
+     253                 :             :                   PeasPluginInfo          *info,
+     254                 :             :                   ValentPreferencesDialog *self)
+     255                 :             : {
+     256                 :           2 :   g_autoptr (AdwPreferencesPage) page = NULL;
+     257         [ +  - ]:           1 :   g_autoptr (GtkWidget) row = NULL;
+     258                 :             : 
+     259         [ +  - ]:           1 :   if (g_hash_table_steal_extended (self->pages, info, NULL, (void **)&page))
+     260                 :           1 :     adw_preferences_dialog_remove (ADW_PREFERENCES_DIALOG (self), page);
+     261                 :             : 
+     262         [ +  - ]:           1 :   if (g_hash_table_steal_extended (self->rows, info, NULL, (void **)&row))
+     263                 :           1 :     gtk_list_box_remove (self->plugin_list, row);
+     264                 :           1 : }
+     265                 :             : 
+     266                 :             : /*
+     267                 :             :  * GActions
+     268                 :             :  */
+     269                 :             : static void
+     270                 :           1 : page_action (GtkWidget  *widget,
+     271                 :             :              const char *action_name,
+     272                 :             :              GVariant   *parameter)
+     273                 :             : {
+     274                 :           1 :   AdwPreferencesDialog *window = ADW_PREFERENCES_DIALOG (widget);
+     275                 :           1 :   const char *module;
+     276                 :             : 
+     277                 :           1 :   module = g_variant_get_string (parameter, NULL);
+     278                 :           1 :   adw_preferences_dialog_set_visible_page_name (window, module);
+     279                 :           1 : }
+     280                 :             : 
+     281                 :             : /*
+     282                 :             :  * GObject
+     283                 :             :  */
+     284                 :             : static void
+     285                 :           4 : valent_preferences_dialog_constructed (GObject *object)
+     286                 :             : {
+     287                 :           4 :   ValentPreferencesDialog *self = VALENT_PREFERENCES_DIALOG (object);
+     288                 :           8 :   g_autofree char *name = NULL;
+     289                 :           4 :   PeasEngine *engine = valent_get_plugin_engine ();
+     290                 :           4 :   unsigned int n_plugins = 0;
+     291                 :             : 
+     292                 :             :   /* Application Settings */
+     293                 :           4 :   self->settings = g_settings_new ("ca.andyholmes.Valent");
+     294                 :           4 :   g_signal_connect_object (self->settings,
+     295                 :             :                            "changed::name",
+     296                 :             :                            G_CALLBACK (on_settings_changed),
+     297                 :             :                            self, 0);
+     298                 :           4 :   name = g_settings_get_string (self->settings, "name");
+     299                 :           4 :   gtk_editable_set_text (GTK_EDITABLE (self->name_entry), name);
+     300                 :             : 
+     301                 :             :   /* Application Plugins */
+     302                 :           4 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (engine));
+     303                 :             : 
+     304         [ +  + ]:          20 :   for (unsigned int i = 0; i < n_plugins; i++)
+     305                 :             :     {
+     306                 :          16 :       g_autoptr (PeasPluginInfo) info = NULL;
+     307                 :             : 
+     308                 :          16 :       info = g_list_model_get_item (G_LIST_MODEL (engine), i);
+     309                 :             : 
+     310         [ +  - ]:          16 :       if (peas_plugin_info_is_loaded (info))
+     311                 :          16 :         on_load_plugin (engine, info, self);
+     312                 :             :     }
+     313                 :             : 
+     314                 :           4 :   g_signal_connect_object (engine,
+     315                 :             :                            "load-plugin",
+     316                 :             :                            G_CALLBACK (on_load_plugin),
+     317                 :             :                            self,
+     318                 :             :                            G_CONNECT_AFTER);
+     319                 :             : 
+     320                 :           4 :   g_signal_connect_object (engine,
+     321                 :             :                            "unload-plugin",
+     322                 :             :                            G_CALLBACK (on_unload_plugin),
+     323                 :             :                            self,
+     324                 :             :                            0);
+     325                 :             : 
+     326                 :           4 :   G_OBJECT_CLASS (valent_preferences_dialog_parent_class)->constructed (object);
+     327                 :           4 : }
+     328                 :             : 
+     329                 :             : static void
+     330                 :           4 : valent_preferences_dialog_dispose (GObject *object)
+     331                 :             : {
+     332                 :           4 :   ValentPreferencesDialog *self = VALENT_PREFERENCES_DIALOG (object);
+     333                 :             : 
+     334                 :           4 :   g_signal_handlers_disconnect_by_data (valent_get_plugin_engine (), self);
+     335         [ +  - ]:           4 :   g_clear_object (&self->settings);
+     336                 :             : 
+     337                 :           4 :   gtk_widget_dispose_template (GTK_WIDGET (object),
+     338                 :             :                                VALENT_TYPE_PREFERENCES_DIALOG);
+     339                 :             : 
+     340                 :           4 :   G_OBJECT_CLASS (valent_preferences_dialog_parent_class)->dispose (object);
+     341                 :           4 : }
+     342                 :             : 
+     343                 :             : static void
+     344                 :           4 : valent_preferences_dialog_finalize (GObject *object)
+     345                 :             : {
+     346                 :           4 :   ValentPreferencesDialog *self = VALENT_PREFERENCES_DIALOG (object);
+     347                 :             : 
+     348         [ +  - ]:           4 :   g_clear_pointer (&self->pages, g_hash_table_unref);
+     349         [ +  - ]:           4 :   g_clear_pointer (&self->rows, g_hash_table_unref);
+     350                 :             : 
+     351                 :           4 :   G_OBJECT_CLASS (valent_preferences_dialog_parent_class)->finalize (object);
+     352                 :           4 : }
+     353                 :             : 
+     354                 :             : static void
+     355                 :           2 : valent_preferences_dialog_class_init (ValentPreferencesDialogClass *klass)
+     356                 :             : {
+     357                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     358                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     359                 :             : 
+     360                 :           2 :   object_class->constructed = valent_preferences_dialog_constructed;
+     361                 :           2 :   object_class->dispose = valent_preferences_dialog_dispose;
+     362                 :           2 :   object_class->finalize = valent_preferences_dialog_finalize;
+     363                 :             : 
+     364                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-preferences-dialog.ui");
+     365                 :             : 
+     366                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentPreferencesDialog, general_group);
+     367                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentPreferencesDialog, main_page);
+     368                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentPreferencesDialog, plugin_group);
+     369                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentPreferencesDialog, plugin_list);
+     370                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentPreferencesDialog, name_entry);
+     371                 :             : 
+     372                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_name_apply);
+     373                 :             : 
+     374                 :           2 :   gtk_widget_class_install_action (widget_class, "win.page", "s", page_action);
+     375                 :             : 
+     376                 :             :   /* ... */
+     377                 :           4 :   extensions[EXTEN_APPLICATION_PLUGIN] =
+     378                 :             :     (ExtensionDescription){
+     379                 :           2 :       VALENT_TYPE_APPLICATION_PLUGIN,
+     380                 :             :       N_("Application"),
+     381                 :             :       "application",
+     382                 :             :     };
+     383                 :             : 
+     384                 :           4 :   extensions[EXTEN_CHANNEL_SERVICE] =
+     385                 :             :     (ExtensionDescription){
+     386                 :           2 :       VALENT_TYPE_CHANNEL_SERVICE,
+     387                 :             :       N_("Device Connections"),
+     388                 :             :       "network",
+     389                 :             :     };
+     390                 :             : 
+     391                 :           4 :   extensions[EXTEN_CLIPBOARD_ADAPTER] =
+     392                 :             :     (ExtensionDescription){
+     393                 :           2 :       VALENT_TYPE_CLIPBOARD_ADAPTER,
+     394                 :             :       N_("Clipboard"),
+     395                 :             :       "clipboard",
+     396                 :             :     };
+     397                 :             : 
+     398                 :           4 :   extensions[EXTEN_CONTACTS_ADAPTER] =
+     399                 :             :     (ExtensionDescription){
+     400                 :           2 :       VALENT_TYPE_CONTACTS_ADAPTER,
+     401                 :             :       N_("Contacts"),
+     402                 :             :       "contacts",
+     403                 :             :     };
+     404                 :             : 
+     405                 :           4 :   extensions[EXTEN_INPUT_ADAPTER] =
+     406                 :             :     (ExtensionDescription){
+     407                 :           2 :       VALENT_TYPE_INPUT_ADAPTER,
+     408                 :             :       N_("Mouse and Keyboard"),
+     409                 :             :       "input",
+     410                 :             :     };
+     411                 :             : 
+     412                 :           4 :   extensions[EXTEN_MEDIA_ADAPTER] =
+     413                 :             :     (ExtensionDescription){
+     414                 :           2 :       VALENT_TYPE_MEDIA_ADAPTER,
+     415                 :             :       N_("Media Players"),
+     416                 :             :       "media",
+     417                 :             :     };
+     418                 :             : 
+     419                 :           4 :   extensions[EXTEN_MIXER_ADAPTER] =
+     420                 :             :     (ExtensionDescription){
+     421                 :           2 :       VALENT_TYPE_MIXER_ADAPTER,
+     422                 :             :       N_("Volume Control"),
+     423                 :             :       "mixer",
+     424                 :             :     };
+     425                 :             : 
+     426                 :           4 :   extensions[EXTEN_NOTIFICATION_ADAPTER] =
+     427                 :             :     (ExtensionDescription){
+     428                 :           2 :       VALENT_TYPE_NOTIFICATIONS_ADAPTER,
+     429                 :             :       N_("Notifications"),
+     430                 :             :       "notifications",
+     431                 :             :     };
+     432                 :             : 
+     433                 :           4 :   extensions[EXTEN_SESSION_ADAPTER] =
+     434                 :             :     (ExtensionDescription){
+     435                 :           2 :       VALENT_TYPE_SESSION_ADAPTER,
+     436                 :             :       N_("Session Manager"),
+     437                 :             :       "session",
+     438                 :             :     };
+     439                 :           2 : }
+     440                 :             : 
+     441                 :             : static void
+     442                 :           4 : valent_preferences_dialog_init (ValentPreferencesDialog *self)
+     443                 :             : {
+     444                 :           4 :   gtk_widget_init_template (GTK_WIDGET (self));
+     445                 :             : 
+     446                 :           4 :   gtk_list_box_set_sort_func (self->plugin_list, plugin_list_sort, NULL, NULL);
+     447                 :             : 
+     448                 :           4 :   self->pages = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
+     449                 :           4 :   self->rows = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
+     450                 :           4 : }
+     451                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-dialog.h.func-c.html b/coverage/src/libvalent/ui/valent-preferences-dialog.h.func-c.html new file mode 100644 index 00000000000..10a5d502278 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-dialog.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PREFERENCES_DIALOG17
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-dialog.h.func.html b/coverage/src/libvalent/ui/valent-preferences-dialog.h.func.html new file mode 100644 index 00000000000..afbc861bf86 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-dialog.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PREFERENCES_DIALOG17
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-dialog.h.gcov.html b/coverage/src/libvalent/ui/valent-preferences-dialog.h.gcov.html new file mode 100644 index 00000000000..bf6d9aa3d99 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-dialog.h.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-dialog.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : #include "../core/valent-object.h"
+       9                 :             : 
+      10                 :             : G_BEGIN_DECLS
+      11                 :             : 
+      12                 :             : #define VALENT_TYPE_PREFERENCES_DIALOG (valent_preferences_dialog_get_type())
+      13                 :             : 
+      14   [ +  -  +  -  :          17 : G_DECLARE_FINAL_TYPE (ValentPreferencesDialog, valent_preferences_dialog, VALENT, PREFERENCES_DIALOG, AdwPreferencesDialog)
+                   -  + ]
+      15                 :             : 
+      16                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-page.c.func-c.html b/coverage/src/libvalent/ui/valent-preferences-page.c.func-c.html new file mode 100644 index 00000000000..67240a78813 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-page.c.func-c.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-page.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-page.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.5 %3834
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %106
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_preferences_page_get_property1
valent_preferences_page_finalize6
valent_preferences_page_init6
valent_preferences_page_set_property6
valent_preferences_page_class_init66
valent_preferences_page_get_type326
valent_preferences_page_class_intern_init66
valent_preferences_page_get_type_once75
valent_preferences_page_get_type185
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-page.c.func.html b/coverage/src/libvalent/ui/valent-preferences-page.c.func.html new file mode 100644 index 00000000000..11bd26045e5 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-page.c.func.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-page.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-page.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.5 %3834
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %106
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_preferences_page_class_init66
valent_preferences_page_finalize6
valent_preferences_page_get_property1
valent_preferences_page_get_type326
valent_preferences_page_class_intern_init66
valent_preferences_page_get_type185
valent_preferences_page_get_type_once75
valent_preferences_page_init6
valent_preferences_page_set_property6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-preferences-page.c.gcov.html b/coverage/src/libvalent/ui/valent-preferences-page.c.gcov.html new file mode 100644 index 00000000000..03a3d46c8c1 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-preferences-page.c.gcov.html @@ -0,0 +1,232 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-preferences-page.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-preferences-page.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.5 %3834
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %106
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-preferences-page"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <libvalent-core.h>
+      10                 :             : 
+      11                 :             : #include "valent-preferences-page.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentPreferencesPage:
+      16                 :             :  *
+      17                 :             :  * An abstract base class for plugin preferences.
+      18                 :             :  *
+      19                 :             :  * `ValentPreferencesPage` is a base class for plugins that want to provide a
+      20                 :             :  * preferences page. Unlike [class@Valent.DevicePreferencesGroup] the page should
+      21                 :             :  * configure all of the plugin's extension implementations, with the exception
+      22                 :             :  * of [class@Valent.DevicePlugin].
+      23                 :             :  *
+      24                 :             :  * Implementations of [class@Valent.DevicePlugin] should instead implement
+      25                 :             :  * [class@Valent.DevicePreferencesGroup], which will allow plugins to store
+      26                 :             :  * per-devices settings.
+      27                 :             :  *
+      28                 :             :  * Since: 1.0
+      29                 :             :  */
+      30                 :             : 
+      31                 :             : typedef struct
+      32                 :             : {
+      33                 :             :   PeasPluginInfo *plugin_info;
+      34                 :             : } ValentPreferencesPagePrivate;
+      35                 :             : 
+      36   [ +  +  +  - ]:         339 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentPreferencesPage, valent_preferences_page, ADW_TYPE_PREFERENCES_PAGE)
+      37                 :             : 
+      38                 :             : enum {
+      39                 :             :   PROP_0,
+      40                 :             :   PROP_PLUGIN_INFO,
+      41                 :             :   N_PROPERTIES
+      42                 :             : };
+      43                 :             : 
+      44                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      45                 :             : 
+      46                 :             : /**
+      47                 :             :  * ValentPreferencesPageClass:
+      48                 :             :  *
+      49                 :             :  * The virtual function table for `ValentPreferencesPage`.
+      50                 :             :  *
+      51                 :             :  * Since: 1.0
+      52                 :             :  */
+      53                 :             : 
+      54                 :             : 
+      55                 :             : /*
+      56                 :             :  * GObject
+      57                 :             :  */
+      58                 :             : static void
+      59                 :           6 : valent_preferences_page_finalize (GObject *object)
+      60                 :             : {
+      61                 :           6 :   ValentPreferencesPage *self = VALENT_PREFERENCES_PAGE (object);
+      62                 :           6 :   ValentPreferencesPagePrivate *priv = valent_preferences_page_get_instance_private (self);
+      63                 :             : 
+      64         [ +  - ]:           6 :   g_clear_object (&priv->plugin_info);
+      65                 :             : 
+      66                 :           6 :   G_OBJECT_CLASS (valent_preferences_page_parent_class)->finalize (object);
+      67                 :           6 : }
+      68                 :             : 
+      69                 :             : static void
+      70                 :           1 : valent_preferences_page_get_property (GObject    *object,
+      71                 :             :                                       guint       prop_id,
+      72                 :             :                                       GValue     *value,
+      73                 :             :                                       GParamSpec *pspec)
+      74                 :             : {
+      75                 :           1 :   ValentPreferencesPage *self = VALENT_PREFERENCES_PAGE (object);
+      76                 :           1 :   ValentPreferencesPagePrivate *priv = valent_preferences_page_get_instance_private (self);
+      77                 :             : 
+      78         [ +  - ]:           1 :   switch (prop_id)
+      79                 :             :     {
+      80                 :           1 :     case PROP_PLUGIN_INFO:
+      81                 :           1 :       g_value_set_object (value, priv->plugin_info);
+      82                 :           1 :       break;
+      83                 :             : 
+      84                 :           0 :     default:
+      85                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      86                 :             :     }
+      87                 :           1 : }
+      88                 :             : 
+      89                 :             : static void
+      90                 :           6 : valent_preferences_page_set_property (GObject      *object,
+      91                 :             :                                       guint         prop_id,
+      92                 :             :                                       const GValue *value,
+      93                 :             :                                       GParamSpec   *pspec)
+      94                 :             : {
+      95                 :           6 :   ValentPreferencesPage *self = VALENT_PREFERENCES_PAGE (object);
+      96                 :           6 :   ValentPreferencesPagePrivate *priv = valent_preferences_page_get_instance_private (self);
+      97                 :             : 
+      98         [ +  - ]:           6 :   switch (prop_id)
+      99                 :             :     {
+     100                 :           6 :     case PROP_PLUGIN_INFO:
+     101                 :           6 :       priv->plugin_info = g_value_dup_object (value);
+     102                 :           6 :       break;
+     103                 :             : 
+     104                 :           0 :     default:
+     105                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     106                 :             :     }
+     107                 :           6 : }
+     108                 :             : 
+     109                 :             : static void
+     110                 :          66 : valent_preferences_page_class_init (ValentPreferencesPageClass *klass)
+     111                 :             : {
+     112                 :          66 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     113                 :             : 
+     114                 :          66 :   object_class->finalize = valent_preferences_page_finalize;
+     115                 :          66 :   object_class->get_property = valent_preferences_page_get_property;
+     116                 :          66 :   object_class->set_property = valent_preferences_page_set_property;
+     117                 :             : 
+     118                 :             :   /**
+     119                 :             :    * ValentPreferencesPage:plugin-info:
+     120                 :             :    *
+     121                 :             :    * The [class@Peas.PluginInfo] describing the plugin this page configures.
+     122                 :             :    *
+     123                 :             :    * Since: 1.0
+     124                 :             :    */
+     125                 :         132 :   properties [PROP_PLUGIN_INFO] =
+     126                 :          66 :     g_param_spec_object ("plugin-info", NULL, NULL,
+     127                 :             :                          PEAS_TYPE_PLUGIN_INFO,
+     128                 :             :                          (G_PARAM_READWRITE |
+     129                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     130                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     131                 :             :                           G_PARAM_STATIC_STRINGS));
+     132                 :             : 
+     133                 :          66 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     134                 :          66 : }
+     135                 :             : 
+     136                 :             : static void
+     137                 :           6 : valent_preferences_page_init (ValentPreferencesPage *self)
+     138                 :             : {
+     139                 :           6 : }
+     140                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-time-helpers.c.func-c.html b/coverage/src/libvalent/ui/valent-time-helpers.c.func-c.html new file mode 100644 index 00000000000..bb8cea197cc --- /dev/null +++ b/coverage/src/libvalent/ui/valent-time-helpers.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-time-helpers.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-time-helpers.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:60.0 %3521
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:37.5 %249
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_media_time_to_string33
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-time-helpers.c.func.html b/coverage/src/libvalent/ui/valent-time-helpers.c.func.html new file mode 100644 index 00000000000..d6f24ca3787 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-time-helpers.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-time-helpers.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-time-helpers.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:60.0 %3521
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:37.5 %249
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_media_time_to_string33
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-time-helpers.c.gcov.html b/coverage/src/libvalent/ui/valent-time-helpers.c.gcov.html new file mode 100644 index 00000000000..3a95f25188c --- /dev/null +++ b/coverage/src/libvalent/ui/valent-time-helpers.c.gcov.html @@ -0,0 +1,246 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-time-helpers.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-time-helpers.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:60.0 %3521
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:37.5 %249
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : /* SPDX-License-Identifier: GPL-2.0-or-later
+       2                 :             :  * SPDX-FileCopyrightText: 2002-2012 Bastien Nocera <hadess@hadess.net>
+       3                 :             :  * SPDX-FileContributor: 2005 Christian Schaller
+       4                 :             :  *
+       5                 :             :  * Copyright © 2002-2012 Bastien Nocera <hadess@hadess.net>
+       6                 :             :  *
+       7                 :             :  * This program is free software; you can redistribute it and/or modify
+       8                 :             :  * it under the terms of the GNU General Public License as published by
+       9                 :             :  * the Free Software Foundation; either version 2 of the License, or
+      10                 :             :  * (at your option) any later version.
+      11                 :             :  *
+      12                 :             :  * This program is distributed in the hope that it will be useful,
+      13                 :             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+      14                 :             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+      15                 :             :  * GNU General Public License for more details.
+      16                 :             :  *
+      17                 :             :  * You should have received a copy of the GNU General Public License
+      18                 :             :  * along with this program; if not, write to the Free Software
+      19                 :             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+      20                 :             :  *
+      21                 :             :  * The Totem project hereby grant permission for non-gpl compatible GStreamer
+      22                 :             :  * plugins to be used and distributed together with GStreamer and Totem. This
+      23                 :             :  * permission is above and beyond the permissions granted by the GPL license
+      24                 :             :  * Totem is covered by.
+      25                 :             :  *
+      26                 :             :  * Monday 7th February 2005: Christian Schaller: Add exception clause.
+      27                 :             :  * See license_change file for details.
+      28                 :             :  *
+      29                 :             :  */
+      30                 :             : 
+      31                 :             : #include <math.h>
+      32                 :             : #include <glib/gi18n.h>
+      33                 :             : #include <libintl.h>
+      34                 :             : 
+      35                 :             : #include "valent-ui-utils-private.h"
+      36                 :             : 
+      37                 :             : 
+      38                 :             : /* FIXME: Remove
+      39                 :             :  * See https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/26 */
+      40                 :             : char *
+      41                 :          33 : valent_media_time_to_string (int64_t       msecs,
+      42                 :             :                              TotemTimeFlag flags)
+      43                 :             : {
+      44                 :          33 :   int64_t _time;
+      45                 :          33 :   int msec, sec, min, hour;
+      46                 :             : 
+      47         [ +  + ]:          33 :   if (msecs < 0) {
+      48                 :             :     /* translators: Unknown time */
+      49         [ -  + ]:          10 :     return g_strdup (_("--:--"));
+      50                 :             :   }
+      51                 :             : 
+      52                 :             :   /* When calculating the remaining time,
+      53                 :             :    * we want to make sure that:
+      54                 :             :    * current time + time remaining = total run time */
+      55                 :          28 :   msec = msecs % 1000;
+      56         [ -  + ]:          28 :   if (flags & TOTEM_TIME_FLAG_MSECS) {
+      57                 :           0 :     _time = msecs - msec;
+      58                 :           0 :     _time = _time / 1000;
+      59                 :             :   } else {
+      60                 :          28 :     double time_f;
+      61                 :             : 
+      62                 :          28 :     time_f = (double) msecs / 1000;
+      63         [ -  + ]:          28 :     if (flags & TOTEM_TIME_FLAG_REMAINING)
+      64                 :           0 :       time_f = ceil (time_f);
+      65                 :             :     else
+      66                 :          28 :       time_f = round (time_f);
+      67                 :          28 :     _time = (int64_t) time_f;
+      68                 :             :   }
+      69                 :             : 
+      70                 :          28 :   sec = _time % 60;
+      71                 :          28 :   _time = _time - sec;
+      72                 :          28 :   min = (_time % (60*60)) / 60;
+      73                 :          28 :   _time = _time - (min * 60);
+      74                 :          28 :   hour = _time / (60*60);
+      75                 :             : 
+      76   [ +  -  -  + ]:          28 :   if (hour > 0 || flags & TOTEM_TIME_FLAG_FORCE_HOUR) {
+      77         [ #  # ]:           0 :     if (!(flags & TOTEM_TIME_FLAG_REMAINING)) {
+      78         [ #  # ]:           0 :       if (!(flags & TOTEM_TIME_FLAG_MSECS)) {
+      79                 :             :         /* hour:minutes:seconds */
+      80                 :             :         /* Translators: This is a time format, like "9:05:02" for 9
+      81                 :             :          * hours, 5 minutes, and 2 seconds. You may change ":" to
+      82                 :             :          * the separator that your locale uses or use "%Id" instead
+      83                 :             :          * of "%d" if your locale uses localized digits.
+      84                 :             :          */
+      85                 :           0 :         return g_strdup_printf (C_("long time format", "%d:%02d:%02d"), hour, min, sec);
+      86                 :             :       } else {
+      87                 :             :         /* hour:minutes:seconds.msecs */
+      88                 :             :         /* Translators: This is a time format, like "9:05:02.050" for 9
+      89                 :             :          * hours, 5 minutes, 2 seconds and 50 milliseconds. You may change ":" to
+      90                 :             :          * the separator that your locale uses or use "%Id" instead
+      91                 :             :          * of "%d" if your locale uses localized digits.
+      92                 :             :          */
+      93                 :           0 :         return g_strdup_printf (C_("long time format", "%d:%02d:%02d.%03d"), hour, min, sec, msec);
+      94                 :             :       }
+      95                 :             :     } else {
+      96         [ #  # ]:           0 :       if (!(flags & TOTEM_TIME_FLAG_MSECS)) {
+      97                 :             :         /* -hour:minutes:seconds */
+      98                 :             :         /* Translators: This is a time format, like "-9:05:02" for 9
+      99                 :             :          * hours, 5 minutes, and 2 seconds playback remaining. You may
+     100                 :             :          * change ":" to the separator that your locale uses or use
+     101                 :             :          * "%Id" instead of "%d" if your locale uses localized digits.
+     102                 :             :          */
+     103                 :           0 :         return g_strdup_printf (C_("long time format", "-%d:%02d:%02d"), hour, min, sec);
+     104                 :             :       } else {
+     105                 :             :         /* -hour:minutes:seconds.msecs */
+     106                 :             :         /* Translators: This is a time format, like "-9:05:02.050" for 9
+     107                 :             :          * hours, 5 minutes, 2 seconds and 50 milliseconds playback remaining. You may
+     108                 :             :          * change ":" to the separator that your locale uses or use
+     109                 :             :          * "%Id" instead of "%d" if your locale uses localized digits.
+     110                 :             :          */
+     111                 :           0 :         return g_strdup_printf (C_("long time format", "-%d:%02d:%02d.%03d"), hour, min, sec, msec);
+     112                 :             :       }
+     113                 :             :     }
+     114                 :             :   }
+     115                 :             : 
+     116         [ -  + ]:          28 :   if (flags & TOTEM_TIME_FLAG_REMAINING) {
+     117         [ #  # ]:           0 :     if (!(flags & TOTEM_TIME_FLAG_MSECS)) {
+     118                 :             :       /* -minutes:seconds */
+     119                 :             :       /* Translators: This is a time format, like "-5:02" for 5
+     120                 :             :        * minutes and 2 seconds playback remaining. You may change
+     121                 :             :        * ":" to the separator that your locale uses or use "%Id"
+     122                 :             :        * instead of "%d" if your locale uses localized digits.
+     123                 :             :        */
+     124                 :           0 :       return g_strdup_printf (C_("short time format", "-%d:%02d"), min, sec);
+     125                 :             :     } else {
+     126                 :             :       /* -minutes:seconds.msec */
+     127                 :             :       /* Translators: This is a time format, like "-5:02.050" for 5
+     128                 :             :        * minutes 2 seconds and 50 milliseconds playback remaining. You may change
+     129                 :             :        * ":" to the separator that your locale uses or use "%Id"
+     130                 :             :        * instead of "%d" if your locale uses localized digits.
+     131                 :             :        */
+     132                 :           0 :       return g_strdup_printf (C_("short time format", "-%d:%02d.%03d"), min, sec, msec);
+     133                 :             :     }
+     134                 :             :   }
+     135                 :             : 
+     136         [ -  + ]:          28 :   if (flags & TOTEM_TIME_FLAG_MSECS) {
+     137                 :             :     /* minutes:seconds.msec */
+     138                 :             :     /* Translators: This is a time format, like "5:02" for 5
+     139                 :             :      * minutes 2 seconds and 50 milliseconds. You may change ":" to the
+     140                 :             :      * separator that your locale uses or use "%Id" instead of
+     141                 :             :      * "%d" if your locale uses localized digits.
+     142                 :             :      */
+     143                 :           0 :     return g_strdup_printf (C_("short time format", "%d:%02d.%03d"), min, sec, msec);
+     144                 :             :   }
+     145                 :             : 
+     146                 :             :   /* minutes:seconds */
+     147                 :             :   /* Translators: This is a time format, like "5:02" for 5
+     148                 :             :    * minutes and 2 seconds. You may change ":" to the
+     149                 :             :    * separator that your locale uses or use "%Id" instead of
+     150                 :             :    * "%d" if your locale uses localized digits.
+     151                 :             :    */
+     152                 :          28 :   return g_strdup_printf (C_("short time format", "%d:%02d"), min, sec);
+     153                 :             : }
+     154                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-main.c.func-c.html b/coverage/src/libvalent/ui/valent-ui-main.c.func-c.html new file mode 100644 index 00000000000..e598fc9eaa3 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-main.c.func-c.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-main.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-main.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3131
Test Date:2024-03-31 18:46:36Functions:100.0 %33
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_ui_init35
valent_ui_init_resources35
valent_ui_init_types35
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-main.c.func.html b/coverage/src/libvalent/ui/valent-ui-main.c.func.html new file mode 100644 index 00000000000..7e5307666ab --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-main.c.func.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-main.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-main.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3131
Test Date:2024-03-31 18:46:36Functions:100.0 %33
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_ui_init35
valent_ui_init_resources35
valent_ui_init_types35
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-main.c.gcov.html b/coverage/src/libvalent/ui/valent-ui-main.c.gcov.html new file mode 100644 index 00000000000..67c200a109c --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-main.c.gcov.html @@ -0,0 +1,177 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-main.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-main.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3131
Test Date:2024-03-31 18:46:36Functions:100.0 %33
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %84
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-ui-main"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : 
+      11                 :             : #include "valent-device-gadget.h"
+      12                 :             : #include "valent-device-page.h"
+      13                 :             : #include "valent-device-preferences-group.h"
+      14                 :             : #include "valent-device-preferences-dialog.h"
+      15                 :             : #include "valent-input-remote.h"
+      16                 :             : #include "valent-media-remote.h"
+      17                 :             : #include "valent-menu-list.h"
+      18                 :             : #include "valent-menu-stack.h"
+      19                 :             : #include "valent-preferences-page.h"
+      20                 :             : #include "valent-preferences-dialog.h"
+      21                 :             : #include "valent-ui-manager.h"
+      22                 :             : #include "valent-ui-utils.h"
+      23                 :             : #include "valent-window.h"
+      24                 :             : 
+      25                 :             : 
+      26                 :             : static void
+      27                 :          35 : valent_ui_init_resources (void)
+      28                 :             : {
+      29                 :          70 :   g_autoptr (GtkCssProvider) css_theme = NULL;
+      30         [ +  - ]:          35 :   g_autoptr (GtkIconTheme) icon_theme = NULL;
+      31                 :             : 
+      32                 :          35 :   css_theme = gtk_css_provider_new ();
+      33                 :          35 :   gtk_css_provider_load_from_resource (css_theme, "/ca/andyholmes/Valent/ui/style.css");
+      34                 :          35 :   gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+      35                 :             :                                               GTK_STYLE_PROVIDER (css_theme),
+      36                 :             :                                               GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+      37                 :             : 
+      38                 :          35 :   icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
+      39         [ +  - ]:          35 :   gtk_icon_theme_add_resource_path (icon_theme, "/ca/andyholmes/Valent/icons");
+      40                 :          35 : }
+      41                 :             : 
+      42                 :             : static void
+      43                 :          35 : valent_ui_init_types (void)
+      44                 :             : {
+      45                 :          35 :   g_type_ensure (VALENT_TYPE_DEVICE_GADGET);
+      46                 :          35 :   g_type_ensure (VALENT_TYPE_DEVICE_PAGE);
+      47                 :          35 :   g_type_ensure (VALENT_TYPE_DEVICE_PREFERENCES_GROUP);
+      48                 :          35 :   g_type_ensure (VALENT_TYPE_DEVICE_PREFERENCES_DIALOG);
+      49                 :          35 :   g_type_ensure (VALENT_TYPE_INPUT_REMOTE);
+      50                 :          35 :   g_type_ensure (VALENT_TYPE_MEDIA_REMOTE);
+      51                 :          35 :   g_type_ensure (VALENT_TYPE_MENU_LIST);
+      52                 :          35 :   g_type_ensure (VALENT_TYPE_MENU_STACK);
+      53                 :          35 :   g_type_ensure (VALENT_TYPE_PREFERENCES_PAGE);
+      54                 :          35 :   g_type_ensure (VALENT_TYPE_PREFERENCES_DIALOG);
+      55                 :          35 :   g_type_ensure (VALENT_TYPE_UI_MANAGER);
+      56                 :          35 :   g_type_ensure (VALENT_TYPE_WINDOW);
+      57                 :          35 : }
+      58                 :             : 
+      59                 :             : /**
+      60                 :             :  * valent_ui_init:
+      61                 :             :  *
+      62                 :             :  * Initialize Valent's default user interface.
+      63                 :             :  *
+      64                 :             :  * Returns: %TRUE if successful, or %FALSE on failure
+      65                 :             :  *
+      66                 :             :  * Since: 1.0
+      67                 :             :  */
+      68                 :             : gboolean
+      69                 :          35 : valent_ui_init (void)
+      70                 :             : {
+      71                 :          35 :   static gboolean initialized = -1;
+      72                 :             : 
+      73         [ +  - ]:          35 :   if G_LIKELY (initialized != -1)
+      74                 :             :     return initialized;
+      75                 :             : 
+      76         [ +  - ]:          35 :   if ((initialized = gtk_init_check ()))
+      77                 :             :     {
+      78                 :          35 :       adw_init ();
+      79                 :             : 
+      80                 :          35 :       valent_ui_init_types ();
+      81                 :          35 :       valent_ui_init_resources ();
+      82                 :             :     }
+      83                 :             : 
+      84                 :          35 :   return initialized;
+      85                 :             : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-manager.c.func-c.html b/coverage/src/libvalent/ui/valent-ui-manager.c.func-c.html new file mode 100644 index 00000000000..71bf0306067 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-manager.c.func-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-manager.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-manager.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:9.7 %626
Test Date:2024-03-31 18:46:36Functions:30.0 %103
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:10.7 %283
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
input_remote_action0
main_window_action0
media_remote_action0
valent_ui_manager_activate0
valent_ui_manager_init0
valent_ui_manager_shutdown0
valent_ui_manager_startup0
valent_ui_manager_get_type131
valent_ui_manager_class_intern_init29
valent_ui_manager_get_type_once38
valent_ui_manager_get_type64
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-manager.c.func.html b/coverage/src/libvalent/ui/valent-ui-manager.c.func.html new file mode 100644 index 00000000000..96026d6ae6e --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-manager.c.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-manager.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-manager.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:9.7 %626
Test Date:2024-03-31 18:46:36Functions:30.0 %103
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:10.7 %283
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
input_remote_action0
main_window_action0
media_remote_action0
valent_ui_manager_activate0
valent_ui_manager_get_type131
valent_ui_manager_class_intern_init29
valent_ui_manager_get_type64
valent_ui_manager_get_type_once38
valent_ui_manager_init0
valent_ui_manager_shutdown0
valent_ui_manager_startup0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-manager.c.gcov.html b/coverage/src/libvalent/ui/valent-ui-manager.c.gcov.html new file mode 100644 index 00000000000..17ff01bc5f3 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-manager.c.gcov.html @@ -0,0 +1,277 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-manager.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-manager.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:9.7 %626
Test Date:2024-03-31 18:46:36Functions:30.0 %103
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:10.7 %283
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : #include <gtk/gtk.h>
+       8                 :             : #include <libvalent-core.h>
+       9                 :             : #include <libvalent-device.h>
+      10                 :             : #include <libvalent-input.h>
+      11                 :             : #include <libvalent-media.h>
+      12                 :             : 
+      13                 :             : #include "valent-input-remote.h"
+      14                 :             : #include "valent-media-remote.h"
+      15                 :             : #include "valent-ui-manager.h"
+      16                 :             : #include "valent-ui-utils.h"
+      17                 :             : #include "valent-window.h"
+      18                 :             : 
+      19                 :             : 
+      20                 :             : struct _ValentUIManager
+      21                 :             : {
+      22                 :             :   ValentApplicationPlugin  parent_instance;
+      23                 :             : 
+      24                 :             :   GtkWindow               *main_window;
+      25                 :             :   GtkWindow               *input_remote;
+      26                 :             :   GtkWindow               *media_remote;
+      27                 :             : };
+      28                 :             : 
+      29   [ +  +  +  - ]:         131 : G_DEFINE_FINAL_TYPE (ValentUIManager, valent_ui_manager, VALENT_TYPE_APPLICATION_PLUGIN)
+      30                 :             : 
+      31                 :             : 
+      32                 :             : /*
+      33                 :             :  * GActions
+      34                 :             :  */
+      35                 :             : static void
+      36                 :           0 : main_window_action (GSimpleAction *action,
+      37                 :             :                     GVariant      *parameter,
+      38                 :             :                     gpointer       user_data)
+      39                 :             : {
+      40                 :           0 :   ValentUIManager *self = VALENT_UI_MANAGER (user_data);
+      41                 :             : 
+      42         [ #  # ]:           0 :   g_assert (VALENT_IS_UI_MANAGER (self));
+      43                 :             : 
+      44         [ #  # ]:           0 :   if (self->main_window == NULL)
+      45                 :             :     {
+      46                 :           0 :       ValentDeviceManager *devices = valent_device_manager_get_default ();
+      47                 :           0 :       GApplication *application = valent_extension_get_object (VALENT_EXTENSION (self));
+      48                 :             : 
+      49                 :           0 :       self->main_window = g_object_new (VALENT_TYPE_WINDOW,
+      50                 :             :                                         "default-width",  600,
+      51                 :             :                                         "default-height", 480,
+      52                 :             :                                         "device-manager", devices,
+      53                 :             :                                         NULL);
+      54                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->main_window),
+      55                 :           0 :                                  (gpointer)&self->main_window);
+      56                 :             : 
+      57                 :           0 :       gtk_widget_insert_action_group (GTK_WIDGET (self->main_window),
+      58                 :             :                                       "app",
+      59                 :             :                                       G_ACTION_GROUP (application));
+      60                 :             :     }
+      61                 :             : 
+      62                 :           0 :   gtk_window_present_with_time (self->main_window, GDK_CURRENT_TIME);
+      63                 :           0 :   gtk_widget_activate_action_variant (GTK_WIDGET (self->main_window),
+      64                 :             :                                       "win.page",
+      65                 :             :                                       parameter);
+      66                 :           0 : }
+      67                 :             : 
+      68                 :             : static void
+      69                 :           0 : input_remote_action (GSimpleAction *action,
+      70                 :             :                      GVariant      *parameter,
+      71                 :             :                      gpointer       user_data)
+      72                 :             : {
+      73                 :           0 :   ValentUIManager *self = VALENT_UI_MANAGER (user_data);
+      74                 :             : 
+      75         [ #  # ]:           0 :   g_assert (VALENT_IS_UI_MANAGER (self));
+      76                 :             : 
+      77         [ #  # ]:           0 :   if (self->input_remote == NULL)
+      78                 :             :     {
+      79                 :           0 :       self->input_remote = g_object_new (VALENT_TYPE_INPUT_REMOTE,
+      80                 :             :                                          "adapters", valent_input_get_default (),
+      81                 :             :                                          NULL);
+      82                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->input_remote),
+      83                 :           0 :                                  (gpointer)&self->input_remote);
+      84                 :             :     }
+      85                 :             : 
+      86                 :           0 :   gtk_window_present_with_time (self->input_remote, GDK_CURRENT_TIME);
+      87                 :           0 : }
+      88                 :             : 
+      89                 :             : static void
+      90                 :           0 : media_remote_action (GSimpleAction *action,
+      91                 :             :                      GVariant      *parameter,
+      92                 :             :                      gpointer       user_data)
+      93                 :             : {
+      94                 :           0 :   ValentUIManager *self = VALENT_UI_MANAGER (user_data);
+      95                 :             : 
+      96         [ #  # ]:           0 :   g_assert (VALENT_IS_UI_MANAGER (self));
+      97                 :             : 
+      98         [ #  # ]:           0 :   if (self->media_remote == NULL)
+      99                 :             :     {
+     100                 :           0 :       self->media_remote = g_object_new (VALENT_TYPE_MEDIA_REMOTE,
+     101                 :             :                                          "players", valent_media_get_default (),
+     102                 :             :                                          NULL);
+     103                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->media_remote),
+     104                 :           0 :                                  (gpointer)&self->media_remote);
+     105                 :             :     }
+     106                 :             : 
+     107                 :           0 :   gtk_window_present_with_time (self->media_remote, GDK_CURRENT_TIME);
+     108                 :           0 : }
+     109                 :             : 
+     110                 :             : static const GActionEntry app_actions[] = {
+     111                 :             :   { "input-remote", input_remote_action, NULL, NULL, NULL },
+     112                 :             :   { "media-remote", media_remote_action, NULL, NULL, NULL },
+     113                 :             :   { "window",       main_window_action,  "s",  NULL, NULL },
+     114                 :             : };
+     115                 :             : 
+     116                 :             : 
+     117                 :             : /*
+     118                 :             :  * ValentApplicationPlugin
+     119                 :             :  */
+     120                 :             : static gboolean
+     121                 :           0 : valent_ui_manager_activate (ValentApplicationPlugin *plugin)
+     122                 :             : {
+     123                 :           0 :   GApplication *application = NULL;
+     124                 :             : 
+     125         [ #  # ]:           0 :   g_assert (VALENT_IS_UI_MANAGER (plugin));
+     126                 :             : 
+     127                 :           0 :   application = valent_extension_get_object (VALENT_EXTENSION (plugin));
+     128                 :           0 :   g_action_group_activate_action (G_ACTION_GROUP (application),
+     129                 :             :                                   "window",
+     130                 :             :                                   g_variant_new_string ("main"));
+     131                 :             : 
+     132                 :           0 :   return TRUE;
+     133                 :             : }
+     134                 :             : 
+     135                 :             : static void
+     136                 :           0 : valent_ui_manager_shutdown (ValentApplicationPlugin *plugin)
+     137                 :             : {
+     138                 :           0 :   ValentUIManager *self = VALENT_UI_MANAGER (plugin);
+     139                 :           0 :   GApplication *application = NULL;
+     140                 :             : 
+     141         [ #  # ]:           0 :   g_assert (VALENT_IS_UI_MANAGER (plugin));
+     142                 :             : 
+     143                 :           0 :   application = valent_extension_get_object (VALENT_EXTENSION (plugin));
+     144                 :             : 
+     145         [ #  # ]:           0 :   for (size_t i = 0; i < G_N_ELEMENTS (app_actions); i++)
+     146                 :           0 :     g_action_map_remove_action (G_ACTION_MAP (application), app_actions[i].name);
+     147                 :             : 
+     148         [ #  # ]:           0 :   g_clear_pointer (&self->media_remote, gtk_window_destroy);
+     149         [ #  # ]:           0 :   g_clear_pointer (&self->main_window, gtk_window_destroy);
+     150                 :           0 : }
+     151                 :             : 
+     152                 :             : static void
+     153                 :           0 : valent_ui_manager_startup (ValentApplicationPlugin *plugin)
+     154                 :             : {
+     155                 :           0 :   GApplication *application = NULL;
+     156                 :             : 
+     157         [ #  # ]:           0 :   g_assert (VALENT_IS_UI_MANAGER (plugin));
+     158                 :             : 
+     159                 :           0 :   application = valent_extension_get_object (VALENT_EXTENSION (plugin));
+     160                 :           0 :   g_action_map_add_action_entries (G_ACTION_MAP (application),
+     161                 :             :                                    app_actions,
+     162                 :             :                                    G_N_ELEMENTS (app_actions),
+     163                 :             :                                    plugin);
+     164                 :           0 : }
+     165                 :             : 
+     166                 :             : 
+     167                 :             : /*
+     168                 :             :  * GObject
+     169                 :             :  */
+     170                 :             : static void
+     171                 :          29 : valent_ui_manager_class_init (ValentUIManagerClass *klass)
+     172                 :             : {
+     173                 :          29 :   ValentApplicationPluginClass *plugin_class = VALENT_APPLICATION_PLUGIN_CLASS (klass);
+     174                 :             : 
+     175                 :          29 :   plugin_class->activate = valent_ui_manager_activate;
+     176                 :          29 :   plugin_class->shutdown = valent_ui_manager_shutdown;
+     177                 :          29 :   plugin_class->startup = valent_ui_manager_startup;
+     178                 :             : }
+     179                 :             : 
+     180                 :             : static void
+     181                 :           0 : valent_ui_manager_init (ValentUIManager *self)
+     182                 :             : {
+     183                 :           0 :   valent_ui_init ();
+     184                 :           0 : }
+     185                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-manager.h.func-c.html b/coverage/src/libvalent/ui/valent-ui-manager.h.func-c.html new file mode 100644 index 00000000000..7657c65dc1a --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-manager.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-manager.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-manager.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_UI_MANAGER0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-manager.h.func.html b/coverage/src/libvalent/ui/valent-ui-manager.h.func.html new file mode 100644 index 00000000000..b6febe67dfa --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-manager.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-manager.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-manager.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_UI_MANAGER0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-manager.h.gcov.html b/coverage/src/libvalent/ui/valent-ui-manager.h.gcov.html new file mode 100644 index 00000000000..60b58733605 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-manager.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-manager.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-manager.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include "../core/valent-application-plugin.h"
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_UI_MANAGER (valent_ui_manager_get_type())
+      11                 :             : 
+      12   [ #  #  #  #  :           0 : G_DECLARE_FINAL_TYPE (ValentUIManager, valent_ui_manager, VALENT, UI_MANAGER, ValentApplicationPlugin)
+                   #  # ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-utils.c.func-c.html b/coverage/src/libvalent/ui/valent-ui-utils.c.func-c.html new file mode 100644 index 00000000000..12d3f3e7e92 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-utils.c.func-c.html @@ -0,0 +1,105 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:82.1 %2823
Test Date:2024-03-31 18:46:36Functions:100.0 %22
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %1612
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_ui_replace_eval_uri4
valent_string_to_markup19
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-utils.c.func.html b/coverage/src/libvalent/ui/valent-ui-utils.c.func.html new file mode 100644 index 00000000000..8e9fdfbed09 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-utils.c.func.html @@ -0,0 +1,105 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:82.1 %2823
Test Date:2024-03-31 18:46:36Functions:100.0 %22
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %1612
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_string_to_markup19
valent_ui_replace_eval_uri4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-ui-utils.c.gcov.html b/coverage/src/libvalent/ui/valent-ui-utils.c.gcov.html new file mode 100644 index 00000000000..8a6b4da597f --- /dev/null +++ b/coverage/src/libvalent/ui/valent-ui-utils.c.gcov.html @@ -0,0 +1,205 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-ui-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-ui-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:82.1 %2823
Test Date:2024-03-31 18:46:36Functions:100.0 %22
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %1612
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-ui-utils"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gtk/gtk.h>
+       9                 :             : #include <pango/pango.h>
+      10                 :             : #include <libvalent-core.h>
+      11                 :             : 
+      12                 :             : #include "valent-ui-utils.h"
+      13                 :             : #include "valent-ui-utils-private.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : // Andy Holmes
+      17                 :             : #define EMAIL_PATTERN "\\b(?:.+@.+\\.[a-z]{2,4}\\b)"
+      18                 :             : 
+      19                 :             : // https://gist.github.com/gruber/8891611 (changed tld list to `[a-z]{2,4}`)
+      20                 :             : #define URL_PATTERN "\\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\\-]+[.](?:[a-z]{2,4})/)(?:[^\\s()<>{}\\[\\]]+|\\([^\\s()]*?\\([^\\s()]+\\)[^\\s()]*?\\)|\\([^\\s]+?\\))+(?:\\([^\\s()]*?\\([^\\s()]+\\)[^\\s()]*?\\)|\\([^\\s]+?\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\\-][a-z0-9]+)*[.](?:[a-z]{2,4})\\b/?(?!@)))"
+      21                 :             : 
+      22                 :             : #define URI_FLAGS   (G_REGEX_CASELESS | G_REGEX_MULTILINE | G_REGEX_NO_AUTO_CAPTURE | G_REGEX_OPTIMIZE)
+      23                 :             : 
+      24                 :             : static GRegex *email_regex = NULL;
+      25                 :             : static GRegex *uri_regex = NULL;
+      26                 :             : 
+      27                 :             : static gboolean
+      28                 :           4 : valent_ui_replace_eval_uri (const GMatchInfo *info,
+      29                 :             :                             GString          *result,
+      30                 :             :                             gpointer          user_data)
+      31                 :             : {
+      32                 :           8 :   g_autofree char *text = NULL;
+      33                 :           4 :   g_autofree char *escaped = NULL;
+      34                 :             : 
+      35                 :           4 :   text = g_match_info_fetch (info, 0);
+      36                 :             : 
+      37         [ +  + ]:           4 :   if (g_uri_is_valid (text, G_URI_FLAGS_NONE, NULL))
+      38                 :             :     {
+      39                 :           1 :       escaped = g_markup_printf_escaped ("<a href=\"%s\">%s</a>",
+      40                 :             :                                          text, text);
+      41                 :             :     }
+      42         [ -  + ]:           3 :   else if (g_regex_match (email_regex, text, 0, NULL))
+      43                 :             :     {
+      44                 :           0 :       escaped = g_markup_printf_escaped ("<a href=\"mailto:%s\">%s</a>",
+      45                 :             :                                          text, text);
+      46                 :             :     }
+      47                 :             :   else
+      48                 :             :     {
+      49                 :           3 :       escaped = g_markup_printf_escaped ("<a href=\"https://%s\">%s</a>",
+      50                 :             :                                          text, text);
+      51                 :             :     }
+      52                 :             : 
+      53         [ -  + ]:           4 :   g_string_append (result, escaped);
+      54                 :             : 
+      55                 :           4 :   return FALSE;
+      56                 :             : }
+      57                 :             : 
+      58                 :             : /**
+      59                 :             :  * valent_string_to_markup:
+      60                 :             :  * @text: (nullable): input text
+      61                 :             :  *
+      62                 :             :  * Add markup to text for recognized elements.
+      63                 :             :  *
+      64                 :             :  * This function currently scans for URLs and e-mail addresses, then amends each
+      65                 :             :  * element with anchor tags (`<a>`).
+      66                 :             :  *
+      67                 :             :  * If @text is %NULL, this function will return %NULL.
+      68                 :             :  *
+      69                 :             :  * Returns: (transfer full) (nullable): a string of Pango markup
+      70                 :             :  *
+      71                 :             :  * Since: 1.0
+      72                 :             :  */
+      73                 :             : char *
+      74                 :          19 : valent_string_to_markup (const char *text)
+      75                 :             : {
+      76                 :          38 :   g_autofree char *result = NULL;
+      77                 :          19 :   int text_len = 0;
+      78                 :          19 :   g_autoptr (GError) error = NULL;
+      79                 :             : 
+      80         [ +  + ]:          19 :   if G_UNLIKELY (text == NULL)
+      81                 :             :     return NULL;
+      82                 :             : 
+      83         [ +  + ]:          15 :   if G_UNLIKELY (uri_regex == NULL)
+      84                 :             :     {
+      85                 :           6 :       email_regex = g_regex_new (EMAIL_PATTERN, URI_FLAGS, 0, NULL);
+      86                 :           6 :       uri_regex = g_regex_new (URL_PATTERN"|"EMAIL_PATTERN, URI_FLAGS, 0, NULL);
+      87                 :             :     }
+      88                 :             : 
+      89                 :          15 :   text_len = strlen (text);
+      90                 :          15 :   result = g_regex_replace_eval (uri_regex,
+      91                 :             :                                  text,
+      92                 :             :                                  text_len,
+      93                 :             :                                  0,
+      94                 :             :                                  0,
+      95                 :             :                                  valent_ui_replace_eval_uri,
+      96                 :             :                                  NULL,
+      97                 :             :                                  &error);
+      98                 :             : 
+      99         [ -  + ]:          15 :   if (result == NULL)
+     100                 :             :     {
+     101                 :           0 :       g_warning ("%s: %s: %s", G_STRFUNC, error->message, text);
+     102                 :           0 :       return g_markup_escape_text (text, text_len);
+     103                 :             :     }
+     104                 :             : 
+     105   [ +  +  +  - ]:          19 :   if (!pango_parse_markup (result, -1, 0, NULL, NULL, NULL, &error) &&
+     106                 :           4 :       !g_error_matches (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT))
+     107                 :             :     {
+     108                 :           0 :       g_warning ("%s: %s: %s", G_STRFUNC, error->message, result);
+     109                 :           0 :       return g_markup_escape_text (text, text_len);
+     110                 :             :     }
+     111                 :             : 
+     112                 :             :   return g_steal_pointer (&result);
+     113                 :             : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-window.c.func-c.html b/coverage/src/libvalent/ui/valent-window.c.func-c.html new file mode 100644 index 00000000000..d15b863d32f --- /dev/null +++ b/coverage/src/libvalent/ui/valent-window.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-window.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-window.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:55.5 %245136
Test Date:2024-03-31 18:46:36Functions:78.9 %1915
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:35.2 %10537
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
about_action0
on_animation_state_changed0
refresh_cb0
valent_get_debug_info0
valent_window_class_init1
valent_window_get_property1
preferences_action2
refresh_action2
valent_window_create_row_func2
page_action4
valent_window_constructed4
valent_window_dispose4
valent_window_finalize4
valent_window_init4
valent_window_set_property4
on_device_changed6
valent_window_get_type85
valent_window_class_intern_init1
valent_window_get_type_once35
valent_window_get_type49
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-window.c.func.html b/coverage/src/libvalent/ui/valent-window.c.func.html new file mode 100644 index 00000000000..6bf5db803df --- /dev/null +++ b/coverage/src/libvalent/ui/valent-window.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-window.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-window.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:55.5 %245136
Test Date:2024-03-31 18:46:36Functions:78.9 %1915
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:35.2 %10537
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
about_action0
on_animation_state_changed0
on_device_changed6
page_action4
preferences_action2
refresh_action2
refresh_cb0
valent_get_debug_info0
valent_window_class_init1
valent_window_constructed4
valent_window_create_row_func2
valent_window_dispose4
valent_window_finalize4
valent_window_get_property1
valent_window_get_type85
valent_window_class_intern_init1
valent_window_get_type49
valent_window_get_type_once35
valent_window_init4
valent_window_set_property4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-window.c.gcov.html b/coverage/src/libvalent/ui/valent-window.c.gcov.html new file mode 100644 index 00000000000..673918926a1 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-window.c.gcov.html @@ -0,0 +1,642 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-window.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-window.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:55.5 %245136
Test Date:2024-03-31 18:46:36Functions:78.9 %1915
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:35.2 %10537
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-window"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <libportal/portal.h>
+      12                 :             : #include <libvalent-core.h>
+      13                 :             : #include <libvalent-device.h>
+      14                 :             : 
+      15                 :             : #include "valent-version-vcs.h"
+      16                 :             : 
+      17                 :             : #include "valent-application-credits.h"
+      18                 :             : #include "valent-device-page.h"
+      19                 :             : #include "valent-preferences-dialog.h"
+      20                 :             : #include "valent-ui-utils-private.h"
+      21                 :             : #include "valent-window.h"
+      22                 :             : 
+      23                 :             : 
+      24                 :             : struct _ValentWindow
+      25                 :             : {
+      26                 :             :   AdwApplicationWindow  parent_instance;
+      27                 :             :   ValentDeviceManager  *manager;
+      28                 :             : 
+      29                 :             :   AdwAnimation         *scan;
+      30                 :             :   AdwAnimation         *fade;
+      31                 :             : 
+      32                 :             :   /* template */
+      33                 :             :   AdwNavigationView    *view;
+      34                 :             :   GtkProgressBar       *progress_bar;
+      35                 :             :   GtkListBox           *device_list;
+      36                 :             :   AdwDialog            *preferences;
+      37                 :             : };
+      38                 :             : 
+      39   [ +  +  +  - ]:          85 : G_DEFINE_FINAL_TYPE (ValentWindow, valent_window, ADW_TYPE_APPLICATION_WINDOW)
+      40                 :             : 
+      41                 :             : enum {
+      42                 :             :   PROP_0,
+      43                 :             :   PROP_DEVICE_MANAGER,
+      44                 :             :   N_PROPERTIES
+      45                 :             : };
+      46                 :             : 
+      47                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      48                 :             : 
+      49                 :             : 
+      50                 :             : static JsonNode *
+      51                 :           0 : valent_get_debug_info (void)
+      52                 :             : {
+      53                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+      54         [ #  # ]:           0 :   g_autofree char *os_name = NULL;
+      55                 :           0 :   const char *desktop = NULL;
+      56                 :           0 :   const char *session = NULL;
+      57                 :           0 :   const char *environment = NULL;
+      58                 :           0 :   PeasEngine *engine = NULL;
+      59                 :           0 :   unsigned int n_plugins = 0;
+      60                 :             : 
+      61                 :           0 :   os_name = g_get_os_info (G_OS_INFO_KEY_PRETTY_NAME);
+      62                 :           0 :   desktop = g_getenv ("XDG_CURRENT_DESKTOP");
+      63                 :           0 :   session = g_getenv ("XDG_SESSION_TYPE");
+      64   [ #  #  #  # ]:           0 :   environment = xdp_portal_running_under_flatpak () ? "flatpak" :
+      65                 :           0 :                   (xdp_portal_running_under_snap (NULL) ? "snap" : "host");
+      66                 :             : 
+      67                 :           0 :   builder = json_builder_new ();
+      68                 :           0 :   json_builder_begin_object (builder);
+      69                 :             : 
+      70                 :             :   /* Application */
+      71                 :           0 :   json_builder_set_member_name (builder, "application");
+      72                 :           0 :   json_builder_begin_object (builder);
+      73                 :           0 :   json_builder_set_member_name (builder, "id");
+      74                 :           0 :   json_builder_add_string_value (builder, APPLICATION_ID);
+      75                 :           0 :   json_builder_set_member_name (builder, "version");
+      76                 :           0 :   json_builder_add_string_value (builder, VALENT_VERSION);
+      77                 :           0 :   json_builder_set_member_name (builder, "commit");
+      78                 :           0 :   json_builder_add_string_value (builder, VALENT_VCS_TAG);
+      79                 :           0 :   json_builder_end_object (builder);
+      80                 :             : 
+      81                 :             :   /* Runtime */
+      82                 :           0 :   json_builder_set_member_name (builder, "runtime");
+      83                 :           0 :   json_builder_begin_object (builder);
+      84                 :           0 :   json_builder_set_member_name (builder, "os");
+      85         [ #  # ]:           0 :   json_builder_add_string_value (builder, os_name != NULL ? os_name : "unknown");
+      86                 :           0 :   json_builder_set_member_name (builder, "desktop");
+      87         [ #  # ]:           0 :   json_builder_add_string_value (builder, desktop != NULL ? desktop : "unknown");
+      88                 :           0 :   json_builder_set_member_name (builder, "session");
+      89         [ #  # ]:           0 :   json_builder_add_string_value (builder, session != NULL ? session : "unknown");
+      90                 :           0 :   json_builder_set_member_name (builder, "environment");
+      91                 :           0 :   json_builder_add_string_value (builder, environment);
+      92                 :           0 :   json_builder_end_object (builder);
+      93                 :             : 
+      94                 :             :   /* Plugins */
+      95                 :           0 :   json_builder_set_member_name (builder, "plugins");
+      96                 :           0 :   json_builder_begin_object (builder);
+      97                 :             : 
+      98                 :           0 :   engine = valent_get_plugin_engine ();
+      99                 :           0 :   n_plugins = g_list_model_get_n_items (G_LIST_MODEL (engine));
+     100                 :             : 
+     101         [ #  # ]:           0 :   for (unsigned int i = 0; i < n_plugins; i++)
+     102                 :             :     {
+     103                 :           0 :       g_autoptr (PeasPluginInfo) info = NULL;
+     104                 :           0 :       const char *name = NULL;
+     105                 :           0 :       gboolean loaded = FALSE;
+     106                 :             : 
+     107                 :           0 :       info = g_list_model_get_item (G_LIST_MODEL (engine), i);
+     108                 :           0 :       name = peas_plugin_info_get_module_name (info);
+     109                 :           0 :       loaded = peas_plugin_info_is_loaded (info);
+     110                 :             : 
+     111                 :           0 :       json_builder_set_member_name (builder, name);
+     112         [ #  # ]:           0 :       json_builder_add_boolean_value (builder, loaded);
+     113                 :             :     }
+     114                 :           0 :   json_builder_end_object (builder);
+     115                 :             : 
+     116                 :           0 :   json_builder_end_object (builder);
+     117                 :             : 
+     118                 :           0 :   return json_builder_get_root (builder);
+     119                 :             : }
+     120                 :             : 
+     121                 :             : /*
+     122                 :             :  * AdwAnimation Callbacks
+     123                 :             :  */
+     124                 :             : static gboolean
+     125                 :           0 : refresh_cb (gpointer data)
+     126                 :             : {
+     127         [ #  # ]:           0 :   g_assert (VALENT_IS_DEVICE_MANAGER (data));
+     128                 :             : 
+     129                 :           0 :   valent_device_manager_refresh (VALENT_DEVICE_MANAGER (data));
+     130                 :             : 
+     131                 :           0 :   return G_SOURCE_CONTINUE;
+     132                 :             : }
+     133                 :             : 
+     134                 :             : static void
+     135                 :           0 : on_animation_state_changed (AdwAnimation *animation,
+     136                 :             :                             GParamSpec   *pspec,
+     137                 :             :                             ValentWindow *self)
+     138                 :             : {
+     139                 :           0 :   AdwAnimationState state = adw_animation_get_state (animation);
+     140                 :           0 :   static unsigned int refresh_id = 0;
+     141                 :             : 
+     142         [ #  # ]:           0 :   g_clear_handle_id (&refresh_id, g_source_remove);
+     143                 :             : 
+     144      [ #  #  # ]:           0 :   switch (state)
+     145                 :             :     {
+     146                 :           0 :     case ADW_ANIMATION_PLAYING:
+     147         [ #  # ]:           0 :       if (self->scan == animation)
+     148                 :             :         {
+     149                 :           0 :           valent_device_manager_refresh (self->manager);
+     150                 :           0 :           refresh_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
+     151                 :             :                                                    2,
+     152                 :             :                                                    refresh_cb,
+     153                 :           0 :                                                    g_object_ref (self->manager),
+     154                 :             :                                                    g_object_unref);
+     155                 :           0 :           gtk_widget_action_set_enabled (GTK_WIDGET (self), "win.refresh", FALSE);
+     156                 :             :         }
+     157                 :             :       break;
+     158                 :             : 
+     159                 :           0 :     case ADW_ANIMATION_FINISHED:
+     160         [ #  # ]:           0 :       if (self->scan == animation)
+     161                 :             :         {
+     162                 :           0 :           adw_animation_play (self->fade);
+     163                 :           0 :           gtk_widget_action_set_enabled (GTK_WIDGET (self), "win.refresh", TRUE);
+     164                 :             :         }
+     165                 :             :       break;
+     166                 :             : 
+     167                 :           0 :     default:
+     168                 :           0 :       gtk_progress_bar_set_fraction (self->progress_bar, 0.0);
+     169                 :           0 :       gtk_widget_set_opacity (GTK_WIDGET (self->progress_bar), 1.0);
+     170                 :           0 :       gtk_widget_action_set_enabled (GTK_WIDGET (self), "win.refresh", TRUE);
+     171                 :           0 :       break;
+     172                 :             :     }
+     173                 :           0 : }
+     174                 :             : 
+     175                 :             : /*
+     176                 :             :  * ValentDevice Callbacks
+     177                 :             :  */
+     178                 :             : static void
+     179                 :           6 : on_device_changed (ValentDevice *device,
+     180                 :             :                    GParamSpec   *pspec,
+     181                 :             :                    GtkWidget    *status)
+     182                 :             : {
+     183                 :           6 :   ValentDeviceState state;
+     184                 :             : 
+     185         [ +  - ]:           6 :   g_assert (VALENT_IS_DEVICE (device));
+     186   [ +  -  +  -  :           6 :   g_assert (GTK_IS_LABEL (status));
+             -  +  -  - ]
+     187                 :             : 
+     188                 :           6 :   state = valent_device_get_state (device);
+     189                 :             : 
+     190         [ +  + ]:           6 :   if ((state & VALENT_DEVICE_STATE_PAIRED) == 0)
+     191                 :             :     {
+     192                 :           2 :       gtk_label_set_label (GTK_LABEL (status), _("Unpaired"));
+     193                 :           2 :       gtk_widget_remove_css_class (status, "dim-label");
+     194                 :             :     }
+     195         [ +  + ]:           4 :   else if ((state & VALENT_DEVICE_STATE_CONNECTED) == 0)
+     196                 :             :     {
+     197                 :           2 :       gtk_label_set_label (GTK_LABEL (status), _("Disconnected"));
+     198                 :           2 :       gtk_widget_add_css_class (status, "dim-label");
+     199                 :             :     }
+     200                 :             :   else
+     201                 :             :     {
+     202                 :           2 :       gtk_label_set_label (GTK_LABEL (status), _("Connected"));
+     203                 :           2 :       gtk_widget_remove_css_class (status, "dim-label");
+     204                 :             :     }
+     205                 :           6 : }
+     206                 :             : 
+     207                 :             : static GtkWidget *
+     208                 :           2 : valent_window_create_row_func (gpointer item,
+     209                 :             :                                gpointer user_data)
+     210                 :             : {
+     211                 :           2 :   ValentWindow *self = VALENT_WINDOW (user_data);
+     212                 :           2 :   ValentDevice *device = VALENT_DEVICE (item);
+     213                 :           2 :   const char *device_id;
+     214                 :           2 :   const char *icon_name;
+     215                 :           2 :   GtkWidget *row;
+     216                 :           2 :   GtkWidget *box;
+     217                 :           2 :   GtkWidget *icon;
+     218                 :           2 :   GtkWidget *status;
+     219                 :           2 :   GtkWidget *arrow;
+     220                 :             : 
+     221         [ +  - ]:           2 :   g_assert (VALENT_IS_WINDOW (self));
+     222         [ -  + ]:           2 :   g_assert (VALENT_IS_DEVICE (item));
+     223                 :             : 
+     224                 :             :   /* A device was added, so stop the refresh */
+     225         [ -  + ]:           2 :   if (self->scan != NULL)
+     226                 :           0 :     adw_animation_skip (self->scan);
+     227                 :             : 
+     228                 :           2 :   device_id = valent_device_get_id (device);
+     229                 :           2 :   icon_name = valent_device_get_icon_name (device);
+     230                 :             : 
+     231                 :             :   /* Row */
+     232                 :           2 :   row = g_object_new (ADW_TYPE_ACTION_ROW,
+     233                 :             :                       "action-name",   "win.page",
+     234                 :             :                       "action-target", g_variant_new_string (device_id),
+     235                 :             :                       "activatable",   TRUE,
+     236                 :             :                       "selectable",    FALSE,
+     237                 :             :                       NULL);
+     238                 :             : 
+     239                 :           2 :   icon = g_object_new (GTK_TYPE_IMAGE,
+     240                 :             :                        "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
+     241                 :             :                        "icon-name",       icon_name,
+     242                 :             :                        NULL);
+     243                 :           2 :   adw_action_row_add_prefix (ADW_ACTION_ROW (row), icon);
+     244                 :             : 
+     245                 :           2 :   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+     246                 :           2 :   adw_action_row_add_suffix (ADW_ACTION_ROW (row), box);
+     247                 :             : 
+     248                 :           2 :   status = g_object_new (GTK_TYPE_LABEL, NULL);
+     249                 :           2 :   gtk_box_append (GTK_BOX (box), status);
+     250                 :             : 
+     251                 :           4 :   arrow = g_object_new (GTK_TYPE_IMAGE,
+     252                 :             :                         "accessible-role", GTK_ACCESSIBLE_ROLE_PRESENTATION,
+     253                 :           2 :                         "css-classes",     VALENT_STRV_INIT ("dim-label"),
+     254                 :             :                         "icon-name",       "go-next-symbolic",
+     255                 :             :                         NULL);
+     256                 :           2 :   gtk_box_append (GTK_BOX (box), arrow);
+     257                 :             : 
+     258                 :           2 :   g_object_bind_property (device, "name",
+     259                 :             :                           row,    "title",
+     260                 :             :                           G_BINDING_SYNC_CREATE);
+     261                 :             : 
+     262                 :           2 :   g_signal_connect_object (device,
+     263                 :             :                            "notify::state",
+     264                 :             :                            G_CALLBACK (on_device_changed),
+     265                 :             :                            status, 0);
+     266                 :           2 :   on_device_changed (device, NULL, status);
+     267                 :             : 
+     268                 :           2 :   gtk_accessible_update_relation (GTK_ACCESSIBLE (row),
+     269                 :             :                                   GTK_ACCESSIBLE_RELATION_DESCRIBED_BY, status, NULL,
+     270                 :             :                                   -1);
+     271                 :             : 
+     272                 :           2 :   return row;
+     273                 :             : }
+     274                 :             : 
+     275                 :             : /*
+     276                 :             :  * GActions
+     277                 :             :  */
+     278                 :             : static void
+     279                 :           0 : about_action (GtkWidget  *widget,
+     280                 :             :               const char *action_name,
+     281                 :             :               GVariant   *parameter)
+     282                 :             : {
+     283                 :           0 :   GtkWindow *window = GTK_WINDOW (widget);
+     284                 :           0 :   AdwDialog *dialog = NULL;
+     285                 :           0 :   g_autoptr (JsonNode) debug_json = NULL;
+     286         [ #  # ]:           0 :   g_autofree char *debug_info = NULL;
+     287                 :             : 
+     288   [ #  #  #  #  :           0 :   g_assert (GTK_IS_WINDOW (window));
+             #  #  #  # ]
+     289                 :             : 
+     290                 :           0 :   debug_json = valent_get_debug_info ();
+     291                 :           0 :   debug_info = json_to_string (debug_json, TRUE);
+     292                 :             : 
+     293                 :           0 :   dialog = g_object_new (ADW_TYPE_ABOUT_DIALOG,
+     294                 :             :                          "application-icon",    APPLICATION_ID,
+     295                 :             :                          "application-name",    _("Valent"),
+     296                 :             :                          "copyright",           "© Andy Holmes",
+     297                 :             :                          "issue-url",           PACKAGE_BUGREPORT,
+     298                 :             :                          "license-type",        GTK_LICENSE_GPL_3_0,
+     299                 :             :                          "debug-info",          debug_info,
+     300                 :             :                          "debug-info-filename", "valent-debug.json",
+     301                 :             :                          "artists",             valent_application_credits_artists,
+     302                 :             :                          "designers",           valent_application_credits_designers,
+     303                 :             :                          "developers",          valent_application_credits_developers,
+     304                 :             :                          "documenters",         valent_application_credits_documenters,
+     305                 :             :                          "translator-credits",  _("translator-credits"),
+     306                 :             :                          "version",             PACKAGE_VERSION,
+     307                 :             :                          "website",             PACKAGE_URL,
+     308                 :             :                          NULL);
+     309                 :           0 :   adw_about_dialog_add_acknowledgement_section (ADW_ABOUT_DIALOG (dialog),
+     310                 :           0 :                                                 _("Sponsors"),
+     311                 :             :                                                 valent_application_credits_sponsors);
+     312                 :             : 
+     313                 :           0 :   adw_dialog_present (dialog, GTK_WIDGET (window));
+     314                 :           0 : }
+     315                 :             : 
+     316                 :             : static void
+     317                 :           4 : page_action (GtkWidget  *widget,
+     318                 :             :              const char *action_name,
+     319                 :             :              GVariant   *parameter)
+     320                 :             : {
+     321                 :           4 :   ValentWindow *self = VALENT_WINDOW (widget);
+     322                 :           4 :   unsigned int n_devices = 0;
+     323                 :           4 :   const char *tag;
+     324                 :             : 
+     325         [ +  - ]:           4 :   g_assert (VALENT_IS_WINDOW (self));
+     326                 :             : 
+     327                 :           4 :   tag = g_variant_get_string (parameter, NULL);
+     328                 :             : 
+     329   [ +  -  +  + ]:           4 :   if (*tag == '\0' || g_strcmp0 (tag, "main") == 0)
+     330                 :             :     {
+     331                 :           2 :       adw_navigation_view_pop (self->view);
+     332                 :           2 :       return;
+     333                 :             :     }
+     334                 :             : 
+     335                 :             : 
+     336         [ -  + ]:           2 :   g_clear_pointer (&self->preferences, adw_dialog_force_close);
+     337                 :             : 
+     338                 :           2 :   n_devices = g_list_model_get_n_items (G_LIST_MODEL (self->manager));
+     339         [ +  - ]:           2 :   for (unsigned int i = 0; i < n_devices; i++)
+     340                 :             :     {
+     341                 :           0 :       g_autoptr (ValentDevice) device = NULL;
+     342                 :           2 :       AdwNavigationPage *page;
+     343                 :             : 
+     344                 :           2 :       device = g_list_model_get_item (G_LIST_MODEL (self->manager), i);
+     345                 :             : 
+     346         [ +  - ]:           2 :       if (g_strcmp0 (valent_device_get_id (device), tag) == 0)
+     347                 :             :         {
+     348                 :           2 :           page = g_object_new (VALENT_TYPE_DEVICE_PAGE,
+     349                 :             :                                "device", device,
+     350                 :             :                                NULL);
+     351                 :           2 :           adw_navigation_view_push (self->view, page);
+     352         [ +  - ]:           2 :           break;
+     353                 :             :         }
+     354                 :             :     }
+     355                 :             : }
+     356                 :             : 
+     357                 :             : static void
+     358                 :           2 : preferences_action (GtkWidget  *widget,
+     359                 :             :                     const char *action_name,
+     360                 :             :                     GVariant   *parameter)
+     361                 :             : {
+     362                 :           2 :   ValentWindow *self = VALENT_WINDOW (widget);
+     363                 :             : 
+     364         [ +  - ]:           2 :   g_assert (VALENT_IS_WINDOW (self));
+     365                 :             : 
+     366         [ +  + ]:           2 :   if (self->preferences == NULL)
+     367                 :             :     {
+     368                 :           1 :       self->preferences = g_object_new (VALENT_TYPE_PREFERENCES_DIALOG, NULL);
+     369                 :           1 :       g_object_add_weak_pointer (G_OBJECT (self->preferences),
+     370                 :           1 :                                  (gpointer)&self->preferences);
+     371                 :             :     }
+     372                 :             : 
+     373                 :           2 :   adw_dialog_present (ADW_DIALOG (self->preferences), GTK_WIDGET (self));
+     374                 :           2 : }
+     375                 :             : 
+     376                 :             : static void
+     377                 :           2 : refresh_action (GtkWidget  *widget,
+     378                 :             :                 const char *action_name,
+     379                 :             :                 GVariant   *parameter)
+     380                 :             : {
+     381                 :           2 :   ValentWindow *self = VALENT_WINDOW (widget);
+     382                 :             : 
+     383         [ +  - ]:           2 :   g_assert (VALENT_IS_WINDOW (self));
+     384                 :             : 
+     385         [ +  - ]:           2 :   if (!adw_get_enable_animations (widget))
+     386                 :             :     {
+     387                 :           2 :       valent_device_manager_refresh (self->manager);
+     388                 :           2 :       return;
+     389                 :             :     }
+     390                 :             : 
+     391   [ #  #  #  # ]:           0 :   if (self->scan == NULL && self->fade == NULL)
+     392                 :           0 :     {
+     393                 :           0 :       AdwAnimationTarget *target = NULL;
+     394                 :             : 
+     395                 :           0 :       target = adw_property_animation_target_new (G_OBJECT (self->progress_bar),
+     396                 :             :                                                   "fraction");
+     397                 :           0 :       self->scan = adw_timed_animation_new (widget, 0.0, 1.0, 5000, target);
+     398                 :           0 :       g_signal_connect_object (self->scan,
+     399                 :             :                                "notify::state",
+     400                 :             :                                G_CALLBACK (on_animation_state_changed),
+     401                 :             :                                self, 0);
+     402                 :             : 
+     403                 :           0 :       target = adw_property_animation_target_new (G_OBJECT (self->progress_bar),
+     404                 :             :                                                   "opacity");
+     405                 :           0 :       self->fade = adw_timed_animation_new (widget, 1.0, 0.0, 500, target);
+     406                 :           0 :       g_signal_connect_object (self->fade,
+     407                 :             :                                "notify::state",
+     408                 :             :                                G_CALLBACK (on_animation_state_changed),
+     409                 :             :                                self, 0);
+     410                 :             :     }
+     411                 :             :   else
+     412                 :             :     {
+     413                 :           0 :       adw_animation_reset (self->fade);
+     414                 :           0 :       adw_animation_reset (self->scan);
+     415                 :             :     }
+     416                 :             : 
+     417                 :           0 :   adw_animation_play (self->scan);
+     418                 :             : }
+     419                 :             : 
+     420                 :             : /*
+     421                 :             :  * GObject
+     422                 :             :  */
+     423                 :             : static void
+     424                 :           4 : valent_window_constructed (GObject *object)
+     425                 :             : {
+     426                 :           4 :   ValentWindow *self = VALENT_WINDOW (object);
+     427                 :             : 
+     428         [ +  - ]:           4 :   g_assert (self->manager != NULL);
+     429                 :             : 
+     430                 :           4 :   gtk_list_box_bind_model (self->device_list,
+     431                 :             :                            G_LIST_MODEL (self->manager),
+     432                 :             :                            valent_window_create_row_func,
+     433                 :             :                            self, NULL);
+     434                 :             : 
+     435                 :           4 :   G_OBJECT_CLASS (valent_window_parent_class)->constructed (object);
+     436                 :           4 : }
+     437                 :             : 
+     438                 :             : static void
+     439                 :           4 : valent_window_dispose (GObject *object)
+     440                 :             : {
+     441                 :           4 :   ValentWindow *self = VALENT_WINDOW (object);
+     442                 :             : 
+     443         [ -  + ]:           4 :   if (self->scan != NULL)
+     444                 :           0 :     adw_animation_reset (self->scan);
+     445         [ -  + ]:           4 :   g_clear_object (&self->scan);
+     446                 :             : 
+     447         [ -  + ]:           4 :   if (self->fade != NULL)
+     448                 :           0 :     adw_animation_reset (self->fade);
+     449         [ -  + ]:           4 :   g_clear_object (&self->fade);
+     450                 :             : 
+     451         [ +  + ]:           4 :   g_clear_pointer (&self->preferences, adw_dialog_force_close);
+     452                 :           4 :   gtk_widget_dispose_template (GTK_WIDGET (object), VALENT_TYPE_WINDOW);
+     453                 :             : 
+     454                 :           4 :   G_OBJECT_CLASS (valent_window_parent_class)->dispose (object);
+     455                 :           4 : }
+     456                 :             : 
+     457                 :             : static void
+     458                 :           4 : valent_window_finalize (GObject *object)
+     459                 :             : {
+     460                 :           4 :   ValentWindow *self = VALENT_WINDOW (object);
+     461                 :             : 
+     462         [ +  - ]:           4 :   g_clear_object (&self->manager);
+     463                 :             : 
+     464                 :           4 :   G_OBJECT_CLASS (valent_window_parent_class)->finalize (object);
+     465                 :           4 : }
+     466                 :             : 
+     467                 :             : static void
+     468                 :           1 : valent_window_get_property (GObject    *object,
+     469                 :             :                             guint       prop_id,
+     470                 :             :                             GValue     *value,
+     471                 :             :                             GParamSpec *pspec)
+     472                 :             : {
+     473                 :           1 :   ValentWindow *self = VALENT_WINDOW (object);
+     474                 :             : 
+     475         [ +  - ]:           1 :   switch (prop_id)
+     476                 :             :     {
+     477                 :           1 :     case PROP_DEVICE_MANAGER:
+     478                 :           1 :       g_value_set_object (value, self->manager);
+     479                 :           1 :       break;
+     480                 :             : 
+     481                 :           0 :     default:
+     482                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     483                 :             :     }
+     484                 :           1 : }
+     485                 :             : 
+     486                 :             : static void
+     487                 :           4 : valent_window_set_property (GObject      *object,
+     488                 :             :                             guint         prop_id,
+     489                 :             :                             const GValue *value,
+     490                 :             :                             GParamSpec   *pspec)
+     491                 :             : {
+     492                 :           4 :   ValentWindow *self = VALENT_WINDOW (object);
+     493                 :             : 
+     494         [ +  - ]:           4 :   switch (prop_id)
+     495                 :             :     {
+     496                 :           4 :     case PROP_DEVICE_MANAGER:
+     497                 :           4 :       self->manager = g_value_dup_object (value);
+     498                 :           4 :       break;
+     499                 :             : 
+     500                 :           0 :     default:
+     501                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     502                 :             :     }
+     503                 :           4 : }
+     504                 :             : 
+     505                 :             : static void
+     506                 :           1 : valent_window_class_init (ValentWindowClass *klass)
+     507                 :             : {
+     508                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     509                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     510                 :             : 
+     511                 :           1 :   object_class->constructed = valent_window_constructed;
+     512                 :           1 :   object_class->dispose = valent_window_dispose;
+     513                 :           1 :   object_class->finalize = valent_window_finalize;
+     514                 :           1 :   object_class->get_property = valent_window_get_property;
+     515                 :           1 :   object_class->set_property = valent_window_set_property;
+     516                 :             : 
+     517                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/ca/andyholmes/Valent/ui/valent-window.ui");
+     518                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentWindow, view);
+     519                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentWindow, progress_bar);
+     520                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentWindow, device_list);
+     521                 :             : 
+     522                 :           1 :   gtk_widget_class_install_action (widget_class, "win.about", NULL, about_action);
+     523                 :           1 :   gtk_widget_class_install_action (widget_class, "win.page", "s", page_action);
+     524                 :           1 :   gtk_widget_class_install_action (widget_class, "win.preferences", NULL, preferences_action);
+     525                 :           1 :   gtk_widget_class_install_action (widget_class, "win.refresh", NULL, refresh_action);
+     526                 :             : 
+     527                 :             :   /**
+     528                 :             :    * ValentWindow:device-manager:
+     529                 :             :    *
+     530                 :             :    * The [class@Valent.DeviceManager] that the window represents.
+     531                 :             :    */
+     532                 :           2 :   properties [PROP_DEVICE_MANAGER] =
+     533                 :           1 :     g_param_spec_object ("device-manager", NULL, NULL,
+     534                 :             :                          VALENT_TYPE_DEVICE_MANAGER,
+     535                 :             :                          (G_PARAM_READWRITE |
+     536                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     537                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     538                 :             :                           G_PARAM_STATIC_STRINGS));
+     539                 :             : 
+     540                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     541                 :           1 : }
+     542                 :             : 
+     543                 :             : static void
+     544                 :           4 : valent_window_init (ValentWindow *self)
+     545                 :             : {
+     546                 :           4 :   gtk_widget_init_template (GTK_WIDGET (self));
+     547                 :           4 : }
+     548                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-window.h.func-c.html b/coverage/src/libvalent/ui/valent-window.h.func-c.html new file mode 100644 index 00000000000..5362f0afd5c --- /dev/null +++ b/coverage/src/libvalent/ui/valent-window.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-window.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-window.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_WINDOW10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-window.h.func.html b/coverage/src/libvalent/ui/valent-window.h.func.html new file mode 100644 index 00000000000..fb60c387820 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-window.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-window.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-window.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_WINDOW10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/libvalent/ui/valent-window.h.gcov.html b/coverage/src/libvalent/ui/valent-window.h.gcov.html new file mode 100644 index 00000000000..74416670dc1 --- /dev/null +++ b/coverage/src/libvalent/ui/valent-window.h.gcov.html @@ -0,0 +1,109 @@ + + + + + + + LCOV - Code Coverage - src/libvalent/ui/valent-window.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/libvalent/ui - valent-window.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : #include "../core/valent-object.h"
+       9                 :             : 
+      10                 :             : G_BEGIN_DECLS
+      11                 :             : 
+      12                 :             : #define VALENT_TYPE_WINDOW (valent_window_get_type())
+      13                 :             : 
+      14   [ +  -  +  -  :          10 : G_DECLARE_FINAL_TYPE (ValentWindow, valent_window, VALENT, WINDOW, AdwApplicationWindow)
+                   -  + ]
+      15                 :             : 
+      16                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/main.c.func-c.html b/coverage/src/main.c.func-c.html new file mode 100644 index 00000000000..4a78bde91f0 --- /dev/null +++ b/coverage/src/main.c.func-c.html @@ -0,0 +1,105 @@ + + + + + + + LCOV - Code Coverage - src/main.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src - main.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
main0
valent_plugin_init0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/main.c.func.html b/coverage/src/main.c.func.html new file mode 100644 index 00000000000..cec4756abbd --- /dev/null +++ b/coverage/src/main.c.func.html @@ -0,0 +1,105 @@ + + + + + + + LCOV - Code Coverage - src/main.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src - main.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
main0
valent_plugin_init0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/main.c.gcov.html b/coverage/src/main.c.gcov.html new file mode 100644 index 00000000000..17b5057316a --- /dev/null +++ b/coverage/src/main.c.gcov.html @@ -0,0 +1,157 @@ + + + + + + + LCOV - Code Coverage - src/main.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src - main.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %260
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <glib/gi18n.h>
+       7                 :             : #include <libportal/portal.h>
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : 
+      11                 :             : static void
+      12                 :           0 : valent_plugin_init (void)
+      13                 :             : {
+      14                 :           0 :   PeasEngine *engine = peas_engine_get_default ();
+      15                 :           0 :   g_autofree char *xdg_plugin_dir = NULL;
+      16                 :             : 
+      17                 :             :   /* The package plugin directory, typically `$LIBDIR/valent/plugins`. */
+      18                 :           0 :   peas_engine_add_search_path (engine, VALENT_PLUGINSDIR, NULL);
+      19                 :             : 
+      20                 :             :   /* The user plugin directory as reported by XDG directories. If in a Flatpak,
+      21                 :             :    * this will be `~/.var/app/APPLICATION_ID/data/PACKAGE_NAME/plugins`. */
+      22                 :           0 :   xdg_plugin_dir = g_build_filename (g_get_user_data_dir (),
+      23                 :             :                                      PACKAGE_NAME, "plugins", NULL);
+      24                 :           0 :   peas_engine_add_search_path (engine, xdg_plugin_dir, NULL);
+      25                 :             : 
+      26                 :             :   /* The real user plugin directory, regardless of XDG environment variables.
+      27                 :             :    * This will always be `~/.local/share/PACKAGE_NAME/plugins`. */
+      28                 :           0 :   if (xdp_portal_running_under_flatpak ())
+      29                 :             :     {
+      30                 :           0 :       g_autofree char *real_plugin_dir = NULL;
+      31                 :             : 
+      32                 :           0 :       real_plugin_dir = g_build_filename (g_get_home_dir (), ".local", "share",
+      33                 :             :                                           PACKAGE_NAME, "plugins", NULL);
+      34                 :           0 :       peas_engine_add_search_path (engine, real_plugin_dir, NULL);
+      35                 :             :     }
+      36                 :           0 : }
+      37                 :             : 
+      38                 :             : int
+      39                 :           0 : main (int   argc,
+      40                 :             :       char *argv[])
+      41                 :             : {
+      42                 :           0 :   int ret;
+      43                 :           0 :   g_autoptr (GApplication) service = NULL;
+      44                 :             : 
+      45                 :             :   /* Initialize Translations */
+      46                 :           0 :   bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+      47                 :           0 :   bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+      48                 :           0 :   textdomain (GETTEXT_PACKAGE);
+      49                 :             : 
+      50                 :             :   /* Initialize Valent */
+      51                 :           0 :   valent_debug_init ();
+      52                 :           0 :   valent_plugin_init ();
+      53                 :             : 
+      54                 :           0 :   if (g_getenv ("VALENT_HEADLESS") != NULL || !valent_ui_init ())
+      55                 :           0 :     g_debug ("Valent running in headless mode");
+      56                 :             : 
+      57                 :             :   /* Run and cleanup, before returning */
+      58                 :           0 :   g_set_application_name ("Valent");
+      59                 :           0 :   service = _valent_application_new ();
+      60                 :           0 :   ret = g_application_run (G_APPLICATION (service), argc, argv);
+      61                 :             : 
+      62                 :           0 :   valent_debug_clear ();
+      63                 :             : 
+      64                 :           0 :   return ret;
+      65                 :             : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/battery-plugin.c.func-c.html b/coverage/src/plugins/battery/battery-plugin.c.func-c.html new file mode 100644 index 00000000000..2f8e1d19656 --- /dev/null +++ b/coverage/src/plugins/battery/battery-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/battery-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - battery-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_battery_plugin_register_types3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/battery-plugin.c.func.html b/coverage/src/plugins/battery/battery-plugin.c.func.html new file mode 100644 index 00000000000..1c164ced88b --- /dev/null +++ b/coverage/src/plugins/battery/battery-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/battery-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - battery-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_battery_plugin_register_types3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/battery-plugin.c.gcov.html b/coverage/src/plugins/battery/battery-plugin.c.gcov.html new file mode 100644 index 00000000000..50e6045979b --- /dev/null +++ b/coverage/src/plugins/battery/battery-plugin.c.gcov.html @@ -0,0 +1,118 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/battery-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - battery-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-battery-gadget.h"
+      10                 :             : #include "valent-battery-plugin.h"
+      11                 :             : #include "valent-battery-preferences.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : _VALENT_EXTERN void
+      15                 :           3 : valent_battery_plugin_register_types (PeasObjectModule *module)
+      16                 :             : {
+      17                 :           3 :   peas_object_module_register_extension_type (module,
+      18                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      19                 :             :                                               VALENT_TYPE_BATTERY_PLUGIN);
+      20                 :           3 :   peas_object_module_register_extension_type (module,
+      21                 :             :                                               VALENT_TYPE_DEVICE_GADGET,
+      22                 :             :                                               VALENT_TYPE_BATTERY_GADGET);
+      23                 :           3 :   peas_object_module_register_extension_type (module,
+      24                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      25                 :             :                                               VALENT_TYPE_BATTERY_PREFERENCES);
+      26                 :           3 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-detail-sort-b.html b/coverage/src/plugins/battery/index-detail-sort-b.html new file mode 100644 index 00000000000..225f7644c6b --- /dev/null +++ b/coverage/src/plugins/battery/index-detail-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-detail-sort-f.html b/coverage/src/plugins/battery/index-detail-sort-f.html new file mode 100644 index 00000000000..6ecdbd7ed8b --- /dev/null +++ b/coverage/src/plugins/battery/index-detail-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-detail-sort-l.html b/coverage/src/plugins/battery/index-detail-sort-l.html new file mode 100644 index 00000000000..042fe01872c --- /dev/null +++ b/coverage/src/plugins/battery/index-detail-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-detail.html b/coverage/src/plugins/battery/index-detail.html new file mode 100644 index 00000000000..20e5ce887c3 --- /dev/null +++ b/coverage/src/plugins/battery/index-detail.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-sort-b.html b/coverage/src/plugins/battery/index-sort-b.html new file mode 100644 index 00000000000..225f7644c6b --- /dev/null +++ b/coverage/src/plugins/battery/index-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-sort-f.html b/coverage/src/plugins/battery/index-sort-f.html new file mode 100644 index 00000000000..6ecdbd7ed8b --- /dev/null +++ b/coverage/src/plugins/battery/index-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index-sort-l.html b/coverage/src/plugins/battery/index-sort-l.html new file mode 100644 index 00000000000..042fe01872c --- /dev/null +++ b/coverage/src/plugins/battery/index-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/index.html b/coverage/src/plugins/battery/index.html new file mode 100644 index 00000000000..20e5ce887c3 --- /dev/null +++ b/coverage/src/plugins/battery/index.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/batteryCoverageTotalHit
Test:Code CoverageLines:96.3 %458441
Test Date:2024-03-31 18:46:36Functions:98.0 %5150
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:65.3 %262171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
battery-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-battery-gadget.c +
94.0%94.0%
+
94.0 %837861.1 %3622100.0 %88
valent-battery-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-plugin.c +
96.1%96.1%
+
96.1 %20719969.2 %1208394.1 %1716
valent-battery-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-battery-preferences.c +
100.0%
+
100.0 %353575.0 %43100.0 %77
valent-battery.c +
96.8%96.8%
+
96.8 %12512164.3 %8454100.0 %1515
valent-battery.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-gadget.c.func-c.html b/coverage/src/plugins/battery/valent-battery-gadget.c.func-c.html new file mode 100644 index 00000000000..a33bda41258 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-gadget.c.func-c.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.0 %8378
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %3622
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_battery_gadget_constructed1
valent_battery_gadget_dispose1
valent_battery_gadget_init1
on_action_enabled_changed2
on_action_state_changed10
valent_battery_gadget_get_type19
valent_battery_gadget_class_intern_init3
valent_battery_gadget_get_type_once3
valent_battery_gadget_get_type13
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-gadget.c.func.html b/coverage/src/plugins/battery/valent-battery-gadget.c.func.html new file mode 100644 index 00000000000..e9196d40f41 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-gadget.c.func.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.0 %8378
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %3622
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_action_enabled_changed2
on_action_state_changed10
valent_battery_gadget_constructed1
valent_battery_gadget_dispose1
valent_battery_gadget_get_type19
valent_battery_gadget_class_intern_init3
valent_battery_gadget_get_type13
valent_battery_gadget_get_type_once3
valent_battery_gadget_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-gadget.c.gcov.html b/coverage/src/plugins/battery/valent-battery-gadget.c.gcov.html new file mode 100644 index 00000000000..80dc699a460 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-gadget.c.gcov.html @@ -0,0 +1,312 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-gadget.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.0 %8378
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %3622
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-battery-gadget"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <glib/gi18n.h>
+      11                 :             : #include <gtk/gtk.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-battery-gadget.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentBatteryGadget
+      18                 :             : {
+      19                 :             :   ValentDeviceGadget  parent_instance;
+      20                 :             : 
+      21                 :             :   GtkWidget          *button;
+      22                 :             :   GtkWidget          *level_bar;
+      23                 :             :   GtkWidget          *label;
+      24                 :             : };
+      25                 :             : 
+      26   [ +  +  +  - ]:          19 : G_DEFINE_FINAL_TYPE (ValentBatteryGadget, valent_battery_gadget, VALENT_TYPE_DEVICE_GADGET)
+      27                 :             : 
+      28                 :             : 
+      29                 :             : static void
+      30                 :          10 : on_action_state_changed (GActionGroup        *action_group,
+      31                 :             :                          const char          *action_name,
+      32                 :             :                          GVariant            *value,
+      33                 :             :                          ValentBatteryGadget *self)
+      34                 :             : {
+      35                 :          10 :   g_autofree char *label = NULL;
+      36                 :          10 :   gboolean charging = FALSE;
+      37                 :          10 :   gboolean is_present = FALSE;
+      38                 :          10 :   double percentage = 0.0;
+      39                 :          10 :   const char *icon_name;
+      40                 :             : 
+      41         [ +  - ]:          10 :   g_assert (VALENT_IS_BATTERY_GADGET (self));
+      42                 :             : 
+      43                 :          10 :   g_variant_lookup (value, "is-present", "b", &is_present);
+      44                 :             : 
+      45         [ +  + ]:          10 :   if (!is_present)
+      46                 :             :     {
+      47                 :           1 :       gtk_widget_set_visible (self->button, FALSE);
+      48                 :           1 :       return;
+      49                 :             :     }
+      50                 :             : 
+      51   [ +  -  -  + ]:          18 :   if (!g_variant_lookup (value, "percentage", "d", &percentage) ||
+      52                 :           9 :       !g_variant_lookup (value, "charging", "b", &charging))
+      53                 :             :     {
+      54                 :           0 :       gtk_widget_set_visible (self->button, FALSE);
+      55                 :           0 :       return;
+      56                 :             :     }
+      57                 :             : 
+      58         [ -  + ]:           9 :   if (!g_variant_lookup (value, "icon-name", "&s", &icon_name))
+      59                 :           0 :     icon_name = "battery-missing-symbolic";
+      60                 :             : 
+      61         [ -  + ]:           9 :   if (percentage >= 100.0)
+      62                 :             :     {
+      63                 :             :       /* TRANSLATORS: When the battery level is 100% */
+      64         [ #  # ]:           0 :       label = g_strdup (_("Fully Charged"));
+      65                 :             :     }
+      66                 :             :   else
+      67                 :             :     {
+      68                 :           9 :       int64_t total_seconds = 0;
+      69                 :           9 :       int64_t total_minutes;
+      70                 :           9 :       int minutes;
+      71                 :           9 :       int hours;
+      72                 :             : 
+      73         [ +  + ]:           9 :       if (charging)
+      74                 :           5 :         g_variant_lookup (value, "time-to-full", "x", &total_seconds);
+      75                 :             :       else
+      76                 :           4 :         g_variant_lookup (value, "time-to-empty", "x", &total_seconds);
+      77                 :             : 
+      78         [ +  - ]:           9 :       if (total_seconds > 0)
+      79                 :             :         {
+      80                 :           9 :           total_minutes = floor (total_seconds / 60);
+      81                 :           9 :           minutes = total_minutes % 60;
+      82                 :           9 :           hours = floor (total_minutes / 60);
+      83                 :             :         }
+      84                 :             : 
+      85         [ -  + ]:           9 :       if (total_seconds <= 0)
+      86                 :             :         {
+      87                 :             :           /* TRANSLATORS: This is <percentage> (Estimating…) */
+      88                 :           0 :           label = g_strdup_printf (_("%g%% (Estimating…)"), percentage);
+      89                 :             :         }
+      90         [ +  + ]:           9 :       else if (charging)
+      91                 :             :         {
+      92                 :             :           /* TRANSLATORS: This is <percentage> (<hours>:<minutes> Until Full) */
+      93                 :           5 :           label = g_strdup_printf (_("%g%% (%d∶%02d Until Full)"),
+      94                 :             :                                    percentage, hours, minutes);
+      95                 :             :         }
+      96                 :             :       else
+      97                 :             :         {
+      98                 :             :           /* TRANSLATORS: This is <percentage> (<hours>:<minutes> Remaining) */
+      99                 :           4 :           label = g_strdup_printf (_("%g%% (%d∶%02d Remaining)"),
+     100                 :             :                                    percentage, hours, minutes);
+     101                 :             :         }
+     102                 :             :     }
+     103                 :             : 
+     104                 :           9 :   gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (self->button), icon_name);
+     105                 :             : 
+     106                 :           9 :   gtk_level_bar_set_value (GTK_LEVEL_BAR (self->level_bar), percentage);
+     107                 :           9 :   gtk_label_set_text (GTK_LABEL (self->label), label);
+     108                 :             : 
+     109         [ +  - ]:           9 :   if (g_action_group_get_action_enabled (action_group, action_name))
+     110                 :           9 :     gtk_widget_set_visible (self->button, TRUE);
+     111                 :             : }
+     112                 :             : 
+     113                 :             : static void
+     114                 :           2 : on_action_enabled_changed (GActionGroup        *action_group,
+     115                 :             :                            const char          *action_name,
+     116                 :             :                            gboolean             enabled,
+     117                 :             :                            ValentBatteryGadget *self)
+     118                 :             : {
+     119                 :           4 :   g_autoptr (GVariant) state = NULL;
+     120                 :             : 
+     121                 :           2 :   gtk_widget_set_visible (self->button, enabled);
+     122                 :             : 
+     123         [ +  + ]:           2 :   if (enabled)
+     124                 :           1 :     state = g_action_group_get_action_state (action_group, action_name);
+     125                 :             : 
+     126         [ +  - ]:           1 :   if (state != NULL)
+     127                 :           1 :     on_action_state_changed (action_group, action_name, state, self);
+     128                 :           2 : }
+     129                 :             : 
+     130                 :             : /*
+     131                 :             :  * GObject
+     132                 :             :  */
+     133                 :             : static void
+     134                 :           1 : valent_battery_gadget_constructed (GObject *object)
+     135                 :             : {
+     136                 :           1 :   ValentBatteryGadget *self = VALENT_BATTERY_GADGET (object);
+     137                 :           1 :   GActionGroup *action_group = NULL;
+     138                 :           1 :   gboolean enabled = FALSE;
+     139                 :             : 
+     140                 :           1 :   g_object_get (object, "device", &action_group, NULL);
+     141                 :           1 :   g_signal_connect_object (action_group,
+     142                 :             :                            "action-state-changed::battery.state",
+     143                 :             :                            G_CALLBACK (on_action_state_changed),
+     144                 :             :                            self, 0);
+     145                 :           1 :   g_signal_connect_object (action_group,
+     146                 :             :                            "action-enabled-changed::battery.state",
+     147                 :             :                            G_CALLBACK (on_action_enabled_changed),
+     148                 :             :                            self, 0);
+     149                 :             : 
+     150                 :           1 :   enabled = g_action_group_get_action_enabled (action_group, "battery.state");
+     151                 :           1 :   on_action_enabled_changed (action_group, "battery.state", enabled, self);
+     152         [ +  - ]:           1 :   g_clear_object (&action_group);
+     153                 :             : 
+     154                 :           1 :   G_OBJECT_CLASS (valent_battery_gadget_parent_class)->constructed (object);
+     155                 :           1 : }
+     156                 :             : 
+     157                 :             : static void
+     158                 :           1 : valent_battery_gadget_dispose (GObject *object)
+     159                 :             : {
+     160                 :           1 :   ValentBatteryGadget *self = VALENT_BATTERY_GADGET (object);
+     161                 :             : 
+     162         [ +  - ]:           1 :   g_clear_pointer (&self->button, gtk_widget_unparent);
+     163                 :             : 
+     164                 :           1 :   G_OBJECT_CLASS (valent_battery_gadget_parent_class)->dispose (object);
+     165                 :           1 : }
+     166                 :             : 
+     167                 :             : static void
+     168                 :           3 : valent_battery_gadget_class_init (ValentBatteryGadgetClass *klass)
+     169                 :             : {
+     170                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     171                 :             : 
+     172                 :           3 :   object_class->constructed = valent_battery_gadget_constructed;
+     173                 :           3 :   object_class->dispose = valent_battery_gadget_dispose;
+     174                 :             : }
+     175                 :             : 
+     176                 :             : static void
+     177                 :           1 : valent_battery_gadget_init (ValentBatteryGadget *self)
+     178                 :             : {
+     179                 :           1 :   GtkWidget *popover;
+     180                 :           1 :   GtkWidget *box;
+     181                 :             : 
+     182                 :             :   /* Popover */
+     183                 :           1 :   box = g_object_new (GTK_TYPE_BOX,
+     184                 :             :                       "margin-top",    6,
+     185                 :             :                       "margin-bottom", 6,
+     186                 :             :                       "margin-start",  6,
+     187                 :             :                       "margin-end",    6,
+     188                 :             :                       "orientation",   GTK_ORIENTATION_VERTICAL,
+     189                 :             :                       "spacing",       6,
+     190                 :             :                       NULL);
+     191                 :             : 
+     192                 :           1 :   self->label = gtk_label_new (NULL);
+     193                 :           1 :   gtk_box_append (GTK_BOX (box), self->label);
+     194                 :             : 
+     195                 :           1 :   self->level_bar = g_object_new (GTK_TYPE_LEVEL_BAR,
+     196                 :             :                                   "min-value",      0.0,
+     197                 :             :                                   "max-value",      100.0,
+     198                 :             :                                   "value",          42.0,
+     199                 :             :                                   "width-request",  100,
+     200                 :             :                                   "height-request", 3,
+     201                 :             :                                   NULL);
+     202                 :           1 :   gtk_box_append (GTK_BOX (box), self->level_bar);
+     203                 :             : 
+     204                 :           1 :   popover = g_object_new (GTK_TYPE_POPOVER,
+     205                 :             :                           "autohide", TRUE,
+     206                 :             :                           "child",    box,
+     207                 :             :                           NULL);
+     208                 :             : 
+     209                 :             :   /* Button */
+     210                 :           1 :   self->button = g_object_new (GTK_TYPE_MENU_BUTTON,
+     211                 :             :                                "icon-name", "battery-missing-symbolic",
+     212                 :             :                                "popover",   popover,
+     213                 :             :                                "has-frame", FALSE,
+     214                 :             :                                NULL);
+     215                 :           1 :   gtk_accessible_update_property (GTK_ACCESSIBLE (self->button),
+     216                 :             :                                   GTK_ACCESSIBLE_PROPERTY_LABEL, _("Battery"),
+     217                 :             :                                   -1);
+     218                 :           1 :   gtk_widget_set_parent (self->button, GTK_WIDGET (self));
+     219                 :           1 : }
+     220                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-gadget.h.func-c.html b/coverage/src/plugins/battery/valent-battery-gadget.h.func-c.html new file mode 100644 index 00000000000..2df2e0ea32a --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-gadget.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-gadget.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-gadget.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_BATTERY_GADGET10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-gadget.h.func.html b/coverage/src/plugins/battery/valent-battery-gadget.h.func.html new file mode 100644 index 00000000000..c06ceb87b65 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-gadget.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-gadget.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-gadget.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_BATTERY_GADGET10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-gadget.h.gcov.html b/coverage/src/plugins/battery/valent-battery-gadget.h.gcov.html new file mode 100644 index 00000000000..782d8492175 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-gadget.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-gadget.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-gadget.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_BATTERY_GADGET (valent_battery_gadget_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          10 : G_DECLARE_FINAL_TYPE (ValentBatteryGadget, valent_battery_gadget, VALENT, BATTERY_GADGET, ValentDeviceGadget)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-plugin.c.func-c.html b/coverage/src/plugins/battery/valent-battery-plugin.c.func-c.html new file mode 100644 index 00000000000..3393fc1f350 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-plugin.c.func-c.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.1 %207199
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:69.2 %12083
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
battery_state_action0
valent_battery_plugin_constructed5
valent_battery_plugin_init5
on_battery_changed10
valent_battery_plugin_destroy10
valent_battery_plugin_send_state10
valent_battery_plugin_update_estimate16
valent_battery_plugin_get_icon_name17
valent_battery_plugin_update_notification17
valent_battery_plugin_update_state17
valent_battery_plugin_handle_battery18
valent_battery_plugin_handle_packet18
valent_battery_plugin_update_gaction27
valent_battery_plugin_watch_battery27
valent_battery_plugin_get_type153
valent_battery_plugin_class_intern_init3
valent_battery_plugin_get_type_once3
valent_battery_plugin_get_type147
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-plugin.c.func.html b/coverage/src/plugins/battery/valent-battery-plugin.c.func.html new file mode 100644 index 00000000000..c6ffac58745 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-plugin.c.func.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.1 %207199
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:69.2 %12083
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
battery_state_action0
on_battery_changed10
valent_battery_plugin_constructed5
valent_battery_plugin_destroy10
valent_battery_plugin_get_icon_name17
valent_battery_plugin_get_type153
valent_battery_plugin_class_intern_init3
valent_battery_plugin_get_type147
valent_battery_plugin_get_type_once3
valent_battery_plugin_handle_battery18
valent_battery_plugin_handle_packet18
valent_battery_plugin_init5
valent_battery_plugin_send_state10
valent_battery_plugin_update_estimate16
valent_battery_plugin_update_gaction27
valent_battery_plugin_update_notification17
valent_battery_plugin_update_state17
valent_battery_plugin_watch_battery27
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-plugin.c.gcov.html b/coverage/src/plugins/battery/valent-battery-plugin.c.gcov.html new file mode 100644 index 00000000000..7f0ae05fe63 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-plugin.c.gcov.html @@ -0,0 +1,554 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.1 %207199
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:69.2 %12083
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-battery-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <glib/gi18n.h>
+      11                 :             : #include <gio/gio.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-battery.h"
+      15                 :             : #include "valent-battery-plugin.h"
+      16                 :             : 
+      17                 :             : /* Defaults are 90m charge, 1d discharge (seconds/percent) */
+      18                 :             : #define DEFAULT_CHARGE_RATE    (90*60/100)
+      19                 :             : #define DEFAULT_DISCHARGE_RATE (24*60*60/100)
+      20                 :             : 
+      21                 :             : 
+      22                 :             : struct _ValentBatteryPlugin
+      23                 :             : {
+      24                 :             :   ValentDevicePlugin  parent_instance;
+      25                 :             : 
+      26                 :             :   /* Local Battery */
+      27                 :             :   ValentBattery      *battery;
+      28                 :             :   unsigned int        battery_watch : 1;
+      29                 :             : 
+      30                 :             :   /* Remote Battery */
+      31                 :             :   gboolean            charging;
+      32                 :             :   const char         *icon_name;
+      33                 :             :   gboolean            is_present;
+      34                 :             :   double              percentage;
+      35                 :             :   int64_t             time_to_full;
+      36                 :             :   int64_t             time_to_empty;
+      37                 :             :   int64_t             charge_rate;
+      38                 :             :   int64_t             discharge_rate;
+      39                 :             :   int64_t             timestamp;
+      40                 :             : };
+      41                 :             : 
+      42                 :             : static const char * valent_battery_plugin_get_icon_name (ValentBatteryPlugin *self);
+      43                 :             : static void         valent_battery_plugin_send_state    (ValentBatteryPlugin *self);
+      44                 :             : 
+      45   [ +  +  +  - ]:         153 : G_DEFINE_FINAL_TYPE (ValentBatteryPlugin, valent_battery_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      46                 :             : 
+      47                 :             : 
+      48                 :             : /*
+      49                 :             :  * Local Battery
+      50                 :             :  */
+      51                 :             : static void
+      52                 :          10 : on_battery_changed (ValentBattery       *battery,
+      53                 :             :                     ValentBatteryPlugin *self)
+      54                 :             : {
+      55         [ +  - ]:          10 :   g_assert (VALENT_IS_BATTERY (battery));
+      56         [ -  + ]:          10 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+      57                 :             : 
+      58                 :          10 :   valent_battery_plugin_send_state (self);
+      59                 :          10 : }
+      60                 :             : 
+      61                 :             : static void
+      62                 :          27 : valent_battery_plugin_watch_battery (ValentBatteryPlugin *self,
+      63                 :             :                                      gboolean             watch)
+      64                 :             : {
+      65         [ +  - ]:          27 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+      66                 :             : 
+      67         [ +  + ]:          27 :   if (self->battery_watch == watch)
+      68                 :             :     return;
+      69                 :             : 
+      70         [ +  + ]:          10 :   if (self->battery == NULL)
+      71                 :           5 :     self->battery = valent_battery_get_default ();
+      72                 :             : 
+      73         [ +  + ]:          10 :   if (watch)
+      74                 :             :     {
+      75                 :           5 :       g_signal_connect_object (self->battery,
+      76                 :             :                                "changed",
+      77                 :             :                                G_CALLBACK (on_battery_changed),
+      78                 :             :                                self, 0);
+      79                 :           5 :       on_battery_changed (self->battery, self);
+      80                 :           5 :       self->battery_watch = TRUE;
+      81                 :             :     }
+      82                 :             :   else
+      83                 :             :     {
+      84                 :           5 :       g_signal_handlers_disconnect_by_data (self->battery, self);
+      85                 :           5 :       self->battery_watch = FALSE;
+      86                 :             :     }
+      87                 :             : }
+      88                 :             : 
+      89                 :             : static void
+      90                 :          10 : valent_battery_plugin_send_state (ValentBatteryPlugin *self)
+      91                 :             : {
+      92                 :          10 :   g_autoptr (JsonBuilder) builder = NULL;
+      93   [ -  +  -  + ]:          10 :   g_autoptr (JsonNode) packet = NULL;
+      94                 :          10 :   GSettings *settings;
+      95                 :          10 :   int current_charge;
+      96                 :          10 :   gboolean is_charging;
+      97                 :          10 :   unsigned int threshold_event;
+      98                 :             : 
+      99         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_BATTERY_PLUGIN (self));
+     100                 :             : 
+     101         [ +  + ]:          10 :   if (!valent_battery_is_present (self->battery))
+     102                 :             :     return;
+     103                 :             : 
+     104                 :             :   /* If the level is zero or less it's probably bogus, so send nothing */
+     105         [ +  - ]:           8 :   if (valent_battery_current_charge (self->battery) <= 0)
+     106                 :             :     return;
+     107                 :             : 
+     108                 :           8 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     109                 :             : 
+     110         [ +  - ]:           8 :   if (!g_settings_get_boolean (settings, "share-state"))
+     111                 :             :     return;
+     112                 :             : 
+     113                 :           8 :   current_charge = valent_battery_current_charge (self->battery);
+     114                 :           8 :   is_charging = valent_battery_is_charging (self->battery);
+     115                 :           8 :   threshold_event = valent_battery_threshold_event (self->battery);
+     116                 :             : 
+     117                 :           8 :   valent_packet_init (&builder, "kdeconnect.battery");
+     118                 :           8 :   json_builder_set_member_name (builder, "currentCharge");
+     119                 :           8 :   json_builder_add_int_value (builder, current_charge);
+     120                 :           8 :   json_builder_set_member_name (builder, "isCharging");
+     121                 :           8 :   json_builder_add_boolean_value (builder, is_charging);
+     122                 :           8 :   json_builder_set_member_name (builder, "thresholdEvent");
+     123                 :           8 :   json_builder_add_int_value (builder, threshold_event);
+     124                 :           8 :   packet = valent_packet_end (&builder);
+     125                 :             : 
+     126         [ +  - ]:           8 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     127                 :             : }
+     128                 :             : 
+     129                 :             : 
+     130                 :             : /*
+     131                 :             :  * Remote Battery
+     132                 :             :  */
+     133                 :             : static const char *
+     134                 :          17 : valent_battery_plugin_get_icon_name (ValentBatteryPlugin *self)
+     135                 :             : {
+     136         [ +  + ]:          17 :   if (!self->is_present)
+     137                 :             :     return "battery-missing-symbolic";
+     138                 :             : 
+     139         [ +  + ]:          16 :   if (self->percentage >= 100.0)
+     140                 :             :     return "battery-full-charged-symbolic";
+     141                 :             : 
+     142         [ +  + ]:          14 :   if (self->percentage < 5.0)
+     143                 :           1 :     return self->charging
+     144                 :             :       ? "battery-empty-charging-symbolic"
+     145         [ -  + ]:           1 :       : "battery-empty-symbolic";
+     146                 :             : 
+     147         [ +  + ]:          13 :   if (self->percentage < 20.0)
+     148                 :           2 :     return self->charging
+     149                 :             :       ? "battery-caution-charging-symbolic"
+     150         [ -  + ]:           2 :       : "battery-caution-symbolic";
+     151                 :             : 
+     152         [ +  + ]:          11 :   if (self->percentage < 30.0)
+     153                 :           2 :     return self->charging
+     154                 :             :       ? "battery-low-charging-symbolic"
+     155         [ +  + ]:           2 :       : "battery-low-symbolic";
+     156                 :             : 
+     157         [ +  + ]:           9 :   if (self->percentage < 60.0)
+     158                 :           4 :     return self->charging
+     159                 :             :       ? "battery-good-charging-symbolic"
+     160         [ +  + ]:           4 :       : "battery-good-symbolic";
+     161                 :             : 
+     162                 :           5 :   return self->charging
+     163                 :             :     ? "battery-full-charging-symbolic"
+     164         [ +  + ]:           5 :     : "battery-full-symbolic";
+     165                 :             : }
+     166                 :             : 
+     167                 :             : static void
+     168                 :          16 : valent_battery_plugin_update_estimate (ValentBatteryPlugin *self,
+     169                 :             :                                        int64_t              current_charge,
+     170                 :             :                                        gboolean             is_charging)
+     171                 :             : {
+     172                 :          16 :   int64_t rate;
+     173                 :          16 :   double percentage;
+     174                 :          16 :   int64_t timestamp;
+     175                 :             : 
+     176         [ +  - ]:          16 :   g_return_if_fail (current_charge >= 0);
+     177                 :             : 
+     178         [ +  - ]:          16 :   percentage = CLAMP (current_charge, 0.0, 100.0);
+     179                 :          16 :   timestamp = floor (valent_timestamp_ms () / 1000);
+     180         [ +  + ]:          16 :   rate = is_charging ? self->charge_rate : self->discharge_rate;
+     181                 :             : 
+     182                 :             :   /* If the battery is present, we must have a timestamp and charge level to
+     183                 :             :    * calculate the deltas and derive the (dis)charge rate. */
+     184         [ +  + ]:          16 :   if (self->is_present)
+     185                 :             :     {
+     186                 :          14 :       double percentage_delta;
+     187                 :          14 :       int64_t timestamp_delta;
+     188                 :          14 :       int64_t new_rate;
+     189                 :             : 
+     190         [ -  + ]:          14 :       percentage_delta = ABS (percentage - self->percentage);
+     191                 :          14 :       timestamp_delta = timestamp - self->timestamp;
+     192                 :          14 :       new_rate = timestamp_delta / percentage_delta;
+     193                 :          14 :       rate = floor ((rate * 0.4) + (new_rate * 0.6));
+     194                 :             :     }
+     195                 :             : 
+     196                 :             :   /* Update the estimate and related values */
+     197         [ +  + ]:          16 :   if (is_charging)
+     198                 :             :     {
+     199                 :           8 :       self->charge_rate = rate;
+     200                 :           8 :       self->time_to_empty = 0;
+     201                 :           8 :       self->time_to_full = floor (self->charge_rate * (100.0 - percentage));
+     202                 :           8 :       self->timestamp = timestamp;
+     203                 :             :     }
+     204                 :             :   else
+     205                 :             :     {
+     206                 :           8 :       self->discharge_rate = rate;
+     207                 :           8 :       self->time_to_empty = floor (self->discharge_rate * percentage);
+     208                 :           8 :       self->time_to_full = 0;
+     209                 :           8 :       self->timestamp = timestamp;
+     210                 :             :     }
+     211                 :             : }
+     212                 :             : 
+     213                 :             : static void
+     214                 :          27 : valent_battery_plugin_update_gaction (ValentBatteryPlugin *self)
+     215                 :             : {
+     216                 :          27 :   GVariantDict dict;
+     217                 :          27 :   GVariant *state;
+     218                 :          27 :   GAction *action;
+     219                 :             : 
+     220         [ +  - ]:          27 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+     221                 :             : 
+     222                 :          27 :   g_variant_dict_init (&dict, NULL);
+     223                 :          27 :   g_variant_dict_insert (&dict, "charging", "b", self->charging);
+     224                 :          27 :   g_variant_dict_insert (&dict, "percentage", "d", self->percentage);
+     225                 :          27 :   g_variant_dict_insert (&dict, "icon-name", "s", self->icon_name);
+     226                 :          27 :   g_variant_dict_insert (&dict, "is-present", "b", self->is_present);
+     227                 :          27 :   g_variant_dict_insert (&dict, "time-to-empty", "x", self->time_to_empty);
+     228                 :          27 :   g_variant_dict_insert (&dict, "time-to-full", "x", self->time_to_full);
+     229                 :          27 :   state = g_variant_dict_end (&dict);
+     230                 :             : 
+     231                 :             :   /* Update the state, even if we're disabling the action */
+     232                 :          27 :   action = g_action_map_lookup_action (G_ACTION_MAP (self), "state");
+     233                 :          27 :   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), self->is_present);
+     234                 :          27 :   g_simple_action_set_state (G_SIMPLE_ACTION (action), state);
+     235                 :          27 : }
+     236                 :             : 
+     237                 :             : static void
+     238                 :          17 : valent_battery_plugin_update_notification (ValentBatteryPlugin *self,
+     239                 :             :                                            int                  threshold_event)
+     240                 :             : {
+     241                 :          15 :   g_autoptr (GNotification) notification = NULL;
+     242         [ +  - ]:          17 :   g_autofree char *title = NULL;
+     243                 :          17 :   g_autofree char *body = NULL;
+     244                 :          17 :   g_autoptr (GIcon) icon = NULL;
+     245                 :          17 :   ValentDevice *device;
+     246                 :          17 :   const char *device_name;
+     247                 :          17 :   GSettings *settings;
+     248                 :          17 :   double full, low;
+     249                 :             : 
+     250         [ +  - ]:          17 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+     251                 :             : 
+     252                 :          17 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     253                 :          17 :   device_name = valent_device_get_name (device);
+     254                 :          17 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     255                 :             : 
+     256                 :          17 :   full = g_settings_get_double (settings, "full-notification-level");
+     257                 :          17 :   low = g_settings_get_double (settings, "low-notification-level");
+     258                 :             : 
+     259         [ +  + ]:          17 :   if (self->percentage >= full)
+     260                 :             :     {
+     261         [ -  + ]:           2 :       if (!g_settings_get_boolean (settings, "full-notification"))
+     262                 :             :         return;
+     263                 :             : 
+     264                 :             :       /* TRANSLATORS: This is <device name>: Fully Charged */
+     265                 :           0 :       title = g_strdup_printf (_("%s: Fully Charged"), device_name);
+     266                 :             :       /* TRANSLATORS: When the battery level is at maximum */
+     267         [ #  # ]:           0 :       body = g_strdup (_("Battery Fully Charged"));
+     268                 :           0 :       icon = g_themed_icon_new ("battery-full-charged-symbolic");
+     269                 :             :     }
+     270                 :             : 
+     271                 :             :   /* Battery is no longer low or is charging */
+     272   [ +  +  +  + ]:          15 :   else if (self->percentage > low || self->charging)
+     273                 :             :     {
+     274                 :          13 :       valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self),
+     275                 :             :                                               "battery-level");
+     276                 :          13 :       return;
+     277                 :             :     }
+     278                 :             : 
+     279                 :             :   /* Battery is now low */
+     280   [ -  +  -  - ]:           2 :   else if (self->percentage <= low || threshold_event == 1)
+     281                 :             :     {
+     282                 :           2 :       int64_t total_minutes;
+     283                 :           2 :       int minutes;
+     284                 :           2 :       int hours;
+     285                 :             : 
+     286         [ +  - ]:           2 :       if (!g_settings_get_boolean (settings, "low-notification"))
+     287                 :             :         return;
+     288                 :             : 
+     289                 :           2 :       total_minutes = floor (self->time_to_empty / 60);
+     290                 :           2 :       minutes = total_minutes % 60;
+     291                 :           2 :       hours = floor (total_minutes / 60);
+     292                 :             : 
+     293                 :             :       /* TRANSLATORS: This is <device name>: Battery Low */
+     294                 :           2 :       title = g_strdup_printf (_("%s: Battery Low"), device_name);
+     295                 :             :       /* TRANSLATORS: This is <percentage> (<hours>:<minutes> Remaining) */
+     296                 :           2 :       body = g_strdup_printf (_("%g%% (%d∶%02d Remaining)"),
+     297                 :             :                               self->percentage, hours, minutes);
+     298                 :           2 :       icon = g_themed_icon_new ("battery-caution-symbolic");
+     299                 :             :     }
+     300                 :             : 
+     301                 :           2 :   notification = g_notification_new (title);
+     302                 :           2 :   g_notification_set_body (notification, body);
+     303                 :           2 :   g_notification_set_icon (notification, icon);
+     304                 :             : 
+     305         [ +  - ]:           2 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     306                 :             :                                           "battery-level",
+     307                 :             :                                           notification);
+     308                 :             : }
+     309                 :             : 
+     310                 :             : static void
+     311                 :          18 : valent_battery_plugin_handle_battery (ValentBatteryPlugin *self,
+     312                 :             :                                       JsonNode            *packet)
+     313                 :             : {
+     314                 :          18 :   gboolean is_charging;
+     315                 :          18 :   int64_t current_charge;
+     316                 :          18 :   int64_t threshold_event;
+     317                 :             : 
+     318         [ +  - ]:          18 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+     319         [ -  + ]:          18 :   g_assert (VALENT_IS_PACKET (packet));
+     320                 :             : 
+     321         [ -  + ]:          18 :   if (!valent_packet_get_boolean (packet, "isCharging", &is_charging))
+     322                 :           0 :     is_charging = self->charging;
+     323                 :             : 
+     324         [ -  + ]:          18 :   if (!valent_packet_get_int (packet, "currentCharge", &current_charge))
+     325                 :           0 :     current_charge = self->percentage;
+     326                 :             : 
+     327         [ -  + ]:          18 :   if (!valent_packet_get_int (packet, "thresholdEvent", &threshold_event))
+     328                 :           0 :     threshold_event = 0;
+     329                 :             : 
+     330                 :             :   /* We get a lot of battery updates, so check if something changed */
+     331   [ +  +  +  + ]:          24 :   if (self->charging == is_charging &&
+     332         [ +  + ]:           6 :       G_APPROX_VALUE (self->percentage, current_charge, 0.1))
+     333                 :           1 :     return;
+     334                 :             : 
+     335                 :             :   /* If `current_charge` is `-1`, either there is no battery or statistics are
+     336                 :             :    * unavailable. Otherwise update the estimate before the instance properties
+     337                 :             :    * so that the time/percentage deltas can be calculated. */
+     338         [ +  + ]:          17 :   if (current_charge >= 0)
+     339                 :          16 :     valent_battery_plugin_update_estimate (self, current_charge, is_charging);
+     340                 :             : 
+     341                 :          17 :   self->charging = is_charging;
+     342         [ +  - ]:          17 :   self->percentage = CLAMP (current_charge, 0.0, 100.0);
+     343                 :          17 :   self->is_present = current_charge >= 0;
+     344                 :          17 :   self->icon_name = valent_battery_plugin_get_icon_name (self);
+     345                 :             : 
+     346                 :          17 :   valent_battery_plugin_update_gaction (self);
+     347                 :          17 :   valent_battery_plugin_update_notification (self, threshold_event);
+     348                 :             : }
+     349                 :             : 
+     350                 :             : /*
+     351                 :             :  * GActions
+     352                 :             :  */
+     353                 :             : static void
+     354                 :           0 : battery_state_action (GSimpleAction *action,
+     355                 :             :                       GVariant      *parameter,
+     356                 :             :                       gpointer       user_data)
+     357                 :             : {
+     358                 :             :   // No-op to make the state read-only
+     359                 :           0 : }
+     360                 :             : 
+     361                 :             : static const GActionEntry actions[] = {
+     362                 :             :     {"state",  NULL, NULL, "@a{sv} {}", battery_state_action},
+     363                 :             : };
+     364                 :             : 
+     365                 :             : /*
+     366                 :             :  * ValentDevicePlugin
+     367                 :             :  */
+     368                 :             : static void
+     369                 :          17 : valent_battery_plugin_update_state (ValentDevicePlugin *plugin,
+     370                 :             :                                     ValentDeviceState   state)
+     371                 :             : {
+     372                 :          17 :   ValentBatteryPlugin *self = VALENT_BATTERY_PLUGIN (plugin);
+     373                 :          17 :   gboolean available;
+     374                 :             : 
+     375         [ +  - ]:          17 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+     376                 :             : 
+     377                 :          17 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     378                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     379                 :             : 
+     380         [ +  + ]:          17 :   if (available)
+     381                 :             :     {
+     382                 :           5 :       valent_battery_plugin_update_gaction (self);
+     383                 :           5 :       valent_battery_plugin_watch_battery (self, TRUE);
+     384                 :             :     }
+     385                 :             :   else
+     386                 :             :     {
+     387                 :          12 :       valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     388                 :          12 :       valent_battery_plugin_watch_battery (self, FALSE);
+     389                 :             :     }
+     390                 :          17 : }
+     391                 :             : 
+     392                 :             : static void
+     393                 :          18 : valent_battery_plugin_handle_packet (ValentDevicePlugin *plugin,
+     394                 :             :                                      const char         *type,
+     395                 :             :                                      JsonNode           *packet)
+     396                 :             : {
+     397                 :          18 :   ValentBatteryPlugin *self = VALENT_BATTERY_PLUGIN (plugin);
+     398                 :             : 
+     399         [ +  - ]:          18 :   g_assert (VALENT_IS_BATTERY_PLUGIN (self));
+     400         [ -  + ]:          18 :   g_assert (type != NULL);
+     401         [ -  + ]:          18 :   g_assert (VALENT_IS_PACKET (packet));
+     402                 :             : 
+     403                 :             :   /* The remote battery state changed */
+     404         [ +  - ]:          18 :   if (g_str_equal (type, "kdeconnect.battery"))
+     405                 :          18 :     valent_battery_plugin_handle_battery (self, packet);
+     406                 :             :   else
+     407                 :          18 :     g_assert_not_reached ();
+     408                 :          18 : }
+     409                 :             : 
+     410                 :             : /*
+     411                 :             :  * ValentObject
+     412                 :             :  */
+     413                 :             : static void
+     414                 :          10 : valent_battery_plugin_destroy (ValentObject *object)
+     415                 :             : {
+     416                 :          10 :   ValentBatteryPlugin *self = VALENT_BATTERY_PLUGIN (object);
+     417                 :             : 
+     418                 :          10 :   valent_battery_plugin_watch_battery (self, FALSE);
+     419                 :             : 
+     420                 :          10 :   VALENT_OBJECT_CLASS (valent_battery_plugin_parent_class)->destroy (object);
+     421                 :          10 : }
+     422                 :             : 
+     423                 :             : /*
+     424                 :             :  * GObject
+     425                 :             :  */
+     426                 :             : static void
+     427                 :           5 : valent_battery_plugin_constructed (GObject *object)
+     428                 :             : {
+     429                 :           5 :   ValentBatteryPlugin *self = VALENT_BATTERY_PLUGIN (object);
+     430                 :             : 
+     431                 :           5 :   g_action_map_add_action_entries (G_ACTION_MAP (object),
+     432                 :             :                                    actions,
+     433                 :             :                                    G_N_ELEMENTS (actions),
+     434                 :             :                                    object);
+     435                 :           5 :   valent_battery_plugin_update_gaction (self);
+     436                 :             : 
+     437                 :           5 :   G_OBJECT_CLASS (valent_battery_plugin_parent_class)->constructed (object);
+     438                 :           5 : }
+     439                 :             : 
+     440                 :             : static void
+     441                 :           3 : valent_battery_plugin_class_init (ValentBatteryPluginClass *klass)
+     442                 :             : {
+     443                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     444                 :           3 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     445                 :           3 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     446                 :             : 
+     447                 :           3 :   object_class->constructed = valent_battery_plugin_constructed;
+     448                 :             : 
+     449                 :           3 :   vobject_class->destroy = valent_battery_plugin_destroy;
+     450                 :             : 
+     451                 :           3 :   plugin_class->handle_packet = valent_battery_plugin_handle_packet;
+     452                 :           3 :   plugin_class->update_state = valent_battery_plugin_update_state;
+     453                 :             : }
+     454                 :             : 
+     455                 :             : static void
+     456                 :           5 : valent_battery_plugin_init (ValentBatteryPlugin *self)
+     457                 :             : {
+     458                 :           5 :   self->icon_name = "battery-missing-symbolic";
+     459                 :           5 :   self->charge_rate = DEFAULT_CHARGE_RATE;
+     460                 :           5 :   self->discharge_rate = DEFAULT_DISCHARGE_RATE;
+     461                 :           5 : }
+     462                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-plugin.h.func-c.html b/coverage/src/plugins/battery/valent-battery-plugin.h.func-c.html new file mode 100644 index 00000000000..4ad0f7e3e2d --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_BATTERY_PLUGIN144
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-plugin.h.func.html b/coverage/src/plugins/battery/valent-battery-plugin.h.func.html new file mode 100644 index 00000000000..cda1431110e --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_BATTERY_PLUGIN144
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-plugin.h.gcov.html b/coverage/src/plugins/battery/valent-battery-plugin.h.gcov.html new file mode 100644 index 00000000000..a13ce63d5cc --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_BATTERY_PLUGIN (valent_battery_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :         144 : G_DECLARE_FINAL_TYPE (ValentBatteryPlugin, valent_battery_plugin, VALENT, BATTERY_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-preferences.c.func-c.html b/coverage/src/plugins/battery/valent-battery-preferences.c.func-c.html new file mode 100644 index 00000000000..e73a840f431 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-preferences.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3535
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_battery_preferences_constructed1
valent_battery_preferences_dispose1
valent_battery_preferences_init1
valent_battery_preferences_class_init3
valent_battery_preferences_get_type10
valent_battery_preferences_class_intern_init3
valent_battery_preferences_get_type_once3
valent_battery_preferences_get_type4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-preferences.c.func.html b/coverage/src/plugins/battery/valent-battery-preferences.c.func.html new file mode 100644 index 00000000000..84f7aad3d6b --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-preferences.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3535
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_battery_preferences_class_init3
valent_battery_preferences_constructed1
valent_battery_preferences_dispose1
valent_battery_preferences_get_type10
valent_battery_preferences_class_intern_init3
valent_battery_preferences_get_type4
valent_battery_preferences_get_type_once3
valent_battery_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery-preferences.c.gcov.html b/coverage/src/plugins/battery/valent-battery-preferences.c.gcov.html new file mode 100644 index 00000000000..354dda8deba --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery-preferences.c.gcov.html @@ -0,0 +1,180 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3535
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-battery-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-battery-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentBatteryPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   AdwExpanderRow               *full_notification;
+      22                 :             :   GtkAdjustment                *full_notification_level;
+      23                 :             :   AdwExpanderRow               *low_notification;
+      24                 :             :   GtkAdjustment                *low_notification_level;
+      25                 :             : };
+      26                 :             : 
+      27   [ +  +  +  - ]:          10 : G_DEFINE_FINAL_TYPE (ValentBatteryPreferences, valent_battery_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      28                 :             : 
+      29                 :             : 
+      30                 :             : /*
+      31                 :             :  * GObject
+      32                 :             :  */
+      33                 :             : static void
+      34                 :           1 : valent_battery_preferences_constructed (GObject *object)
+      35                 :             : {
+      36                 :           1 :   ValentBatteryPreferences *self = VALENT_BATTERY_PREFERENCES (object);
+      37                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      38                 :           1 :   GSettings *settings;
+      39                 :             : 
+      40                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+      41                 :           1 :   g_settings_bind (settings,                "full-notification",
+      42                 :           1 :                    self->full_notification, "enable-expansion",
+      43                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      44                 :           1 :   g_settings_bind (settings,                      "full-notification-level",
+      45                 :           1 :                    self->full_notification_level, "value",
+      46                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      47                 :           1 :   g_settings_bind (settings,               "low-notification",
+      48                 :           1 :                    self->low_notification, "enable-expansion",
+      49                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      50                 :           1 :   g_settings_bind (settings,                     "low-notification-level",
+      51                 :           1 :                    self->low_notification_level, "value",
+      52                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      53                 :             : 
+      54                 :           1 :   G_OBJECT_CLASS (valent_battery_preferences_parent_class)->constructed (object);
+      55                 :           1 : }
+      56                 :             : 
+      57                 :             : static void
+      58                 :           1 : valent_battery_preferences_dispose (GObject *object)
+      59                 :             : {
+      60                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+      61                 :             : 
+      62                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_BATTERY_PREFERENCES);
+      63                 :             : 
+      64                 :           1 :   G_OBJECT_CLASS (valent_battery_preferences_parent_class)->dispose (object);
+      65                 :           1 : }
+      66                 :             : 
+      67                 :             : static void
+      68                 :           3 : valent_battery_preferences_class_init (ValentBatteryPreferencesClass *klass)
+      69                 :             : {
+      70                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      71                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+      72                 :             : 
+      73                 :           3 :   object_class->constructed = valent_battery_preferences_constructed;
+      74                 :           3 :   object_class->dispose = valent_battery_preferences_dispose;
+      75                 :             : 
+      76                 :           3 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/battery/valent-battery-preferences.ui");
+      77                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentBatteryPreferences, full_notification);
+      78                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentBatteryPreferences, full_notification_level);
+      79                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentBatteryPreferences, low_notification);
+      80                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentBatteryPreferences, low_notification_level);
+      81                 :           3 : }
+      82                 :             : 
+      83                 :             : static void
+      84                 :           1 : valent_battery_preferences_init (ValentBatteryPreferences *self)
+      85                 :             : {
+      86                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+      87                 :           1 : }
+      88                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery.c.func-c.html b/coverage/src/plugins/battery/valent-battery.c.func-c.html new file mode 100644 index 00000000000..b419568fee0 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.8 %125121
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:64.3 %8454
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_battery_dispose1
valent_battery_finalize1
g_dbus_proxy_new_for_bus_cb3
valent_battery_class_init3
valent_battery_init3
valent_battery_load_properties4
valent_battery_get_default6
valent_battery_is_present14
valent_battery_threshold_event17
valent_battery_is_charging18
valent_battery_current_charge22
on_properties_changed62
valent_battery_get_type156
valent_battery_class_intern_init3
valent_battery_get_type_once3
valent_battery_get_type150
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery.c.func.html b/coverage/src/plugins/battery/valent-battery.c.func.html new file mode 100644 index 00000000000..fcc4e997e62 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.8 %125121
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:64.3 %8454
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_dbus_proxy_new_for_bus_cb3
on_properties_changed62
valent_battery_class_init3
valent_battery_current_charge22
valent_battery_dispose1
valent_battery_finalize1
valent_battery_get_default6
valent_battery_get_type156
valent_battery_class_intern_init3
valent_battery_get_type150
valent_battery_get_type_once3
valent_battery_init3
valent_battery_is_charging18
valent_battery_is_present14
valent_battery_load_properties4
valent_battery_threshold_event17
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery.c.gcov.html b/coverage/src/plugins/battery/valent-battery.c.gcov.html new file mode 100644 index 00000000000..03fb1b9c9d3 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery.c.gcov.html @@ -0,0 +1,538 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.8 %125121
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:64.3 %8454
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-battery"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : #include <stdint.h>
+      10                 :             : 
+      11                 :             : #include <gio/gio.h>
+      12                 :             : 
+      13                 :             : #include "valent-battery.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentBattery
+      17                 :             : {
+      18                 :             :   GObject       parent_instance;
+      19                 :             : 
+      20                 :             :   GDBusProxy   *proxy;
+      21                 :             :   GCancellable *cancellable;
+      22                 :             : 
+      23                 :             :   unsigned int  current_charge;
+      24                 :             :   unsigned int  is_charging : 1;
+      25                 :             :   unsigned int  is_present : 1;
+      26                 :             :   unsigned int  threshold_event;
+      27                 :             : };
+      28                 :             : 
+      29   [ +  +  +  - ]:         156 : G_DEFINE_FINAL_TYPE (ValentBattery, valent_battery, G_TYPE_OBJECT)
+      30                 :             : 
+      31                 :             : enum {
+      32                 :             :   CHANGED,
+      33                 :             :   N_SIGNALS
+      34                 :             : };
+      35                 :             : 
+      36                 :             : static guint signals[N_SIGNALS] = { 0, };
+      37                 :             : 
+      38                 :             : static ValentBattery *default_battery = NULL;
+      39                 :             : 
+      40                 :             : 
+      41                 :             : /*
+      42                 :             :  * These are a convenient representation of the values returned by UPower D-Bus
+      43                 :             :  * service, that would otherwise be opaque integers.
+      44                 :             :  *
+      45                 :             :  * See: https://upower.freedesktop.org/docs/Device.html
+      46                 :             :  */
+      47                 :             : enum {
+      48                 :             :   UPOWER_KIND_UNKNOWN,
+      49                 :             :   UPOWER_KIND_LINE_POWER,
+      50                 :             :   UPOWER_KIND_BATTERY,
+      51                 :             :   UPOWER_KIND_UPS,
+      52                 :             :   UPOWER_KIND_MONITOR,
+      53                 :             :   UPOWER_KIND_MOUSE,
+      54                 :             :   UPOWER_KIND_KEYBOARD,
+      55                 :             :   UPOWER_KIND_PDA,
+      56                 :             :   UPOWER_KIND_PHONE,
+      57                 :             : };
+      58                 :             : 
+      59                 :             : enum {
+      60                 :             :   UPOWER_LEVEL_UNKNOWN,
+      61                 :             :   UPOWER_LEVEL_NONE,
+      62                 :             :   UPOWER_LEVEL_DISCHARGING,
+      63                 :             :   UPOWER_LEVEL_LOW,
+      64                 :             :   UPOWER_LEVEL_CRITICAL,
+      65                 :             :   UPOWER_LEVEL_ACTION,
+      66                 :             :   UPOWER_LEVEL_NORMAL,
+      67                 :             :   UPOWER_LEVEL_HIGH,
+      68                 :             :   UPOWER_LEVEL_FULL
+      69                 :             : };
+      70                 :             : 
+      71                 :             : enum {
+      72                 :             :   UPOWER_STATE_UNKNOWN,
+      73                 :             :   UPOWER_STATE_CHARGING,
+      74                 :             :   UPOWER_STATE_DISCHARGING,
+      75                 :             :   UPOWER_STATE_EMPTY,
+      76                 :             :   UPOWER_STATE_FULLY_CHARGED,
+      77                 :             :   UPOWER_STATE_PENDING_CHARGE,
+      78                 :             :   UPOWER_STATE_PENDING_DISCHARGE
+      79                 :             : };
+      80                 :             : 
+      81                 :             : 
+      82                 :             : /*
+      83                 :             :  * These are convenience functions for translating UPower states and levels into
+      84                 :             :  * values expected by KDE Connect.
+      85                 :             :  */
+      86                 :             : static inline gboolean
+      87                 :          20 : translate_state (uint32_t state)
+      88                 :             : {
+      89                 :          20 :   switch (state)
+      90                 :             :     {
+      91                 :             :     case UPOWER_STATE_CHARGING:
+      92                 :             :     case UPOWER_STATE_FULLY_CHARGED:
+      93                 :             :     case UPOWER_STATE_PENDING_CHARGE:
+      94                 :             :       return TRUE;
+      95                 :             : 
+      96                 :             :     case UPOWER_STATE_DISCHARGING:
+      97                 :             :     case UPOWER_STATE_EMPTY:
+      98                 :             :     case UPOWER_STATE_PENDING_DISCHARGE:
+      99                 :             :       return FALSE;
+     100                 :             : 
+     101                 :             :     default:
+     102                 :             :       return FALSE;
+     103                 :             :     }
+     104                 :             : }
+     105                 :             : 
+     106                 :             : static inline unsigned int
+     107                 :          19 : translate_warning_level (uint32_t warning_level)
+     108                 :             : {
+     109                 :          19 :   switch (warning_level)
+     110                 :             :     {
+     111                 :             :     case UPOWER_LEVEL_NONE:
+     112                 :             :       return 0;
+     113                 :             : 
+     114                 :           4 :     case UPOWER_LEVEL_LOW:
+     115                 :             :     case UPOWER_LEVEL_CRITICAL:
+     116                 :             :     case UPOWER_LEVEL_ACTION:
+     117                 :           4 :       return 1;
+     118                 :             : 
+     119                 :             :     default:
+     120                 :             :       return 0;
+     121                 :             :     }
+     122                 :             : }
+     123                 :             : 
+     124                 :             : /*
+     125                 :             :  * GDBusProxy
+     126                 :             :  */
+     127                 :             : static void
+     128                 :           4 : valent_battery_load_properties (ValentBattery *self)
+     129                 :             : {
+     130                 :           8 :   g_autoptr (GVariant) value = NULL;
+     131                 :             : 
+     132         [ +  - ]:           4 :   if ((value = g_dbus_proxy_get_cached_property (self->proxy, "IsPresent")) != NULL)
+     133                 :             :     {
+     134                 :           4 :       gboolean is_present = g_variant_get_boolean (value);
+     135                 :             : 
+     136                 :           4 :       self->is_present = is_present;
+     137                 :           4 :       g_clear_pointer (&value, g_variant_unref);
+     138                 :             :     }
+     139                 :             : 
+     140         [ +  - ]:           4 :   g_assert (VALENT_IS_BATTERY (self));
+     141                 :             : 
+     142         [ +  - ]:           4 :   if ((value = g_dbus_proxy_get_cached_property (self->proxy, "Percentage")) != NULL)
+     143                 :             :     {
+     144                 :           4 :       double percentage = g_variant_get_double (value);
+     145                 :             : 
+     146                 :           4 :       self->current_charge = floor (percentage);
+     147                 :           4 :       g_clear_pointer (&value, g_variant_unref);
+     148                 :             :     }
+     149                 :             : 
+     150         [ +  - ]:           4 :   if ((value = g_dbus_proxy_get_cached_property (self->proxy, "State")) != NULL)
+     151                 :             :     {
+     152                 :           4 :       uint32_t state = g_variant_get_uint32 (value);
+     153                 :             : 
+     154         [ +  - ]:           4 :       self->is_charging = translate_state (state);
+     155                 :           4 :       g_clear_pointer (&value, g_variant_unref);
+     156                 :             :     }
+     157                 :             : 
+     158         [ +  - ]:           4 :   if ((value = g_dbus_proxy_get_cached_property (self->proxy, "WarningLevel")) != NULL)
+     159                 :             :     {
+     160                 :           4 :       uint32_t warning_level = g_variant_get_uint32 (value);
+     161                 :             : 
+     162         [ -  + ]:           4 :       self->threshold_event = translate_warning_level (warning_level);
+     163                 :           4 :       g_clear_pointer (&value, g_variant_unref);
+     164                 :             :     }
+     165                 :           4 : }
+     166                 :             : 
+     167                 :             : static void
+     168                 :          62 : on_properties_changed (GDBusProxy    *proxy,
+     169                 :             :                        GVariant      *changed_properties,
+     170                 :             :                        GStrv          invalidated_properties,
+     171                 :             :                        ValentBattery *self)
+     172                 :             : {
+     173                 :          62 :   gboolean changed = FALSE;
+     174                 :          62 :   gboolean is_present;
+     175                 :          62 :   double percentage;
+     176                 :          62 :   uint32_t state;
+     177                 :          62 :   uint32_t warning_level;
+     178                 :             : 
+     179         [ +  - ]:          62 :   g_assert (VALENT_IS_BATTERY (self));
+     180                 :             : 
+     181                 :             :   /* If the battery was inserted or removed, the properties need to be either
+     182                 :             :    * entirely reloaded or reset, respectively. */
+     183         [ +  + ]:          62 :   if (g_variant_lookup (changed_properties, "IsPresent", "b", &is_present))
+     184                 :             :     {
+     185                 :             :       /* An existing battery was physically inserted */
+     186   [ +  +  +  - ]:          15 :       if (!self->is_present && is_present)
+     187                 :             :         {
+     188                 :           1 :           valent_battery_load_properties (self);
+     189                 :           1 :           changed = TRUE;
+     190                 :             :         }
+     191                 :             : 
+     192                 :             :       /* An existing battery was physically removed */
+     193   [ +  -  +  + ]:          14 :       else if (self->is_present && !is_present)
+     194                 :             :         {
+     195                 :           1 :           self->current_charge = 0;
+     196                 :           1 :           self->is_charging = FALSE;
+     197                 :           1 :           self->is_present = FALSE;
+     198                 :           1 :           self->threshold_event = 0;
+     199                 :           1 :           changed = TRUE;
+     200                 :             :         }
+     201                 :             : 
+     202                 :           2 :       if (changed)
+     203                 :             :         {
+     204                 :           2 :           g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     205                 :           2 :           return;
+     206                 :             :         }
+     207                 :             :     }
+     208                 :             : 
+     209         [ +  + ]:          60 :   if (g_variant_lookup (changed_properties, "Percentage", "d", &percentage))
+     210                 :             :     {
+     211                 :          16 :       unsigned int current_charge = floor (percentage);
+     212                 :             : 
+     213         [ +  + ]:          16 :       if (self->current_charge != current_charge)
+     214                 :             :         {
+     215                 :           3 :           self->current_charge = current_charge;
+     216                 :           3 :           changed = TRUE;
+     217                 :             :         }
+     218                 :             :     }
+     219                 :             : 
+     220         [ +  + ]:          60 :   if (g_variant_lookup (changed_properties, "State", "u", &state))
+     221                 :             :     {
+     222         [ +  + ]:          16 :       gboolean is_charging = translate_state (state);
+     223                 :             : 
+     224         [ +  + ]:          16 :       if (self->is_charging != is_charging)
+     225                 :             :         {
+     226                 :           7 :           self->is_charging = is_charging;
+     227                 :           7 :           changed = TRUE;
+     228                 :             :         }
+     229                 :             :     }
+     230                 :             : 
+     231         [ +  + ]:          60 :   if (g_variant_lookup (changed_properties, "WarningLevel", "u", &warning_level))
+     232                 :             :     {
+     233         [ +  + ]:          15 :       unsigned int threshold_event = translate_warning_level (warning_level);
+     234                 :             : 
+     235         [ +  + ]:          15 :       if (self->threshold_event != threshold_event)
+     236                 :             :         {
+     237                 :           6 :           self->threshold_event = threshold_event;
+     238                 :           6 :           changed = TRUE;
+     239                 :             :         }
+     240                 :             :     }
+     241                 :             : 
+     242         [ +  + ]:          60 :   if (changed)
+     243                 :          16 :     g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     244                 :             : }
+     245                 :             : 
+     246                 :             : static void
+     247                 :           3 : g_dbus_proxy_new_for_bus_cb (GObject       *object,
+     248                 :             :                              GAsyncResult  *result,
+     249                 :             :                              ValentBattery *self)
+     250                 :             : {
+     251                 :           3 :   g_autoptr (GError) error = NULL;
+     252   [ -  +  -  - ]:           3 :   g_autoptr (GVariant) type = NULL;
+     253         [ -  - ]:           3 :   g_autoptr (GVariant) value = NULL;
+     254                 :             : 
+     255         [ -  + ]:           3 :   if ((self->proxy = g_dbus_proxy_new_for_bus_finish (result, &error)) == NULL)
+     256                 :             :     {
+     257                 :           0 :       g_warning ("%s: %s", G_OBJECT_TYPE_NAME (self), error->message);
+     258                 :           0 :       return;
+     259                 :             :     }
+     260                 :             : 
+     261   [ +  -  -  + ]:           6 :   if ((type = g_dbus_proxy_get_cached_property (self->proxy, "Type")) == NULL ||
+     262                 :           3 :       g_variant_get_uint32 (type) != UPOWER_KIND_BATTERY)
+     263                 :             :     {
+     264                 :           0 :       g_debug ("%s: not a battery", G_OBJECT_TYPE_NAME (self));
+     265         [ #  # ]:           0 :       return;
+     266                 :             :     }
+     267                 :             : 
+     268         [ +  - ]:           3 :   if ((value = g_dbus_proxy_get_cached_property (self->proxy, "IsPresent")) != NULL)
+     269                 :             :     {
+     270                 :           3 :       gboolean is_present = g_variant_get_boolean (value);
+     271                 :             : 
+     272         [ +  - ]:           3 :       if (is_present)
+     273                 :           3 :         valent_battery_load_properties (self);
+     274                 :             :     }
+     275                 :             : 
+     276                 :           3 :   g_signal_connect_object (self->proxy,
+     277                 :             :                            "g-properties-changed",
+     278                 :             :                            G_CALLBACK (on_properties_changed),
+     279                 :             :                            self, 0);
+     280         [ +  - ]:           3 :   g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     281                 :             : }
+     282                 :             : 
+     283                 :             : /*
+     284                 :             :  * GObject
+     285                 :             :  */
+     286                 :             : static void
+     287                 :           1 : valent_battery_dispose (GObject *object)
+     288                 :             : {
+     289                 :           1 :   ValentBattery *self = VALENT_BATTERY (object);
+     290                 :             : 
+     291                 :           1 :   g_cancellable_cancel (self->cancellable);
+     292                 :             : 
+     293                 :           1 :   G_OBJECT_CLASS (valent_battery_parent_class)->dispose (object);
+     294                 :           1 : }
+     295                 :             : 
+     296                 :             : static void
+     297                 :           1 : valent_battery_finalize (GObject *object)
+     298                 :             : {
+     299                 :           1 :   ValentBattery *self = VALENT_BATTERY (object);
+     300                 :             : 
+     301         [ +  - ]:           1 :   g_clear_object (&self->cancellable);
+     302         [ +  - ]:           1 :   g_clear_object (&self->proxy);
+     303                 :             : 
+     304                 :           1 :   G_OBJECT_CLASS (valent_battery_parent_class)->finalize (object);
+     305                 :           1 : }
+     306                 :             : 
+     307                 :             : static void
+     308                 :           3 : valent_battery_class_init (ValentBatteryClass *klass)
+     309                 :             : {
+     310                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     311                 :             : 
+     312                 :           3 :   object_class->dispose = valent_battery_dispose;
+     313                 :           3 :   object_class->finalize = valent_battery_finalize;
+     314                 :             : 
+     315                 :             :   /**
+     316                 :             :    * ValentBattery::changed:
+     317                 :             :    * @self: a `ValentBattery`
+     318                 :             :    *
+     319                 :             :    * `ValentBattery`::changed is emitted whenever a relevant property changes.
+     320                 :             :    */
+     321                 :           6 :   signals [CHANGED] =
+     322                 :           3 :     g_signal_new ("changed",
+     323                 :             :                   G_TYPE_FROM_CLASS (klass),
+     324                 :             :                   G_SIGNAL_RUN_LAST,
+     325                 :             :                   0,
+     326                 :             :                   NULL, NULL, NULL,
+     327                 :             :                   G_TYPE_NONE, 0);
+     328                 :           3 : }
+     329                 :             : 
+     330                 :             : static void
+     331                 :           3 : valent_battery_init (ValentBattery *self)
+     332                 :             : {
+     333                 :           3 :   self->cancellable = g_cancellable_new ();
+     334                 :           3 :   self->current_charge = 0;
+     335                 :           3 :   self->is_charging = FALSE;
+     336                 :           3 :   self->is_present = FALSE;
+     337                 :           3 :   self->threshold_event = 0;
+     338                 :             : 
+     339                 :           3 :   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+     340                 :             :                             G_DBUS_PROXY_FLAGS_NONE,
+     341                 :             :                             NULL,
+     342                 :             :                             "org.freedesktop.UPower",
+     343                 :             :                             "/org/freedesktop/UPower/devices/DisplayDevice",
+     344                 :             :                             "org.freedesktop.UPower.Device",
+     345                 :             :                             self->cancellable,
+     346                 :             :                             (GAsyncReadyCallback)g_dbus_proxy_new_for_bus_cb,
+     347                 :             :                             self);
+     348                 :           3 : }
+     349                 :             : 
+     350                 :             : /**
+     351                 :             :  * valent_battery_get_default:
+     352                 :             :  *
+     353                 :             :  * Get the default `ValentBattery`.
+     354                 :             :  *
+     355                 :             :  * Returns: (transfer none): The default `ValentBattery`
+     356                 :             :  */
+     357                 :             : ValentBattery *
+     358                 :           6 : valent_battery_get_default (void)
+     359                 :             : {
+     360         [ +  + ]:           6 :   if (default_battery == NULL)
+     361                 :             :     {
+     362                 :           3 :       default_battery = g_object_new (VALENT_TYPE_BATTERY, NULL);
+     363                 :             : 
+     364                 :           3 :       g_object_add_weak_pointer (G_OBJECT (default_battery),
+     365                 :             :                                  (gpointer) &default_battery);
+     366                 :             :     }
+     367                 :             : 
+     368                 :           6 :   return default_battery;
+     369                 :             : }
+     370                 :             : 
+     371                 :             : /**
+     372                 :             :  * valent_battery_current_charge:
+     373                 :             :  * @battery: a `ValentBattery`
+     374                 :             :  *
+     375                 :             :  * Get the charge level of @battery.
+     376                 :             :  *
+     377                 :             :  * The value returned by this method is a simplification of a UPower device
+     378                 :             :  * battery percentage, useful for KDE Connect clients.
+     379                 :             :  *
+     380                 :             :  * Returns: a charge percentage, or `0` if unavailable
+     381                 :             :  */
+     382                 :             : int
+     383                 :          22 : valent_battery_current_charge (ValentBattery *battery)
+     384                 :             : {
+     385         [ +  - ]:          22 :   g_return_val_if_fail (VALENT_IS_BATTERY (battery), 0);
+     386                 :             : 
+     387         [ +  + ]:          22 :   if (!battery->is_present)
+     388                 :             :     return 0;
+     389                 :             : 
+     390                 :          20 :   return battery->current_charge;
+     391                 :             : }
+     392                 :             : 
+     393                 :             : /**
+     394                 :             :  * valent_battery_is_charging:
+     395                 :             :  * @battery: a `ValentBattery`
+     396                 :             :  *
+     397                 :             :  * Get whether the battery is charging.
+     398                 :             :  *
+     399                 :             :  * The value returned by this method is a simplification of a UPower device
+     400                 :             :  * state to a value useful for KDE Connect clients.
+     401                 :             :  *
+     402                 :             :  * Returns: %TRUE if the battery is charging
+     403                 :             :  */
+     404                 :             : gboolean
+     405                 :          18 : valent_battery_is_charging (ValentBattery *battery)
+     406                 :             : {
+     407         [ +  - ]:          18 :   g_return_val_if_fail (VALENT_IS_BATTERY (battery), FALSE);
+     408                 :             : 
+     409                 :          18 :   return battery->is_charging;
+     410                 :             : }
+     411                 :             : 
+     412                 :             : /**
+     413                 :             :  * valent_battery_is_present:
+     414                 :             :  * @battery: a `ValentBattery`
+     415                 :             :  *
+     416                 :             :  * Get whether the battery is present.
+     417                 :             :  *
+     418                 :             :  * Returns: %TRUE if the battery is present, %FALSE otherwise
+     419                 :             :  */
+     420                 :             : gboolean
+     421                 :          14 : valent_battery_is_present (ValentBattery *battery)
+     422                 :             : {
+     423         [ +  - ]:          14 :   g_return_val_if_fail (VALENT_IS_BATTERY (battery), FALSE);
+     424                 :             : 
+     425                 :          14 :   return battery->is_present;
+     426                 :             : }
+     427                 :             : 
+     428                 :             : /**
+     429                 :             :  * valent_battery_is_charging:
+     430                 :             :  * @battery: a `ValentBattery`
+     431                 :             :  *
+     432                 :             :  * Get whether the battery is charging.
+     433                 :             :  *
+     434                 :             :  * The value returned by this method is a simplification of a UPower device
+     435                 :             :  * level to a value useful for KDE Connect clients.
+     436                 :             :  *
+     437                 :             :  * Returns: `1` if the level is below the threshold, `0` otherwise
+     438                 :             :  */
+     439                 :             : unsigned int
+     440                 :          17 : valent_battery_threshold_event (ValentBattery *battery)
+     441                 :             : {
+     442         [ +  - ]:          17 :   g_return_val_if_fail (VALENT_IS_BATTERY (battery), FALSE);
+     443                 :             : 
+     444                 :          17 :   return battery->threshold_event;
+     445                 :             : }
+     446                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery.h.func-c.html b/coverage/src/plugins/battery/valent-battery.h.func-c.html new file mode 100644 index 00000000000..484a4ecdc37 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_BATTERY147
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery.h.func.html b/coverage/src/plugins/battery/valent-battery.h.func.html new file mode 100644 index 00000000000..3415b54eb07 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_BATTERY147
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/battery/valent-battery.h.gcov.html b/coverage/src/plugins/battery/valent-battery.h.gcov.html new file mode 100644 index 00000000000..03ffa5871b7 --- /dev/null +++ b/coverage/src/plugins/battery/valent-battery.h.gcov.html @@ -0,0 +1,114 @@ + + + + + + + LCOV - Code Coverage - src/plugins/battery/valent-battery.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/battery - valent-battery.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_BATTERY (valent_battery_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :         148 : G_DECLARE_FINAL_TYPE (ValentBattery, valent_battery, VALENT, BATTERY, GObject)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentBattery * valent_battery_get_default     (void);
+      15                 :             : int             valent_battery_current_charge  (ValentBattery *battery);
+      16                 :             : gboolean        valent_battery_is_charging     (ValentBattery *battery);
+      17                 :             : gboolean        valent_battery_is_present      (ValentBattery *battery);
+      18                 :             : unsigned int    valent_battery_threshold_event (ValentBattery *battery);
+      19                 :             : 
+      20                 :             : G_END_DECLS
+      21                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/clipboard-plugin.c.func-c.html b/coverage/src/plugins/clipboard/clipboard-plugin.c.func-c.html new file mode 100644 index 00000000000..ad1a9b847b8 --- /dev/null +++ b/coverage/src/plugins/clipboard/clipboard-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/clipboard-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - clipboard-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/clipboard-plugin.c.func.html b/coverage/src/plugins/clipboard/clipboard-plugin.c.func.html new file mode 100644 index 00000000000..b53f2b564fd --- /dev/null +++ b/coverage/src/plugins/clipboard/clipboard-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/clipboard-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - clipboard-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/clipboard-plugin.c.gcov.html b/coverage/src/plugins/clipboard/clipboard-plugin.c.gcov.html new file mode 100644 index 00000000000..b91907e2a1d --- /dev/null +++ b/coverage/src/plugins/clipboard/clipboard-plugin.c.gcov.html @@ -0,0 +1,114 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/clipboard-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - clipboard-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-clipboard-plugin.h"
+      10                 :             : #include "valent-clipboard-preferences.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_clipboard_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_CLIPBOARD_PLUGIN);
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      21                 :             :                                               VALENT_TYPE_CLIPBOARD_PREFERENCES);
+      22                 :           2 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-detail-sort-b.html b/coverage/src/plugins/clipboard/index-detail-sort-b.html new file mode 100644 index 00000000000..e8b6043cd65 --- /dev/null +++ b/coverage/src/plugins/clipboard/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-detail-sort-f.html b/coverage/src/plugins/clipboard/index-detail-sort-f.html new file mode 100644 index 00000000000..c742945c5fc --- /dev/null +++ b/coverage/src/plugins/clipboard/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-detail-sort-l.html b/coverage/src/plugins/clipboard/index-detail-sort-l.html new file mode 100644 index 00000000000..c039c34b358 --- /dev/null +++ b/coverage/src/plugins/clipboard/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-detail.html b/coverage/src/plugins/clipboard/index-detail.html new file mode 100644 index 00000000000..6b4778fbcad --- /dev/null +++ b/coverage/src/plugins/clipboard/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-sort-b.html b/coverage/src/plugins/clipboard/index-sort-b.html new file mode 100644 index 00000000000..e8b6043cd65 --- /dev/null +++ b/coverage/src/plugins/clipboard/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-sort-f.html b/coverage/src/plugins/clipboard/index-sort-f.html new file mode 100644 index 00000000000..c742945c5fc --- /dev/null +++ b/coverage/src/plugins/clipboard/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index-sort-l.html b/coverage/src/plugins/clipboard/index-sort-l.html new file mode 100644 index 00000000000..c039c34b358 --- /dev/null +++ b/coverage/src/plugins/clipboard/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/index.html b/coverage/src/plugins/clipboard/index.html new file mode 100644 index 00000000000..6b4778fbcad --- /dev/null +++ b/coverage/src/plugins/clipboard/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboardCoverageTotalHit
Test:Code CoverageLines:90.3 %236213
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:52.9 %17492
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
clipboard-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-clipboard-plugin.c +
88.6%88.6%
+
88.6 %20217952.4 %16486100.0 %2121
valent-clipboard-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-clipboard-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.func-c.html b/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.func-c.html new file mode 100644 index 00000000000..06b27539bf2 --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.func-c.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.6 %202179
Test Date:2024-03-31 18:46:36Functions:100.0 %2121
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:52.4 %16486
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
clipboard_pull_action1
clipboard_push_action1
on_auto_pull_changed2
on_auto_push_changed2
valent_clipboard_plugin_clipboard2
valent_clipboard_plugin_handle_clipboard2
valent_clipboard_plugin_handle_clipboard_connect2
valent_clipboard_plugin_clipboard_connect3
valent_clipboard_read_text_connect_cb3
valent_clipboard_write_text_cb3
valent_clipboard_plugin_handle_packet4
valent_clipboard_read_text_cb4
on_clipboard_changed5
valent_clipboard_plugin_constructed5
valent_clipboard_plugin_finalize5
valent_clipboard_plugin_init5
valent_clipboard_plugin_destroy10
valent_clipboard_plugin_update_state16
valent_clipboard_plugin_get_type49
valent_clipboard_plugin_class_intern_init2
valent_clipboard_plugin_get_type_once2
valent_clipboard_plugin_get_type45
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.func.html b/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.func.html new file mode 100644 index 00000000000..939f4dfd3f5 --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.func.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.6 %202179
Test Date:2024-03-31 18:46:36Functions:100.0 %2121
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:52.4 %16486
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
clipboard_pull_action1
clipboard_push_action1
on_auto_pull_changed2
on_auto_push_changed2
on_clipboard_changed5
valent_clipboard_plugin_clipboard2
valent_clipboard_plugin_clipboard_connect3
valent_clipboard_plugin_constructed5
valent_clipboard_plugin_destroy10
valent_clipboard_plugin_finalize5
valent_clipboard_plugin_get_type49
valent_clipboard_plugin_class_intern_init2
valent_clipboard_plugin_get_type45
valent_clipboard_plugin_get_type_once2
valent_clipboard_plugin_handle_clipboard2
valent_clipboard_plugin_handle_clipboard_connect2
valent_clipboard_plugin_handle_packet4
valent_clipboard_plugin_init5
valent_clipboard_plugin_update_state16
valent_clipboard_read_text_cb4
valent_clipboard_read_text_connect_cb3
valent_clipboard_write_text_cb3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.gcov.html b/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.gcov.html new file mode 100644 index 00000000000..bd15c09cb8d --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-plugin.c.gcov.html @@ -0,0 +1,597 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.6 %202179
Test Date:2024-03-31 18:46:36Functions:100.0 %2121
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:52.4 %16486
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-clipboard-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-clipboard-plugin.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentClipboardPlugin
+      16                 :             : {
+      17                 :             :   ValentDevicePlugin  parent_instance;
+      18                 :             : 
+      19                 :             :   ValentClipboard    *clipboard;
+      20                 :             :   unsigned long       changed_id;
+      21                 :             : 
+      22                 :             :   char               *remote_text;
+      23                 :             :   int64_t             remote_timestamp;
+      24                 :             :   int64_t             local_timestamp;
+      25                 :             :   unsigned int        auto_pull : 1;
+      26                 :             :   unsigned int        auto_push : 1;
+      27                 :             : };
+      28                 :             : 
+      29   [ +  +  +  - ]:          49 : G_DEFINE_FINAL_TYPE (ValentClipboardPlugin, valent_clipboard_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      30                 :             : 
+      31                 :             : 
+      32                 :             : /*
+      33                 :             :  * Local Clipboard
+      34                 :             :  */
+      35                 :             : static void
+      36                 :           2 : valent_clipboard_plugin_clipboard (ValentClipboardPlugin *self,
+      37                 :             :                                    const char            *content)
+      38                 :             : {
+      39                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+      40   [ -  +  -  - ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+      41                 :             : 
+      42         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_CLIPBOARD_PLUGIN (self));
+      43                 :             : 
+      44         [ +  - ]:           2 :   if (content == NULL)
+      45                 :             :     return;
+      46                 :             : 
+      47                 :           2 :   valent_packet_init (&builder, "kdeconnect.clipboard");
+      48                 :           2 :   json_builder_set_member_name (builder, "content");
+      49                 :           2 :   json_builder_add_string_value (builder, content);
+      50                 :           2 :   packet = valent_packet_end (&builder);
+      51                 :             : 
+      52         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      53                 :             : }
+      54                 :             : 
+      55                 :             : static void
+      56                 :           3 : valent_clipboard_plugin_clipboard_connect (ValentClipboardPlugin *self,
+      57                 :             :                                            const char            *content,
+      58                 :             :                                            int64_t                timestamp)
+      59                 :             : {
+      60                 :           3 :   g_autoptr (JsonBuilder) builder = NULL;
+      61   [ -  +  -  - ]:           3 :   g_autoptr (JsonNode) packet = NULL;
+      62                 :             : 
+      63         [ +  - ]:           3 :   g_return_if_fail (VALENT_IS_CLIPBOARD_PLUGIN (self));
+      64                 :             : 
+      65         [ +  - ]:           3 :   if (content == NULL)
+      66                 :             :     return;
+      67                 :             : 
+      68                 :           3 :   valent_packet_init (&builder, "kdeconnect.clipboard.connect");
+      69                 :           3 :   json_builder_set_member_name (builder, "content");
+      70                 :           3 :   json_builder_add_string_value (builder, content);
+      71                 :           3 :   json_builder_set_member_name (builder, "timestamp");
+      72                 :           3 :   json_builder_add_int_value (builder, timestamp);
+      73                 :           3 :   packet = valent_packet_end (&builder);
+      74                 :             : 
+      75         [ +  - ]:           3 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      76                 :             : }
+      77                 :             : 
+      78                 :             : static void
+      79                 :           4 : valent_clipboard_read_text_cb (ValentClipboard       *clipboard,
+      80                 :             :                                GAsyncResult          *result,
+      81                 :             :                                ValentClipboardPlugin *self)
+      82                 :             : {
+      83                 :           4 :   g_autoptr (GError) error = NULL;
+      84   [ -  +  -  + ]:           4 :   g_autofree char *text = NULL;
+      85                 :             : 
+      86         [ +  - ]:           4 :   g_assert (VALENT_IS_CLIPBOARD (clipboard));
+      87         [ -  + ]:           4 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+      88                 :             : 
+      89                 :           4 :   text = valent_clipboard_read_text_finish (clipboard, result, &error);
+      90                 :             : 
+      91         [ -  + ]:           4 :   if (error != NULL)
+      92                 :             :     {
+      93         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+      94                 :           0 :         g_debug ("%s(): %s", G_STRFUNC, error->message);
+      95                 :             : 
+      96                 :           0 :       return;
+      97                 :             :     }
+      98                 :             : 
+      99                 :             :   /* Skip if the local clipboard is empty, or already synced with the device */
+     100   [ +  -  +  + ]:           4 :   if (text == NULL || g_strcmp0 (self->remote_text, text) == 0)
+     101                 :           2 :     return;
+     102                 :             : 
+     103                 :           2 :   valent_clipboard_plugin_clipboard (self, text);
+     104                 :             : }
+     105                 :             : 
+     106                 :             : static void
+     107                 :           3 : valent_clipboard_read_text_connect_cb (ValentClipboard       *clipboard,
+     108                 :             :                                        GAsyncResult          *result,
+     109                 :             :                                        ValentClipboardPlugin *self)
+     110                 :             : {
+     111                 :           3 :   g_autofree char *text = NULL;
+     112                 :           3 :   g_autoptr (GError) error = NULL;
+     113                 :             : 
+     114         [ +  - ]:           3 :   g_assert (VALENT_IS_CLIPBOARD (clipboard));
+     115         [ -  + ]:           3 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     116                 :             : 
+     117                 :           3 :   text = valent_clipboard_read_text_finish (clipboard, result, &error);
+     118                 :             : 
+     119         [ -  + ]:           3 :   if (error != NULL)
+     120                 :             :     {
+     121         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     122                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     123                 :             : 
+     124                 :           0 :       return;
+     125                 :             :     }
+     126                 :             : 
+     127         [ +  - ]:           3 :   if (text == NULL)
+     128                 :             :     return;
+     129                 :             : 
+     130         [ -  + ]:           3 :   valent_clipboard_plugin_clipboard_connect (self, text, self->local_timestamp);
+     131                 :             : }
+     132                 :             : 
+     133                 :             : static void
+     134                 :           3 : valent_clipboard_write_text_cb (ValentClipboard *clipboard,
+     135                 :             :                                 GAsyncResult    *result,
+     136                 :             :                                 gpointer         user_data)
+     137                 :             : {
+     138                 :           6 :   g_autoptr (GError) error = NULL;
+     139                 :             : 
+     140         [ +  - ]:           3 :   g_assert (VALENT_IS_CLIPBOARD (clipboard));
+     141                 :             : 
+     142   [ -  +  -  - ]:           3 :   if (!valent_clipboard_write_text_finish (clipboard, result, &error) &&
+     143                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     144                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     145                 :           3 : }
+     146                 :             : 
+     147                 :             : static void
+     148                 :           2 : on_auto_pull_changed (GSettings             *settings,
+     149                 :             :                       const char            *key,
+     150                 :             :                       ValentClipboardPlugin *self)
+     151                 :             : {
+     152                 :           2 :   ValentDevice *device;
+     153                 :           2 :   ValentDeviceState state;
+     154                 :           4 :   g_autoptr (GCancellable) destroy = NULL;
+     155                 :             : 
+     156   [ +  -  +  -  :           2 :   g_assert (G_IS_SETTINGS (settings));
+             -  +  -  - ]
+     157         [ -  + ]:           2 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     158                 :             : 
+     159                 :           2 :   self->auto_pull = g_settings_get_boolean (settings, "auto-pull");
+     160                 :             : 
+     161         [ +  + ]:           2 :   if (!self->auto_pull)
+     162                 :             :     return;
+     163                 :             : 
+     164                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     165                 :           1 :   state = valent_device_get_state (device);
+     166                 :             : 
+     167         [ -  + ]:           1 :   if ((state & VALENT_DEVICE_STATE_CONNECTED) != 0 ||
+     168                 :             :       (state & VALENT_DEVICE_STATE_PAIRED) != 0)
+     169                 :             :     return;
+     170                 :             : 
+     171                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     172         [ #  # ]:           0 :   valent_clipboard_write_text (self->clipboard,
+     173                 :           0 :                                self->remote_text,
+     174                 :             :                                destroy,
+     175                 :             :                                (GAsyncReadyCallback)valent_clipboard_write_text_cb,
+     176                 :             :                                NULL);
+     177                 :             : }
+     178                 :             : 
+     179                 :             : static void
+     180                 :           2 : on_auto_push_changed (GSettings             *settings,
+     181                 :             :                       const char            *key,
+     182                 :             :                       ValentClipboardPlugin *self)
+     183                 :             : {
+     184                 :           2 :   ValentDevice *device;
+     185                 :           2 :   ValentDeviceState state;
+     186                 :           4 :   g_autoptr (GCancellable) destroy = NULL;
+     187                 :             : 
+     188   [ +  -  +  -  :           2 :   g_assert (G_IS_SETTINGS (settings));
+             -  +  -  - ]
+     189         [ -  + ]:           2 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     190                 :             : 
+     191                 :           2 :   self->auto_push = g_settings_get_boolean (settings, "auto-push");
+     192                 :             : 
+     193         [ +  + ]:           2 :   if (!self->auto_push)
+     194                 :             :     return;
+     195                 :             : 
+     196                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     197                 :           1 :   state = valent_device_get_state (device);
+     198                 :             : 
+     199         [ -  + ]:           1 :   if ((state & VALENT_DEVICE_STATE_CONNECTED) != 0 ||
+     200                 :             :       (state & VALENT_DEVICE_STATE_PAIRED) != 0)
+     201                 :             :     return;
+     202                 :             : 
+     203                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     204         [ #  # ]:           0 :   valent_clipboard_read_text (valent_clipboard_get_default (),
+     205                 :             :                               destroy,
+     206                 :             :                               (GAsyncReadyCallback)valent_clipboard_read_text_cb,
+     207                 :             :                               self);
+     208                 :             : 
+     209                 :             : }
+     210                 :             : 
+     211                 :             : static void
+     212                 :           5 : on_clipboard_changed (ValentClipboard       *clipboard,
+     213                 :             :                       ValentClipboardPlugin *self)
+     214                 :             : {
+     215                 :          10 :   g_autoptr (GCancellable) destroy = NULL;
+     216                 :             : 
+     217         [ +  - ]:           5 :   g_assert (VALENT_IS_CLIPBOARD (clipboard));
+     218         [ -  + ]:           5 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     219                 :             : 
+     220                 :           5 :   self->local_timestamp = valent_clipboard_get_timestamp (clipboard);
+     221                 :             : 
+     222         [ +  + ]:           5 :   if (!self->auto_push)
+     223                 :             :     return;
+     224                 :             : 
+     225                 :           3 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     226         [ +  - ]:           3 :   valent_clipboard_read_text (clipboard,
+     227                 :             :                               destroy,
+     228                 :             :                               (GAsyncReadyCallback)valent_clipboard_read_text_cb,
+     229                 :             :                               self);
+     230                 :             : }
+     231                 :             : 
+     232                 :             : /*
+     233                 :             :  * Remote Clipboard
+     234                 :             :  */
+     235                 :             : static void
+     236                 :           2 : valent_clipboard_plugin_handle_clipboard (ValentClipboardPlugin *self,
+     237                 :             :                                           JsonNode              *packet)
+     238                 :             : {
+     239                 :           2 :   const char *content;
+     240                 :           2 :   g_autoptr (GCancellable) destroy = NULL;
+     241                 :             : 
+     242         [ +  - ]:           2 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     243         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     244                 :             : 
+     245         [ -  + ]:           2 :   if (!valent_packet_get_string (packet, "content", &content))
+     246                 :             :     {
+     247                 :           0 :       g_debug ("%s(): expected \"content\" field holding a string",
+     248                 :             :                G_STRFUNC);
+     249                 :           0 :       return;
+     250                 :             :     }
+     251                 :             : 
+     252                 :             :   /* The remote clipboard content is cached, for manual control over syncing,
+     253                 :             :    * because there is no packet type for requesting it on-demand. */
+     254                 :           2 :   g_set_str (&self->remote_text, content);
+     255                 :           2 :   self->remote_timestamp = valent_timestamp_ms ();
+     256                 :             : 
+     257         [ +  + ]:           2 :   if (!self->auto_pull)
+     258                 :             :     return;
+     259                 :             : 
+     260                 :           1 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     261         [ +  - ]:           1 :   valent_clipboard_write_text (self->clipboard,
+     262                 :           1 :                                self->remote_text,
+     263                 :             :                                destroy,
+     264                 :             :                                (GAsyncReadyCallback)valent_clipboard_write_text_cb,
+     265                 :             :                                NULL);
+     266                 :             : }
+     267                 :             : 
+     268                 :             : static void
+     269                 :           2 : valent_clipboard_plugin_handle_clipboard_connect (ValentClipboardPlugin *self,
+     270                 :             :                                                   JsonNode              *packet)
+     271                 :             : {
+     272                 :           2 :   int64_t timestamp;
+     273                 :           2 :   const char *content;
+     274                 :           2 :   g_autoptr (GCancellable) destroy = NULL;
+     275                 :             : 
+     276         [ +  - ]:           2 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     277         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     278                 :             : 
+     279         [ -  + ]:           2 :   if (!valent_packet_get_int (packet, "timestamp", &timestamp))
+     280                 :             :     {
+     281                 :           0 :       g_debug ("%s(): expected \"timestamp\" field holding an integer",
+     282                 :             :                G_STRFUNC);
+     283                 :           0 :       return;
+     284                 :             :     }
+     285                 :             : 
+     286         [ -  + ]:           2 :   if (!valent_packet_get_string (packet, "content", &content))
+     287                 :             :     {
+     288                 :           0 :       g_debug ("%s(): expected \"content\" field holding a string",
+     289                 :             :                G_STRFUNC);
+     290                 :           0 :       return;
+     291                 :             :     }
+     292                 :             : 
+     293                 :             :   /* The remote clipboard content is cached, for manual control over syncing,
+     294                 :             :    * because there is no packet type for requesting it on-demand. */
+     295         [ +  + ]:           2 :   g_clear_pointer (&self->remote_text, g_free);
+     296         [ -  + ]:           2 :   self->remote_text = g_strdup (content);
+     297                 :           2 :   self->remote_timestamp = timestamp;
+     298                 :             : 
+     299         [ +  + ]:           2 :   if (self->remote_timestamp <= self->local_timestamp)
+     300                 :             :     return;
+     301                 :             : 
+     302         [ +  - ]:           1 :   if (!self->auto_pull)
+     303                 :             :     return;
+     304                 :             : 
+     305                 :           1 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     306         [ +  - ]:           1 :   valent_clipboard_write_text (self->clipboard,
+     307                 :           1 :                                self->remote_text,
+     308                 :             :                                destroy,
+     309                 :             :                                (GAsyncReadyCallback)valent_clipboard_write_text_cb,
+     310                 :             :                                NULL);
+     311                 :             : }
+     312                 :             : 
+     313                 :             : /*
+     314                 :             :  * GActions
+     315                 :             :  */
+     316                 :             : static void
+     317                 :           1 : clipboard_pull_action (GSimpleAction *action,
+     318                 :             :                        GVariant      *parameter,
+     319                 :             :                        gpointer       user_data)
+     320                 :             : {
+     321                 :           1 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (user_data);
+     322                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     323                 :             : 
+     324         [ +  - ]:           1 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     325                 :             : 
+     326   [ +  -  -  + ]:           1 :   if (self->remote_text == NULL || *self->remote_text == '\0')
+     327                 :             :     {
+     328                 :           0 :       g_debug ("%s(): remote clipboard empty", G_STRFUNC);
+     329                 :           0 :       return;
+     330                 :             :     }
+     331                 :             : 
+     332                 :           1 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     333         [ +  - ]:           1 :   valent_clipboard_write_text (self->clipboard,
+     334                 :           1 :                                self->remote_text,
+     335                 :             :                                destroy,
+     336                 :             :                                (GAsyncReadyCallback)valent_clipboard_write_text_cb,
+     337                 :             :                                NULL);
+     338                 :             : }
+     339                 :             : 
+     340                 :             : static void
+     341                 :           1 : clipboard_push_action (GSimpleAction *action,
+     342                 :             :                        GVariant      *parameter,
+     343                 :             :                        gpointer       user_data)
+     344                 :             : {
+     345                 :           1 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (user_data);
+     346                 :           2 :   g_autoptr (GCancellable) destroy = NULL;
+     347                 :             : 
+     348         [ +  - ]:           1 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     349                 :             : 
+     350                 :           1 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     351         [ +  - ]:           1 :   valent_clipboard_read_text (valent_clipboard_get_default (),
+     352                 :             :                               destroy,
+     353                 :             :                               (GAsyncReadyCallback)valent_clipboard_read_text_cb,
+     354                 :             :                               self);
+     355                 :           1 : }
+     356                 :             : 
+     357                 :             : static const GActionEntry actions[] = {
+     358                 :             :     {"pull", clipboard_pull_action, NULL, NULL, NULL},
+     359                 :             :     {"push", clipboard_push_action, NULL, NULL, NULL}
+     360                 :             : };
+     361                 :             : 
+     362                 :             : /*
+     363                 :             :  * ValentDevicePlugin
+     364                 :             :  */
+     365                 :             : static void
+     366                 :          16 : valent_clipboard_plugin_update_state (ValentDevicePlugin *plugin,
+     367                 :             :                                       ValentDeviceState   state)
+     368                 :             : {
+     369                 :          16 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (plugin);
+     370                 :          16 :   gboolean available;
+     371                 :             : 
+     372         [ +  - ]:          16 :   g_assert (VALENT_IS_CLIPBOARD_PLUGIN (self));
+     373                 :             : 
+     374                 :          16 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     375                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     376                 :             : 
+     377                 :          16 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     378                 :             : 
+     379         [ +  + ]:          16 :   if (available)
+     380                 :             :     {
+     381         [ +  - ]:           5 :       if (self->changed_id == 0)
+     382                 :           5 :         self->changed_id = g_signal_connect (self->clipboard,
+     383                 :             :                                              "changed",
+     384                 :             :                                              G_CALLBACK (on_clipboard_changed),
+     385                 :             :                                              self);
+     386                 :             : 
+     387         [ +  + ]:           5 :       if (self->auto_push)
+     388                 :             :         {
+     389                 :          19 :           g_autoptr (GCancellable) destroy = NULL;
+     390                 :             : 
+     391                 :           3 :           destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     392         [ +  - ]:           3 :           valent_clipboard_read_text (self->clipboard,
+     393                 :             :                                       destroy,
+     394                 :             :                                       (GAsyncReadyCallback)valent_clipboard_read_text_connect_cb,
+     395                 :             :                                       self);
+     396                 :             :         }
+     397                 :             :     }
+     398                 :             :   else
+     399                 :             :     {
+     400         [ +  + ]:          11 :       g_clear_signal_handler (&self->changed_id, self->clipboard);
+     401                 :             :     }
+     402                 :          16 : }
+     403                 :             : 
+     404                 :             : static void
+     405                 :           4 : valent_clipboard_plugin_handle_packet (ValentDevicePlugin *plugin,
+     406                 :             :                                        const char         *type,
+     407                 :             :                                        JsonNode           *packet)
+     408                 :             : {
+     409                 :           4 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (plugin);
+     410                 :             : 
+     411         [ +  - ]:           4 :   g_assert (VALENT_IS_DEVICE_PLUGIN (plugin));
+     412         [ -  + ]:           4 :   g_assert (type != NULL);
+     413         [ -  + ]:           4 :   g_assert (VALENT_IS_PACKET (packet));
+     414                 :             : 
+     415                 :             :   /* The remote clipboard content changed */
+     416         [ +  + ]:           4 :   if (g_str_equal (type, "kdeconnect.clipboard"))
+     417                 :           2 :     valent_clipboard_plugin_handle_clipboard (self, packet);
+     418                 :             : 
+     419         [ +  - ]:           2 :   else if (g_str_equal (type, "kdeconnect.clipboard.connect"))
+     420                 :           2 :     valent_clipboard_plugin_handle_clipboard_connect (self, packet);
+     421                 :             : 
+     422                 :             :   else
+     423                 :           0 :     g_assert_not_reached ();
+     424                 :           4 : }
+     425                 :             : 
+     426                 :             : /*
+     427                 :             :  * ValentObject
+     428                 :             :  */
+     429                 :             : static void
+     430                 :          10 : valent_clipboard_plugin_destroy (ValentObject *object)
+     431                 :             : {
+     432                 :          10 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (object);
+     433                 :             : 
+     434         [ -  + ]:          10 :   g_clear_signal_handler (&self->changed_id, self->clipboard);
+     435                 :             : 
+     436                 :          10 :   VALENT_OBJECT_CLASS (valent_clipboard_plugin_parent_class)->destroy (object);
+     437                 :          10 : }
+     438                 :             : 
+     439                 :             : /*
+     440                 :             :  * GObject
+     441                 :             :  */
+     442                 :             : static void
+     443                 :           5 : valent_clipboard_plugin_constructed (GObject *object)
+     444                 :             : {
+     445                 :           5 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (object);
+     446                 :           5 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     447                 :           5 :   GSettings *settings = NULL;
+     448                 :             : 
+     449                 :           5 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     450                 :             :                                    actions,
+     451                 :             :                                    G_N_ELEMENTS (actions),
+     452                 :             :                                    plugin);
+     453                 :             : 
+     454                 :           5 :   settings = valent_extension_get_settings (VALENT_EXTENSION (plugin));
+     455                 :           5 :   self->auto_pull = g_settings_get_boolean (settings, "auto-pull");
+     456                 :           5 :   g_signal_connect_object (settings,
+     457                 :             :                            "changed::auto-pull",
+     458                 :             :                            G_CALLBACK (on_auto_pull_changed),
+     459                 :             :                            self, 0);
+     460                 :             : 
+     461                 :           5 :   self->auto_push = g_settings_get_boolean (settings, "auto-push");
+     462                 :           5 :   g_signal_connect_object (settings,
+     463                 :             :                            "changed::auto-push",
+     464                 :             :                            G_CALLBACK (on_auto_push_changed),
+     465                 :             :                            self, 0);
+     466                 :             : 
+     467                 :           5 :   self->clipboard = valent_clipboard_get_default ();
+     468                 :           5 :   self->local_timestamp = valent_clipboard_get_timestamp (self->clipboard);
+     469                 :             : 
+     470                 :           5 :   G_OBJECT_CLASS (valent_clipboard_plugin_parent_class)->constructed (object);
+     471                 :           5 : }
+     472                 :             : 
+     473                 :             : static void
+     474                 :           5 : valent_clipboard_plugin_finalize (GObject *object)
+     475                 :             : {
+     476                 :           5 :   ValentClipboardPlugin *self = VALENT_CLIPBOARD_PLUGIN (object);
+     477                 :             : 
+     478         [ +  + ]:           5 :   g_clear_pointer (&self->remote_text, g_free);
+     479                 :             : 
+     480                 :           5 :   G_OBJECT_CLASS (valent_clipboard_plugin_parent_class)->finalize (object);
+     481                 :           5 : }
+     482                 :             : 
+     483                 :             : static void
+     484                 :           2 : valent_clipboard_plugin_class_init (ValentClipboardPluginClass *klass)
+     485                 :             : {
+     486                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     487                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     488                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     489                 :             : 
+     490                 :           2 :   object_class->constructed = valent_clipboard_plugin_constructed;
+     491                 :           2 :   object_class->finalize = valent_clipboard_plugin_finalize;
+     492                 :             : 
+     493                 :           2 :   vobject_class->destroy = valent_clipboard_plugin_destroy;
+     494                 :             : 
+     495                 :           2 :   plugin_class->handle_packet = valent_clipboard_plugin_handle_packet;
+     496                 :           2 :   plugin_class->update_state = valent_clipboard_plugin_update_state;
+     497                 :             : }
+     498                 :             : 
+     499                 :             : static void
+     500                 :           5 : valent_clipboard_plugin_init (ValentClipboardPlugin *self)
+     501                 :             : {
+     502                 :           5 : }
+     503                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.func-c.html b/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.func-c.html new file mode 100644 index 00000000000..24de15d48c8 --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CLIPBOARD_PLUGIN43
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.func.html b/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.func.html new file mode 100644 index 00000000000..81d1a8bc912 --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CLIPBOARD_PLUGIN43
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.gcov.html b/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.gcov.html new file mode 100644 index 00000000000..0c1f40fff77 --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_CLIPBOARD_PLUGIN (valent_clipboard_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          43 : G_DECLARE_FINAL_TYPE (ValentClipboardPlugin, valent_clipboard_plugin, VALENT, CLIPBOARD_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.func-c.html b/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.func-c.html new file mode 100644 index 00000000000..047714518b9 --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2929
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_preferences_constructed1
valent_clipboard_preferences_dispose1
valent_clipboard_preferences_init1
valent_clipboard_preferences_class_init2
valent_clipboard_preferences_get_type7
valent_clipboard_preferences_class_intern_init2
valent_clipboard_preferences_get_type_once2
valent_clipboard_preferences_get_type3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.func.html b/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.func.html new file mode 100644 index 00000000000..a925ed380df --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2929
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_clipboard_preferences_class_init2
valent_clipboard_preferences_constructed1
valent_clipboard_preferences_dispose1
valent_clipboard_preferences_get_type7
valent_clipboard_preferences_class_intern_init2
valent_clipboard_preferences_get_type3
valent_clipboard_preferences_get_type_once2
valent_clipboard_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.gcov.html b/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.gcov.html new file mode 100644 index 00000000000..ec74bf5ed2a --- /dev/null +++ b/coverage/src/plugins/clipboard/valent-clipboard-preferences.c.gcov.html @@ -0,0 +1,170 @@ + + + + + + + LCOV - Code Coverage - src/plugins/clipboard/valent-clipboard-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/clipboard - valent-clipboard-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2929
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-clipboard-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-clipboard-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentClipboardPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   GtkSwitch                    *sync_pull;
+      22                 :             :   GtkSwitch                    *sync_push;
+      23                 :             : };
+      24                 :             : 
+      25   [ +  +  +  - ]:           7 : G_DEFINE_FINAL_TYPE (ValentClipboardPreferences, valent_clipboard_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      26                 :             : 
+      27                 :             : 
+      28                 :             : /*
+      29                 :             :  * GObject
+      30                 :             :  */
+      31                 :             : static void
+      32                 :           1 : valent_clipboard_preferences_constructed (GObject *object)
+      33                 :             : {
+      34                 :           1 :   ValentClipboardPreferences *self = VALENT_CLIPBOARD_PREFERENCES (object);
+      35                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      36                 :           1 :   GSettings *settings;
+      37                 :             : 
+      38                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+      39                 :           1 :   g_settings_bind (settings,        "auto-pull",
+      40                 :           1 :                    self->sync_pull, "active",
+      41                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      42                 :           1 :   g_settings_bind (settings,        "auto-push",
+      43                 :           1 :                    self->sync_push, "active",
+      44                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      45                 :             : 
+      46                 :           1 :   G_OBJECT_CLASS (valent_clipboard_preferences_parent_class)->constructed (object);
+      47                 :           1 : }
+      48                 :             : 
+      49                 :             : static void
+      50                 :           1 : valent_clipboard_preferences_dispose (GObject *object)
+      51                 :             : {
+      52                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+      53                 :             : 
+      54                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_CLIPBOARD_PREFERENCES);
+      55                 :             : 
+      56                 :           1 :   G_OBJECT_CLASS (valent_clipboard_preferences_parent_class)->dispose (object);
+      57                 :           1 : }
+      58                 :             : 
+      59                 :             : static void
+      60                 :           2 : valent_clipboard_preferences_class_init (ValentClipboardPreferencesClass *klass)
+      61                 :             : {
+      62                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      63                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+      64                 :             : 
+      65                 :           2 :   object_class->constructed = valent_clipboard_preferences_constructed;
+      66                 :           2 :   object_class->dispose = valent_clipboard_preferences_dispose;
+      67                 :             : 
+      68                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/clipboard/valent-clipboard-preferences.ui");
+      69                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentClipboardPreferences, sync_pull);
+      70                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentClipboardPreferences, sync_push);
+      71                 :           2 : }
+      72                 :             : 
+      73                 :             : static void
+      74                 :           1 : valent_clipboard_preferences_init (ValentClipboardPreferences *self)
+      75                 :             : {
+      76                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+      77                 :           1 : }
+      78                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.func-c.html b/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.func-c.html new file mode 100644 index 00000000000..f9a36bab39e --- /dev/null +++ b/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/connectivity_report-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - connectivity_report-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_connectivity_report_plugin_register_types3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.func.html b/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.func.html new file mode 100644 index 00000000000..c0098853f2d --- /dev/null +++ b/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/connectivity_report-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - connectivity_report-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_connectivity_report_plugin_register_types3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.gcov.html b/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.gcov.html new file mode 100644 index 00000000000..54543787a0b --- /dev/null +++ b/coverage/src/plugins/connectivity_report/connectivity_report-plugin.c.gcov.html @@ -0,0 +1,118 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/connectivity_report-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - connectivity_report-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-connectivity_report-gadget.h"
+      10                 :             : #include "valent-connectivity_report-plugin.h"
+      11                 :             : #include "valent-connectivity_report-preferences.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : _VALENT_EXTERN void
+      15                 :           3 : valent_connectivity_report_plugin_register_types (PeasObjectModule *module)
+      16                 :             : {
+      17                 :           3 :   peas_object_module_register_extension_type (module,
+      18                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      19                 :             :                                               VALENT_TYPE_CONNECTIVITY_REPORT_PLUGIN);
+      20                 :           3 :   peas_object_module_register_extension_type (module,
+      21                 :             :                                               VALENT_TYPE_DEVICE_GADGET,
+      22                 :             :                                               VALENT_TYPE_CONNECTIVITY_REPORT_GADGET);
+      23                 :           3 :   peas_object_module_register_extension_type (module,
+      24                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      25                 :             :                                               VALENT_TYPE_CONNECTIVITY_REPORT_PREFERENCES);
+      26                 :           3 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-detail-sort-b.html b/coverage/src/plugins/connectivity_report/index-detail-sort-b.html new file mode 100644 index 00000000000..79da8fa12b2 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-detail-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-detail-sort-f.html b/coverage/src/plugins/connectivity_report/index-detail-sort-f.html new file mode 100644 index 00000000000..21bba440374 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-detail-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-detail-sort-l.html b/coverage/src/plugins/connectivity_report/index-detail-sort-l.html new file mode 100644 index 00000000000..fc2ce90e1bb --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-detail-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-detail.html b/coverage/src/plugins/connectivity_report/index-detail.html new file mode 100644 index 00000000000..be9e5211c45 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-detail.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-sort-b.html b/coverage/src/plugins/connectivity_report/index-sort-b.html new file mode 100644 index 00000000000..79da8fa12b2 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-sort-f.html b/coverage/src/plugins/connectivity_report/index-sort-f.html new file mode 100644 index 00000000000..21bba440374 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index-sort-l.html b/coverage/src/plugins/connectivity_report/index-sort-l.html new file mode 100644 index 00000000000..fc2ce90e1bb --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/index.html b/coverage/src/plugins/connectivity_report/index.html new file mode 100644 index 00000000000..be9e5211c45 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/index.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_reportCoverageTotalHit
Test:Code CoverageLines:93.8 %452424
Test Date:2024-03-31 18:46:36Functions:98.1 %5251
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.6 %287174
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
connectivity_report-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-connectivity_report-gadget.c +
97.4%97.4%
+
97.4 %787661.8 %3421100.0 %88
valent-connectivity_report-gadget.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-plugin.c +
96.6%96.6%
+
96.6 %17717171.3 %1087793.8 %1615
valent-connectivity_report-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-connectivity_report-preferences.c +
100.0%
+
100.0 %292975.0 %43100.0 %77
valent-telephony.c +
87.5%87.5%
+
87.5 %16014051.2 %12162100.0 %1717
valent-telephony.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.func-c.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.func-c.html new file mode 100644 index 00000000000..649e17cae9c --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.func-c.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.4 %7876
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.8 %3421
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_connectivity_report_gadget_constructed1
valent_connectivity_report_gadget_dispose1
valent_connectivity_report_gadget_init1
on_action_enabled_changed2
on_action_state_changed9
valent_connectivity_report_gadget_get_type18
valent_connectivity_report_gadget_class_intern_init3
valent_connectivity_report_gadget_get_type_once3
valent_connectivity_report_gadget_get_type12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.func.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.func.html new file mode 100644 index 00000000000..a9a59be9a43 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.func.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.4 %7876
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.8 %3421
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_action_enabled_changed2
on_action_state_changed9
valent_connectivity_report_gadget_constructed1
valent_connectivity_report_gadget_dispose1
valent_connectivity_report_gadget_get_type18
valent_connectivity_report_gadget_class_intern_init3
valent_connectivity_report_gadget_get_type12
valent_connectivity_report_gadget_get_type_once3
valent_connectivity_report_gadget_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.gcov.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.gcov.html new file mode 100644 index 00000000000..0a2140f65fd --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.c.gcov.html @@ -0,0 +1,299 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-gadget.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:97.4 %7876
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.8 %3421
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-connectivity_report-gadget"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-connectivity_report-gadget.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentConnectivityReportGadget
+      16                 :             : {
+      17                 :             :   ValentDeviceGadget  parent_instance;
+      18                 :             : 
+      19                 :             :   GHashTable         *connections;
+      20                 :             : 
+      21                 :             :   GtkWidget          *button;
+      22                 :             :   GtkWidget          *box;
+      23                 :             : };
+      24                 :             : 
+      25   [ +  +  +  - ]:          18 : G_DEFINE_FINAL_TYPE (ValentConnectivityReportGadget, valent_connectivity_report_gadget, VALENT_TYPE_DEVICE_GADGET)
+      26                 :             : 
+      27                 :             : 
+      28                 :             : static void
+      29                 :           9 : on_action_state_changed (GActionGroup                   *action_group,
+      30                 :             :                          const char                     *action_name,
+      31                 :             :                          GVariant                       *value,
+      32                 :             :                          ValentConnectivityReportGadget *self)
+      33                 :             : {
+      34                 :           9 :   GtkWidget *child;
+      35                 :           9 :   g_autoptr (GVariant) signal_strengths = NULL;
+      36                 :           9 :   GVariantIter iter;
+      37                 :           9 :   char *signal_id = NULL;
+      38                 :           9 :   GVariant *signal_state;
+      39                 :           9 :   const char *icon_name;
+      40                 :           9 :   const char *title;
+      41                 :             : 
+      42         [ -  + ]:           9 :   g_assert (VALENT_IS_CONNECTIVITY_REPORT_GADGET (self));
+      43                 :             : 
+      44                 :             :   /* Clear the popup */
+      45         [ +  + ]:          15 :   while ((child = gtk_widget_get_first_child (self->box)) != NULL)
+      46                 :           6 :     gtk_box_remove (GTK_BOX (self->box), child);
+      47                 :             : 
+      48         [ -  + ]:           9 :   if (!g_variant_lookup (value, "signal-strengths", "@a{sv}", &signal_strengths))
+      49                 :             :     {
+      50                 :           0 :       gtk_widget_set_visible (self->button, FALSE);
+      51         [ #  # ]:           0 :       return;
+      52                 :             :     }
+      53                 :             : 
+      54                 :             :   /* Add each signal */
+      55                 :           9 :   g_variant_iter_init (&iter, signal_strengths);
+      56                 :             : 
+      57         [ +  + ]:          16 :   while (g_variant_iter_loop (&iter, "{sv}", &signal_id, &signal_state))
+      58                 :             :     {
+      59                 :           7 :       GtkWidget *box;
+      60                 :           7 :       GtkWidget *level;
+      61                 :           7 :       GtkWidget *icon;
+      62                 :           7 :       const char *signal_icon;
+      63                 :           7 :       const char *network_type;
+      64                 :           7 :       int64_t signal_strength;
+      65                 :             : 
+      66                 :           7 :       box = g_object_new (GTK_TYPE_BOX,
+      67                 :             :                           "spacing", 6,
+      68                 :             :                           NULL);
+      69                 :             : 
+      70                 :           7 :       icon = g_object_new (GTK_TYPE_IMAGE,
+      71                 :             :                            "pixel-size", 16,
+      72                 :             :                            "valign",     GTK_ALIGN_CENTER,
+      73                 :             :                            NULL);
+      74                 :           7 :       gtk_box_append (GTK_BOX (box), icon);
+      75                 :             : 
+      76                 :           7 :       level = g_object_new (GTK_TYPE_LEVEL_BAR,
+      77                 :             :                             "mode",           GTK_LEVEL_BAR_MODE_DISCRETE,
+      78                 :             :                             "min-value",      0.0,
+      79                 :             :                             "max-value",      5.0,
+      80                 :             :                             "value",          0.0,
+      81                 :             :                             "valign",         GTK_ALIGN_CENTER,
+      82                 :             :                             "hexpand",        TRUE,
+      83                 :             :                             "height-request", 3,
+      84                 :             :                             "width-request",  64,
+      85                 :             :                             NULL);
+      86                 :           7 :       gtk_box_append (GTK_BOX (box), level);
+      87                 :             : 
+      88         [ +  - ]:           7 :       if (g_variant_lookup (signal_state, "icon-name", "&s", &signal_icon))
+      89                 :           7 :         gtk_image_set_from_icon_name (GTK_IMAGE (icon), signal_icon);
+      90                 :             : 
+      91         [ +  - ]:           7 :       if (g_variant_lookup (signal_state, "network-type", "&s", &network_type))
+      92                 :           7 :         gtk_widget_set_tooltip_text (GTK_WIDGET (icon), network_type);
+      93                 :             : 
+      94         [ +  - ]:           7 :       if (g_variant_lookup (signal_state, "signal-strength", "x", &signal_strength))
+      95                 :           7 :         gtk_level_bar_set_value (GTK_LEVEL_BAR (level), signal_strength);
+      96                 :             : 
+      97                 :           7 :       gtk_box_append (GTK_BOX (self->box), box);
+      98                 :             :     }
+      99                 :             : 
+     100                 :             :   /* Add status properties */
+     101         [ +  - ]:           9 :   if (g_variant_lookup (value, "icon-name", "&s", &icon_name))
+     102                 :           9 :     gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (self->button), icon_name);
+     103                 :             : 
+     104         [ +  - ]:           9 :   if (g_variant_lookup (value, "title", "&s", &title))
+     105                 :           9 :     gtk_accessible_update_property (GTK_ACCESSIBLE (self->button),
+     106                 :             :                                     GTK_ACCESSIBLE_PROPERTY_LABEL, title,
+     107                 :             :                                     -1);
+     108                 :             : 
+     109         [ +  + ]:           9 :   if (g_action_group_get_action_enabled (action_group, action_name))
+     110                 :           8 :     gtk_widget_set_visible (self->button, TRUE);
+     111                 :             : }
+     112                 :             : 
+     113                 :             : static void
+     114                 :           2 : on_action_enabled_changed (GActionGroup                   *action_group,
+     115                 :             :                            const char                     *action_name,
+     116                 :             :                            gboolean                        enabled,
+     117                 :             :                            ValentConnectivityReportGadget *self)
+     118                 :             : {
+     119                 :           4 :   g_autoptr (GVariant) state = NULL;
+     120                 :             : 
+     121                 :           2 :   gtk_widget_set_visible (self->button, enabled);
+     122                 :             : 
+     123         [ +  + ]:           2 :   if (enabled)
+     124                 :           1 :     state = g_action_group_get_action_state (action_group, action_name);
+     125                 :             : 
+     126         [ +  - ]:           1 :   if (state != NULL)
+     127                 :           1 :     on_action_state_changed (action_group, action_name, state, self);
+     128                 :           2 : }
+     129                 :             : 
+     130                 :             : /*
+     131                 :             :  * GObject
+     132                 :             :  */
+     133                 :             : static void
+     134                 :           1 : valent_connectivity_report_gadget_constructed (GObject *object)
+     135                 :             : {
+     136                 :           1 :   ValentConnectivityReportGadget *self = VALENT_CONNECTIVITY_REPORT_GADGET (object);
+     137                 :           1 :   GActionGroup *action_group = NULL;
+     138                 :           1 :   gboolean enabled = FALSE;
+     139                 :             : 
+     140                 :           1 :   g_object_get (object, "device", &action_group, NULL);
+     141                 :           1 :   g_signal_connect_object (action_group,
+     142                 :             :                            "action-state-changed::connectivity_report.state",
+     143                 :             :                            G_CALLBACK (on_action_state_changed),
+     144                 :             :                            self, 0);
+     145                 :             : 
+     146                 :           1 :   g_signal_connect_object (action_group,
+     147                 :             :                            "action-enabled-changed::connectivity_report.state",
+     148                 :             :                            G_CALLBACK (on_action_enabled_changed),
+     149                 :             :                            self, 0);
+     150                 :             : 
+     151                 :           1 :   enabled = g_action_group_get_action_enabled (action_group, "connectivity_report.state");
+     152                 :           1 :   on_action_enabled_changed (action_group, "connectivity_report.state", enabled, self);
+     153         [ +  - ]:           1 :   g_clear_object (&action_group);
+     154                 :             : 
+     155                 :           1 :   G_OBJECT_CLASS (valent_connectivity_report_gadget_parent_class)->constructed (object);
+     156                 :           1 : }
+     157                 :             : 
+     158                 :             : static void
+     159                 :           1 : valent_connectivity_report_gadget_dispose (GObject *object)
+     160                 :             : {
+     161                 :           1 :   ValentConnectivityReportGadget *self = VALENT_CONNECTIVITY_REPORT_GADGET (object);
+     162                 :             : 
+     163         [ +  - ]:           1 :   g_clear_pointer (&self->button, gtk_widget_unparent);
+     164                 :             : 
+     165                 :           1 :   G_OBJECT_CLASS (valent_connectivity_report_gadget_parent_class)->dispose (object);
+     166                 :           1 : }
+     167                 :             : 
+     168                 :             : static void
+     169                 :           3 : valent_connectivity_report_gadget_class_init (ValentConnectivityReportGadgetClass *klass)
+     170                 :             : {
+     171                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     172                 :             : 
+     173                 :           3 :   object_class->constructed = valent_connectivity_report_gadget_constructed;
+     174                 :           3 :   object_class->dispose = valent_connectivity_report_gadget_dispose;
+     175                 :             : }
+     176                 :             : 
+     177                 :             : static void
+     178                 :           1 : valent_connectivity_report_gadget_init (ValentConnectivityReportGadget *self)
+     179                 :             : {
+     180                 :           1 :   GtkWidget *popover;
+     181                 :             : 
+     182                 :             :   /* Popover */
+     183                 :           1 :   self->box = g_object_new (GTK_TYPE_BOX,
+     184                 :             :                             "margin-top",    6,
+     185                 :             :                             "margin-bottom", 6,
+     186                 :             :                             "margin-start",  6,
+     187                 :             :                             "margin-end",    6,
+     188                 :             :                             "orientation",   GTK_ORIENTATION_VERTICAL,
+     189                 :             :                             "spacing",       6,
+     190                 :             :                             NULL);
+     191                 :           1 :   popover = g_object_new (GTK_TYPE_POPOVER,
+     192                 :             :                           "autohide", TRUE,
+     193                 :             :                           "child",    self->box,
+     194                 :             :                           NULL);
+     195                 :             : 
+     196                 :             :   /* Button */
+     197                 :           1 :   self->button = g_object_new (GTK_TYPE_MENU_BUTTON,
+     198                 :             :                                "icon-name", "network-cellular-offline-symbolic",
+     199                 :             :                                "popover",   popover,
+     200                 :             :                                "has-frame", FALSE,
+     201                 :             :                                NULL);
+     202                 :           1 :   gtk_accessible_update_property (GTK_ACCESSIBLE (self->button),
+     203                 :             :                                   GTK_ACCESSIBLE_PROPERTY_LABEL, _("Mobile Network"),
+     204                 :             :                                   -1);
+     205                 :           1 :   gtk_widget_set_parent (self->button, GTK_WIDGET (self));
+     206                 :           1 : }
+     207                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.func-c.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.func-c.html new file mode 100644 index 00000000000..c3c1c9af070 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-gadget.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-gadget.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONNECTIVITY_REPORT_GADGET9
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.func.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.func.html new file mode 100644 index 00000000000..5e3d3e496f6 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-gadget.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-gadget.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONNECTIVITY_REPORT_GADGET9
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.gcov.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.gcov.html new file mode 100644 index 00000000000..8f34f095b1a --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-gadget.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-gadget.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-gadget.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_CONNECTIVITY_REPORT_GADGET (valent_connectivity_report_gadget_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           9 : G_DECLARE_FINAL_TYPE (ValentConnectivityReportGadget, valent_connectivity_report_gadget, VALENT, CONNECTIVITY_REPORT_GADGET, ValentDeviceGadget)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.func-c.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.func-c.html new file mode 100644 index 00000000000..316f15e2062 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.6 %177171
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:71.3 %10877
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
state_action0
on_telephony_changed4
valent_connectivity_report_plugin_constructed4
valent_connectivity_report_plugin_init4
valent_connectivity_report_plugin_send_state4
valent_connectivity_report_plugin_destroy8
valent_connectivity_report_plugin_update_state12
get_network_type_icon16
get_signal_strength_icon18
get_status_labels18
valent_connectivity_report_plugin_handle_connectivity_report18
valent_connectivity_report_plugin_handle_packet18
valent_connectivity_report_plugin_watch_telephony20
valent_connectivity_report_plugin_get_type85
valent_connectivity_report_plugin_class_intern_init3
valent_connectivity_report_plugin_get_type_once3
valent_connectivity_report_plugin_get_type79
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.func.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.func.html new file mode 100644 index 00000000000..1519ac025fa --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.6 %177171
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:71.3 %10877
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
get_network_type_icon16
get_signal_strength_icon18
get_status_labels18
on_telephony_changed4
state_action0
valent_connectivity_report_plugin_constructed4
valent_connectivity_report_plugin_destroy8
valent_connectivity_report_plugin_get_type85
valent_connectivity_report_plugin_class_intern_init3
valent_connectivity_report_plugin_get_type79
valent_connectivity_report_plugin_get_type_once3
valent_connectivity_report_plugin_handle_connectivity_report18
valent_connectivity_report_plugin_handle_packet18
valent_connectivity_report_plugin_init4
valent_connectivity_report_plugin_send_state4
valent_connectivity_report_plugin_update_state12
valent_connectivity_report_plugin_watch_telephony20
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.gcov.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.gcov.html new file mode 100644 index 00000000000..2ccfd4ee38d --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.c.gcov.html @@ -0,0 +1,523 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.6 %177171
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:71.3 %10877
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-connectivity_report-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <glib/gi18n.h>
+      11                 :             : #include <gio/gio.h>
+      12                 :             : #include <json-glib/json-glib.h>
+      13                 :             : #include <valent.h>
+      14                 :             : 
+      15                 :             : #include "valent-connectivity_report-plugin.h"
+      16                 :             : #include "valent-telephony.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : struct _ValentConnectivityReportPlugin
+      20                 :             : {
+      21                 :             :   ValentDevicePlugin  parent_instance;
+      22                 :             : 
+      23                 :             :   /* Local Modems */
+      24                 :             :   ValentTelephony    *telephony;
+      25                 :             :   unsigned int        telephony_watch : 1;
+      26                 :             : };
+      27                 :             : 
+      28                 :             : static void   valent_connectivity_report_plugin_send_state    (ValentConnectivityReportPlugin *self);
+      29                 :             : 
+      30   [ +  +  +  - ]:          85 : G_DEFINE_FINAL_TYPE (ValentConnectivityReportPlugin, valent_connectivity_report_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      31                 :             : 
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * Local Modems
+      35                 :             :  */
+      36                 :             : static void
+      37                 :           4 : on_telephony_changed (ValentTelephony                *telephony,
+      38                 :             :                       ValentConnectivityReportPlugin *self)
+      39                 :             : {
+      40         [ +  - ]:           4 :   g_assert (VALENT_IS_TELEPHONY (telephony));
+      41         [ -  + ]:           4 :   g_assert (VALENT_IS_CONNECTIVITY_REPORT_PLUGIN (self));
+      42                 :             : 
+      43                 :           4 :   valent_connectivity_report_plugin_send_state (self);
+      44                 :           4 : }
+      45                 :             : 
+      46                 :             : 
+      47                 :             : static void
+      48                 :          20 : valent_connectivity_report_plugin_watch_telephony (ValentConnectivityReportPlugin *self,
+      49                 :             :                                                    gboolean                        watch)
+      50                 :             : {
+      51         [ +  - ]:          20 :   g_assert (VALENT_IS_CONNECTIVITY_REPORT_PLUGIN (self));
+      52                 :             : 
+      53         [ +  + ]:          20 :   if (self->telephony_watch == watch)
+      54                 :             :     return;
+      55                 :             : 
+      56         [ +  + ]:           6 :   if (self->telephony == NULL)
+      57                 :           3 :     self->telephony = valent_telephony_get_default ();
+      58                 :             : 
+      59         [ +  + ]:           6 :   if (watch)
+      60                 :             :     {
+      61                 :           3 :       g_signal_connect_object (self->telephony,
+      62                 :             :                                "changed",
+      63                 :             :                                G_CALLBACK (on_telephony_changed),
+      64                 :             :                                self, 0);
+      65                 :           3 :       self->telephony_watch = TRUE;
+      66                 :             :     }
+      67                 :             :   else
+      68                 :             :     {
+      69                 :           3 :       g_signal_handlers_disconnect_by_data (self->telephony, self);
+      70                 :           3 :       self->telephony_watch = FALSE;
+      71                 :             :     }
+      72                 :             : }
+      73                 :             : 
+      74                 :             : static void
+      75                 :           4 : valent_connectivity_report_plugin_send_state (ValentConnectivityReportPlugin *self)
+      76                 :             : {
+      77                 :           4 :   GSettings *settings;
+      78                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+      79         [ -  + ]:           4 :   g_autoptr (JsonNode) packet = NULL;
+      80   [ +  -  -  - ]:           4 :   g_autoptr (JsonNode) signal_node = NULL;
+      81                 :             : 
+      82         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_CONNECTIVITY_REPORT_PLUGIN (self));
+      83                 :             : 
+      84                 :           4 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+      85                 :             : 
+      86         [ +  - ]:           4 :   if (!g_settings_get_boolean (settings, "share-state"))
+      87                 :             :     return;
+      88                 :             : 
+      89                 :           4 :   signal_node = valent_telephony_get_signal_strengths (self->telephony);
+      90                 :             : 
+      91                 :           4 :   valent_packet_init (&builder, "kdeconnect.connectivity_report");
+      92                 :           4 :   json_builder_set_member_name (builder, "signalStrengths");
+      93                 :           4 :   json_builder_add_value (builder, g_steal_pointer (&signal_node));
+      94                 :           4 :   packet = valent_packet_end (&builder);
+      95                 :             : 
+      96         [ +  - ]:           4 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      97                 :             : }
+      98                 :             : 
+      99                 :             : 
+     100                 :             : /*
+     101                 :             :  * Remote Modems
+     102                 :             :  */
+     103                 :             : static const char *
+     104                 :          16 : get_network_type_icon (const char *network_type)
+     105                 :             : {
+     106         [ +  + ]:          16 :   if (g_str_equal (network_type, "GSM") ||
+     107         [ +  - ]:          14 :       g_str_equal (network_type, "CDMA") ||
+     108         [ +  - ]:          14 :       g_str_equal (network_type, "iDEN"))
+     109                 :             :     return "network-cellular-2g-symbolic";
+     110                 :             : 
+     111         [ +  + ]:          14 :   if (g_str_equal (network_type, "UMTS") ||
+     112         [ +  - ]:          12 :       g_str_equal (network_type, "CDMA2000"))
+     113                 :             :     return "network-cellular-3g-symbolic";
+     114                 :             : 
+     115         [ +  + ]:          12 :   if (g_str_equal (network_type, "EDGE"))
+     116                 :             :     return "network-cellular-edge-symbolic";
+     117                 :             : 
+     118         [ +  + ]:          10 :   if (g_str_equal (network_type, "GPRS"))
+     119                 :             :     return "network-cellular-gprs-symbolic";
+     120                 :             : 
+     121         [ +  + ]:           8 :   if (g_str_equal (network_type, "HSPA"))
+     122                 :             :     return "network-cellular-hspa-symbolic";
+     123                 :             : 
+     124         [ +  + ]:           6 :   if (g_str_equal (network_type, "LTE"))
+     125                 :             :     return "network-cellular-4g-symbolic";
+     126                 :             : 
+     127         [ +  + ]:           4 :   if (g_str_equal (network_type, "5G"))
+     128                 :           2 :     return "network-cellular-5g-symbolic";
+     129                 :             : 
+     130                 :             :   return "network-cellular-symbolic";
+     131                 :             : }
+     132                 :             : 
+     133                 :             : static const char *
+     134                 :          18 : get_signal_strength_icon (double signal_strength)
+     135                 :             : {
+     136         [ +  + ]:          18 :   if (signal_strength >= 4.0)
+     137                 :             :     return "network-cellular-signal-excellent-symbolic";
+     138                 :             : 
+     139         [ +  + ]:          12 :   if (signal_strength >= 3.0)
+     140                 :             :     return "network-cellular-signal-good-symbolic";
+     141                 :             : 
+     142         [ +  + ]:          10 :   if (signal_strength >= 2.0)
+     143                 :             :     return "network-cellular-signal-ok-symbolic";
+     144                 :             : 
+     145         [ +  + ]:           8 :   if (signal_strength >= 1.0)
+     146                 :             :     return "network-cellular-signal-weak-symbolic";
+     147                 :             : 
+     148         [ +  + ]:           6 :   if (signal_strength >= 0.0)
+     149                 :           2 :     return "network-cellular-signal-none-symbolic";
+     150                 :             : 
+     151                 :             :   return "network-cellular-offline-symbolic";
+     152                 :             : }
+     153                 :             : 
+     154                 :             : static void
+     155                 :          18 : get_status_labels (double   signal_strength,
+     156                 :             :                    char   **status_title,
+     157                 :             :                    char   **status_body)
+     158                 :             : {
+     159         [ +  + ]:          18 :   if (signal_strength >= 1.0)
+     160                 :             :     {
+     161                 :             :       /* TRANSLATORS: When the mobile network signal is available */
+     162         [ -  + ]:          12 :       *status_title = g_strdup (_("Mobile Network"));
+     163                 :             :       /* TRANSLATORS: The mobile network signal strength (e.g. "Signal Strength (25%)") */
+     164                 :          12 :       *status_body = g_strdup_printf (_("Signal Strength %f%%"),
+     165                 :             :                                       floor (signal_strength * 20.0));
+     166                 :             :     }
+     167         [ +  + ]:           6 :   else if (signal_strength >= 0.0)
+     168                 :             :     {
+     169                 :             :       /* TRANSLATORS: When no mobile service is available */
+     170         [ -  + ]:           2 :       *status_title = g_strdup (_("No Service"));
+     171                 :             :       /* TRANSLATORS: When no mobile network signal is available */
+     172         [ -  + ]:           4 :       *status_body = g_strdup (_("No mobile network service"));
+     173                 :             :     }
+     174                 :             :   else
+     175                 :             :     {
+     176                 :             :       /* TRANSLATORS: When no mobile service is available */
+     177         [ -  + ]:           4 :       *status_title = g_strdup (_("No Service"));
+     178                 :             :       /* TRANSLATORS: When the device is missing a SIM card */
+     179         [ -  + ]:           8 :       *status_body = g_strdup (_("No SIM"));
+     180                 :             :     }
+     181                 :          18 : }
+     182                 :             : 
+     183                 :             : static void
+     184                 :          18 : valent_connectivity_report_plugin_handle_connectivity_report (ValentConnectivityReportPlugin *self,
+     185                 :             :                                                               JsonNode                       *packet)
+     186                 :             : {
+     187                 :          18 :   GAction *action;
+     188                 :          18 :   GVariant *state;
+     189                 :          18 :   GSettings *settings;
+     190                 :          18 :   GVariantBuilder builder;
+     191                 :          18 :   GVariantBuilder signals_builder;
+     192                 :          18 :   JsonObject *signal_strengths;
+     193                 :          18 :   JsonObjectIter iter;
+     194                 :          18 :   const char *signal_id;
+     195                 :          18 :   JsonNode *signal_node;
+     196                 :          18 :   double average_strength = 0.0;
+     197                 :          18 :   double n_nodes = 0;
+     198                 :          18 :   gboolean is_online = FALSE;
+     199                 :          18 :   const char *status_icon;
+     200                 :          18 :   g_autofree char *status_title = NULL;
+     201                 :          18 :   g_autofree char *status_body = NULL;
+     202                 :             : 
+     203         [ +  - ]:          18 :   g_assert (VALENT_IS_CONNECTIVITY_REPORT_PLUGIN (self));
+     204         [ -  + ]:          18 :   g_assert (VALENT_IS_PACKET (packet));
+     205                 :             : 
+     206         [ -  + ]:          18 :   if (!valent_packet_get_object (packet, "signalStrengths", &signal_strengths))
+     207                 :             :     {
+     208                 :           0 :       g_debug ("%s(): expected \"signalStrengths\" field holding an object",
+     209                 :             :                G_STRFUNC);
+     210                 :           0 :       return;
+     211                 :             :     }
+     212                 :             : 
+     213                 :          18 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     214                 :             : 
+     215                 :             :   /* Add each signal */
+     216                 :          18 :   g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+     217                 :          18 :   g_variant_builder_init (&signals_builder, G_VARIANT_TYPE_VARDICT);
+     218                 :             : 
+     219                 :          18 :   json_object_iter_init (&iter, signal_strengths);
+     220                 :             : 
+     221         [ +  + ]:          34 :   while (json_object_iter_next (&iter, &signal_id, &signal_node))
+     222                 :             :     {
+     223                 :          16 :       GVariantBuilder signal_builder;
+     224                 :          16 :       JsonObject *signal_obj;
+     225                 :          16 :       const char *network_type;
+     226                 :          16 :       int64_t signal_strength;
+     227                 :          16 :       const char *icon_name;
+     228                 :             : 
+     229         [ +  - ]:          16 :       if G_UNLIKELY (json_node_get_value_type (signal_node) != JSON_TYPE_OBJECT)
+     230                 :             :         {
+     231                 :           0 :           g_debug ("%s(): expected entry value holding an object",
+     232                 :             :                    G_STRFUNC);
+     233                 :           0 :           continue;
+     234                 :             :         }
+     235                 :             : 
+     236                 :             :       /* Extract the signal information */
+     237                 :          16 :       signal_obj = json_node_get_object (signal_node);
+     238                 :          16 :       network_type = json_object_get_string_member_with_default (signal_obj,
+     239                 :             :                                                                  "networkType",
+     240                 :             :                                                                  "Unknown");
+     241                 :          16 :       signal_strength = json_object_get_int_member_with_default (signal_obj,
+     242                 :             :                                                                  "signalStrength",
+     243                 :             :                                                                  -1);
+     244                 :          16 :       icon_name = get_network_type_icon (network_type);
+     245                 :             : 
+     246                 :             :       /* Ignore offline modems (`-1`) when determining the average strength */
+     247         [ +  + ]:          16 :       if (signal_strength >= 0)
+     248                 :             :         {
+     249                 :          14 :           average_strength = (n_nodes * average_strength + signal_strength) /
+     250                 :          14 :                              (n_nodes + 1);
+     251                 :          14 :           n_nodes += 1;
+     252                 :          14 :           is_online = TRUE;
+     253                 :             :         }
+     254                 :             : 
+     255                 :             :       /* Add the signal to the `signal_strengths` dictionary */
+     256                 :          16 :       g_variant_builder_init (&signal_builder, G_VARIANT_TYPE_VARDICT);
+     257                 :          16 :       g_variant_builder_add (&signal_builder, "{sv}", "network-type",
+     258                 :             :                              g_variant_new_string (network_type));
+     259                 :          16 :       g_variant_builder_add (&signal_builder, "{sv}", "signal-strength",
+     260                 :             :                              g_variant_new_int64 (signal_strength));
+     261                 :          16 :       g_variant_builder_add (&signal_builder, "{sv}", "icon-name",
+     262                 :             :                              g_variant_new_string (icon_name));
+     263                 :          16 :       g_variant_builder_add (&signals_builder, "{sv}", signal_id,
+     264                 :             :                              g_variant_builder_end (&signal_builder));
+     265                 :             :     }
+     266                 :             : 
+     267                 :          18 :   g_variant_builder_add (&builder, "{sv}", "signal-strengths",
+     268                 :             :                          g_variant_builder_end (&signals_builder));
+     269                 :             : 
+     270                 :             :   /* Set the status properties */
+     271         [ +  + ]:          18 :   status_icon = get_signal_strength_icon (is_online ? average_strength : -1);
+     272                 :          18 :   get_status_labels (is_online ? average_strength : -1,
+     273                 :             :                      &status_title,
+     274                 :             :                      &status_body);
+     275                 :             : 
+     276                 :          18 :   g_variant_builder_add (&builder, "{sv}", "icon-name",
+     277                 :             :                          g_variant_new_string (status_icon));
+     278                 :          18 :   g_variant_builder_add (&builder, "{sv}", "title",
+     279                 :             :                          g_variant_new_string (status_title));
+     280                 :          18 :   g_variant_builder_add (&builder, "{sv}", "body",
+     281                 :             :                          g_variant_new_string (status_body));
+     282                 :             : 
+     283                 :          18 :   state = g_variant_builder_end (&builder);
+     284                 :             : 
+     285                 :             :   /* Update the GAction */
+     286                 :          18 :   action = g_action_map_lookup_action (G_ACTION_MAP (self), "state");
+     287                 :          18 :   g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+     288                 :          18 :                                json_object_get_size (signal_strengths) > 0);
+     289                 :          18 :   g_simple_action_set_state (G_SIMPLE_ACTION (action), state);
+     290                 :             : 
+     291                 :             :   /* Notify if necessary */
+     292         [ +  + ]:          18 :   if (average_strength > 0.0)
+     293                 :             :     {
+     294                 :          12 :       valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self),
+     295                 :             :                                               "offline");
+     296                 :             :     }
+     297         [ +  + ]:           6 :   else if (g_settings_get_boolean (settings, "offline-notification"))
+     298                 :             :     {
+     299                 :           3 :       ValentDevice *device;
+     300                 :          18 :       g_autoptr (GNotification) notification = NULL;
+     301         [ +  - ]:           3 :       g_autoptr (GIcon) icon = NULL;
+     302         [ +  - ]:           3 :       g_autofree char *title = NULL;
+     303                 :           3 :       g_autofree char *body = NULL;
+     304                 :           3 :       const char *device_name;
+     305                 :             : 
+     306                 :           3 :       device = valent_extension_get_object (VALENT_EXTENSION (self));
+     307                 :           3 :       device_name = valent_device_get_name (device);
+     308                 :             : 
+     309                 :             :       /* TRANSLATORS: The connectivity notification title (e.g. "PinePhone: No Service") */
+     310                 :           3 :       title = g_strdup_printf (_("%s: %s"), device_name, status_title);
+     311                 :             :       /* TRANSLATORS: The connectivity notification body (e.g. "No mobile network service") */
+     312         [ -  + ]:           3 :       body = g_strdup (status_body);
+     313                 :           3 :       icon = g_themed_icon_new (status_icon);
+     314                 :             : 
+     315                 :           3 :       notification = g_notification_new (title);
+     316                 :           3 :       g_notification_set_body (notification, body);
+     317                 :           3 :       g_notification_set_icon (notification, icon);
+     318                 :           3 :       valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     319                 :             :                                               "offline",
+     320                 :             :                                               notification);
+     321                 :             :     }
+     322                 :             : }
+     323                 :             : 
+     324                 :             : /*
+     325                 :             :  * GActions
+     326                 :             :  */
+     327                 :             : static void
+     328                 :           0 : state_action (GSimpleAction *action,
+     329                 :             :               GVariant      *parameter,
+     330                 :             :               gpointer       user_data)
+     331                 :             : {
+     332                 :             :   // No-op to make the state read-only
+     333                 :           0 : }
+     334                 :             : 
+     335                 :             : static const GActionEntry actions[] = {
+     336                 :             :     {"state", NULL, NULL, "@a{sv} {}", state_action},
+     337                 :             : };
+     338                 :             : 
+     339                 :             : /*
+     340                 :             :  * ValentDevicePlugin
+     341                 :             :  */
+     342                 :             : static void
+     343                 :          12 : valent_connectivity_report_plugin_update_state (ValentDevicePlugin *plugin,
+     344                 :             :                                                 ValentDeviceState   state)
+     345                 :             : {
+     346                 :          12 :   ValentConnectivityReportPlugin *self = VALENT_CONNECTIVITY_REPORT_PLUGIN (plugin);
+     347                 :          12 :   gboolean available;
+     348                 :             : 
+     349         [ +  - ]:          12 :   g_assert (VALENT_IS_CONNECTIVITY_REPORT_PLUGIN (self));
+     350                 :             : 
+     351                 :          12 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     352                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     353                 :             : 
+     354         [ +  + ]:          12 :   if (available)
+     355                 :             :     {
+     356                 :           3 :       valent_connectivity_report_plugin_watch_telephony (self, TRUE);
+     357                 :             :     }
+     358                 :             :   else
+     359                 :             :     {
+     360                 :           9 :       valent_connectivity_report_plugin_watch_telephony (self, FALSE);
+     361                 :           9 :       valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     362                 :             :     }
+     363                 :          12 : }
+     364                 :             : 
+     365                 :             : static void
+     366                 :          18 : valent_connectivity_report_plugin_handle_packet (ValentDevicePlugin *plugin,
+     367                 :             :                                                  const char         *type,
+     368                 :             :                                                  JsonNode           *packet)
+     369                 :             : {
+     370                 :          18 :   ValentConnectivityReportPlugin *self = VALENT_CONNECTIVITY_REPORT_PLUGIN (plugin);
+     371                 :             : 
+     372         [ +  - ]:          18 :   g_assert (VALENT_IS_CONNECTIVITY_REPORT_PLUGIN (self));
+     373         [ -  + ]:          18 :   g_assert (type != NULL);
+     374         [ -  + ]:          18 :   g_assert (VALENT_IS_PACKET (packet));
+     375                 :             : 
+     376                 :             :   /* A remote connectivity report */
+     377         [ +  - ]:          18 :   if (g_str_equal (type, "kdeconnect.connectivity_report"))
+     378                 :          18 :     valent_connectivity_report_plugin_handle_connectivity_report (self, packet);
+     379                 :             :   else
+     380                 :          18 :     g_assert_not_reached ();
+     381                 :          18 : }
+     382                 :             : 
+     383                 :             : /*
+     384                 :             :  * ValentObject
+     385                 :             :  */
+     386                 :             : static void
+     387                 :           8 : valent_connectivity_report_plugin_destroy (ValentObject *object)
+     388                 :             : {
+     389                 :           8 :   ValentConnectivityReportPlugin *self = VALENT_CONNECTIVITY_REPORT_PLUGIN (object);
+     390                 :             : 
+     391                 :           8 :   valent_connectivity_report_plugin_watch_telephony (self, FALSE);
+     392                 :             : 
+     393                 :           8 :   VALENT_OBJECT_CLASS (valent_connectivity_report_plugin_parent_class)->destroy (object);
+     394                 :           8 : }
+     395                 :             : 
+     396                 :             : /*
+     397                 :             :  * GObject
+     398                 :             :  */
+     399                 :             : static void
+     400                 :           4 : valent_connectivity_report_plugin_constructed (GObject *object)
+     401                 :             : {
+     402                 :           4 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     403                 :             : 
+     404                 :           4 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     405                 :             :                                    actions,
+     406                 :             :                                    G_N_ELEMENTS (actions),
+     407                 :             :                                    plugin);
+     408                 :             : 
+     409                 :           4 :   G_OBJECT_CLASS (valent_connectivity_report_plugin_parent_class)->constructed (object);
+     410                 :           4 : }
+     411                 :             : 
+     412                 :             : static void
+     413                 :           3 : valent_connectivity_report_plugin_class_init (ValentConnectivityReportPluginClass *klass)
+     414                 :             : {
+     415                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     416                 :           3 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     417                 :           3 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     418                 :             : 
+     419                 :           3 :   object_class->constructed = valent_connectivity_report_plugin_constructed;
+     420                 :             : 
+     421                 :           3 :   vobject_class->destroy = valent_connectivity_report_plugin_destroy;
+     422                 :             : 
+     423                 :           3 :   plugin_class->handle_packet = valent_connectivity_report_plugin_handle_packet;
+     424                 :           3 :   plugin_class->update_state = valent_connectivity_report_plugin_update_state;
+     425                 :             : }
+     426                 :             : 
+     427                 :             : static void
+     428                 :           4 : valent_connectivity_report_plugin_init (ValentConnectivityReportPlugin *self)
+     429                 :             : {
+     430                 :           4 : }
+     431                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.func-c.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.func-c.html new file mode 100644 index 00000000000..5d01df29ceb --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONNECTIVITY_REPORT_PLUGIN76
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.func.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.func.html new file mode 100644 index 00000000000..f75c7074519 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONNECTIVITY_REPORT_PLUGIN76
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.gcov.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.gcov.html new file mode 100644 index 00000000000..c549f847e54 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_CONNECTIVITY_REPORT_PLUGIN (valent_connectivity_report_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          76 : G_DECLARE_FINAL_TYPE (ValentConnectivityReportPlugin, valent_connectivity_report_plugin, VALENT, CONNECTIVITY_REPORT_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.func-c.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.func-c.html new file mode 100644 index 00000000000..ae045b9b2ad --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2929
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_connectivity_report_preferences_constructed1
valent_connectivity_report_preferences_dispose1
valent_connectivity_report_preferences_init1
valent_connectivity_report_preferences_class_init3
valent_connectivity_report_preferences_get_type10
valent_connectivity_report_preferences_class_intern_init3
valent_connectivity_report_preferences_get_type_once3
valent_connectivity_report_preferences_get_type4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.func.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.func.html new file mode 100644 index 00000000000..803c23d7027 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2929
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_connectivity_report_preferences_class_init3
valent_connectivity_report_preferences_constructed1
valent_connectivity_report_preferences_dispose1
valent_connectivity_report_preferences_get_type10
valent_connectivity_report_preferences_class_intern_init3
valent_connectivity_report_preferences_get_type4
valent_connectivity_report_preferences_get_type_once3
valent_connectivity_report_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.gcov.html b/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.gcov.html new file mode 100644 index 00000000000..b0230bd1631 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-connectivity_report-preferences.c.gcov.html @@ -0,0 +1,170 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-connectivity_report-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-connectivity_report-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %2929
Test Date:2024-03-31 18:46:36Functions:100.0 %77
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %43
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-connectivity_report-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-connectivity_report-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentConnectivityReportPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   GtkSwitch                    *share_state;
+      22                 :             :   GtkSwitch                    *offline_notification;
+      23                 :             : };
+      24                 :             : 
+      25   [ +  +  +  - ]:          10 : G_DEFINE_FINAL_TYPE (ValentConnectivityReportPreferences, valent_connectivity_report_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      26                 :             : 
+      27                 :             : 
+      28                 :             : /*
+      29                 :             :  * GObject
+      30                 :             :  */
+      31                 :             : static void
+      32                 :           1 : valent_connectivity_report_preferences_constructed (GObject *object)
+      33                 :             : {
+      34                 :           1 :   ValentConnectivityReportPreferences *self = VALENT_CONNECTIVITY_REPORT_PREFERENCES (object);
+      35                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      36                 :           1 :   GSettings *settings;
+      37                 :             : 
+      38                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+      39                 :           1 :   g_settings_bind (settings,          "share-state",
+      40                 :           1 :                    self->share_state, "active",
+      41                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      42                 :           1 :   g_settings_bind (settings,                   "offline-notification",
+      43                 :           1 :                    self->offline_notification, "active",
+      44                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      45                 :             : 
+      46                 :           1 :   G_OBJECT_CLASS (valent_connectivity_report_preferences_parent_class)->constructed (object);
+      47                 :           1 : }
+      48                 :             : 
+      49                 :             : static void
+      50                 :           1 : valent_connectivity_report_preferences_dispose (GObject *object)
+      51                 :             : {
+      52                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+      53                 :             : 
+      54                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_CONNECTIVITY_REPORT_PREFERENCES);
+      55                 :             : 
+      56                 :           1 :   G_OBJECT_CLASS (valent_connectivity_report_preferences_parent_class)->dispose (object);
+      57                 :           1 : }
+      58                 :             : 
+      59                 :             : static void
+      60                 :           3 : valent_connectivity_report_preferences_class_init (ValentConnectivityReportPreferencesClass *klass)
+      61                 :             : {
+      62                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      63                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+      64                 :             : 
+      65                 :           3 :   object_class->constructed = valent_connectivity_report_preferences_constructed;
+      66                 :           3 :   object_class->dispose = valent_connectivity_report_preferences_dispose;
+      67                 :             : 
+      68                 :           3 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/connectivity_report/valent-connectivity_report-preferences.ui");
+      69                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentConnectivityReportPreferences, share_state);
+      70                 :           3 :   gtk_widget_class_bind_template_child (widget_class, ValentConnectivityReportPreferences, offline_notification);
+      71                 :           3 : }
+      72                 :             : 
+      73                 :             : static void
+      74                 :           1 : valent_connectivity_report_preferences_init (ValentConnectivityReportPreferences *self)
+      75                 :             : {
+      76                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+      77                 :           1 : }
+      78                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-telephony.c.func-c.html b/coverage/src/plugins/connectivity_report/valent-telephony.c.func-c.html new file mode 100644 index 00000000000..99db3bf9a73 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-telephony.c.func-c.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-telephony.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-telephony.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.5 %160140
Test Date:2024-03-31 18:46:36Functions:100.0 %1717
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.2 %12162
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_telephony_destroy1
valent_telephony_finalize1
g_dbus_proxy_new_for_bus_cb2
on_modem_added2
on_modem_removed2
g_dbus_object_manager_client_new_for_bus_cb3
valent_telephony_class_init3
valent_telephony_constructed3
valent_telephony_init3
on_properties_changed4
valent_telephony_get_default4
get_telephony_type_string6
valent_telephony_serialize_modem6
valent_telephony_get_signal_strengths8
valent_telephony_get_type25
valent_telephony_class_intern_init3
valent_telephony_get_type_once3
valent_telephony_get_type19
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-telephony.c.func.html b/coverage/src/plugins/connectivity_report/valent-telephony.c.func.html new file mode 100644 index 00000000000..64422122ebe --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-telephony.c.func.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-telephony.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-telephony.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.5 %160140
Test Date:2024-03-31 18:46:36Functions:100.0 %1717
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.2 %12162
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_dbus_object_manager_client_new_for_bus_cb3
g_dbus_proxy_new_for_bus_cb2
get_telephony_type_string6
on_modem_added2
on_modem_removed2
on_properties_changed4
valent_telephony_class_init3
valent_telephony_constructed3
valent_telephony_destroy1
valent_telephony_finalize1
valent_telephony_get_default4
valent_telephony_get_signal_strengths8
valent_telephony_get_type25
valent_telephony_class_intern_init3
valent_telephony_get_type19
valent_telephony_get_type_once3
valent_telephony_init3
valent_telephony_serialize_modem6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-telephony.c.gcov.html b/coverage/src/plugins/connectivity_report/valent-telephony.c.gcov.html new file mode 100644 index 00000000000..42ea17938e0 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-telephony.c.gcov.html @@ -0,0 +1,562 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-telephony.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-telephony.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:87.5 %160140
Test Date:2024-03-31 18:46:36Functions:100.0 %1717
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:51.2 %12162
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-telephony"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-telephony.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * ValentTelephony:
+      17                 :             :  *
+      18                 :             :  * A class for controlling pointer and keyboard devices.
+      19                 :             :  *
+      20                 :             :  * `ValentTelephony` is an abstraction of telephony support, intended for use by
+      21                 :             :  * [class@Valent.DevicePlugin] implementations.
+      22                 :             :  */
+      23                 :             : 
+      24                 :             : struct _ValentTelephony
+      25                 :             : {
+      26                 :             :   ValentObject        parent_instance;
+      27                 :             : 
+      28                 :             :   GDBusObjectManager *manager;
+      29                 :             :   GDBusProxy         *modem;
+      30                 :             :   GHashTable         *modems;
+      31                 :             : };
+      32                 :             : 
+      33   [ +  +  +  - ]:          25 : G_DEFINE_FINAL_TYPE (ValentTelephony, valent_telephony, VALENT_TYPE_OBJECT)
+      34                 :             : 
+      35                 :             : enum {
+      36                 :             :   CHANGED,
+      37                 :             :   N_SIGNALS
+      38                 :             : };
+      39                 :             : 
+      40                 :             : static guint signals[N_SIGNALS] = { 0, };
+      41                 :             : 
+      42                 :             : 
+      43                 :             : static ValentTelephony *default_telephony = NULL;
+      44                 :             : 
+      45                 :             : /*
+      46                 :             :  * ModemManager-enums.h
+      47                 :             :  */
+      48                 :             : typedef enum { /*< underscore_name=mm_modem_access_technology >*/
+      49                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN     = 0,
+      50                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_POTS        = 1 << 0,
+      51                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_GSM         = 1 << 1,
+      52                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT = 1 << 2,
+      53                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_GPRS        = 1 << 3,
+      54                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_EDGE        = 1 << 4,
+      55                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_UMTS        = 1 << 5,
+      56                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_HSDPA       = 1 << 6,
+      57                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_HSUPA       = 1 << 7,
+      58                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_HSPA        = 1 << 8,
+      59                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS   = 1 << 9,
+      60                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_1XRTT       = 1 << 10,
+      61                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_EVDO0       = 1 << 11,
+      62                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_EVDOA       = 1 << 12,
+      63                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_EVDOB       = 1 << 13,
+      64                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_LTE         = 1 << 14,
+      65                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_5GNR        = 1 << 15,
+      66                 :             :   MM_MODEM_ACCESS_TECHNOLOGY_ANY         = 0xFFFFFFFF,
+      67                 :             : } ValentModemAccessTechnology;
+      68                 :             : 
+      69                 :             : typedef enum { /*< underscore_name=mm_modem_state >*/
+      70                 :             :   MM_MODEM_STATE_FAILED        = -1,
+      71                 :             :   MM_MODEM_STATE_UNKNOWN       = 0,
+      72                 :             :   MM_MODEM_STATE_INITIALIZING  = 1,
+      73                 :             :   MM_MODEM_STATE_LOCKED        = 2,
+      74                 :             :   MM_MODEM_STATE_DISABLED      = 3,
+      75                 :             :   MM_MODEM_STATE_DISABLING     = 4,
+      76                 :             :   MM_MODEM_STATE_ENABLING      = 5,
+      77                 :             :   MM_MODEM_STATE_ENABLED       = 6,
+      78                 :             :   MM_MODEM_STATE_SEARCHING     = 7,
+      79                 :             :   MM_MODEM_STATE_REGISTERED    = 8,
+      80                 :             :   MM_MODEM_STATE_DISCONNECTING = 9,
+      81                 :             :   MM_MODEM_STATE_CONNECTING    = 10,
+      82                 :             :   MM_MODEM_STATE_CONNECTED     = 11,
+      83                 :             : } ValentModemState;
+      84                 :             : 
+      85                 :             : 
+      86                 :             : static inline const char *
+      87                 :           6 : get_telephony_type_string (unsigned int flags)
+      88                 :             : {
+      89   [ -  -  -  -  :           6 :   switch (flags)
+             -  -  +  -  
+                      + ]
+      90                 :             :     {
+      91                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN:
+      92                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_POTS:
+      93                 :             :       return "Unknown";
+      94                 :             : 
+      95                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_GSM:
+      96                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT:
+      97                 :           0 :       return "GSM";
+      98                 :             : 
+      99                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_GPRS:
+     100                 :           0 :       return "GPRS";
+     101                 :             : 
+     102                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_EDGE:
+     103                 :           0 :       return "EDGE";
+     104                 :             : 
+     105                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_UMTS:
+     106                 :           0 :       return "UMTS";
+     107                 :             : 
+     108                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_HSDPA:
+     109                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_HSUPA:
+     110                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_HSUPA | MM_MODEM_ACCESS_TECHNOLOGY_HSDPA:
+     111                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_HSPA:
+     112                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS:
+     113                 :           0 :       return "HSPA";
+     114                 :             : 
+     115                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_1XRTT:
+     116                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_EVDO0:
+     117                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_EVDOA:
+     118                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_EVDOB:
+     119                 :           0 :       return "CDMA2000";
+     120                 :             : 
+     121                 :           2 :     case MM_MODEM_ACCESS_TECHNOLOGY_LTE:
+     122                 :           2 :       return "LTE";
+     123                 :             : 
+     124                 :           0 :     case MM_MODEM_ACCESS_TECHNOLOGY_5GNR:
+     125                 :           0 :       return "5G";
+     126                 :             : 
+     127                 :             :     case MM_MODEM_ACCESS_TECHNOLOGY_ANY:
+     128                 :             :       return "Unknown";
+     129                 :             : 
+     130                 :             :     default:
+     131                 :             :       return "Unknown";
+     132                 :             :     }
+     133                 :             : }
+     134                 :             : 
+     135                 :             : static void
+     136                 :           4 : on_properties_changed (GDBusProxy      *proxy,
+     137                 :             :                        GVariant        *changed_properties,
+     138                 :             :                        GStrv            invalidated,
+     139                 :             :                        ValentTelephony *self)
+     140                 :             : {
+     141                 :           4 :   GVariantIter iter;
+     142                 :           4 :   const char *property;
+     143                 :           4 :   GVariant *value;
+     144                 :           4 :   gboolean changed = FALSE;
+     145                 :             : 
+     146                 :           4 :   g_variant_iter_init (&iter, changed_properties);
+     147                 :             : 
+     148         [ +  + ]:          44 :   while (g_variant_iter_loop (&iter, "{sv}", &property, &value))
+     149                 :             :     {
+     150         [ +  + ]:          40 :       if (g_str_equal (property, "AccessTechnologies"))
+     151                 :             :         changed = TRUE;
+     152         [ +  + ]:          36 :       else if (g_str_equal (property, "SignalQuality"))
+     153                 :             :         changed = TRUE;
+     154         [ +  + ]:          32 :       else if (g_str_equal (property, "State"))
+     155                 :          12 :         changed = TRUE;
+     156                 :             :     }
+     157                 :             : 
+     158         [ +  - ]:           4 :   if (changed)
+     159                 :           4 :     g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     160                 :           4 : }
+     161                 :             : 
+     162                 :             : static void
+     163                 :           2 : g_dbus_proxy_new_for_bus_cb (GObject      *object,
+     164                 :             :                              GAsyncResult *result,
+     165                 :             :                              gpointer      user_data)
+     166                 :             : {
+     167                 :           2 :   g_autoptr (ValentTelephony) self = VALENT_TELEPHONY (user_data);
+     168         [ -  - ]:           2 :   g_autoptr (GDBusProxy) proxy = NULL;
+     169         [ -  - ]:           2 :   g_autoptr (GError) error = NULL;
+     170                 :           2 :   const char *object_path;
+     171                 :             : 
+     172                 :           2 :   proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
+     173                 :             : 
+     174         [ -  + ]:           2 :   if (proxy == NULL)
+     175                 :             :     {
+     176                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     177         [ #  # ]:           0 :       return;
+     178                 :             :     }
+     179                 :             : 
+     180                 :           2 :   g_signal_connect_object (proxy,
+     181                 :             :                            "g-properties-changed",
+     182                 :             :                            G_CALLBACK (on_properties_changed),
+     183                 :             :                            self, 0);
+     184                 :             : 
+     185                 :           2 :   object_path = g_dbus_proxy_get_object_path (proxy);
+     186         [ -  + ]:           2 :   g_hash_table_replace (self->modems,
+     187                 :           2 :                         g_strdup (object_path),
+     188                 :             :                         g_steal_pointer (&proxy));
+     189                 :             : 
+     190         [ -  + ]:           2 :   g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     191                 :             : }
+     192                 :             : 
+     193                 :             : static void
+     194                 :           2 : on_modem_added (GDBusObjectManager *manager,
+     195                 :             :                 GDBusObject        *object,
+     196                 :             :                 ValentTelephony    *self)
+     197                 :             : {
+     198                 :           2 :   const char *object_path;
+     199                 :             : 
+     200   [ +  -  +  -  :           2 :   g_assert (G_IS_DBUS_OBJECT_MANAGER (manager));
+             +  -  -  + ]
+     201   [ +  -  +  -  :           2 :   g_assert (G_IS_DBUS_OBJECT (object));
+             +  -  -  + ]
+     202         [ -  + ]:           2 :   g_assert (VALENT_IS_TELEPHONY (self));
+     203                 :             : 
+     204                 :           2 :   object_path = g_dbus_object_get_object_path (object);
+     205                 :             : 
+     206   [ +  -  +  -  :           2 :   if (!g_str_has_prefix (object_path, "/org/freedesktop/ModemManager1/Modem"))
+                   -  + ]
+     207                 :           0 :     return;
+     208                 :             : 
+     209                 :           2 :   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+     210                 :             :                             G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+     211                 :             :                             NULL,
+     212                 :             :                             "org.freedesktop.ModemManager1",
+     213                 :             :                             object_path,
+     214                 :             :                             "org.freedesktop.ModemManager1.Modem",
+     215                 :             :                             NULL,
+     216                 :             :                             (GAsyncReadyCallback)g_dbus_proxy_new_for_bus_cb,
+     217                 :             :                             g_object_ref (self));
+     218                 :             : }
+     219                 :             : 
+     220                 :             : static void
+     221                 :           2 : on_modem_removed (GDBusObjectManager *manager,
+     222                 :             :                   GDBusObject        *object,
+     223                 :             :                   ValentTelephony    *self)
+     224                 :             : {
+     225                 :           2 :   const char *object_path;
+     226                 :             : 
+     227   [ +  -  +  -  :           2 :   g_assert (G_IS_DBUS_OBJECT_MANAGER (manager));
+             +  -  -  + ]
+     228   [ +  -  +  -  :           2 :   g_assert (G_IS_DBUS_OBJECT (object));
+             +  -  -  + ]
+     229         [ -  + ]:           2 :   g_assert (VALENT_IS_TELEPHONY (self));
+     230                 :             : 
+     231                 :           2 :   object_path = g_dbus_object_get_object_path (object);
+     232                 :             : 
+     233   [ +  -  +  -  :           2 :   if (!g_str_has_prefix (object_path, "/org/freedesktop/ModemManager1/Modem"))
+                   -  + ]
+     234                 :           0 :     return;
+     235                 :             : 
+     236         [ +  - ]:           2 :   if (g_hash_table_remove (self->modems, object_path))
+     237                 :           2 :     g_signal_emit (G_OBJECT (self), signals [CHANGED], 0);
+     238                 :             : }
+     239                 :             : 
+     240                 :             : static void
+     241                 :           3 : g_dbus_object_manager_client_new_for_bus_cb (GObject      *object,
+     242                 :             :                                              GAsyncResult *result,
+     243                 :             :                                              gpointer      user_data)
+     244                 :             : {
+     245                 :           3 :   g_autoptr (ValentTelephony) self = VALENT_TELEPHONY (user_data);
+     246                 :           3 :   g_autolist (GDBusObject) modems = NULL;
+     247                 :           3 :   g_autoptr (GError) error = NULL;
+     248                 :             : 
+     249                 :           3 :   self->manager = g_dbus_object_manager_client_new_for_bus_finish (result,
+     250                 :             :                                                                    &error);
+     251                 :             : 
+     252         [ -  + ]:           3 :   if (self->manager == NULL)
+     253                 :             :     {
+     254                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     255         [ #  # ]:           0 :       return;
+     256                 :             :     }
+     257                 :             : 
+     258                 :           3 :   modems = g_dbus_object_manager_get_objects (self->manager);
+     259                 :             : 
+     260         [ +  + ]:           4 :   for (const GList *iter = modems; iter; iter = iter->next)
+     261                 :           1 :     on_modem_added (self->manager, iter->data, self);
+     262                 :             : 
+     263                 :           3 :   g_signal_connect_object (self->manager,
+     264                 :             :                            "object-added",
+     265                 :             :                            G_CALLBACK (on_modem_added),
+     266                 :             :                            self, 0);
+     267         [ -  + ]:           3 :   g_signal_connect_object (self->manager,
+     268                 :             :                            "object-removed",
+     269                 :             :                            G_CALLBACK (on_modem_removed),
+     270                 :             :                            self, 0);
+     271                 :             : }
+     272                 :             : 
+     273                 :             : /*
+     274                 :             :  * ValentObject
+     275                 :             :  */
+     276                 :             : static void
+     277                 :           1 : valent_telephony_destroy (ValentObject *object)
+     278                 :             : {
+     279                 :           1 :   ValentTelephony *self = VALENT_TELEPHONY (object);
+     280                 :             : 
+     281                 :           1 :   g_signal_handlers_disconnect_by_data (self->manager, self);
+     282         [ +  - ]:           1 :   g_clear_object (&self->manager);
+     283                 :             : 
+     284                 :           1 :   VALENT_OBJECT_CLASS (valent_telephony_parent_class)->destroy (object);
+     285                 :           1 : }
+     286                 :             : 
+     287                 :             : /*
+     288                 :             :  * GObject
+     289                 :             :  */
+     290                 :             : static void
+     291                 :           3 : valent_telephony_constructed (GObject *object)
+     292                 :             : {
+     293                 :           3 :   ValentTelephony *self = VALENT_TELEPHONY (object);
+     294                 :             : 
+     295                 :           3 :   g_dbus_object_manager_client_new_for_bus (G_BUS_TYPE_SYSTEM,
+     296                 :             :                                             G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START,
+     297                 :             :                                             "org.freedesktop.ModemManager1",
+     298                 :             :                                             "/org/freedesktop/ModemManager1",
+     299                 :             :                                             NULL, NULL, NULL,
+     300                 :             :                                             NULL,
+     301                 :             :                                             (GAsyncReadyCallback)g_dbus_object_manager_client_new_for_bus_cb,
+     302                 :             :                                             g_object_ref (self));
+     303                 :             : 
+     304                 :           3 :   G_OBJECT_CLASS (valent_telephony_parent_class)->constructed (object);
+     305                 :           3 : }
+     306                 :             : 
+     307                 :             : static void
+     308                 :           1 : valent_telephony_finalize (GObject *object)
+     309                 :             : {
+     310                 :           1 :   ValentTelephony *self = VALENT_TELEPHONY (object);
+     311                 :             : 
+     312         [ +  - ]:           1 :   g_clear_pointer (&self->modems, g_hash_table_unref);
+     313                 :             : 
+     314                 :           1 :   G_OBJECT_CLASS (valent_telephony_parent_class)->finalize (object);
+     315                 :           1 : }
+     316                 :             : 
+     317                 :             : static void
+     318                 :           3 : valent_telephony_class_init (ValentTelephonyClass *klass)
+     319                 :             : {
+     320                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     321                 :           3 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     322                 :             : 
+     323                 :           3 :   object_class->constructed = valent_telephony_constructed;
+     324                 :           3 :   object_class->finalize = valent_telephony_finalize;
+     325                 :             : 
+     326                 :           3 :   vobject_class->destroy = valent_telephony_destroy;
+     327                 :             : 
+     328                 :             :   /**
+     329                 :             :    * ValentTelephony::changed:
+     330                 :             :    * @self: a `ValentTelephony`
+     331                 :             :    *
+     332                 :             :    * `ValentTelephony`::changed is emitted whenever a relevant property changes.
+     333                 :             :    */
+     334                 :           6 :   signals [CHANGED] =
+     335                 :           3 :     g_signal_new ("changed",
+     336                 :             :                   G_TYPE_FROM_CLASS (klass),
+     337                 :             :                   G_SIGNAL_RUN_LAST,
+     338                 :             :                   0,
+     339                 :             :                   NULL, NULL, NULL,
+     340                 :             :                   G_TYPE_NONE, 0);
+     341                 :           3 : }
+     342                 :             : 
+     343                 :             : static void
+     344                 :           3 : valent_telephony_init (ValentTelephony *self)
+     345                 :             : {
+     346                 :           3 :   self->modems = g_hash_table_new_full (g_str_hash,
+     347                 :             :                                         g_str_equal,
+     348                 :             :                                         g_free,
+     349                 :             :                                         g_object_unref);
+     350                 :           3 : }
+     351                 :             : 
+     352                 :             : /**
+     353                 :             :  * valent_telephony_get_default:
+     354                 :             :  *
+     355                 :             :  * Get the default [class@Valent.Network].
+     356                 :             :  *
+     357                 :             :  * Returns: (transfer none) (not nullable): a `ValentTelephony`
+     358                 :             :  *
+     359                 :             :  * Since: 1.0
+     360                 :             :  */
+     361                 :             : ValentTelephony *
+     362                 :           4 : valent_telephony_get_default (void)
+     363                 :             : {
+     364         [ +  + ]:           4 :   if (default_telephony == NULL)
+     365                 :             :     {
+     366                 :           3 :       default_telephony = g_object_new (VALENT_TYPE_TELEPHONY, NULL);
+     367                 :             : 
+     368                 :           3 :       g_object_add_weak_pointer (G_OBJECT (default_telephony),
+     369                 :             :                                  (gpointer)&default_telephony);
+     370                 :             :     }
+     371                 :             : 
+     372                 :           4 :   return default_telephony;
+     373                 :             : }
+     374                 :             : 
+     375                 :             : static JsonNode *
+     376                 :           6 : valent_telephony_serialize_modem (GDBusProxy *proxy)
+     377                 :             : {
+     378                 :          12 :   g_autoptr (JsonBuilder) builder = NULL;
+     379                 :           6 :   GVariant *value;
+     380                 :           6 :   unsigned int access_technologies;
+     381                 :           6 :   uint32_t signal_quality;
+     382                 :           6 :   gboolean signal_recent;
+     383                 :           6 :   int32_t state;
+     384                 :           6 :   const char *telephony_type;
+     385                 :           6 :   int64_t signal_strength = -1;
+     386                 :             : 
+     387   [ +  -  +  -  :           6 :   g_assert (G_IS_DBUS_PROXY (proxy));
+             -  +  -  - ]
+     388                 :             : 
+     389                 :             :   /* Extract the relevant properties */
+     390                 :           6 :   value = g_dbus_proxy_get_cached_property (proxy, "AccessTechnologies");
+     391                 :           6 :   g_variant_get (value, "u", &access_technologies);
+     392         [ +  - ]:           6 :   g_clear_pointer (&value, g_variant_unref);
+     393                 :             : 
+     394                 :           6 :   value = g_dbus_proxy_get_cached_property (proxy, "SignalQuality");
+     395                 :           6 :   g_variant_get (value, "(ub)", &signal_quality, &signal_recent);
+     396         [ +  - ]:           6 :   g_clear_pointer (&value, g_variant_unref);
+     397                 :             : 
+     398                 :           6 :   value = g_dbus_proxy_get_cached_property (proxy, "State");
+     399                 :           6 :   g_variant_get (value, "i", &state);
+     400         [ +  - ]:           6 :   g_clear_pointer (&value, g_variant_unref);
+     401                 :             : 
+     402                 :             :   /* Convert to KDE Connect values (`networkType`, `signalStrength`) */
+     403                 :           6 :   telephony_type = get_telephony_type_string (access_technologies);
+     404                 :             : 
+     405         [ +  + ]:           6 :   if (state >= MM_MODEM_STATE_ENABLED)
+     406                 :           2 :     signal_strength = (int64_t)(signal_quality / 20);
+     407                 :             : 
+     408                 :             :   /* Serialize to a JsonNode */
+     409                 :           6 :   builder = json_builder_new ();
+     410                 :           6 :   json_builder_begin_object (builder);
+     411                 :           6 :   json_builder_set_member_name (builder, "networkType");
+     412                 :           6 :   json_builder_add_string_value (builder, telephony_type);
+     413                 :           6 :   json_builder_set_member_name (builder, "signalStrength");
+     414                 :           6 :   json_builder_add_int_value (builder, signal_strength);
+     415                 :           6 :   json_builder_end_object (builder);
+     416                 :             : 
+     417         [ +  - ]:           6 :   return json_builder_get_root (builder);
+     418                 :             : }
+     419                 :             : 
+     420                 :             : /**
+     421                 :             :  * valent_telephony_get_signal_strengths:
+     422                 :             :  * @telephony: a `ValentTelephony`
+     423                 :             :  *
+     424                 :             :  * Get a serialized dictionary of the known modems' status.
+     425                 :             :  *
+     426                 :             :  * Returns: (transfer full) (nullable): a `JsonNode`
+     427                 :             :  *
+     428                 :             :  * Since: 1.0
+     429                 :             :  */
+     430                 :             : JsonNode *
+     431                 :           8 : valent_telephony_get_signal_strengths (ValentTelephony *telephony)
+     432                 :             : {
+     433                 :          16 :   g_autoptr (JsonBuilder) builder = NULL;
+     434                 :           8 :   GHashTableIter iter;
+     435                 :           8 :   gpointer key, value;
+     436                 :           8 :   unsigned int m = 0;
+     437                 :             : 
+     438         [ +  - ]:           8 :   g_return_val_if_fail (VALENT_IS_TELEPHONY (telephony), NULL);
+     439                 :             : 
+     440                 :           8 :   builder = json_builder_new ();
+     441                 :           8 :   json_builder_begin_object (builder);
+     442                 :             : 
+     443                 :           8 :   g_hash_table_iter_init (&iter, telephony->modems);
+     444                 :             : 
+     445         [ +  + ]:          14 :   while (g_hash_table_iter_next (&iter, &key, &value))
+     446                 :             :     {
+     447                 :           6 :       g_autoptr (JsonNode) modem = NULL;
+     448                 :           6 :       g_autofree char *id = NULL;
+     449                 :             : 
+     450                 :           6 :       id = g_strdup_printf ("%u", m++);
+     451                 :           6 :       modem = valent_telephony_serialize_modem (G_DBUS_PROXY (value));
+     452                 :             : 
+     453                 :           6 :       json_builder_set_member_name (builder, id);
+     454                 :           6 :       json_builder_add_value (builder, g_steal_pointer (&modem));
+     455                 :             :     }
+     456                 :             : 
+     457                 :           8 :   json_builder_end_object (builder);
+     458                 :             : 
+     459                 :           8 :   return json_builder_get_root (builder);
+     460                 :             : }
+     461                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-telephony.h.func-c.html b/coverage/src/plugins/connectivity_report/valent-telephony.h.func-c.html new file mode 100644 index 00000000000..8fa99dde96c --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-telephony.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-telephony.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-telephony.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_TELEPHONY16
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-telephony.h.func.html b/coverage/src/plugins/connectivity_report/valent-telephony.h.func.html new file mode 100644 index 00000000000..10fd96875e8 --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-telephony.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-telephony.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-telephony.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_TELEPHONY16
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/connectivity_report/valent-telephony.h.gcov.html b/coverage/src/plugins/connectivity_report/valent-telephony.h.gcov.html new file mode 100644 index 00000000000..17b4c01147c --- /dev/null +++ b/coverage/src/plugins/connectivity_report/valent-telephony.h.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/connectivity_report/valent-telephony.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/connectivity_report - valent-telephony.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_TELEPHONY (valent_telephony_get_type ())
+      11                 :             : 
+      12   [ +  -  +  -  :          23 : G_DECLARE_FINAL_TYPE (ValentTelephony, valent_telephony, VALENT, TELEPHONY, ValentObject)
+             +  +  -  + ]
+      13                 :             : 
+      14                 :             : ValentTelephony * valent_telephony_get_default          (void);
+      15                 :             : JsonNode        * valent_telephony_get_signal_strengths (ValentTelephony *telephony);
+      16                 :             : 
+      17                 :             : G_END_DECLS
+      18                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/contacts-plugin.c.func-c.html b/coverage/src/plugins/contacts/contacts-plugin.c.func-c.html new file mode 100644 index 00000000000..ebd4b22e282 --- /dev/null +++ b/coverage/src/plugins/contacts/contacts-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/contacts-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - contacts-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contacts_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/contacts-plugin.c.func.html b/coverage/src/plugins/contacts/contacts-plugin.c.func.html new file mode 100644 index 00000000000..fa69c52b240 --- /dev/null +++ b/coverage/src/plugins/contacts/contacts-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/contacts-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - contacts-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contacts_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/contacts-plugin.c.gcov.html b/coverage/src/plugins/contacts/contacts-plugin.c.gcov.html new file mode 100644 index 00000000000..1f7bde0c840 --- /dev/null +++ b/coverage/src/plugins/contacts/contacts-plugin.c.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/contacts-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - contacts-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-contacts-plugin.h"
+      10                 :             : #include "valent-contacts-preferences.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_contacts_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_CONTACTS_PLUGIN);
+      19                 :             : 
+      20                 :           2 :   peas_object_module_register_extension_type (module,
+      21                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      22                 :             :                                               VALENT_TYPE_CONTACTS_PREFERENCES);
+      23                 :           2 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-detail-sort-b.html b/coverage/src/plugins/contacts/index-detail-sort-b.html new file mode 100644 index 00000000000..5798bcd3b88 --- /dev/null +++ b/coverage/src/plugins/contacts/index-detail-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-detail-sort-f.html b/coverage/src/plugins/contacts/index-detail-sort-f.html new file mode 100644 index 00000000000..31fc1699f0a --- /dev/null +++ b/coverage/src/plugins/contacts/index-detail-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-detail-sort-l.html b/coverage/src/plugins/contacts/index-detail-sort-l.html new file mode 100644 index 00000000000..41670b21e7a --- /dev/null +++ b/coverage/src/plugins/contacts/index-detail-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-detail.html b/coverage/src/plugins/contacts/index-detail.html new file mode 100644 index 00000000000..b243192ffc0 --- /dev/null +++ b/coverage/src/plugins/contacts/index-detail.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-sort-b.html b/coverage/src/plugins/contacts/index-sort-b.html new file mode 100644 index 00000000000..5798bcd3b88 --- /dev/null +++ b/coverage/src/plugins/contacts/index-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-sort-f.html b/coverage/src/plugins/contacts/index-sort-f.html new file mode 100644 index 00000000000..31fc1699f0a --- /dev/null +++ b/coverage/src/plugins/contacts/index-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index-sort-l.html b/coverage/src/plugins/contacts/index-sort-l.html new file mode 100644 index 00000000000..41670b21e7a --- /dev/null +++ b/coverage/src/plugins/contacts/index-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/index.html b/coverage/src/plugins/contacts/index.html new file mode 100644 index 00000000000..b243192ffc0 --- /dev/null +++ b/coverage/src/plugins/contacts/index.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contactsCoverageTotalHit
Test:Code CoverageLines:86.4 %339293
Test Date:2024-03-31 18:46:36Functions:93.8 %3230
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:49.0 %208102
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
contacts-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-contacts-plugin.c +
93.7%93.7%
+
93.7 %22120757.9 %14081100.0 %1717
valent-contacts-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-contacts-preferences.c +
71.4%71.4%
+
71.4 %1128026.8 %561583.3 %1210
valent-contacts-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-plugin.c.func-c.html b/coverage/src/plugins/contacts/valent-contacts-plugin.c.func-c.html new file mode 100644 index 00000000000..0b8000d04dd --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-plugin.c.func-c.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.7 %221207
Test Date:2024-03-31 18:46:36Functions:100.0 %1717
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.9 %14081
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
contacts_fetch_action1
valent_contact_plugin_handle_request_all_uids_timestamps1
valent_contact_plugin_handle_request_vcards_by_uid1
valent_contact_plugin_handle_response_uids_timestamps1
valent_contact_plugin_handle_response_vcards1
valent_contact_store_add_contacts_cb1
valent_contact_store_query_uids_cb1
valent_contact_store_query_vcards_cb1
valent_contacts_plugin_constructed3
valent_contacts_plugin_init3
valent_contacts_plugin_handle_packet4
valent_contacts_plugin_request_all_uids_timestamps4
valent_contacts_plugin_destroy6
valent_contacts_plugin_update_state10
valent_contacts_plugin_get_type29
valent_contacts_plugin_class_intern_init2
valent_contacts_plugin_get_type_once2
valent_contacts_plugin_get_type25
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-plugin.c.func.html b/coverage/src/plugins/contacts/valent-contacts-plugin.c.func.html new file mode 100644 index 00000000000..a631a808da2 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-plugin.c.func.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.7 %221207
Test Date:2024-03-31 18:46:36Functions:100.0 %1717
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.9 %14081
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
contacts_fetch_action1
valent_contact_plugin_handle_request_all_uids_timestamps1
valent_contact_plugin_handle_request_vcards_by_uid1
valent_contact_plugin_handle_response_uids_timestamps1
valent_contact_plugin_handle_response_vcards1
valent_contact_store_add_contacts_cb1
valent_contact_store_query_uids_cb1
valent_contact_store_query_vcards_cb1
valent_contacts_plugin_constructed3
valent_contacts_plugin_destroy6
valent_contacts_plugin_get_type29
valent_contacts_plugin_class_intern_init2
valent_contacts_plugin_get_type25
valent_contacts_plugin_get_type_once2
valent_contacts_plugin_handle_packet4
valent_contacts_plugin_init3
valent_contacts_plugin_request_all_uids_timestamps4
valent_contacts_plugin_update_state10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-plugin.c.gcov.html b/coverage/src/plugins/contacts/valent-contacts-plugin.c.gcov.html new file mode 100644 index 00000000000..65663027833 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-plugin.c.gcov.html @@ -0,0 +1,585 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.7 %221207
Test Date:2024-03-31 18:46:36Functions:100.0 %1717
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.9 %14081
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contacts-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-contacts-plugin.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentContactsPlugin
+      16                 :             : {
+      17                 :             :   ValentDevicePlugin  parent_instance;
+      18                 :             : 
+      19                 :             :   GCancellable       *cancellable;
+      20                 :             : 
+      21                 :             :   ValentContactStore *local_store;
+      22                 :             :   ValentContactStore *remote_store;
+      23                 :             : };
+      24                 :             : 
+      25   [ +  +  +  - ]:          29 : G_DEFINE_FINAL_TYPE (ValentContactsPlugin, valent_contacts_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      26                 :             : 
+      27                 :             : 
+      28                 :             : /*
+      29                 :             :  * Local Contacts
+      30                 :             :  */
+      31                 :             : static void
+      32                 :           1 : valent_contact_store_query_vcards_cb (ValentContactStore   *store,
+      33                 :             :                                       GAsyncResult         *result,
+      34                 :             :                                       ValentContactsPlugin *self)
+      35                 :             : {
+      36                 :           1 :   g_autoptr (JsonBuilder) builder = NULL;
+      37   [ -  -  -  + ]:           1 :   g_autoptr (JsonNode) response = NULL;
+      38   [ -  -  +  - ]:           1 :   g_autoslist (GObject) contacts = NULL;
+      39                 :           1 :   g_autoptr (GError) error = NULL;
+      40                 :             : 
+      41         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+      42                 :             : 
+      43                 :           1 :   contacts = valent_contact_store_query_finish (store, result, &error);
+      44                 :             : 
+      45         [ -  + ]:           1 :   if (error != NULL)
+      46                 :             :     {
+      47                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+      48         [ #  # ]:           0 :       return;
+      49                 :             :     }
+      50                 :             : 
+      51                 :           1 :   valent_packet_init (&builder, "kdeconnect.contacts.response_vcards");
+      52                 :             : 
+      53                 :             :   /* Add UIDs */
+      54                 :           1 :   json_builder_set_member_name (builder, "uids");
+      55                 :           1 :   json_builder_begin_array (builder);
+      56                 :             : 
+      57         [ +  + ]:           3 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+      58                 :             :     {
+      59                 :           2 :       const char *uid;
+      60                 :             : 
+      61                 :           2 :       uid = e_contact_get_const (iter->data, E_CONTACT_UID);
+      62                 :           2 :       json_builder_add_string_value (builder, uid);
+      63                 :             :     }
+      64                 :           1 :   json_builder_end_array (builder);
+      65                 :             : 
+      66                 :             :   /* Add vCard data */
+      67         [ +  + ]:           3 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+      68                 :             :     {
+      69                 :           2 :       const char *uid;
+      70                 :           2 :       g_autofree char *vcard_data = NULL;
+      71                 :             : 
+      72                 :           2 :       uid = e_contact_get_const (iter->data, E_CONTACT_UID);
+      73                 :           2 :       json_builder_set_member_name (builder, uid);
+      74                 :             : 
+      75                 :           2 :       vcard_data = e_vcard_to_string (iter->data, EVC_FORMAT_VCARD_21);
+      76                 :           2 :       json_builder_add_string_value (builder, vcard_data);
+      77                 :             :     }
+      78                 :             : 
+      79                 :             :   /* Finish and send the response */
+      80                 :           1 :   response = valent_packet_end (&builder);
+      81         [ -  + ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), response);
+      82                 :             : }
+      83                 :             : 
+      84                 :             : static void
+      85                 :           1 : valent_contact_plugin_handle_request_vcards_by_uid (ValentContactsPlugin *self,
+      86                 :             :                                                     JsonNode             *packet)
+      87                 :             : {
+      88                 :           1 :   GSettings *settings;
+      89                 :           1 :   g_autofree EBookQuery **queries = NULL;
+      90                 :           1 :   g_autoptr (EBookQuery) query = NULL;
+      91         [ +  - ]:           1 :   g_autofree char *sexp = NULL;
+      92                 :           1 :   JsonArray *uids;
+      93                 :           1 :   unsigned int n_uids, n_queries;
+      94                 :             : 
+      95         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+      96                 :             : 
+      97                 :             : #ifndef __clang_analyzer__
+      98                 :             :   /* Bail if exporting is disabled */
+      99                 :           1 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     100                 :             : 
+     101   [ +  -  -  + ]:           1 :   if (self->local_store == NULL || !g_settings_get_boolean (settings, "local-sync"))
+     102                 :           0 :     return;
+     103                 :             : 
+     104         [ -  + ]:           1 :   if (!valent_packet_get_array (packet, "uids", &uids))
+     105                 :             :     {
+     106                 :           0 :       g_debug ("%s(): expected \"uids\" field holding an array",
+     107                 :             :                G_STRFUNC);
+     108                 :           0 :       return;
+     109                 :             :     }
+     110                 :             : 
+     111                 :             :   /* Build a list of queries */
+     112                 :           1 :   n_uids = json_array_get_length (uids);
+     113         [ -  + ]:           1 :   queries = g_new (EBookQuery *, n_uids);
+     114                 :           1 :   n_queries = 0;
+     115                 :             : 
+     116         [ +  + ]:           3 :   for (unsigned int i = 0; i < n_uids; i++)
+     117                 :             :     {
+     118                 :           2 :       JsonNode *element = json_array_get_element (uids, i);
+     119                 :           2 :       const char *uid = NULL;
+     120                 :             : 
+     121         [ +  - ]:           2 :       if G_LIKELY (json_node_get_value_type (element) == G_TYPE_STRING)
+     122                 :           2 :         uid = json_node_get_string (element);
+     123                 :             : 
+     124   [ +  -  +  - ]:           2 :       if G_UNLIKELY (uid == NULL || *uid == '\0')
+     125                 :             :         {
+     126                 :           0 :           g_debug ("%s(): expected \"uids\" element to contain a string",
+     127                 :             :                    G_STRFUNC);
+     128                 :           0 :           continue;
+     129                 :             :         }
+     130                 :             : 
+     131                 :           2 :       queries[n_queries++] = e_book_query_field_test (E_CONTACT_UID,
+     132                 :             :                                                       E_BOOK_QUERY_IS,
+     133                 :             :                                                       uid);
+     134                 :             :     }
+     135                 :             : 
+     136         [ +  - ]:           1 :   if (n_queries == 0)
+     137                 :             :     return;
+     138                 :             : 
+     139                 :           1 :   query = e_book_query_or (n_queries, queries, TRUE);
+     140                 :           1 :   sexp = e_book_query_to_string (query);
+     141                 :             : 
+     142                 :           1 :   valent_contact_store_query (self->local_store,
+     143                 :             :                               sexp,
+     144                 :             :                               self->cancellable,
+     145                 :             :                               (GAsyncReadyCallback)valent_contact_store_query_vcards_cb,
+     146                 :             :                               self);
+     147                 :             : #endif /* __clang_analyzer__ */
+     148                 :             : }
+     149                 :             : 
+     150                 :             : static void
+     151                 :           1 : valent_contact_store_query_uids_cb (ValentContactStore   *store,
+     152                 :             :                                     GAsyncResult         *result,
+     153                 :             :                                     ValentContactsPlugin *self)
+     154                 :             : {
+     155                 :           1 :   g_autoptr (JsonBuilder) builder = NULL;
+     156   [ -  -  -  + ]:           1 :   g_autoptr (JsonNode) response = NULL;
+     157   [ -  -  +  - ]:           1 :   g_autoslist (GObject) contacts = NULL;
+     158                 :           1 :   g_autoptr (GError) error = NULL;
+     159                 :             : 
+     160         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     161                 :             : 
+     162                 :           1 :   contacts = valent_contact_store_query_finish (store, result, &error);
+     163                 :             : 
+     164                 :             :   /* If the operation was cancelled, we're about to dispose. For any other
+     165                 :             :    * error log a warning and send an empty list. */
+     166         [ -  + ]:           1 :   if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     167         [ #  # ]:           0 :     return;
+     168                 :             : 
+     169         [ -  + ]:           1 :   if (error != NULL)
+     170                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     171                 :             : 
+     172                 :             :   /* Build response */
+     173                 :           1 :   valent_packet_init (&builder, "kdeconnect.contacts.response_uids_timestamps");
+     174                 :             : 
+     175         [ +  + ]:           3 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+     176                 :             :     {
+     177                 :           2 :       const char *uid;
+     178                 :           2 :       int64_t timestamp = 0;
+     179                 :             : 
+     180                 :           2 :       uid = e_contact_get_const (iter->data, E_CONTACT_UID);
+     181                 :           2 :       json_builder_set_member_name (builder, uid);
+     182                 :             : 
+     183                 :             :       // TODO: We probably need to convert between the custom field
+     184                 :             :       // `X-KDECONNECT-TIMESTAMP` and `E_CONTACT_REV` to set a proper timestamp
+     185                 :           2 :       timestamp = 0;
+     186                 :           2 :       json_builder_add_int_value (builder, timestamp);
+     187                 :             :     }
+     188                 :             : 
+     189                 :           1 :   response = valent_packet_end (&builder);
+     190         [ -  + ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), response);
+     191                 :             : }
+     192                 :             : 
+     193                 :             : static void
+     194                 :           1 : valent_contact_plugin_handle_request_all_uids_timestamps (ValentContactsPlugin *self,
+     195                 :             :                                                           JsonNode             *packet)
+     196                 :             : {
+     197                 :           1 :   GSettings *settings;
+     198                 :           0 :   g_autoptr (EBookQuery) query = NULL;
+     199         [ +  - ]:           1 :   g_autofree char *sexp = NULL;
+     200                 :             : 
+     201         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+     202                 :             : 
+     203                 :             :   /* Bail if exporting is disabled */
+     204                 :           1 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     205                 :             : 
+     206   [ +  -  -  + ]:           1 :   if (self->local_store == NULL || !g_settings_get_boolean (settings, "local-sync"))
+     207                 :           0 :     return;
+     208                 :             : 
+     209                 :           1 :   query = e_book_query_vcard_field_exists (EVC_UID);
+     210                 :           1 :   sexp = e_book_query_to_string (query);
+     211                 :             : 
+     212                 :           1 :   valent_contact_store_query (self->local_store,
+     213                 :             :                               sexp,
+     214                 :             :                               self->cancellable,
+     215                 :             :                               (GAsyncReadyCallback)valent_contact_store_query_uids_cb,
+     216                 :             :                               self);
+     217                 :             : }
+     218                 :             : 
+     219                 :             : /*
+     220                 :             :  * Remote Contacts
+     221                 :             :  */
+     222                 :             : static void
+     223                 :           1 : valent_contact_plugin_handle_response_uids_timestamps (ValentContactsPlugin *self,
+     224                 :             :                                                        JsonNode             *packet)
+     225                 :             : {
+     226                 :           2 :   g_autoptr (JsonNode) request = NULL;
+     227         [ +  - ]:           1 :   g_autoptr (JsonBuilder) builder = NULL;
+     228                 :           1 :   JsonObjectIter iter;
+     229                 :           1 :   const char *uid;
+     230                 :           1 :   JsonNode *node;
+     231                 :           1 :   unsigned int n_requested = 0;
+     232                 :             : 
+     233         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+     234                 :             : 
+     235                 :             :   /* Start the packet */
+     236                 :           1 :   valent_packet_init (&builder, "kdeconnect.contacts.request_vcards_by_uid");
+     237                 :           1 :   json_builder_set_member_name (builder, "uids");
+     238                 :           1 :   json_builder_begin_array (builder);
+     239                 :             : 
+     240                 :           1 :   json_object_iter_init (&iter, valent_packet_get_body (packet));
+     241                 :             : 
+     242         [ +  + ]:           4 :   while (json_object_iter_next (&iter, &uid, &node))
+     243                 :             :     {
+     244                 :           3 :       int64_t timestamp = 0;
+     245                 :             : 
+     246                 :             :       // skip the "uids" array
+     247         [ +  + ]:           3 :       if G_UNLIKELY (g_str_equal ("uids", uid))
+     248                 :           1 :         continue;
+     249                 :             : 
+     250         [ +  - ]:           2 :       if G_LIKELY (json_node_get_value_type (node) == G_TYPE_INT64)
+     251                 :           2 :         timestamp = json_node_get_int (node);
+     252                 :             : 
+     253                 :             :       /* Check if the contact is new or updated */
+     254         [ -  + ]:           2 :       if (0 != timestamp)
+     255                 :             :       //if (valent_contact_store_get_timestamp (self->store, uid) != timestamp)
+     256                 :             :         {
+     257                 :           2 :           n_requested++;
+     258                 :           2 :           json_builder_add_string_value (builder, uid);
+     259                 :             :         }
+     260                 :             :     }
+     261                 :             : 
+     262                 :           1 :   json_builder_end_array (builder);
+     263                 :           1 :   request = valent_packet_end (&builder);
+     264                 :             : 
+     265         [ +  - ]:           1 :   if (n_requested > 0)
+     266                 :           1 :     valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), request);
+     267                 :           1 : }
+     268                 :             : 
+     269                 :             : static void
+     270                 :           1 : valent_contact_store_add_contacts_cb (ValentContactStore *store,
+     271                 :             :                                       GAsyncResult       *result,
+     272                 :             :                                       gpointer            user_data)
+     273                 :             : {
+     274                 :           2 :   g_autoptr (GError) error = NULL;
+     275                 :             : 
+     276   [ -  +  -  - ]:           1 :   if (!valent_contact_store_add_contacts_finish (store, result, &error) &&
+     277                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     278                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     279                 :           1 : }
+     280                 :             : 
+     281                 :             : static void
+     282                 :           1 : valent_contact_plugin_handle_response_vcards (ValentContactsPlugin *self,
+     283                 :             :                                               JsonNode             *packet)
+     284                 :             : {
+     285                 :           2 :   g_autoslist (EContact) contacts = NULL;
+     286                 :           1 :   JsonObject *body;
+     287                 :           1 :   JsonObjectIter iter;
+     288                 :           1 :   const char *uid;
+     289                 :           1 :   JsonNode *node;
+     290                 :             : 
+     291         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+     292                 :             : 
+     293                 :           1 :   body = valent_packet_get_body (packet);
+     294                 :           1 :   json_object_iter_init (&iter, body);
+     295                 :             : 
+     296         [ +  + ]:           4 :   while (json_object_iter_next (&iter, &uid, &node))
+     297                 :             :     {
+     298                 :           3 :       EContact *contact;
+     299                 :           3 :       const char *vcard;
+     300                 :             : 
+     301                 :             :       /* NOTE: This has the side-effect of ignoring `uids` array, which is fine
+     302                 :             :        *       because the contact members are the ultimate source of truth. */
+     303         [ +  + ]:           3 :       if G_UNLIKELY (json_node_get_value_type (node) != G_TYPE_STRING)
+     304                 :           1 :         continue;
+     305                 :             : 
+     306                 :           2 :       vcard = json_node_get_string (node);
+     307                 :           2 :       contact = e_contact_new_from_vcard_with_uid (vcard, uid);
+     308                 :             : 
+     309                 :           2 :       contacts = g_slist_append (contacts, contact);
+     310                 :             :     }
+     311                 :             : 
+     312         [ +  - ]:           1 :   if (contacts != NULL)
+     313                 :             :     {
+     314                 :           1 :       valent_contact_store_add_contacts (self->remote_store,
+     315                 :             :                                          contacts,
+     316                 :             :                                          self->cancellable,
+     317                 :             :                                          (GAsyncReadyCallback)valent_contact_store_add_contacts_cb,
+     318                 :             :                                          NULL);
+     319                 :             :     }
+     320                 :           1 : }
+     321                 :             : 
+     322                 :             : static void
+     323                 :           4 : valent_contacts_plugin_request_all_uids_timestamps (ValentContactsPlugin *self)
+     324                 :             : {
+     325                 :           8 :   g_autoptr (JsonNode) packet = NULL;
+     326                 :             : 
+     327         [ +  - ]:           4 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+     328                 :             : 
+     329                 :           4 :   packet = valent_packet_new ("kdeconnect.contacts.request_all_uids_timestamps");
+     330         [ +  - ]:           4 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     331                 :           4 : }
+     332                 :             : 
+     333                 :             : /*
+     334                 :             :  * GActions
+     335                 :             :  */
+     336                 :             : static void
+     337                 :           1 : contacts_fetch_action (GSimpleAction *action,
+     338                 :             :                        GVariant      *parameter,
+     339                 :             :                        gpointer       user_data)
+     340                 :             : {
+     341                 :           1 :   ValentContactsPlugin *self = VALENT_CONTACTS_PLUGIN (user_data);
+     342                 :             : 
+     343         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+     344                 :             : 
+     345                 :           1 :   valent_contacts_plugin_request_all_uids_timestamps (self);
+     346                 :           1 : }
+     347                 :             : 
+     348                 :             : static const GActionEntry actions[] = {
+     349                 :             :     {"fetch", contacts_fetch_action, NULL, NULL, NULL}
+     350                 :             : };
+     351                 :             : 
+     352                 :             : /*
+     353                 :             :  * ValentDevicePlugin
+     354                 :             :  */
+     355                 :             : static void
+     356                 :          10 : valent_contacts_plugin_update_state (ValentDevicePlugin *plugin,
+     357                 :             :                                      ValentDeviceState   state)
+     358                 :             : {
+     359                 :          10 :   ValentContactsPlugin *self = VALENT_CONTACTS_PLUGIN (plugin);
+     360                 :          10 :   gboolean available;
+     361                 :             : 
+     362         [ +  - ]:          10 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (self));
+     363                 :             : 
+     364                 :          10 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     365                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     366                 :             : 
+     367                 :          10 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     368                 :             : 
+     369         [ +  + ]:          10 :   if (available)
+     370                 :           3 :     valent_contacts_plugin_request_all_uids_timestamps (self);
+     371                 :          10 : }
+     372                 :             : 
+     373                 :             : static void
+     374                 :           4 : valent_contacts_plugin_handle_packet (ValentDevicePlugin *plugin,
+     375                 :             :                                       const char         *type,
+     376                 :             :                                       JsonNode           *packet)
+     377                 :             : {
+     378                 :           4 :   ValentContactsPlugin *self = VALENT_CONTACTS_PLUGIN (plugin);
+     379                 :             : 
+     380         [ +  - ]:           4 :   g_assert (VALENT_IS_CONTACTS_PLUGIN (plugin));
+     381         [ -  + ]:           4 :   g_assert (type != NULL);
+     382         [ -  + ]:           4 :   g_assert (VALENT_IS_PACKET (packet));
+     383                 :             : 
+     384                 :             :   /* A response to a request for a listing of contacts */
+     385         [ +  + ]:           4 :   if (g_str_equal (type, "kdeconnect.contacts.response_uids_timestamps"))
+     386                 :           1 :     valent_contact_plugin_handle_response_uids_timestamps (self, packet);
+     387                 :             : 
+     388                 :             :   /* A response to a request for contacts */
+     389         [ +  + ]:           3 :   else if (g_str_equal (type, "kdeconnect.contacts.response_vcards"))
+     390                 :           1 :     valent_contact_plugin_handle_response_vcards (self, packet);
+     391                 :             : 
+     392                 :             :   /* A request for a listing of contacts */
+     393         [ +  + ]:           2 :   else if (g_str_equal (type, "kdeconnect.contacts.request_all_uids_timestamps"))
+     394                 :           1 :     valent_contact_plugin_handle_request_all_uids_timestamps (self, packet);
+     395                 :             : 
+     396                 :             :   /* A request for contacts */
+     397         [ +  - ]:           1 :   else if (g_str_equal (type, "kdeconnect.contacts.request_vcards_by_uid"))
+     398                 :           1 :     valent_contact_plugin_handle_request_vcards_by_uid (self, packet);
+     399                 :             : 
+     400                 :             :   else
+     401                 :           0 :     g_assert_not_reached ();
+     402                 :           4 : }
+     403                 :             : 
+     404                 :             : /*
+     405                 :             :  * ValentObject
+     406                 :             :  */
+     407                 :             : static void
+     408                 :           6 : valent_contacts_plugin_destroy (ValentObject *object)
+     409                 :             : {
+     410                 :           6 :   ValentContactsPlugin *self = VALENT_CONTACTS_PLUGIN (object);
+     411                 :             : 
+     412                 :             :   /* Cancel any pending operations and drop the address books */
+     413                 :           6 :   g_cancellable_cancel (self->cancellable);
+     414         [ +  + ]:           6 :   g_clear_object (&self->cancellable);
+     415         [ +  + ]:           6 :   g_clear_object (&self->remote_store);
+     416         [ +  + ]:           6 :   g_clear_object (&self->local_store);
+     417                 :             : 
+     418                 :           6 :   VALENT_OBJECT_CLASS (valent_contacts_plugin_parent_class)->destroy (object);
+     419                 :           6 : }
+     420                 :             : 
+     421                 :             : /*
+     422                 :             :  * GObject
+     423                 :             :  */
+     424                 :             : static void
+     425                 :           3 : valent_contacts_plugin_constructed (GObject *object)
+     426                 :             : {
+     427                 :           3 :   ValentContactsPlugin *self = VALENT_CONTACTS_PLUGIN (object);
+     428                 :           3 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     429                 :           3 :   ValentContacts *contacts = valent_contacts_get_default ();
+     430                 :           3 :   ValentContactStore *store = NULL;
+     431                 :           6 :   g_autofree char *local_uid = NULL;
+     432                 :           3 :   ValentDevice *device;
+     433                 :           3 :   GSettings *settings;
+     434                 :             : 
+     435                 :           3 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     436                 :             :                                    actions,
+     437                 :             :                                    G_N_ELEMENTS (actions),
+     438                 :             :                                    plugin);
+     439                 :             : 
+     440                 :             :   /* Prepare Addressbooks */
+     441                 :           3 :   self->cancellable = g_cancellable_new ();
+     442                 :           3 :   device = valent_extension_get_object (VALENT_EXTENSION (plugin));
+     443                 :           3 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     444                 :             : 
+     445                 :           3 :   store = valent_contacts_ensure_store (valent_contacts_get_default (),
+     446                 :             :                                         valent_device_get_id (device),
+     447                 :             :                                         valent_device_get_name (device));
+     448                 :           3 :   g_set_object (&self->remote_store, store);
+     449                 :             : 
+     450                 :             :   /* Local address book, shared with remote device */
+     451                 :           3 :   local_uid = g_settings_get_string (settings, "local-uid");
+     452                 :             : 
+     453         [ +  + ]:           3 :   if (*local_uid != '\0')
+     454                 :             :     {
+     455                 :           2 :       unsigned int n_stores = g_list_model_get_n_items (G_LIST_MODEL (contacts));
+     456                 :             : 
+     457         [ +  - ]:           4 :       for (unsigned int i = 0; i < n_stores; i++)
+     458                 :             :         {
+     459                 :           2 :           g_autoptr (ValentContactStore) local = NULL;
+     460                 :             : 
+     461                 :           4 :           local = g_list_model_get_item (G_LIST_MODEL (contacts), i);
+     462                 :             : 
+     463         [ +  + ]:           4 :           if (g_strcmp0 (valent_contact_store_get_uid (local), local_uid) != 0)
+     464         [ +  - ]:           2 :             continue;
+     465                 :             : 
+     466                 :           2 :           g_set_object (&self->local_store, local);
+     467         [ +  - ]:           2 :           break;
+     468                 :             :         }
+     469                 :             :     }
+     470                 :             : 
+     471                 :           3 :   G_OBJECT_CLASS (valent_contacts_plugin_parent_class)->constructed (object);
+     472                 :           3 : }
+     473                 :             : 
+     474                 :             : static void
+     475                 :           2 : valent_contacts_plugin_class_init (ValentContactsPluginClass *klass)
+     476                 :             : {
+     477                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     478                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     479                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     480                 :             : 
+     481                 :           2 :   object_class->constructed = valent_contacts_plugin_constructed;
+     482                 :             : 
+     483                 :           2 :   vobject_class->destroy = valent_contacts_plugin_destroy;
+     484                 :             : 
+     485                 :           2 :   plugin_class->handle_packet = valent_contacts_plugin_handle_packet;
+     486                 :           2 :   plugin_class->update_state = valent_contacts_plugin_update_state;
+     487                 :             : }
+     488                 :             : 
+     489                 :             : static void
+     490                 :           3 : valent_contacts_plugin_init (ValentContactsPlugin *self)
+     491                 :             : {
+     492                 :           3 : }
+     493                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-plugin.h.func-c.html b/coverage/src/plugins/contacts/valent-contacts-plugin.h.func-c.html new file mode 100644 index 00000000000..05bd8871c12 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS_PLUGIN23
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-plugin.h.func.html b/coverage/src/plugins/contacts/valent-contacts-plugin.h.func.html new file mode 100644 index 00000000000..aa0f30da8d8 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS_PLUGIN23
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-plugin.h.gcov.html b/coverage/src/plugins/contacts/valent-contacts-plugin.h.gcov.html new file mode 100644 index 00000000000..77265939115 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_CONTACTS_PLUGIN (valent_contacts_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          23 : G_DECLARE_FINAL_TYPE (ValentContactsPlugin, valent_contacts_plugin, VALENT, CONTACTS_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-preferences.c.func-c.html b/coverage/src/plugins/contacts/valent-contacts-preferences.c.func-c.html new file mode 100644 index 00000000000..d960ed57d30 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-preferences.c.func-c.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:71.4 %11280
Test Date:2024-03-31 18:46:36Functions:83.3 %1210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:26.8 %5615
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_local_sync0
on_store_selected0
_adw_expander_row_get_list1
valent_contacts_preferences_constructed1
valent_contacts_preferences_create_row_func1
valent_contacts_preferences_dispose1
valent_contacts_preferences_finalize1
valent_contacts_preferences_init1
valent_contacts_preferences_class_init2
valent_contacts_preferences_get_type8
valent_contacts_preferences_class_intern_init2
valent_contacts_preferences_get_type_once2
valent_contacts_preferences_get_type4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-preferences.c.func.html b/coverage/src/plugins/contacts/valent-contacts-preferences.c.func.html new file mode 100644 index 00000000000..c8053322748 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-preferences.c.func.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:71.4 %11280
Test Date:2024-03-31 18:46:36Functions:83.3 %1210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:26.8 %5615
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_adw_expander_row_get_list1
on_local_sync0
on_store_selected0
valent_contacts_preferences_class_init2
valent_contacts_preferences_constructed1
valent_contacts_preferences_create_row_func1
valent_contacts_preferences_dispose1
valent_contacts_preferences_finalize1
valent_contacts_preferences_get_type8
valent_contacts_preferences_class_intern_init2
valent_contacts_preferences_get_type4
valent_contacts_preferences_get_type_once2
valent_contacts_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-preferences.c.gcov.html b/coverage/src/plugins/contacts/valent-contacts-preferences.c.gcov.html new file mode 100644 index 00000000000..8e7a7e9c9ed --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-preferences.c.gcov.html @@ -0,0 +1,342 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:71.4 %11280
Test Date:2024-03-31 18:46:36Functions:83.3 %1210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:26.8 %5615
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contacts-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-contacts-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentContactsPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   GHashTable                   *local_stores;
+      21                 :             : 
+      22                 :             :   /* template */
+      23                 :             :   AdwExpanderRow               *local_sync;
+      24                 :             :   GtkListBox                   *local_list;
+      25                 :             :   GtkSwitch                    *remote_sync;
+      26                 :             : };
+      27                 :             : 
+      28   [ +  +  +  - ]:           8 : G_DEFINE_FINAL_TYPE (ValentContactsPreferences, valent_contacts_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      29                 :             : 
+      30                 :             : 
+      31                 :             : static void
+      32                 :           0 : on_local_sync (GtkListBox                   *box,
+      33                 :             :                GtkListBoxRow                *row,
+      34                 :             :                ValentDevicePreferencesGroup *group)
+      35                 :             : {
+      36                 :           0 :   GSettings *settings;
+      37                 :           0 :   g_autofree char *local_uid = NULL;
+      38                 :           0 :   const char *uid;
+      39                 :             : 
+      40   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX (box));
+             #  #  #  # ]
+      41   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX_ROW (row));
+             #  #  #  # ]
+      42         [ #  # ]:           0 :   g_assert (VALENT_IS_DEVICE_PREFERENCES_GROUP (group));
+      43                 :             : 
+      44                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+      45                 :           0 :   local_uid = g_settings_get_string (settings, "local-uid");
+      46                 :           0 :   uid = gtk_widget_get_name (GTK_WIDGET (row));
+      47                 :             : 
+      48         [ #  # ]:           0 :   if (g_strcmp0 (local_uid, uid) == 0)
+      49                 :           0 :     g_settings_reset (settings, "local-uid");
+      50                 :             :   else
+      51                 :           0 :     g_settings_set_string (settings, "local-uid", uid);
+      52                 :             : 
+      53                 :           0 :   gtk_list_box_invalidate_filter (box);
+      54                 :           0 : }
+      55                 :             : 
+      56                 :             : static void
+      57                 :           0 : on_store_selected (AdwActionRow              *row,
+      58                 :             :                    ValentContactsPreferences *self)
+      59                 :             : {
+      60                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      61                 :           0 :   GSettings *settings;
+      62                 :           0 :   GHashTableIter iter;
+      63                 :           0 :   gpointer store, store_row;
+      64                 :             : 
+      65         [ #  # ]:           0 :   g_assert (ADW_IS_ACTION_ROW (row));
+      66         [ #  # ]:           0 :   g_assert (VALENT_IS_CONTACTS_PREFERENCES (self));
+      67                 :             : 
+      68                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+      69                 :             : 
+      70                 :           0 :   g_hash_table_iter_init (&iter, self->local_stores);
+      71                 :             : 
+      72         [ #  # ]:           0 :   while (g_hash_table_iter_next (&iter, &store, &store_row))
+      73                 :             :     {
+      74                 :           0 :       GtkWidget *check = g_object_get_data (G_OBJECT (store_row), "select");
+      75                 :             : 
+      76         [ #  # ]:           0 :       if (row == store_row)
+      77                 :             :         {
+      78                 :           0 :           const char *local_uid;
+      79                 :             : 
+      80                 :           0 :           local_uid = valent_contact_store_get_uid (store);
+      81                 :           0 :           g_settings_set_string (settings, "local-uid", local_uid);
+      82                 :             :         }
+      83                 :             : 
+      84                 :           0 :       gtk_widget_set_visible (check, (row == store_row));
+      85                 :             :     }
+      86                 :           0 : }
+      87                 :             : 
+      88                 :             : static GtkWidget *
+      89                 :           1 : valent_contacts_preferences_create_row_func (gpointer item,
+      90                 :             :                                              gpointer user_data)
+      91                 :             : {
+      92                 :           1 :   ValentContactsPreferences *self = VALENT_CONTACTS_PREFERENCES (user_data);
+      93                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      94                 :           1 :   ValentContactStore *store = VALENT_CONTACT_STORE (item);
+      95                 :           1 :   ValentContext *context = NULL;
+      96                 :           1 :   const char *device_id = NULL;
+      97                 :           1 :   GSettings *settings;
+      98                 :           1 :   GtkWidget *row;
+      99                 :           1 :   GtkWidget *check;
+     100                 :           1 :   const char *icon_name;
+     101                 :           1 :   const char *uid;
+     102                 :           2 :   g_autofree char *local_uid = NULL;
+     103                 :             : 
+     104         [ +  - ]:           1 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     105         [ -  + ]:           1 :   g_assert (VALENT_IS_CONTACTS_PREFERENCES (self));
+     106                 :             : 
+     107                 :             :   /* FIXME: select an icon name for the addressbook type */
+     108                 :           1 :   context = valent_device_preferences_group_get_context (group);
+     109                 :           1 :   device_id = valent_context_get_id (context);
+     110                 :           1 :   uid = valent_contact_store_get_uid (store);
+     111                 :             : 
+     112         [ +  - ]:           1 :   if (g_strcmp0 (device_id, uid) == 0)
+     113                 :             :     icon_name = APPLICATION_ID"-symbolic";
+     114                 :             :   else
+     115                 :           1 :     icon_name = "x-office-address-book";
+     116                 :             : 
+     117                 :             :   /* Row */
+     118                 :           1 :   row = g_object_new (ADW_TYPE_ACTION_ROW,
+     119                 :             :                       "activatable", TRUE,
+     120                 :             :                       "icon-name",   icon_name,
+     121                 :             :                       "title",       valent_contact_store_get_name (store),
+     122                 :             :                       NULL);
+     123                 :             : 
+     124                 :           1 :   g_signal_connect_object (G_OBJECT (row),
+     125                 :             :                            "activated",
+     126                 :             :                            G_CALLBACK (on_store_selected),
+     127                 :             :                            self, 0);
+     128                 :             : 
+     129                 :             :   /* Check */
+     130                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     131                 :           1 :   local_uid = g_settings_get_string (settings, "local-uid");
+     132                 :           1 :   check = g_object_new (GTK_TYPE_IMAGE,
+     133                 :             :                         "icon-name", "object-select-symbolic",
+     134                 :             :                         "icon-size", GTK_ICON_SIZE_NORMAL,
+     135                 :           1 :                         "visible",   (g_strcmp0 (local_uid, uid) == 0),
+     136                 :             :                         NULL);
+     137                 :           1 :   adw_action_row_add_suffix (ADW_ACTION_ROW (row), check);
+     138                 :           1 :   g_object_set_data (G_OBJECT (row), "select", check);
+     139                 :             : 
+     140                 :           1 :   g_object_bind_property (store, "name",
+     141                 :             :                           row,   "title",
+     142                 :             :                           G_BINDING_SYNC_CREATE);
+     143                 :             : 
+     144                 :           1 :   return row;
+     145                 :             : }
+     146                 :             : 
+     147                 :             : static GtkListBox *
+     148                 :           1 : _adw_expander_row_get_list (AdwExpanderRow *row)
+     149                 :             : {
+     150                 :           1 :   GtkWidget *box;
+     151                 :           1 :   GtkWidget *child;
+     152                 :             : 
+     153                 :             :   /* First child is a GtkBox */
+     154                 :           1 :   box = gtk_widget_get_first_child (GTK_WIDGET (row));
+     155                 :             : 
+     156                 :             :   /* The GtkBox contains the primary AdwActionRow and a GtkRevealer */
+     157                 :           1 :   for (child = gtk_widget_get_first_child (box);
+     158         [ +  - ]:           2 :        child != NULL;
+     159                 :           1 :        child = gtk_widget_get_next_sibling (child))
+     160                 :             :     {
+     161   [ +  -  +  +  :           2 :       if (GTK_IS_REVEALER (child))
+                   +  - ]
+     162                 :             :         break;
+     163                 :             :     }
+     164                 :             : 
+     165                 :             :   /* The GtkRevealer's child is the GtkListBox */
+     166   [ +  -  +  -  :           1 :   if (GTK_IS_REVEALER (child))
+             -  +  -  - ]
+     167                 :           1 :     return GTK_LIST_BOX (gtk_revealer_get_child (GTK_REVEALER (child)));
+     168                 :             : 
+     169                 :             :   return NULL;
+     170                 :             : }
+     171                 :             : 
+     172                 :             : 
+     173                 :             : /*
+     174                 :             :  * GObject
+     175                 :             :  */
+     176                 :             : static void
+     177                 :           1 : valent_contacts_preferences_constructed (GObject *object)
+     178                 :             : {
+     179                 :           1 :   ValentContactsPreferences *self = VALENT_CONTACTS_PREFERENCES (object);
+     180                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     181                 :           1 :   GSettings *settings;
+     182                 :           1 :   ValentContacts *contacts;
+     183                 :             : 
+     184                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     185                 :           1 :   g_settings_bind (settings,          "remote-sync",
+     186                 :           1 :                    self->remote_sync, "active",
+     187                 :             :                    G_SETTINGS_BIND_DEFAULT);
+     188                 :           1 :   g_settings_bind (settings,         "local-sync",
+     189                 :           1 :                    self->local_sync, "enable-expansion",
+     190                 :             :                    G_SETTINGS_BIND_DEFAULT);
+     191                 :             : 
+     192                 :           1 :   contacts = valent_contacts_get_default ();
+     193                 :           1 :   gtk_list_box_bind_model (self->local_list,
+     194                 :             :                            G_LIST_MODEL (contacts),
+     195                 :             :                            valent_contacts_preferences_create_row_func,
+     196                 :             :                            self, NULL);
+     197                 :             : 
+     198                 :           1 :   G_OBJECT_CLASS (valent_contacts_preferences_parent_class)->constructed (object);
+     199                 :           1 : }
+     200                 :             : 
+     201                 :             : static void
+     202                 :           1 : valent_contacts_preferences_dispose (GObject *object)
+     203                 :             : {
+     204                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     205                 :             : 
+     206                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_CONTACTS_PREFERENCES);
+     207                 :             : 
+     208                 :           1 :   G_OBJECT_CLASS (valent_contacts_preferences_parent_class)->dispose (object);
+     209                 :           1 : }
+     210                 :             : 
+     211                 :             : static void
+     212                 :           1 : valent_contacts_preferences_finalize (GObject *object)
+     213                 :             : {
+     214                 :           1 :   ValentContactsPreferences *self = VALENT_CONTACTS_PREFERENCES (object);
+     215                 :             : 
+     216         [ +  - ]:           1 :   g_clear_pointer (&self->local_stores, g_hash_table_unref);
+     217                 :             : 
+     218                 :           1 :   G_OBJECT_CLASS (valent_contacts_preferences_parent_class)->finalize (object);
+     219                 :           1 : }
+     220                 :             : 
+     221                 :             : static void
+     222                 :           2 : valent_contacts_preferences_class_init (ValentContactsPreferencesClass *klass)
+     223                 :             : {
+     224                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     225                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     226                 :             : 
+     227                 :           2 :   object_class->constructed = valent_contacts_preferences_constructed;
+     228                 :           2 :   object_class->dispose = valent_contacts_preferences_dispose;
+     229                 :           2 :   object_class->finalize = valent_contacts_preferences_finalize;
+     230                 :             : 
+     231                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/contacts/valent-contacts-preferences.ui");
+     232                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentContactsPreferences, local_sync);
+     233                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentContactsPreferences, remote_sync);
+     234                 :             : 
+     235                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_local_sync);
+     236                 :           2 : }
+     237                 :             : 
+     238                 :             : static void
+     239                 :           1 : valent_contacts_preferences_init (ValentContactsPreferences *self)
+     240                 :             : {
+     241                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     242                 :             : 
+     243                 :           1 :   self->local_list = _adw_expander_row_get_list (self->local_sync);
+     244                 :           1 :   self->local_stores = g_hash_table_new (NULL, NULL);
+     245                 :           1 : }
+     246                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-preferences.h.func-c.html b/coverage/src/plugins/contacts/valent-contacts-preferences.h.func-c.html new file mode 100644 index 00000000000..afc80641ffe --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-preferences.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS_PREFERENCES1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-preferences.h.func.html b/coverage/src/plugins/contacts/valent-contacts-preferences.h.func.html new file mode 100644 index 00000000000..4a684cd7e79 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-preferences.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACTS_PREFERENCES1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/contacts/valent-contacts-preferences.h.gcov.html b/coverage/src/plugins/contacts/valent-contacts-preferences.h.gcov.html new file mode 100644 index 00000000000..e6ea8b761a8 --- /dev/null +++ b/coverage/src/plugins/contacts/valent-contacts-preferences.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/contacts/valent-contacts-preferences.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/contacts - valent-contacts-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_CONTACTS_PREFERENCES (valent_contacts_preferences_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           1 : G_DECLARE_FINAL_TYPE (ValentContactsPreferences, valent_contacts_preferences, VALENT, CONTACTS_PREFERENCES, ValentDevicePreferencesGroup)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/eds-plugin.c.func-c.html b/coverage/src/plugins/eds/eds-plugin.c.func-c.html new file mode 100644 index 00000000000..bb1cd84cc33 --- /dev/null +++ b/coverage/src/plugins/eds/eds-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/eds-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - eds-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %30
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_eds_plugin_register_types0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/eds-plugin.c.func.html b/coverage/src/plugins/eds/eds-plugin.c.func.html new file mode 100644 index 00000000000..d2d827a2c8a --- /dev/null +++ b/coverage/src/plugins/eds/eds-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/eds-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - eds-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %30
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_eds_plugin_register_types0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/eds-plugin.c.gcov.html b/coverage/src/plugins/eds/eds-plugin.c.gcov.html new file mode 100644 index 00000000000..f17894b0499 --- /dev/null +++ b/coverage/src/plugins/eds/eds-plugin.c.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/eds-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - eds-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %30
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-ebook-adapter.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           0 : valent_eds_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           0 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_CONTACTS_ADAPTER,
+      17                 :             :                                               VALENT_TYPE_EBOOK_ADAPTER);
+      18                 :           0 : }
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-detail-sort-b.html b/coverage/src/plugins/eds/index-detail-sort-b.html new file mode 100644 index 00000000000..ed460b89a29 --- /dev/null +++ b/coverage/src/plugins/eds/index-detail-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-detail-sort-f.html b/coverage/src/plugins/eds/index-detail-sort-f.html new file mode 100644 index 00000000000..9e1d1f9416d --- /dev/null +++ b/coverage/src/plugins/eds/index-detail-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-detail-sort-l.html b/coverage/src/plugins/eds/index-detail-sort-l.html new file mode 100644 index 00000000000..74039eee2a3 --- /dev/null +++ b/coverage/src/plugins/eds/index-detail-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-detail.html b/coverage/src/plugins/eds/index-detail.html new file mode 100644 index 00000000000..76a0679989f --- /dev/null +++ b/coverage/src/plugins/eds/index-detail.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-sort-b.html b/coverage/src/plugins/eds/index-sort-b.html new file mode 100644 index 00000000000..ed460b89a29 --- /dev/null +++ b/coverage/src/plugins/eds/index-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-sort-f.html b/coverage/src/plugins/eds/index-sort-f.html new file mode 100644 index 00000000000..9e1d1f9416d --- /dev/null +++ b/coverage/src/plugins/eds/index-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index-sort-l.html b/coverage/src/plugins/eds/index-sort-l.html new file mode 100644 index 00000000000..74039eee2a3 --- /dev/null +++ b/coverage/src/plugins/eds/index-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/index.html b/coverage/src/plugins/eds/index.html new file mode 100644 index 00000000000..76a0679989f --- /dev/null +++ b/coverage/src/plugins/eds/index.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/edsCoverageTotalHit
Test:Code CoverageLines:0.0 %2600
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
eds-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-ebook-adapter.c +
0.0%
+
0.0 %82-0.0 %12
valent-ebook-adapter.h +
0.0%
+
0.0 %1-0.0 %1
valent-ebook-store.c +
0.0%
+
0.0 %156-0.0 %21
valent-ebook-store.h +
0.0%
+
0.0 %1-0.0 %1
valent-eds-utils.c +
0.0%
+
0.0 %17-0.0 %2
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-adapter.c.func-c.html b/coverage/src/plugins/eds/valent-ebook-adapter.c.func-c.html new file mode 100644 index 00000000000..a476c5144be --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-adapter.c.func-c.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %820
Test Date:2024-03-31 18:46:36Functions:0.0 %120
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
e_source_registry_new_cb0
g_async_initable_iface_init0
g_async_initable_new_async_cb0
on_source_added0
on_source_removed0
valent_ebook_adapter_destroy0
valent_ebook_adapter_finalize0
valent_ebook_adapter_get_type0
valent_ebook_adapter_class_intern_init0
valent_ebook_adapter_get_type0
valent_ebook_adapter_get_type_once0
valent_ebook_adapter_init0
valent_ebook_adapter_init_async0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-adapter.c.func.html b/coverage/src/plugins/eds/valent-ebook-adapter.c.func.html new file mode 100644 index 00000000000..a45214aa97a --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-adapter.c.func.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %820
Test Date:2024-03-31 18:46:36Functions:0.0 %120
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
e_source_registry_new_cb0
g_async_initable_iface_init0
g_async_initable_new_async_cb0
on_source_added0
on_source_removed0
valent_ebook_adapter_destroy0
valent_ebook_adapter_finalize0
valent_ebook_adapter_get_type0
valent_ebook_adapter_class_intern_init0
valent_ebook_adapter_get_type0
valent_ebook_adapter_get_type_once0
valent_ebook_adapter_init0
valent_ebook_adapter_init_async0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-adapter.c.gcov.html b/coverage/src/plugins/eds/valent-ebook-adapter.c.gcov.html new file mode 100644 index 00000000000..9bc189d7e80 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-adapter.c.gcov.html @@ -0,0 +1,325 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %820
Test Date:2024-03-31 18:46:36Functions:0.0 %120
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-ebook-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-ebook-adapter.h"
+      12                 :             : #include "valent-ebook-store.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentEBookAdapter
+      16                 :             : {
+      17                 :             :   ValentContactsAdapter  parent_instance;
+      18                 :             : 
+      19                 :             :   ESourceRegistry       *registry;
+      20                 :             :   GHashTable            *stores;
+      21                 :             : };
+      22                 :             : 
+      23                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      24                 :             : 
+      25                 :           0 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentEBookAdapter, valent_ebook_adapter, VALENT_TYPE_CONTACTS_ADAPTER,
+      26                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      27                 :             : 
+      28                 :             : 
+      29                 :             : /*
+      30                 :             :  * ESourceRegistry Callbacks
+      31                 :             :  */
+      32                 :             : static void
+      33                 :           0 : g_async_initable_new_async_cb (GAsyncInitable     *initable,
+      34                 :             :                                GAsyncResult       *result,
+      35                 :             :                                ValentEBookAdapter *self)
+      36                 :             : {
+      37                 :           0 :   ESource *source = NULL;
+      38                 :           0 :   g_autoptr (GObject) object = NULL;
+      39                 :           0 :   g_autoptr (GError) error = NULL;
+      40                 :             : 
+      41                 :           0 :   if ((object = g_async_initable_new_finish (initable, result, &error)) == NULL)
+      42                 :             :     {
+      43                 :           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+      44                 :           0 :         g_warning ("Failed loading address book: %s", error->message);
+      45                 :             : 
+      46                 :           0 :       return;
+      47                 :             :     }
+      48                 :             : 
+      49                 :           0 :   source = valent_contact_store_get_source (VALENT_CONTACT_STORE (object));
+      50                 :           0 :   g_hash_table_replace (self->stores,
+      51                 :             :                         g_object_ref (source),
+      52                 :             :                         g_object_ref (object));
+      53                 :           0 :   valent_contacts_adapter_store_added (VALENT_CONTACTS_ADAPTER (self),
+      54                 :             :                                        VALENT_CONTACT_STORE (object));
+      55                 :             : }
+      56                 :             : 
+      57                 :             : static void
+      58                 :           0 : on_source_added (ESourceRegistry    *registry,
+      59                 :             :                  ESource            *source,
+      60                 :             :                  ValentEBookAdapter *self)
+      61                 :             : {
+      62                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+      63                 :             : 
+      64                 :           0 :   g_assert (E_IS_SOURCE_REGISTRY (registry));
+      65                 :           0 :   g_assert (E_IS_SOURCE (source));
+      66                 :           0 :   g_assert (VALENT_IS_EBOOK_ADAPTER (self));
+      67                 :             : 
+      68                 :           0 :   if (!e_source_has_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK))
+      69                 :             :     return;
+      70                 :             : 
+      71                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+      72                 :           0 :   g_async_initable_new_async (VALENT_TYPE_EBOOK_STORE,
+      73                 :             :                               G_PRIORITY_DEFAULT,
+      74                 :             :                               destroy,
+      75                 :             :                               (GAsyncReadyCallback)g_async_initable_new_async_cb,
+      76                 :             :                               self,
+      77                 :             :                               "source", source,
+      78                 :             :                               NULL);
+      79                 :             : }
+      80                 :             : 
+      81                 :             : static void
+      82                 :           0 : on_source_removed (ESourceRegistry    *registry,
+      83                 :             :                    ESource            *source,
+      84                 :             :                    ValentEBookAdapter *self)
+      85                 :             : {
+      86                 :           0 :   ValentContactsAdapter *adapter = VALENT_CONTACTS_ADAPTER (self);
+      87                 :           0 :   gpointer esource, store;
+      88                 :             : 
+      89                 :           0 :   g_assert (E_IS_SOURCE_REGISTRY (registry));
+      90                 :           0 :   g_assert (E_IS_SOURCE (source));
+      91                 :           0 :   g_assert (VALENT_IS_EBOOK_ADAPTER (self));
+      92                 :             : 
+      93                 :           0 :   if (!e_source_has_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK))
+      94                 :           0 :     return;
+      95                 :             : 
+      96                 :           0 :   if (g_hash_table_steal_extended (self->stores, source, &esource, &store))
+      97                 :             :     {
+      98                 :           0 :       valent_contacts_adapter_store_removed (adapter, store);
+      99                 :           0 :       g_object_unref (esource);
+     100                 :           0 :       g_object_unref (store);
+     101                 :             :     }
+     102                 :             : }
+     103                 :             : 
+     104                 :             : /*
+     105                 :             :  * GAsyncInitable
+     106                 :             :  */
+     107                 :             : static void
+     108                 :           0 : e_source_registry_new_cb (GObject      *object,
+     109                 :             :                           GAsyncResult *result,
+     110                 :             :                           gpointer      user_data)
+     111                 :             : {
+     112                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     113                 :           0 :   g_autolist (ESource) sources = NULL;
+     114                 :           0 :   ValentEBookAdapter *self = g_task_get_source_object (task);
+     115                 :           0 :   g_autoptr (GError) error = NULL;
+     116                 :             : 
+     117                 :           0 :   g_assert (VALENT_IS_EBOOK_ADAPTER (self));
+     118                 :             : 
+     119                 :           0 :   if ((self->registry = e_source_registry_new_finish (result, &error)) == NULL)
+     120                 :             :     {
+     121                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     122                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     123                 :             :                                              error);
+     124                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     125                 :             :     }
+     126                 :             : 
+     127                 :             :   /* Load existing address books */
+     128                 :           0 :   sources = e_source_registry_list_sources (self->registry,
+     129                 :             :                                             E_SOURCE_EXTENSION_ADDRESS_BOOK);
+     130                 :             : 
+     131                 :           0 :   for (const GList *iter = sources; iter; iter = iter->next)
+     132                 :           0 :     on_source_added (self->registry, E_SOURCE (iter->data), self);
+     133                 :             : 
+     134                 :           0 :   g_signal_connect_object (self->registry,
+     135                 :             :                            "source-added",
+     136                 :             :                            G_CALLBACK (on_source_added),
+     137                 :             :                            self, 0);
+     138                 :           0 :   g_signal_connect_object (self->registry,
+     139                 :             :                            "source-removed",
+     140                 :             :                            G_CALLBACK (on_source_removed),
+     141                 :             :                            self, 0);
+     142                 :             : 
+     143                 :             :   /* Report the adapter as active */
+     144                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     145                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     146                 :             :                                          NULL);
+     147                 :           0 :   g_task_return_boolean (task, TRUE);
+     148                 :             : }
+     149                 :             : 
+     150                 :             : static void
+     151                 :           0 : valent_ebook_adapter_init_async (GAsyncInitable        *initable,
+     152                 :             :                                  int                    io_priority,
+     153                 :             :                                  GCancellable          *cancellable,
+     154                 :             :                                  GAsyncReadyCallback    callback,
+     155                 :             :                                  gpointer               user_data)
+     156                 :             : {
+     157                 :           0 :   g_autoptr (GTask) task = NULL;
+     158                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     159                 :             : 
+     160                 :           0 :   g_assert (VALENT_IS_EBOOK_ADAPTER (initable));
+     161                 :           0 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     162                 :             : 
+     163                 :             :   /* Cede the primary position until complete */
+     164                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     165                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     166                 :             :                                          NULL);
+     167                 :             : 
+     168                 :             :   /* Cancel initialization if the object is destroyed */
+     169                 :           0 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     170                 :             :                                              cancellable);
+     171                 :             : 
+     172                 :           0 :   task = g_task_new (initable, destroy, callback, user_data);
+     173                 :           0 :   g_task_set_priority (task, io_priority);
+     174                 :           0 :   g_task_set_source_tag (task, valent_ebook_adapter_init_async);
+     175                 :             : 
+     176                 :           0 :   e_source_registry_new (destroy,
+     177                 :             :                          e_source_registry_new_cb,
+     178                 :             :                          g_steal_pointer (&task));
+     179                 :           0 : }
+     180                 :             : 
+     181                 :             : static void
+     182                 :           0 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     183                 :             : {
+     184                 :           0 :   iface->init_async = valent_ebook_adapter_init_async;
+     185                 :           0 : }
+     186                 :             : 
+     187                 :             : /*
+     188                 :             :  * ValentObject
+     189                 :             :  */
+     190                 :             : static void
+     191                 :           0 : valent_ebook_adapter_destroy (ValentObject *object)
+     192                 :             : {
+     193                 :           0 :   ValentEBookAdapter *self = VALENT_EBOOK_ADAPTER (object);
+     194                 :             : 
+     195                 :           0 :   g_clear_object (&self->registry);
+     196                 :           0 :   g_hash_table_remove_all (self->stores);
+     197                 :             : 
+     198                 :           0 :   VALENT_OBJECT_CLASS (valent_ebook_adapter_parent_class)->destroy (object);
+     199                 :           0 : }
+     200                 :             : 
+     201                 :             : /*
+     202                 :             :  * GObject
+     203                 :             :  */
+     204                 :             : static void
+     205                 :           0 : valent_ebook_adapter_finalize (GObject *object)
+     206                 :             : {
+     207                 :           0 :   ValentEBookAdapter *self = VALENT_EBOOK_ADAPTER (object);
+     208                 :             : 
+     209                 :           0 :   g_clear_pointer (&self->stores, g_hash_table_unref);
+     210                 :             : 
+     211                 :           0 :   G_OBJECT_CLASS (valent_ebook_adapter_parent_class)->finalize (object);
+     212                 :           0 : }
+     213                 :             : 
+     214                 :             : static void
+     215                 :           0 : valent_ebook_adapter_class_init (ValentEBookAdapterClass *klass)
+     216                 :             : {
+     217                 :           0 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     218                 :           0 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     219                 :             : 
+     220                 :           0 :   object_class->finalize = valent_ebook_adapter_finalize;
+     221                 :             : 
+     222                 :           0 :   vobject_class->destroy = valent_ebook_adapter_destroy;
+     223                 :             : }
+     224                 :             : 
+     225                 :             : static void
+     226                 :           0 : valent_ebook_adapter_init (ValentEBookAdapter *self)
+     227                 :             : {
+     228                 :           0 :   self->stores = g_hash_table_new_full ((GHashFunc)e_source_hash,
+     229                 :             :                                         (GEqualFunc)e_source_equal,
+     230                 :             :                                         g_object_unref,
+     231                 :             :                                         g_object_unref);
+     232                 :           0 : }
+     233                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-adapter.h.func-c.html b/coverage/src/plugins/eds/valent-ebook-adapter.h.func-c.html new file mode 100644 index 00000000000..3064d781547 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_EBOOK_ADAPTER0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-adapter.h.func.html b/coverage/src/plugins/eds/valent-ebook-adapter.h.func.html new file mode 100644 index 00000000000..3f78d320e95 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_EBOOK_ADAPTER0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-adapter.h.gcov.html b/coverage/src/plugins/eds/valent-ebook-adapter.h.gcov.html new file mode 100644 index 00000000000..db9f922e118 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-adapter.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_EBOOK_ADAPTER (valent_ebook_adapter_get_type ())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentEBookAdapter, valent_ebook_adapter, VALENT, EBOOK_ADAPTER, ValentContactsAdapter)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-store.c.func-c.html b/coverage/src/plugins/eds/valent-ebook-store.c.func-c.html new file mode 100644 index 00000000000..78003b747a6 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-store.c.func-c.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-store.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1560
Test Date:2024-03-31 18:46:36Functions:0.0 %210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
e_book_client_connect_cb0
e_book_client_get_view_cb0
e_client_wait_for_connected_cb0
g_async_initable_iface_init0
on_objects_added0
on_objects_removed0
valent_ebook_store_add_contacts0
valent_ebook_store_add_contacts_cb0
valent_ebook_store_destroy0
valent_ebook_store_finalize0
valent_ebook_store_get_contact0
valent_ebook_store_get_contact_cb0
valent_ebook_store_get_type0
valent_ebook_store_class_intern_init0
valent_ebook_store_get_type0
valent_ebook_store_get_type_once0
valent_ebook_store_init0
valent_ebook_store_init_async0
valent_ebook_store_query0
valent_ebook_store_query_cb0
valent_ebook_store_remove_cb0
valent_ebook_store_remove_contacts0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-store.c.func.html b/coverage/src/plugins/eds/valent-ebook-store.c.func.html new file mode 100644 index 00000000000..a6de5d09328 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-store.c.func.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-store.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1560
Test Date:2024-03-31 18:46:36Functions:0.0 %210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
e_book_client_connect_cb0
e_book_client_get_view_cb0
e_client_wait_for_connected_cb0
g_async_initable_iface_init0
on_objects_added0
on_objects_removed0
valent_ebook_store_add_contacts0
valent_ebook_store_add_contacts_cb0
valent_ebook_store_destroy0
valent_ebook_store_finalize0
valent_ebook_store_get_contact0
valent_ebook_store_get_contact_cb0
valent_ebook_store_get_type0
valent_ebook_store_class_intern_init0
valent_ebook_store_get_type0
valent_ebook_store_get_type_once0
valent_ebook_store_init0
valent_ebook_store_init_async0
valent_ebook_store_query0
valent_ebook_store_query_cb0
valent_ebook_store_remove_cb0
valent_ebook_store_remove_contacts0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-store.c.gcov.html b/coverage/src/plugins/eds/valent-ebook-store.c.gcov.html new file mode 100644 index 00000000000..ddc94d4e863 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-store.c.gcov.html @@ -0,0 +1,487 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-store.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1560
Test Date:2024-03-31 18:46:36Functions:0.0 %210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-ebook-store"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : #include "valent-ebook-store.h"
+      11                 :             : #include "valent-eds-utils.h"
+      12                 :             : 
+      13                 :             : #define WAIT_FOR_CONNECTED_TIMEOUT 30
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentEBookStore
+      17                 :             : {
+      18                 :             :   ValentContactStore  parent_instance;
+      19                 :             : 
+      20                 :             :   EBookClient        *client;
+      21                 :             :   EBookClientView    *view;
+      22                 :             : };
+      23                 :             : 
+      24                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      25                 :             : 
+      26                 :           0 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentEBookStore, valent_ebook_store, VALENT_TYPE_CONTACT_STORE,
+      27                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      28                 :             : 
+      29                 :             : 
+      30                 :             : /*
+      31                 :             :  * ValentContactStore
+      32                 :             :  */
+      33                 :             : static void
+      34                 :           0 : valent_ebook_store_add_contacts_cb (GObject      *object,
+      35                 :             :                                     GAsyncResult *result,
+      36                 :             :                                     gpointer      user_data)
+      37                 :             : {
+      38                 :           0 :   EBookClient *client = E_BOOK_CLIENT (object);
+      39                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+      40                 :           0 :   GError *error = NULL;
+      41                 :             : 
+      42                 :           0 :   if (!e_book_client_add_contacts_finish (client, result, NULL, &error))
+      43                 :           0 :     return g_task_return_error (task, error);
+      44                 :             : 
+      45                 :           0 :   g_task_return_boolean (task, TRUE);
+      46                 :             : }
+      47                 :             : 
+      48                 :             : static void
+      49                 :           0 : valent_ebook_store_add_contacts (ValentContactStore  *store,
+      50                 :             :                                  GSList              *contacts,
+      51                 :             :                                  GCancellable        *cancellable,
+      52                 :             :                                  GAsyncReadyCallback  callback,
+      53                 :             :                                  gpointer             user_data)
+      54                 :             : {
+      55                 :           0 :   ValentEBookStore *self = VALENT_EBOOK_STORE (store);
+      56                 :           0 :   g_autoptr (GTask) task = NULL;
+      57                 :             : 
+      58                 :           0 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+      59                 :           0 :   g_assert (contacts != NULL);
+      60                 :           0 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+      61                 :             : 
+      62                 :           0 :   task = g_task_new (store, cancellable, callback, user_data);
+      63                 :           0 :   g_task_set_source_tag (task, valent_ebook_store_add_contacts);
+      64                 :             : 
+      65                 :           0 :   e_book_client_add_contacts (self->client,
+      66                 :             :                               contacts,
+      67                 :             :                               E_BOOK_OPERATION_FLAG_CONFLICT_USE_NEWER,
+      68                 :             :                               cancellable,
+      69                 :             :                               valent_ebook_store_add_contacts_cb,
+      70                 :             :                               g_steal_pointer (&task));
+      71                 :           0 : }
+      72                 :             : 
+      73                 :             : static void
+      74                 :           0 : valent_ebook_store_remove_cb (GObject      *object,
+      75                 :             :                               GAsyncResult *result,
+      76                 :             :                               gpointer      user_data)
+      77                 :             : {
+      78                 :           0 :   EBookClient *client = E_BOOK_CLIENT (object);
+      79                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+      80                 :           0 :   GError *error = NULL;
+      81                 :             : 
+      82                 :           0 :   if (!e_book_client_remove_contacts_finish (client, result, &error))
+      83                 :           0 :     return g_task_return_error (task, error);
+      84                 :             : 
+      85                 :           0 :   g_task_return_boolean (task, TRUE);
+      86                 :             : }
+      87                 :             : 
+      88                 :             : static void
+      89                 :           0 : valent_ebook_store_remove_contacts (ValentContactStore  *store,
+      90                 :             :                                     GSList              *uids,
+      91                 :             :                                     GCancellable        *cancellable,
+      92                 :             :                                     GAsyncReadyCallback  callback,
+      93                 :             :                                     gpointer             user_data)
+      94                 :             : {
+      95                 :           0 :   ValentEBookStore *self = VALENT_EBOOK_STORE (store);
+      96                 :           0 :   g_autoptr (GTask) task = NULL;
+      97                 :             : 
+      98                 :           0 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+      99                 :           0 :   g_assert (uids != NULL);
+     100                 :           0 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     101                 :             : 
+     102                 :           0 :   task = g_task_new (store, cancellable, callback, user_data);
+     103                 :           0 :   g_task_set_source_tag (task, valent_ebook_store_remove_contacts);
+     104                 :             : 
+     105                 :           0 :   e_book_client_remove_contacts (self->client,
+     106                 :             :                                  uids,
+     107                 :             :                                  E_BOOK_OPERATION_FLAG_NONE,
+     108                 :             :                                  cancellable,
+     109                 :             :                                  valent_ebook_store_remove_cb,
+     110                 :             :                                  g_steal_pointer (&task));
+     111                 :           0 : }
+     112                 :             : 
+     113                 :             : static void
+     114                 :           0 : valent_ebook_store_get_contact_cb (GObject      *object,
+     115                 :             :                                    GAsyncResult *result,
+     116                 :             :                                    gpointer      user_data)
+     117                 :             : {
+     118                 :           0 :   EBookClient *client = E_BOOK_CLIENT (object);
+     119                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     120                 :           0 :   g_autoptr (EContact) contact = NULL;
+     121                 :           0 :   GError *error = NULL;
+     122                 :             : 
+     123                 :           0 :   if (!e_book_client_get_contact_finish (client, result, &contact, &error))
+     124                 :           0 :     return g_task_return_error (task, error);
+     125                 :             : 
+     126                 :           0 :   g_task_return_pointer (task, g_steal_pointer (&contact), g_object_unref);
+     127                 :             : }
+     128                 :             : 
+     129                 :             : static void
+     130                 :           0 : valent_ebook_store_get_contact (ValentContactStore  *store,
+     131                 :             :                                 const char          *uid,
+     132                 :             :                                 GCancellable        *cancellable,
+     133                 :             :                                 GAsyncReadyCallback  callback,
+     134                 :             :                                 gpointer             user_data)
+     135                 :             : {
+     136                 :           0 :   ValentEBookStore *self = VALENT_EBOOK_STORE (store);
+     137                 :           0 :   g_autoptr (GTask) task = NULL;
+     138                 :             : 
+     139                 :           0 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     140                 :           0 :   g_assert (uid != NULL);
+     141                 :           0 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     142                 :             : 
+     143                 :           0 :   task = g_task_new (store, cancellable, callback, user_data);
+     144                 :           0 :   g_task_set_source_tag (task, valent_ebook_store_get_contact);
+     145                 :             : 
+     146                 :           0 :   e_book_client_get_contact (self->client,
+     147                 :             :                              uid,
+     148                 :             :                              cancellable,
+     149                 :             :                              valent_ebook_store_get_contact_cb,
+     150                 :             :                              g_steal_pointer (&task));
+     151                 :           0 : }
+     152                 :             : 
+     153                 :             : static void
+     154                 :           0 : valent_ebook_store_query_cb (GObject      *object,
+     155                 :             :                              GAsyncResult *result,
+     156                 :             :                              gpointer      user_data)
+     157                 :             : {
+     158                 :           0 :   EBookClient *client = E_BOOK_CLIENT (object);
+     159                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     160                 :           0 :   GSList *results = NULL;
+     161                 :           0 :   GError *error = NULL;
+     162                 :             : 
+     163                 :           0 :   if (!e_book_client_get_contacts_finish (client, result, &results, &error))
+     164                 :           0 :     return g_task_return_error (task, error);
+     165                 :             : 
+     166                 :           0 :   g_task_return_pointer (task, g_steal_pointer (&results), g_object_unref);
+     167                 :             : }
+     168                 :             : 
+     169                 :             : static void
+     170                 :           0 : valent_ebook_store_query (ValentContactStore  *store,
+     171                 :             :                           const char          *query,
+     172                 :             :                           GCancellable        *cancellable,
+     173                 :             :                           GAsyncReadyCallback  callback,
+     174                 :             :                           gpointer             user_data)
+     175                 :             : {
+     176                 :           0 :   ValentEBookStore *self = VALENT_EBOOK_STORE (store);
+     177                 :           0 :   g_autoptr (GTask) task = NULL;
+     178                 :             : 
+     179                 :           0 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     180                 :           0 :   g_assert (query != NULL);
+     181                 :           0 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     182                 :             : 
+     183                 :           0 :   task = g_task_new (store, cancellable, callback, user_data);
+     184                 :           0 :   g_task_set_source_tag (task, valent_ebook_store_query);
+     185                 :           0 :   g_task_set_task_data (task, g_strdup (query), g_free);
+     186                 :             : 
+     187                 :           0 :   e_book_client_get_contacts (self->client,
+     188                 :             :                               query,
+     189                 :             :                               cancellable,
+     190                 :             :                               valent_ebook_store_query_cb,
+     191                 :             :                               g_steal_pointer (&task));
+     192                 :           0 : }
+     193                 :             : 
+     194                 :             : static void
+     195                 :           0 : on_objects_added (EBookClientView    *view,
+     196                 :             :                   GSList             *contacts,
+     197                 :             :                   ValentContactStore *store)
+     198                 :             : {
+     199                 :           0 :   g_assert (E_IS_BOOK_CLIENT_VIEW (view));
+     200                 :           0 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     201                 :             : 
+     202                 :           0 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+     203                 :           0 :     valent_contact_store_contact_added (store, E_CONTACT (iter->data));
+     204                 :           0 : }
+     205                 :             : 
+     206                 :             : static void
+     207                 :           0 : on_objects_removed (EBookClientView    *view,
+     208                 :             :                     GSList             *uids,
+     209                 :             :                     ValentContactStore *store)
+     210                 :             : {
+     211                 :           0 :   g_assert (E_IS_BOOK_CLIENT_VIEW (view));
+     212                 :           0 :   g_assert (VALENT_IS_CONTACT_STORE (store));
+     213                 :             : 
+     214                 :           0 :   for (const GSList *iter = uids; iter; iter = iter->next)
+     215                 :           0 :     valent_contact_store_contact_removed (store, (const char *)iter->data);
+     216                 :           0 : }
+     217                 :             : 
+     218                 :             : static void
+     219                 :           0 : e_client_wait_for_connected_cb (EClient            *client,
+     220                 :             :                                 GAsyncResult       *result,
+     221                 :             :                                 ValentContactStore *store)
+     222                 :             : {
+     223                 :           0 :   g_autoptr (GError) error = NULL;
+     224                 :             : 
+     225                 :           0 :   if (!e_client_wait_for_connected_finish (client, result, &error) &&
+     226                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     227                 :             :     {
+     228                 :           0 :       g_debug ("%s (%s): failed to connect backend: %s",
+     229                 :             :                G_OBJECT_TYPE_NAME (store),
+     230                 :             :                valent_contact_store_get_name (store),
+     231                 :             :                error->message);
+     232                 :             :     }
+     233                 :           0 : }
+     234                 :             : 
+     235                 :             : static void
+     236                 :           0 : e_book_client_get_view_cb (EBookClient      *client,
+     237                 :             :                            GAsyncResult     *result,
+     238                 :             :                            ValentEBookStore *self)
+     239                 :             : {
+     240                 :           0 :   g_autoptr (EBookClientView) view = NULL;
+     241                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     242                 :           0 :   g_autoptr (GError) error = NULL;
+     243                 :             : 
+     244                 :           0 :   if (!e_book_client_get_view_finish (client, result, &view, &error))
+     245                 :             :     {
+     246                 :             :       /* If the operation was cancelled then the store has been destroyed */
+     247                 :           0 :       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     248                 :           0 :         return;
+     249                 :             : 
+     250                 :           0 :       g_warning ("%s (%s): failed to subscribe to changes: %s",
+     251                 :             :                  G_OBJECT_TYPE_NAME (self),
+     252                 :             :                  valent_contact_store_get_name (VALENT_CONTACT_STORE (self)),
+     253                 :             :                  error->message);
+     254                 :             :     }
+     255                 :             :   else
+     256                 :             :     {
+     257                 :           0 :       self->view = g_steal_pointer (&view);
+     258                 :           0 :       g_signal_connect_object (self->view,
+     259                 :             :                                "objects-added",
+     260                 :             :                                G_CALLBACK (on_objects_added),
+     261                 :             :                                self, 0);
+     262                 :           0 :       g_signal_connect_object (self->view,
+     263                 :             :                                "objects-removed",
+     264                 :             :                                G_CALLBACK (on_objects_removed),
+     265                 :             :                                self, 0);
+     266                 :             :     }
+     267                 :             : 
+     268                 :             :   /* Attempt to connect to the backend */
+     269                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     270                 :           0 :   e_client_wait_for_connected (E_CLIENT (self->client),
+     271                 :             :                                WAIT_FOR_CONNECTED_TIMEOUT,
+     272                 :             :                                destroy,
+     273                 :             :                                (GAsyncReadyCallback)e_client_wait_for_connected_cb,
+     274                 :             :                                self);
+     275                 :             : }
+     276                 :             : 
+     277                 :             : /*
+     278                 :             :  * GAsyncInitable
+     279                 :             :  */
+     280                 :             : static void
+     281                 :           0 : e_book_client_connect_cb (GObject      *object,
+     282                 :             :                           GAsyncResult *result,
+     283                 :             :                           gpointer      user_data)
+     284                 :             : {
+     285                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     286                 :           0 :   ValentEBookStore *self = g_task_get_source_object (user_data);
+     287                 :           0 :   g_autoptr (EClient) client = NULL;
+     288                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     289                 :           0 :   g_autoptr (GError) error = NULL;
+     290                 :             : 
+     291                 :           0 :   g_assert (VALENT_IS_EBOOK_STORE (self));
+     292                 :             : 
+     293                 :           0 :   if ((client = e_book_client_connect_finish (result, &error)) == NULL)
+     294                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     295                 :             : 
+     296                 :           0 :   self->client = g_object_ref ((EBookClient *)client);
+     297                 :           0 :   g_task_return_boolean (task, TRUE);
+     298                 :             : 
+     299                 :             :   /* Initialization is finished; connect to the backend in the background */
+     300                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     301                 :           0 :   e_book_client_get_view (self->client,
+     302                 :             :                           "",
+     303                 :             :                           destroy,
+     304                 :             :                           (GAsyncReadyCallback)e_book_client_get_view_cb,
+     305                 :             :                           self);
+     306                 :             : }
+     307                 :             : 
+     308                 :             : static void
+     309                 :           0 : valent_ebook_store_init_async (GAsyncInitable      *initable,
+     310                 :             :                                int                  io_priority,
+     311                 :             :                                GCancellable        *cancellable,
+     312                 :             :                                GAsyncReadyCallback  callback,
+     313                 :             :                                gpointer             user_data)
+     314                 :             : {
+     315                 :           0 :   ValentContactStore *store = VALENT_CONTACT_STORE (initable);
+     316                 :           0 :   g_autoptr (GTask) task = NULL;
+     317                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     318                 :             : 
+     319                 :           0 :   g_assert (VALENT_IS_EBOOK_STORE (initable));
+     320                 :           0 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+     321                 :             : 
+     322                 :             :   /* Cancel initialization if the object is destroyed */
+     323                 :           0 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     324                 :             :                                              cancellable);
+     325                 :             : 
+     326                 :           0 :   task = g_task_new (initable, destroy, callback, user_data);
+     327                 :           0 :   g_task_set_priority (task, io_priority);
+     328                 :           0 :   g_task_set_source_tag (task, valent_ebook_store_init_async);
+     329                 :             : 
+     330                 :           0 :   e_book_client_connect (valent_contact_store_get_source (store),
+     331                 :             :                          -1,
+     332                 :             :                          destroy,
+     333                 :             :                          (GAsyncReadyCallback)e_book_client_connect_cb,
+     334                 :             :                          g_steal_pointer (&task));
+     335                 :           0 : }
+     336                 :             : 
+     337                 :             : static void
+     338                 :           0 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     339                 :             : {
+     340                 :           0 :   iface->init_async = valent_ebook_store_init_async;
+     341                 :           0 : }
+     342                 :             : 
+     343                 :             : /*
+     344                 :             :  * ValentObject
+     345                 :             :  */
+     346                 :             : static void
+     347                 :           0 : valent_ebook_store_destroy (ValentObject *object)
+     348                 :             : {
+     349                 :           0 :   ValentEBookStore *self = VALENT_EBOOK_STORE (object);
+     350                 :             : 
+     351                 :           0 :   if (self->view != NULL)
+     352                 :             :     {
+     353                 :           0 :       g_signal_handlers_disconnect_by_data (self->view, self);
+     354                 :           0 :       g_clear_object (&self->view);
+     355                 :             :     }
+     356                 :             : 
+     357                 :           0 :   VALENT_OBJECT_CLASS (valent_ebook_store_parent_class)->destroy (object);
+     358                 :           0 : }
+     359                 :             : 
+     360                 :             : /*
+     361                 :             :  * GObject
+     362                 :             :  */
+     363                 :             : static void
+     364                 :           0 : valent_ebook_store_finalize (GObject *object)
+     365                 :             : {
+     366                 :           0 :   ValentEBookStore *self = VALENT_EBOOK_STORE (object);
+     367                 :             : 
+     368                 :           0 :   g_clear_object (&self->view);
+     369                 :           0 :   g_clear_object (&self->client);
+     370                 :             : 
+     371                 :           0 :   G_OBJECT_CLASS (valent_ebook_store_parent_class)->finalize (object);
+     372                 :           0 : }
+     373                 :             : 
+     374                 :             : static void
+     375                 :           0 : valent_ebook_store_class_init (ValentEBookStoreClass *klass)
+     376                 :             : {
+     377                 :           0 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     378                 :           0 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     379                 :           0 :   ValentContactStoreClass *store_class = VALENT_CONTACT_STORE_CLASS (klass);
+     380                 :             : 
+     381                 :           0 :   object_class->finalize = valent_ebook_store_finalize;
+     382                 :             : 
+     383                 :           0 :   vobject_class->destroy = valent_ebook_store_destroy;
+     384                 :             : 
+     385                 :           0 :   store_class->add_contacts = valent_ebook_store_add_contacts;
+     386                 :           0 :   store_class->remove_contacts = valent_ebook_store_remove_contacts;
+     387                 :           0 :   store_class->get_contact = valent_ebook_store_get_contact;
+     388                 :           0 :   store_class->query = valent_ebook_store_query;
+     389                 :             : }
+     390                 :             : 
+     391                 :             : static void
+     392                 :           0 : valent_ebook_store_init (ValentEBookStore *self)
+     393                 :             : {
+     394                 :           0 : }
+     395                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-store.h.func-c.html b/coverage/src/plugins/eds/valent-ebook-store.h.func-c.html new file mode 100644 index 00000000000..ed183447565 --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-store.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-store.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_EBOOK_STORE0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-store.h.func.html b/coverage/src/plugins/eds/valent-ebook-store.h.func.html new file mode 100644 index 00000000000..2fada2ebd1b --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-store.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-store.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_EBOOK_STORE0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-ebook-store.h.gcov.html b/coverage/src/plugins/eds/valent-ebook-store.h.gcov.html new file mode 100644 index 00000000000..bbb047899ce --- /dev/null +++ b/coverage/src/plugins/eds/valent-ebook-store.h.gcov.html @@ -0,0 +1,106 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-ebook-store.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-ebook-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_EBOOK_STORE (valent_ebook_store_get_type())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentEBookStore, valent_ebook_store, VALENT, EBOOK_STORE, ValentContactStore)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-eds-utils.c.func-c.html b/coverage/src/plugins/eds/valent-eds-utils.c.func-c.html new file mode 100644 index 00000000000..747cf299520 --- /dev/null +++ b/coverage/src/plugins/eds/valent-eds-utils.c.func-c.html @@ -0,0 +1,105 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-eds-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-eds-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %170
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_eds_get_registry0
valent_eds_register_source0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-eds-utils.c.func.html b/coverage/src/plugins/eds/valent-eds-utils.c.func.html new file mode 100644 index 00000000000..451a96e4cd6 --- /dev/null +++ b/coverage/src/plugins/eds/valent-eds-utils.c.func.html @@ -0,0 +1,105 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-eds-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-eds-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %170
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_eds_get_registry0
valent_eds_register_source0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/eds/valent-eds-utils.c.gcov.html b/coverage/src/plugins/eds/valent-eds-utils.c.gcov.html new file mode 100644 index 00000000000..125d9edae6d --- /dev/null +++ b/coverage/src/plugins/eds/valent-eds-utils.c.gcov.html @@ -0,0 +1,179 @@ + + + + + + + LCOV - Code Coverage - src/plugins/eds/valent-eds-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/eds - valent-eds-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %170
Test Date:2024-03-31 18:46:36Functions:0.0 %20
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-eds-utils"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : #include "valent-eds-utils.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : static ESourceRegistry *default_registry = NULL;
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * valent_eds_get_registry:
+      17                 :             :  * @cancellable: (nullable): a `GCancellable`
+      18                 :             :  * @error: (nullable): a `GError`
+      19                 :             :  *
+      20                 :             :  * Get the global `ESourceRegistry` object.
+      21                 :             :  *
+      22                 :             :  * Returns: (transfer none): the `ESourceRegistry`
+      23                 :             :  */
+      24                 :             : ESourceRegistry *
+      25                 :           0 : valent_eds_get_registry (GCancellable  *cancellable,
+      26                 :             :                          GError       **error)
+      27                 :             : {
+      28                 :           0 :   if (default_registry == NULL)
+      29                 :             :     {
+      30                 :           0 :       default_registry = e_source_registry_new_sync (cancellable, error);
+      31                 :             : 
+      32                 :           0 :       if (default_registry != NULL)
+      33                 :           0 :         g_object_add_weak_pointer (G_OBJECT (default_registry), (gpointer) &default_registry);
+      34                 :             :       else
+      35                 :             :         return NULL;
+      36                 :             :     }
+      37                 :             : 
+      38                 :           0 :   return default_registry;
+      39                 :             : }
+      40                 :             : 
+      41                 :             : /**
+      42                 :             :  * valent_eds_register_source:
+      43                 :             :  * @source: an `ESource`
+      44                 :             :  * @cancellable: (nullable): a `GCancellable`
+      45                 :             :  * @error: (nullable): a `GError`
+      46                 :             :  *
+      47                 :             :  * Register @scratch with the `ESourceRegistry`. If a source with the same UID as
+      48                 :             :  * @scratch is already registered, that source will be returned. If the registry
+      49                 :             :  * is unavailable or registration fails a new reference of @scratch will be
+      50                 :             :  * returned.
+      51                 :             :  *
+      52                 :             :  * Returns: (transfer full): an `ESource`
+      53                 :             :  */
+      54                 :             : ESource *
+      55                 :           0 : valent_eds_register_source (ESource       *scratch,
+      56                 :             :                             GCancellable  *cancellable,
+      57                 :             :                             GError       **error)
+      58                 :             : {
+      59                 :           0 :   ESourceRegistry *registry;
+      60                 :           0 :   g_autoptr (ESource) source = NULL;
+      61                 :             : 
+      62                 :           0 :   g_return_val_if_fail (E_IS_SOURCE (scratch), NULL);
+      63                 :             : 
+      64                 :             :   /* Get the source to the registry */
+      65                 :           0 :   registry = valent_eds_get_registry (cancellable, error);
+      66                 :             : 
+      67                 :           0 :   if (registry == NULL)
+      68                 :           0 :     return g_object_ref (scratch);
+      69                 :             : 
+      70                 :             :   /* Check the registry for an existing source */
+      71                 :           0 :   source = e_source_registry_ref_source (registry, e_source_get_uid (scratch));
+      72                 :             : 
+      73                 :           0 :   if (source)
+      74                 :             :     return g_steal_pointer (&source);
+      75                 :             : 
+      76                 :             :   /* Commit the scratch source to the registry */
+      77                 :           0 :   if (!e_source_registry_commit_source_sync (registry, scratch, cancellable, error))
+      78                 :             :     return NULL;
+      79                 :             : 
+      80                 :             :       /* if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) */
+      81                 :             :       /*   return e_source_registry_ref_source (registry, uid); */
+      82                 :             :       /* else */
+      83                 :             :       /*   g_warning ("Failed to register ESource: %s", error->message); */
+      84                 :             : 
+      85                 :           0 :   return g_object_ref (scratch);
+      86                 :             : }
+      87                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/fdo-plugin.c.func-c.html b/coverage/src/plugins/fdo/fdo-plugin.c.func-c.html new file mode 100644 index 00000000000..876a86abe92 --- /dev/null +++ b/coverage/src/plugins/fdo/fdo-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/fdo-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - fdo-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_fdo_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/fdo-plugin.c.func.html b/coverage/src/plugins/fdo/fdo-plugin.c.func.html new file mode 100644 index 00000000000..878da600b88 --- /dev/null +++ b/coverage/src/plugins/fdo/fdo-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/fdo-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - fdo-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_fdo_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/fdo-plugin.c.gcov.html b/coverage/src/plugins/fdo/fdo-plugin.c.gcov.html new file mode 100644 index 00000000000..6bcedfb3037 --- /dev/null +++ b/coverage/src/plugins/fdo/fdo-plugin.c.gcov.html @@ -0,0 +1,118 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/fdo-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - fdo-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-fdo-notifications.h"
+      10                 :             : #include "valent-fdo-session.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_fdo_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :             :   /* Although notifications typically only make sense in a graphical
+      17                 :             :    * environment, it is standard interface that one could implement for devices
+      18                 :             :    * without a graphical display (i.e. home automation device). */
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_NOTIFICATIONS_ADAPTER,
+      21                 :             :                                               VALENT_TYPE_FDO_NOTIFICATIONS);
+      22                 :             : 
+      23                 :           2 :   peas_object_module_register_extension_type (module,
+      24                 :             :                                               VALENT_TYPE_SESSION_ADAPTER,
+      25                 :             :                                               VALENT_TYPE_FDO_SESSION);
+      26                 :           2 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-detail-sort-b.html b/coverage/src/plugins/fdo/index-detail-sort-b.html new file mode 100644 index 00000000000..545eea73f68 --- /dev/null +++ b/coverage/src/plugins/fdo/index-detail-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-detail-sort-f.html b/coverage/src/plugins/fdo/index-detail-sort-f.html new file mode 100644 index 00000000000..5d6022e8b0e --- /dev/null +++ b/coverage/src/plugins/fdo/index-detail-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-detail-sort-l.html b/coverage/src/plugins/fdo/index-detail-sort-l.html new file mode 100644 index 00000000000..1dcc121ebd2 --- /dev/null +++ b/coverage/src/plugins/fdo/index-detail-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-detail.html b/coverage/src/plugins/fdo/index-detail.html new file mode 100644 index 00000000000..6c1badbede3 --- /dev/null +++ b/coverage/src/plugins/fdo/index-detail.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-sort-b.html b/coverage/src/plugins/fdo/index-sort-b.html new file mode 100644 index 00000000000..545eea73f68 --- /dev/null +++ b/coverage/src/plugins/fdo/index-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-sort-f.html b/coverage/src/plugins/fdo/index-sort-f.html new file mode 100644 index 00000000000..5d6022e8b0e --- /dev/null +++ b/coverage/src/plugins/fdo/index-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index-sort-l.html b/coverage/src/plugins/fdo/index-sort-l.html new file mode 100644 index 00000000000..1dcc121ebd2 --- /dev/null +++ b/coverage/src/plugins/fdo/index-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/index.html b/coverage/src/plugins/fdo/index.html new file mode 100644 index 00000000000..6c1badbede3 --- /dev/null +++ b/coverage/src/plugins/fdo/index.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdoCoverageTotalHit
Test:Code CoverageLines:86.4 %308266
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.9 %22891
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
fdo-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-fdo-notifications.c +
83.4%83.4%
+
83.4 %19316140.7 %1084494.1 %1716
valent-fdo-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-fdo-session.c +
90.8%90.8%
+
90.8 %1099938.0 %10841100.0 %1515
valent-fdo-session.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-notifications.c.func-c.html b/coverage/src/plugins/fdo/valent-fdo-notifications.c.func-c.html new file mode 100644 index 00000000000..17e0a22046d --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-notifications.c.func-c.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-notifications.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.4 %193161
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.7 %10844
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_name_vanished0
_g_icon_new_for_variant1
_notification_closed1
become_monitor_cb1
new_for_address_cb1
on_name_appeared1
on_notification_closed1
valent_fdo_notifications_destroy1
valent_fdo_notifications_finalize1
valent_fdo_notifications_init1
valent_fdo_notifications_init_async1
_notify2
g_async_initable_iface_init2
valent_fdo_notifications_method_call2
valent_fdo_notifications_get_type9
valent_fdo_notifications_class_intern_init2
valent_fdo_notifications_get_type_once2
valent_fdo_notifications_get_type5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-notifications.c.func.html b/coverage/src/plugins/fdo/valent-fdo-notifications.c.func.html new file mode 100644 index 00000000000..d54c9ad241a --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-notifications.c.func.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-notifications.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.4 %193161
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.7 %10844
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_g_icon_new_for_variant1
_notification_closed1
_notify2
become_monitor_cb1
g_async_initable_iface_init2
new_for_address_cb1
on_name_appeared1
on_name_vanished0
on_notification_closed1
valent_fdo_notifications_destroy1
valent_fdo_notifications_finalize1
valent_fdo_notifications_get_type9
valent_fdo_notifications_class_intern_init2
valent_fdo_notifications_get_type5
valent_fdo_notifications_get_type_once2
valent_fdo_notifications_init1
valent_fdo_notifications_init_async1
valent_fdo_notifications_method_call2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-notifications.c.gcov.html b/coverage/src/plugins/fdo/valent-fdo-notifications.c.gcov.html new file mode 100644 index 00000000000..41866e9a5a6 --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-notifications.c.gcov.html @@ -0,0 +1,628 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-notifications.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.4 %193161
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:40.7 %10844
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-fdo-notifications"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gdk-pixbuf/gdk-pixbuf.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-fdo-notifications.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentFdoNotifications
+      16                 :             : {
+      17                 :             :   ValentNotificationsAdapter  parent_instance;
+      18                 :             : 
+      19                 :             :   GDBusInterfaceVTable        vtable;
+      20                 :             :   GDBusNodeInfo              *node_info;
+      21                 :             :   GDBusInterfaceInfo         *iface_info;
+      22                 :             :   GDBusConnection            *monitor;
+      23                 :             :   unsigned int                monitor_id;
+      24                 :             :   char                       *name_owner;
+      25                 :             :   unsigned int                name_owner_id;
+      26                 :             :   GDBusConnection            *session;
+      27                 :             :   unsigned int                closed_id;
+      28                 :             : };
+      29                 :             : 
+      30                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      31                 :             : 
+      32   [ +  +  +  - ]:           9 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentFdoNotifications, valent_fdo_notifications, VALENT_TYPE_NOTIFICATIONS_ADAPTER,
+      33                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      34                 :             : 
+      35                 :             : 
+      36                 :             : /*
+      37                 :             :  * Map of notification-spec urgency to GNotificationPriority
+      38                 :             :  *
+      39                 :             :  * See: https://developer-old.gnome.org/notification-spec/#urgency-levels
+      40                 :             :  */
+      41                 :             : static const unsigned int urgencies[] = {
+      42                 :             :   G_NOTIFICATION_PRIORITY_LOW,
+      43                 :             :   G_NOTIFICATION_PRIORITY_NORMAL,
+      44                 :             :   G_NOTIFICATION_PRIORITY_URGENT
+      45                 :             : };
+      46                 :             : 
+      47                 :             : 
+      48                 :             : /*
+      49                 :             :  * GDBusInterfaceSkeleton
+      50                 :             :  */
+      51                 :             : static const char interface_xml[] =
+      52                 :             :   "<node>"
+      53                 :             :   "  <interface name='org.freedesktop.Notifications'>"
+      54                 :             :   "    <method name='Notify'>"
+      55                 :             :   "      <arg name='appName' type='s' direction='in'/>"
+      56                 :             :   "      <arg name='replacesId' type='u' direction='in'/>"
+      57                 :             :   "      <arg name='iconName' type='s' direction='in'/>"
+      58                 :             :   "      <arg name='summary' type='s' direction='in'/>"
+      59                 :             :   "      <arg name='body' type='s' direction='in'/>"
+      60                 :             :   "      <arg name='actions' type='as' direction='in'/>"
+      61                 :             :   "      <arg name='hints' type='a{sv}' direction='in'/>"
+      62                 :             :   "      <arg name='timeout' type='i' direction='in'/>"
+      63                 :             :   "    </method>"
+      64                 :             :   "  </interface>"
+      65                 :             :   "</node>";
+      66                 :             : 
+      67                 :             : static const char *interface_matches[] = {
+      68                 :             :   "interface='org.freedesktop.Notifications',member='Notify',type='method_call'",
+      69                 :             :   NULL
+      70                 :             : };
+      71                 :             : 
+      72                 :             : 
+      73                 :             : static GIcon *
+      74                 :           1 : _g_icon_new_for_variant (GVariant *image_data)
+      75                 :             : {
+      76                 :           1 :   GdkPixbuf *pixbuf;
+      77                 :           1 :   int32_t width, height, rowstride;
+      78                 :           1 :   gboolean has_alpha;
+      79                 :           1 :   int32_t bits_per_sample, n_channels;
+      80                 :           2 :   g_autoptr (GVariant) data_variant = NULL;
+      81                 :           1 :   unsigned char *data = NULL;
+      82                 :           1 :   size_t data_len = 0;
+      83                 :           1 :   size_t expected_len = 0;
+      84                 :             : 
+      85                 :           1 :   g_variant_get (image_data, "(iiibii@ay)",
+      86                 :             :                  &width,
+      87                 :             :                  &height,
+      88                 :             :                  &rowstride,
+      89                 :             :                  &has_alpha,
+      90                 :             :                  &bits_per_sample,
+      91                 :             :                  &n_channels,
+      92                 :             :                  &data_variant);
+      93                 :             : 
+      94                 :           1 :   data_len = g_variant_get_size (data_variant);
+      95                 :           1 :   expected_len = (height - 1) * rowstride + width
+      96                 :           1 :     * ((n_channels * bits_per_sample + 7) / 8);
+      97                 :             : 
+      98         [ -  + ]:           1 :   if (expected_len != data_len)
+      99                 :             :     {
+     100                 :           0 :       g_warning ("Expected image data to be of length %" G_GSIZE_FORMAT
+     101                 :             :                  " but got a length of %" G_GSIZE_FORMAT,
+     102                 :             :                  expected_len,
+     103                 :             :                  data_len);
+     104                 :           0 :       return NULL;
+     105                 :             :     }
+     106                 :             : 
+     107                 :           1 :   data = g_memdup2 (g_variant_get_data (data_variant), data_len);
+     108                 :           1 :   pixbuf = gdk_pixbuf_new_from_data (data,
+     109                 :             :                                      GDK_COLORSPACE_RGB,
+     110                 :             :                                      has_alpha,
+     111                 :             :                                      bits_per_sample,
+     112                 :             :                                      width,
+     113                 :             :                                      height,
+     114                 :             :                                      rowstride,
+     115                 :             :                                      (GdkPixbufDestroyNotify)(GCallback)g_free,
+     116                 :             :                                      NULL);
+     117                 :             : 
+     118                 :           1 :   return (GIcon *)pixbuf;
+     119                 :             : }
+     120                 :             : 
+     121                 :             : static void
+     122                 :           1 : _notification_closed (ValentNotificationsAdapter *adapter,
+     123                 :             :                       GVariant                   *parameters)
+     124                 :             : {
+     125                 :           1 :   uint32_t id, reason;
+     126                 :           2 :   g_autofree char *id_str = NULL;
+     127                 :             : 
+     128                 :           1 :   g_variant_get (parameters, "(uu)", &id, &reason);
+     129                 :             : 
+     130                 :           1 :   id_str = g_strdup_printf ("%u", id);
+     131                 :           1 :   valent_notifications_adapter_notification_removed (adapter, id_str);
+     132                 :           1 : }
+     133                 :             : 
+     134                 :             : static void
+     135                 :           2 : _notify (ValentNotificationsAdapter *adapter,
+     136                 :             :          GVariant                   *parameters)
+     137                 :             : {
+     138                 :           4 :   g_autoptr (ValentNotification) notification = NULL;
+     139         [ +  - ]:           2 :   g_autoptr (GIcon) icon = NULL;
+     140                 :             : 
+     141                 :           2 :   const char *app_name;
+     142                 :           2 :   uint32_t replaces_id;
+     143                 :           2 :   const char *app_icon;
+     144                 :           2 :   const char *summary;
+     145                 :           2 :   const char *body;
+     146         [ +  - ]:           2 :   g_autoptr (GVariant) actions = NULL;
+     147         [ +  - ]:           2 :   g_autoptr (GVariant) hints = NULL;
+     148                 :           2 :   int32_t expire_timeout;
+     149                 :             : 
+     150         [ +  - ]:           2 :   g_autofree char *replaces_id_str = NULL;
+     151                 :           2 :   g_autoptr (GVariant) image_data = NULL;
+     152                 :           2 :   const char *image_path;
+     153                 :           2 :   unsigned char urgency;
+     154                 :             : 
+     155                 :             :   /* Extract what we need from the parameters */
+     156                 :           2 :   g_variant_get (parameters, "(&su&s&s&s@as@a{sv}i)",
+     157                 :             :                  &app_name,
+     158                 :             :                  &replaces_id,
+     159                 :             :                  &app_icon,
+     160                 :             :                  &summary,
+     161                 :             :                  &body,
+     162                 :             :                  &actions,
+     163                 :             :                  &hints,
+     164                 :             :                  &expire_timeout);
+     165                 :             : 
+     166                 :           2 :   replaces_id_str = g_strdup_printf ("%u", replaces_id);
+     167                 :             : 
+     168                 :             :   /* Deserialize GNotification into ValentNotification */
+     169                 :           2 :   notification = valent_notification_new (NULL);
+     170                 :           2 :   valent_notification_set_id (notification, replaces_id_str);
+     171                 :           2 :   valent_notification_set_application (notification, app_name);
+     172                 :           2 :   valent_notification_set_title (notification, summary);
+     173                 :           2 :   valent_notification_set_body (notification, body);
+     174                 :             : 
+     175                 :             :   /* This bizarre ordering is required by the specification.
+     176                 :             :    * See: https://developer-old.gnome.org/notification-spec/#icons-and-images
+     177                 :             :    */
+     178   [ +  +  -  + ]:           3 :   if (g_variant_lookup (hints, "image-data", "@(iiibiiay)", &image_data) ||
+     179                 :           1 :       g_variant_lookup (hints, "image_data", "@(iiibiiay)", &image_data))
+     180                 :             :     {
+     181                 :           1 :       icon = _g_icon_new_for_variant (image_data);
+     182                 :           1 :       valent_notification_set_icon (notification, icon);
+     183                 :             :     }
+     184   [ +  -  -  + ]:           2 :   else if (g_variant_lookup (hints, "image-path", "&s", &image_path) ||
+     185                 :           1 :            g_variant_lookup (hints, "image_path", "&s", &image_path))
+     186                 :             :     {
+     187                 :           0 :       icon = g_icon_new_for_string (image_path, NULL);
+     188                 :           0 :       valent_notification_set_icon (notification, icon);
+     189                 :             :     }
+     190         [ +  - ]:           1 :   else if (*app_icon != '\0')
+     191                 :             :     {
+     192                 :           1 :       icon = g_icon_new_for_string (app_icon, NULL);
+     193                 :           1 :       valent_notification_set_icon (notification, icon);
+     194                 :             :     }
+     195         [ #  # ]:           0 :   else if (g_variant_lookup (hints, "icon_data", "@(iiibiiay)", &image_data))
+     196                 :             :     {
+     197                 :           0 :       icon = _g_icon_new_for_variant (image_data);
+     198                 :           0 :       valent_notification_set_icon (notification, icon);
+     199                 :             :     }
+     200                 :             : 
+     201                 :             :   /* Map libnotify urgency to GNotification priority */
+     202   [ +  -  +  - ]:           2 :   if (g_variant_lookup (hints, "urgency", "y", &urgency) && urgency < G_N_ELEMENTS (urgencies))
+     203                 :           2 :     valent_notification_set_priority (notification, urgencies[urgency]);
+     204                 :             :   else
+     205                 :           0 :     valent_notification_set_priority (notification, G_NOTIFICATION_PRIORITY_NORMAL);
+     206                 :             : 
+     207                 :             :   /* Set a timestamp */
+     208                 :           2 :   valent_notification_set_time (notification, valent_timestamp_ms ());
+     209                 :             : 
+     210         [ +  + ]:           2 :   valent_notifications_adapter_notification_added (adapter, notification);
+     211                 :           2 : }
+     212                 :             : 
+     213                 :             : static void
+     214                 :           2 : valent_fdo_notifications_method_call (GDBusConnection       *connection,
+     215                 :             :                                       const char            *sender,
+     216                 :             :                                       const char            *object_path,
+     217                 :             :                                       const char            *interface_name,
+     218                 :             :                                       const char            *method_name,
+     219                 :             :                                       GVariant              *parameters,
+     220                 :             :                                       GDBusMethodInvocation *invocation,
+     221                 :             :                                       gpointer               user_data)
+     222                 :             : {
+     223                 :           2 :   ValentNotificationsAdapter *adapter = VALENT_NOTIFICATIONS_ADAPTER (user_data);
+     224                 :           2 :   ValentFdoNotifications *self = VALENT_FDO_NOTIFICATIONS (user_data);
+     225                 :           2 :   GDBusMessage *message;
+     226                 :           2 :   const char *destination;
+     227                 :             : 
+     228         [ +  - ]:           2 :   g_assert (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     229         [ -  + ]:           2 :   g_assert (VALENT_IS_FDO_NOTIFICATIONS (self));
+     230                 :             : 
+     231                 :           2 :   message = g_dbus_method_invocation_get_message (invocation);
+     232                 :           2 :   destination = g_dbus_message_get_destination (message);
+     233                 :             : 
+     234                 :             :   // TODO: accepting notifications from the well-known name causes duplicates on
+     235                 :             :   //       GNOME Shell where a proxy daemon is run.
+     236   [ -  +  -  - ]:           2 :   if (g_strcmp0 ("org.freedesktop.Notifications", destination) != 0 &&
+     237                 :           0 :       g_strcmp0 (self->name_owner, destination) != 0)
+     238                 :           0 :     goto out;
+     239                 :             : 
+     240         [ -  + ]:           2 :   if (g_strcmp0 (method_name, "Notify") == 0)
+     241                 :           2 :     _notify (adapter, parameters);
+     242                 :             : 
+     243                 :           0 :   out:
+     244                 :           2 :     g_object_unref (invocation);
+     245                 :           2 : }
+     246                 :             : 
+     247                 :             : static void
+     248                 :           1 : on_notification_closed (GDBusConnection *connection,
+     249                 :             :                         const char      *sender_name,
+     250                 :             :                         const char      *object_path,
+     251                 :             :                         const char      *interface_name,
+     252                 :             :                         const char      *signal_name,
+     253                 :             :                         GVariant        *parameters,
+     254                 :             :                         gpointer         user_data)
+     255                 :             : {
+     256                 :           1 :   ValentNotificationsAdapter *adapter = VALENT_NOTIFICATIONS_ADAPTER (user_data);
+     257                 :             : 
+     258         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATIONS_ADAPTER (adapter));
+     259         [ -  + ]:           1 :   g_assert (g_strcmp0 (signal_name, "NotificationClosed") == 0);
+     260                 :             : 
+     261                 :           1 :   _notification_closed (adapter, parameters);
+     262                 :           1 : }
+     263                 :             : 
+     264                 :             : /*
+     265                 :             :  * Setup
+     266                 :             :  */
+     267                 :             : static void
+     268                 :           1 : on_name_appeared (GDBusConnection *connection,
+     269                 :             :                   const char      *name,
+     270                 :             :                   const char      *name_owner,
+     271                 :             :                   gpointer         user_data)
+     272                 :             : {
+     273                 :           1 :   ValentFdoNotifications *self = VALENT_FDO_NOTIFICATIONS (user_data);
+     274                 :             : 
+     275         [ -  + ]:           1 :   self->name_owner = g_strdup (name_owner);
+     276                 :           1 :   g_set_object (&self->session, connection);
+     277                 :             : 
+     278         [ +  - ]:           1 :   if (self->closed_id == 0)
+     279                 :             :     {
+     280                 :           1 :       self->closed_id =
+     281                 :           1 :         g_dbus_connection_signal_subscribe (self->session,
+     282                 :             :                                             "org.freedesktop.Notifications",
+     283                 :             :                                             "org.freedesktop.Notifications",
+     284                 :             :                                             "NotificationClosed",
+     285                 :             :                                             "/org/freedesktop/Notifications",
+     286                 :             :                                             NULL,
+     287                 :             :                                             G_DBUS_SIGNAL_FLAGS_NONE,
+     288                 :             :                                             on_notification_closed,
+     289                 :             :                                             self, NULL);
+     290                 :             :     }
+     291                 :             : 
+     292                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     293                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     294                 :             :                                          NULL);
+     295                 :           1 : }
+     296                 :             : 
+     297                 :             : static void
+     298                 :           0 : on_name_vanished (GDBusConnection *connection,
+     299                 :             :                   const char      *name,
+     300                 :             :                   gpointer         user_data)
+     301                 :             : {
+     302                 :           0 :   ValentFdoNotifications *self = VALENT_FDO_NOTIFICATIONS (user_data);
+     303                 :             : 
+     304         [ #  # ]:           0 :   g_clear_pointer (&self->name_owner, g_free);
+     305                 :             : 
+     306         [ #  # ]:           0 :   if (self->closed_id > 0)
+     307                 :             :     {
+     308                 :           0 :       g_dbus_connection_signal_unsubscribe (self->session, self->closed_id);
+     309                 :           0 :       self->closed_id = 0;
+     310                 :             :     }
+     311                 :             : 
+     312                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     313                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     314                 :             :                                          NULL);
+     315                 :           0 : }
+     316                 :             : 
+     317                 :             : static void
+     318                 :           1 : become_monitor_cb (GDBusConnection *connection,
+     319                 :             :                    GAsyncResult    *result,
+     320                 :             :                    gpointer         user_data)
+     321                 :             : {
+     322                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     323                 :           1 :   ValentFdoNotifications *self = g_task_get_source_object (task);
+     324   [ -  -  +  - ]:           1 :   g_autoptr (GVariant) reply = NULL;
+     325         [ -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     326                 :             : 
+     327                 :           1 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     328                 :             : 
+     329         [ -  + ]:           1 :   if (reply == NULL)
+     330                 :             :     {
+     331                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     332                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     333                 :             :                                              error);
+     334         [ #  # ]:           0 :       g_clear_object (&self->monitor);
+     335                 :           0 :       g_dbus_error_strip_remote_error (error);
+     336         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     337                 :             :     }
+     338                 :             : 
+     339                 :             :   /* Watch the true name owner */
+     340                 :           1 :   self->name_owner_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
+     341                 :             :                                           "org.freedesktop.Notifications",
+     342                 :             :                                           G_BUS_NAME_WATCHER_FLAGS_NONE,
+     343                 :             :                                           on_name_appeared,
+     344                 :             :                                           on_name_vanished,
+     345                 :             :                                           self, NULL);
+     346                 :             : 
+     347                 :             : 
+     348                 :             :   /* Report the adapter as active */
+     349                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     350                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     351                 :             :                                          NULL);
+     352         [ -  + ]:           1 :   g_task_return_boolean (task, TRUE);
+     353                 :             : }
+     354                 :             : 
+     355                 :             : static void
+     356                 :           1 : new_for_address_cb (GObject      *object,
+     357                 :             :                     GAsyncResult *result,
+     358                 :             :                     gpointer      user_data)
+     359                 :             : {
+     360                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     361                 :           1 :   ValentFdoNotifications *self = g_task_get_source_object (task);
+     362                 :           1 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     363         [ -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     364                 :             : 
+     365                 :           1 :   self->monitor = g_dbus_connection_new_for_address_finish (result, &error);
+     366                 :             : 
+     367         [ -  + ]:           1 :   if (self->monitor == NULL)
+     368                 :             :     {
+     369                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     370                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     371                 :             :                                              error);
+     372                 :           0 :       g_dbus_error_strip_remote_error (error);
+     373                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     374                 :             :     }
+     375                 :             : 
+     376                 :             :   /* Export the monitor interface */
+     377                 :           2 :   self->monitor_id =
+     378                 :           1 :     g_dbus_connection_register_object (self->monitor,
+     379                 :             :                                        "/org/freedesktop/Notifications",
+     380                 :             :                                        self->iface_info,
+     381                 :           1 :                                        &self->vtable,
+     382                 :             :                                        self, NULL,
+     383                 :             :                                        &error);
+     384                 :             : 
+     385         [ -  + ]:           1 :   if (self->monitor_id == 0)
+     386                 :             :     {
+     387                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     388                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     389                 :             :                                              error);
+     390         [ #  # ]:           0 :       g_clear_object (&self->monitor);
+     391                 :           0 :       g_dbus_error_strip_remote_error (error);
+     392                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     393                 :             :     }
+     394                 :             : 
+     395                 :             :   /* Become a monitor for notifications */
+     396         [ -  + ]:           1 :   g_dbus_connection_call (self->monitor,
+     397                 :             :                           "org.freedesktop.DBus",
+     398                 :             :                           "/org/freedesktop/DBus",
+     399                 :             :                           "org.freedesktop.DBus.Monitoring",
+     400                 :             :                           "BecomeMonitor",
+     401                 :             :                           g_variant_new ("(^asu)", interface_matches, 0),
+     402                 :             :                           NULL,
+     403                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     404                 :             :                           -1,
+     405                 :             :                           cancellable,
+     406                 :             :                           (GAsyncReadyCallback)become_monitor_cb,
+     407                 :             :                           g_steal_pointer (&task));
+     408                 :             : }
+     409                 :             : 
+     410                 :             : 
+     411                 :             : /*
+     412                 :             :  * GAsyncInitable
+     413                 :             :  */
+     414                 :             : static void
+     415                 :           1 : valent_fdo_notifications_init_async (GAsyncInitable             *initable,
+     416                 :             :                                      int                         io_priority,
+     417                 :             :                                      GCancellable               *cancellable,
+     418                 :             :                                      GAsyncReadyCallback         callback,
+     419                 :             :                                      gpointer                    user_data)
+     420                 :             : {
+     421                 :           1 :   g_autoptr (GTask) task = NULL;
+     422         [ -  - ]:           1 :   g_autoptr (GCancellable) destroy = NULL;
+     423   [ -  -  +  - ]:           1 :   g_autofree char *address = NULL;
+     424                 :           1 :   g_autoptr (GError) error = NULL;
+     425                 :             : 
+     426         [ +  - ]:           1 :   g_assert (VALENT_IS_FDO_NOTIFICATIONS (initable));
+     427                 :             : 
+     428                 :             :   /* Cede the primary position until complete */
+     429                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     430                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     431                 :             :                                          NULL);
+     432                 :             : 
+     433                 :             :   /* Cancel initialization if the object is destroyed */
+     434                 :           1 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     435                 :             :                                              cancellable);
+     436                 :             : 
+     437                 :           1 :   task = g_task_new (initable, destroy, callback, user_data);
+     438                 :           1 :   g_task_set_priority (task, io_priority);
+     439         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_fdo_notifications_init_async);
+     440                 :             : 
+     441                 :             :   /* Get a bus address */
+     442                 :           1 :   address = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION,
+     443                 :             :                                              destroy,
+     444                 :             :                                              &error);
+     445                 :             : 
+     446         [ -  + ]:           1 :   if (address == NULL)
+     447                 :             :     {
+     448                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     449                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     450                 :             :                                              error);
+     451         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     452                 :             :     }
+     453                 :             : 
+     454                 :             :   /* Get a dedicated connection for monitoring */
+     455         [ -  + ]:           1 :   g_dbus_connection_new_for_address (address,
+     456                 :             :                                      G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+     457                 :             :                                      G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
+     458                 :             :                                      NULL,
+     459                 :             :                                      destroy,
+     460                 :             :                                      (GAsyncReadyCallback)new_for_address_cb,
+     461                 :             :                                      g_steal_pointer (&task));
+     462                 :             : }
+     463                 :             : 
+     464                 :             : static void
+     465                 :           2 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     466                 :             : {
+     467                 :           2 :   iface->init_async = valent_fdo_notifications_init_async;
+     468                 :           2 : }
+     469                 :             : 
+     470                 :             : /*
+     471                 :             :  * ValentObject
+     472                 :             :  */
+     473                 :             : static void
+     474                 :           1 : valent_fdo_notifications_destroy (ValentObject *object)
+     475                 :             : {
+     476                 :           1 :   ValentFdoNotifications *self = VALENT_FDO_NOTIFICATIONS (object);
+     477                 :             : 
+     478         [ +  - ]:           1 :   if (self->closed_id > 0)
+     479                 :             :     {
+     480                 :           1 :       g_dbus_connection_signal_unsubscribe (self->session, self->closed_id);
+     481                 :           1 :       self->closed_id = 0;
+     482                 :             :     }
+     483                 :             : 
+     484         [ +  - ]:           1 :   if (self->name_owner_id > 0)
+     485                 :             :     {
+     486                 :           1 :       g_clear_handle_id (&self->name_owner_id, g_bus_unwatch_name);
+     487         [ +  - ]:           1 :       g_clear_pointer (&self->name_owner, g_free);
+     488                 :             :     }
+     489                 :             : 
+     490         [ +  - ]:           1 :   if (self->monitor_id != 0)
+     491                 :             :     {
+     492                 :           1 :       g_dbus_connection_unregister_object (self->monitor, self->monitor_id);
+     493                 :           1 :       self->monitor_id = 0;
+     494                 :             :     }
+     495                 :             : 
+     496         [ +  - ]:           1 :   g_clear_object (&self->monitor);
+     497         [ +  - ]:           1 :   g_clear_object (&self->session);
+     498                 :             : 
+     499                 :           1 :   VALENT_OBJECT_CLASS (valent_fdo_notifications_parent_class)->destroy (object);
+     500                 :           1 : }
+     501                 :             : 
+     502                 :             : /*
+     503                 :             :  * GObject
+     504                 :             :  */
+     505                 :             : static void
+     506                 :           1 : valent_fdo_notifications_finalize (GObject *object)
+     507                 :             : {
+     508                 :           1 :   ValentFdoNotifications *self = VALENT_FDO_NOTIFICATIONS (object);
+     509                 :             : 
+     510         [ +  - ]:           1 :   g_clear_pointer (&self->node_info, g_dbus_node_info_unref);
+     511                 :             : 
+     512                 :           1 :   G_OBJECT_CLASS (valent_fdo_notifications_parent_class)->finalize (object);
+     513                 :           1 : }
+     514                 :             : 
+     515                 :             : static void
+     516                 :           2 : valent_fdo_notifications_class_init (ValentFdoNotificationsClass *klass)
+     517                 :             : {
+     518                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     519                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     520                 :             : 
+     521                 :           2 :   object_class->finalize = valent_fdo_notifications_finalize;
+     522                 :             : 
+     523                 :           2 :   vobject_class->destroy = valent_fdo_notifications_destroy;
+     524                 :             : }
+     525                 :             : 
+     526                 :             : static void
+     527                 :           1 : valent_fdo_notifications_init (ValentFdoNotifications *self)
+     528                 :             : {
+     529                 :           1 :   self->node_info = g_dbus_node_info_new_for_xml (interface_xml, NULL);
+     530                 :           1 :   self->iface_info = self->node_info->interfaces[0];
+     531                 :             : 
+     532                 :           1 :   self->vtable.method_call = valent_fdo_notifications_method_call;
+     533                 :           1 :   self->vtable.get_property = NULL;
+     534                 :           1 :   self->vtable.set_property = NULL;
+     535                 :           1 : }
+     536                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-notifications.h.func-c.html b/coverage/src/plugins/fdo/valent-fdo-notifications.h.func-c.html new file mode 100644 index 00000000000..009b262f1f6 --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-notifications.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-notifications.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_FDO_NOTIFICATIONS3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-notifications.h.func.html b/coverage/src/plugins/fdo/valent-fdo-notifications.h.func.html new file mode 100644 index 00000000000..3dbcd38283d --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-notifications.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-notifications.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_FDO_NOTIFICATIONS3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-notifications.h.gcov.html b/coverage/src/plugins/fdo/valent-fdo-notifications.h.gcov.html new file mode 100644 index 00000000000..cab2c56121e --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-notifications.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-notifications.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_FDO_NOTIFICATIONS (valent_fdo_notifications_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           3 : G_DECLARE_FINAL_TYPE (ValentFdoNotifications, valent_fdo_notifications, VALENT, FDO_NOTIFICATIONS, ValentNotificationsAdapter)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-session.c.func-c.html b/coverage/src/plugins/fdo/valent-fdo-session.c.func-c.html new file mode 100644 index 00000000000..a6de34f8bd1 --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-session.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-session.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.8 %10999
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.0 %10841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
get_display_cb1
get_user_cb1
new_session_cb1
on_properties_changed1
on_signal1
valent_fdo_notifications_init_async1
valent_fdo_session_destroy1
valent_fdo_session_init1
valent_fdo_session_set_locked1
g_async_initable_iface_init2
valent_fdo_session_get_active2
valent_fdo_session_get_locked2
valent_fdo_session_get_type15
valent_fdo_session_class_intern_init2
valent_fdo_session_get_type_once2
valent_fdo_session_get_type11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-session.c.func.html b/coverage/src/plugins/fdo/valent-fdo-session.c.func.html new file mode 100644 index 00000000000..f6e686122da --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-session.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-session.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.8 %10999
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.0 %10841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init2
get_display_cb1
get_user_cb1
new_session_cb1
on_properties_changed1
on_signal1
valent_fdo_notifications_init_async1
valent_fdo_session_destroy1
valent_fdo_session_get_active2
valent_fdo_session_get_locked2
valent_fdo_session_get_type15
valent_fdo_session_class_intern_init2
valent_fdo_session_get_type11
valent_fdo_session_get_type_once2
valent_fdo_session_init1
valent_fdo_session_set_locked1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-session.c.gcov.html b/coverage/src/plugins/fdo/valent-fdo-session.c.gcov.html new file mode 100644 index 00000000000..90df695a3d2 --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-session.c.gcov.html @@ -0,0 +1,428 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-session.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.8 %10999
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.0 %10841
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-fdo-session"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libpeas.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-fdo-session.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : struct _ValentFdoSession
+      15                 :             : {
+      16                 :             :   ValentSessionAdapter  parent_instance;
+      17                 :             : 
+      18                 :             :   GDBusProxy           *proxy;
+      19                 :             : 
+      20                 :             :   gboolean              active;
+      21                 :             :   gboolean              locked;
+      22                 :             : };
+      23                 :             : 
+      24                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      25                 :             : 
+      26   [ +  +  +  - ]:          15 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentFdoSession, valent_fdo_session, VALENT_TYPE_SESSION_ADAPTER,
+      27                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      28                 :             : 
+      29                 :             : 
+      30                 :             : /*
+      31                 :             :  * DBus Callbacks
+      32                 :             :  */
+      33                 :             : static void
+      34                 :           1 : on_properties_changed (GDBusProxy       *proxy,
+      35                 :             :                        GVariant         *changed_properties,
+      36                 :             :                        GStrv             invalidated_properties,
+      37                 :             :                        ValentFdoSession *self)
+      38                 :             : {
+      39         [ +  - ]:           1 :   g_assert (VALENT_IS_FDO_SESSION (self));
+      40                 :             : 
+      41         [ +  - ]:           1 :   if (!g_variant_lookup (changed_properties, "Active", "b", &self->active))
+      42                 :             :     return;
+      43                 :             : 
+      44                 :           1 :   g_object_notify (G_OBJECT (self), "active");
+      45                 :             : }
+      46                 :             : 
+      47                 :             : static void
+      48                 :           1 : on_signal (GDBusProxy       *proxy,
+      49                 :             :            const char       *sender_name,
+      50                 :             :            const char       *signal_name,
+      51                 :             :            GVariant         *parameters,
+      52                 :             :            ValentFdoSession *self)
+      53                 :             : {
+      54         [ +  - ]:           1 :   g_assert (VALENT_IS_FDO_SESSION (self));
+      55                 :             : 
+      56         [ +  - ]:           1 :   if (g_strcmp0 (signal_name, "Lock") == 0)
+      57                 :           1 :     self->locked = TRUE;
+      58         [ #  # ]:           0 :   else if (g_strcmp0 (signal_name, "Unlock") == 0)
+      59                 :           0 :     self->locked = FALSE;
+      60                 :             : 
+      61                 :           1 :   g_object_notify (G_OBJECT (self), "locked");
+      62                 :           1 : }
+      63                 :             : 
+      64                 :             : /*
+      65                 :             :  * ValentSessionAdapter
+      66                 :             :  */
+      67                 :             : static gboolean
+      68                 :           2 : valent_fdo_session_get_active (ValentSessionAdapter *adapter)
+      69                 :             : {
+      70                 :           2 :   ValentFdoSession *self = VALENT_FDO_SESSION (adapter);
+      71                 :             : 
+      72         [ +  - ]:           2 :   g_assert (VALENT_IS_FDO_SESSION (self));
+      73                 :             : 
+      74                 :           2 :   return self->active;
+      75                 :             : }
+      76                 :             : 
+      77                 :             : static gboolean
+      78                 :           2 : valent_fdo_session_get_locked (ValentSessionAdapter *adapter)
+      79                 :             : {
+      80                 :           2 :   ValentFdoSession *self = VALENT_FDO_SESSION (adapter);
+      81                 :             : 
+      82         [ +  - ]:           2 :   g_assert (VALENT_IS_FDO_SESSION (self));
+      83                 :             : 
+      84                 :           2 :   return self->locked;
+      85                 :             : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           1 : valent_fdo_session_set_locked (ValentSessionAdapter *adapter,
+      89                 :             :                                gboolean              state)
+      90                 :             : {
+      91                 :           1 :   ValentFdoSession *self = VALENT_FDO_SESSION (adapter);
+      92                 :             : 
+      93         [ +  - ]:           1 :   g_assert (VALENT_IS_FDO_SESSION (self));
+      94   [ +  -  +  -  :           1 :   g_return_if_fail (G_IS_DBUS_PROXY (self->proxy));
+             -  +  -  - ]
+      95                 :             : 
+      96         [ -  + ]:           1 :   g_dbus_proxy_call (self->proxy,
+      97                 :             :                      state ? "Lock" : "Unlock",
+      98                 :             :                      NULL,
+      99                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     100                 :             :                      -1,
+     101                 :             :                      NULL,
+     102                 :             :                      NULL,
+     103                 :             :                      NULL);
+     104                 :             : }
+     105                 :             : 
+     106                 :             : static void
+     107                 :           1 : new_session_cb (GObject      *object,
+     108                 :             :                 GAsyncResult *result,
+     109                 :             :                 gpointer      user_data)
+     110                 :             : {
+     111                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     112                 :           1 :   ValentFdoSession *self = g_task_get_source_object (task);
+     113                 :           1 :   g_autoptr (GVariant) active = NULL;
+     114         [ +  - ]:           1 :   g_autoptr (GVariant) locked = NULL;
+     115         [ +  - ]:           1 :   g_autoptr (GError) error = NULL;
+     116                 :             : 
+     117   [ +  -  +  -  :           1 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     118         [ -  + ]:           1 :   g_assert (VALENT_IS_FDO_SESSION (self));
+     119                 :             : 
+     120                 :           1 :   self->proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
+     121                 :             : 
+     122         [ -  + ]:           1 :   if (self->proxy == NULL)
+     123                 :             :     {
+     124                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     125                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     126                 :             :                                              error);
+     127         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     128                 :             :     }
+     129                 :             : 
+     130                 :             :   /* Preload properties */
+     131                 :           1 :   active = g_dbus_proxy_get_cached_property (self->proxy, "Active");
+     132                 :             : 
+     133         [ +  - ]:           1 :   if (active != NULL)
+     134                 :           1 :     self->active = g_variant_get_boolean (active);
+     135                 :             : 
+     136                 :           1 :   locked = g_dbus_proxy_get_cached_property (self->proxy, "LockedHint");
+     137                 :             : 
+     138         [ +  - ]:           1 :   if (locked != NULL)
+     139                 :           1 :     self->locked = g_variant_get_boolean (locked);
+     140                 :             : 
+     141                 :             :   /* Watch for changes */
+     142                 :           1 :   g_signal_connect_object (self->proxy,
+     143                 :             :                            "g-properties-changed",
+     144                 :             :                            G_CALLBACK (on_properties_changed),
+     145                 :             :                            self, 0);
+     146                 :             : 
+     147                 :           1 :   g_signal_connect_object (self->proxy,
+     148                 :             :                            "g-signal",
+     149                 :             :                            G_CALLBACK (on_signal),
+     150                 :             :                            self, 0);
+     151                 :             : 
+     152                 :             : 
+     153                 :             :   /* Report the adapter as active */
+     154                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     155                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     156                 :             :                                          NULL);
+     157         [ -  + ]:           1 :   g_task_return_boolean (task, TRUE);
+     158                 :             : }
+     159                 :             : 
+     160                 :             : static void
+     161                 :           1 : get_display_cb (GDBusConnection *connection,
+     162                 :             :                 GAsyncResult    *result,
+     163                 :             :                 gpointer         user_data)
+     164                 :             : {
+     165                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     166                 :           1 :   ValentFdoSession *self = g_task_get_source_object (task);
+     167                 :           1 :   g_autoptr (GError) error = NULL;
+     168         [ -  + ]:           1 :   g_autoptr (GVariant) reply = NULL;
+     169         [ -  - ]:           1 :   g_autoptr (GVariant) value = NULL;
+     170                 :           1 :   const char *session_id, *object_path;
+     171                 :             : 
+     172   [ +  -  +  -  :           1 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     173                 :             : 
+     174                 :           1 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     175                 :             : 
+     176         [ -  + ]:           1 :   if (reply == NULL)
+     177                 :             :     {
+     178                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     179                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     180                 :             :                                              error);
+     181         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     182                 :             :     }
+     183                 :             : 
+     184                 :           1 :   g_variant_get (reply, "(v)", &value);
+     185                 :           1 :   g_variant_get (value, "(&s&o)", &session_id, &object_path);
+     186         [ +  - ]:           1 :   g_dbus_proxy_new (connection,
+     187                 :             :                     G_DBUS_PROXY_FLAGS_NONE,
+     188                 :             :                     NULL,
+     189                 :             :                     "org.freedesktop.login1",
+     190                 :             :                     object_path,
+     191                 :             :                     "org.freedesktop.login1.Session",
+     192                 :             :                     g_task_get_cancellable (task),
+     193                 :             :                     (GAsyncReadyCallback)new_session_cb,
+     194                 :             :                     g_object_ref (task));
+     195                 :             : }
+     196                 :             : 
+     197                 :             : static void
+     198                 :           1 : get_user_cb (GDBusConnection *connection,
+     199                 :             :              GAsyncResult    *result,
+     200                 :             :              gpointer         user_data)
+     201                 :             : {
+     202                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     203                 :           1 :   ValentFdoSession *self = g_task_get_source_object (task);
+     204                 :           1 :   g_autoptr (GError) error = NULL;
+     205   [ -  -  -  + ]:           1 :   g_autoptr (GVariant) reply = NULL;
+     206                 :           1 :   const char *object_path;
+     207                 :             : 
+     208   [ +  -  +  -  :           1 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     209                 :             : 
+     210                 :           1 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     211                 :             : 
+     212         [ -  + ]:           1 :   if (reply == NULL)
+     213                 :             :     {
+     214                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     215                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     216                 :             :                                              error);
+     217         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     218                 :             :     }
+     219                 :             : 
+     220                 :           1 :   g_variant_get (reply, "(&o)", &object_path);
+     221                 :           1 :   g_dbus_connection_call (connection,
+     222                 :             :                           "org.freedesktop.login1",
+     223                 :             :                           object_path,
+     224                 :             :                           "org.freedesktop.DBus.Properties",
+     225                 :             :                           "Get",
+     226                 :             :                           g_variant_new ("(ss)",
+     227                 :             :                                          "org.freedesktop.login1.User",
+     228                 :             :                                          "Display"),
+     229                 :             :                           G_VARIANT_TYPE ("(v)"),
+     230                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     231                 :             :                           -1,
+     232                 :             :                           g_task_get_cancellable (task),
+     233                 :             :                           (GAsyncReadyCallback)get_display_cb,
+     234                 :             :                           g_object_ref (task));
+     235                 :             : }
+     236                 :             : 
+     237                 :             : /*
+     238                 :             :  * GAsyncInitable
+     239                 :             :  */
+     240                 :             : static void
+     241                 :           1 : valent_fdo_notifications_init_async (GAsyncInitable             *initable,
+     242                 :             :                                      int                         io_priority,
+     243                 :             :                                      GCancellable               *cancellable,
+     244                 :             :                                      GAsyncReadyCallback         callback,
+     245                 :             :                                      gpointer                    user_data)
+     246                 :             : {
+     247                 :           1 :   g_autoptr (GTask) task = NULL;
+     248         [ -  - ]:           1 :   g_autoptr (GCancellable) destroy = NULL;
+     249   [ -  -  +  - ]:           1 :   g_autoptr (GDBusConnection) connection = NULL;
+     250         [ -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     251                 :             : 
+     252         [ +  - ]:           1 :   g_assert (VALENT_IS_FDO_SESSION (initable));
+     253                 :             : 
+     254                 :             :   /* Cede the primary position until complete */
+     255                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     256                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     257                 :             :                                          NULL);
+     258                 :             : 
+     259                 :             :   /* Cancel initialization if the object is destroyed */
+     260                 :           1 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     261                 :             :                                              cancellable);
+     262                 :             : 
+     263                 :           1 :   task = g_task_new (initable, destroy, callback, user_data);
+     264                 :           1 :   g_task_set_priority (task, io_priority);
+     265         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_fdo_notifications_init_async);
+     266                 :             : 
+     267                 :             :   /* Get a bus address */
+     268                 :           1 :   connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, destroy, &error);
+     269                 :             : 
+     270         [ -  + ]:           1 :   if (connection == NULL)
+     271                 :             :     {
+     272                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     273                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     274                 :             :                                              error);
+     275         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     276                 :             :     }
+     277                 :             : 
+     278                 :             :   /* Check for logind */
+     279         [ -  + ]:           1 :   g_dbus_connection_call (connection,
+     280                 :             :                           "org.freedesktop.login1",
+     281                 :             :                           "/org/freedesktop/login1",
+     282                 :             :                           "org.freedesktop.login1.Manager",
+     283                 :             :                           "GetUser",
+     284                 :             :                           g_variant_new ("(u)", geteuid ()),
+     285                 :             :                           G_VARIANT_TYPE ("(o)"),
+     286                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     287                 :             :                           -1,
+     288                 :             :                           destroy,
+     289                 :             :                           (GAsyncReadyCallback)get_user_cb,
+     290                 :             :                           g_steal_pointer (&task));
+     291                 :             : }
+     292                 :             : 
+     293                 :             : static void
+     294                 :           2 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     295                 :             : {
+     296                 :           2 :   iface->init_async = valent_fdo_notifications_init_async;
+     297                 :           2 : }
+     298                 :             : 
+     299                 :             : /*
+     300                 :             :  * ValentObject
+     301                 :             :  */
+     302                 :             : static void
+     303                 :           1 : valent_fdo_session_destroy (ValentObject *object)
+     304                 :             : {
+     305                 :           1 :   ValentFdoSession *self = VALENT_FDO_SESSION (object);
+     306                 :             : 
+     307         [ +  - ]:           1 :   g_clear_object (&self->proxy);
+     308                 :             : 
+     309                 :           1 :   VALENT_OBJECT_CLASS (valent_fdo_session_parent_class)->destroy (object);
+     310                 :           1 : }
+     311                 :             : 
+     312                 :             : /*
+     313                 :             :  * GObject
+     314                 :             :  */
+     315                 :             : static void
+     316                 :           2 : valent_fdo_session_class_init (ValentFdoSessionClass *klass)
+     317                 :             : {
+     318                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     319                 :           2 :   ValentSessionAdapterClass *session_class = VALENT_SESSION_ADAPTER_CLASS (klass);
+     320                 :             : 
+     321                 :           2 :   vobject_class->destroy = valent_fdo_session_destroy;
+     322                 :             : 
+     323                 :           2 :   session_class->get_active = valent_fdo_session_get_active;
+     324                 :           2 :   session_class->get_locked = valent_fdo_session_get_locked;
+     325                 :           2 :   session_class->set_locked = valent_fdo_session_set_locked;
+     326                 :             : }
+     327                 :             : 
+     328                 :             : static void
+     329                 :           1 : valent_fdo_session_init (ValentFdoSession *self)
+     330                 :             : {
+     331                 :           1 : }
+     332                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-session.h.func-c.html b/coverage/src/plugins/fdo/valent-fdo-session.h.func-c.html new file mode 100644 index 00000000000..74ad14c1bfe --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-session.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-session.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_FDO_SESSION9
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-session.h.func.html b/coverage/src/plugins/fdo/valent-fdo-session.h.func.html new file mode 100644 index 00000000000..7ae11ac5928 --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-session.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-session.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_FDO_SESSION9
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/fdo/valent-fdo-session.h.gcov.html b/coverage/src/plugins/fdo/valent-fdo-session.h.gcov.html new file mode 100644 index 00000000000..f3c5950ac1c --- /dev/null +++ b/coverage/src/plugins/fdo/valent-fdo-session.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/fdo/valent-fdo-session.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/fdo - valent-fdo-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_FDO_SESSION (valent_fdo_session_get_type ())
+      11                 :             : 
+      12   [ +  -  +  -  :           9 : G_DECLARE_FINAL_TYPE (ValentFdoSession, valent_fdo_session, VALENT, FDO_SESSION, ValentSessionAdapter)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/findmyphone-plugin.c.func-c.html b/coverage/src/plugins/findmyphone/findmyphone-plugin.c.func-c.html new file mode 100644 index 00000000000..6a063fd080b --- /dev/null +++ b/coverage/src/plugins/findmyphone/findmyphone-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/findmyphone-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - findmyphone-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_findmyphone_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/findmyphone-plugin.c.func.html b/coverage/src/plugins/findmyphone/findmyphone-plugin.c.func.html new file mode 100644 index 00000000000..b71cbde1bac --- /dev/null +++ b/coverage/src/plugins/findmyphone/findmyphone-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/findmyphone-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - findmyphone-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_findmyphone_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/findmyphone-plugin.c.gcov.html b/coverage/src/plugins/findmyphone/findmyphone-plugin.c.gcov.html new file mode 100644 index 00000000000..c82e3200e52 --- /dev/null +++ b/coverage/src/plugins/findmyphone/findmyphone-plugin.c.gcov.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/findmyphone-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - findmyphone-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-findmyphone-plugin.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           1 : valent_findmyphone_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           1 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_FINDMYPHONE_PLUGIN);
+      18                 :           1 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-detail-sort-b.html b/coverage/src/plugins/findmyphone/index-detail-sort-b.html new file mode 100644 index 00000000000..7f047e7bb31 --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-detail-sort-f.html b/coverage/src/plugins/findmyphone/index-detail-sort-f.html new file mode 100644 index 00000000000..ca3c7f1ccac --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-detail-sort-l.html b/coverage/src/plugins/findmyphone/index-detail-sort-l.html new file mode 100644 index 00000000000..c44d277e7eb --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-detail.html b/coverage/src/plugins/findmyphone/index-detail.html new file mode 100644 index 00000000000..02434cf2279 --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-sort-b.html b/coverage/src/plugins/findmyphone/index-sort-b.html new file mode 100644 index 00000000000..7f047e7bb31 --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-sort-f.html b/coverage/src/plugins/findmyphone/index-sort-f.html new file mode 100644 index 00000000000..ca3c7f1ccac --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index-sort-l.html b/coverage/src/plugins/findmyphone/index-sort-l.html new file mode 100644 index 00000000000..c44d277e7eb --- /dev/null +++ b/coverage/src/plugins/findmyphone/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/index.html b/coverage/src/plugins/findmyphone/index.html new file mode 100644 index 00000000000..02434cf2279 --- /dev/null +++ b/coverage/src/plugins/findmyphone/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphoneCoverageTotalHit
Test:Code CoverageLines:45.9 %15973
Test Date:2024-03-31 18:46:36Functions:60.0 %2515
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:23.4 %9422
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
findmyphone-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-findmyphone-plugin.c +
74.6%74.6%
+
74.6 %594442.3 %261180.0 %108
valent-findmyphone-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-findmyphone-ringer.c +
26.0%26.0%
+
26.0 %962512.9 %62838.5 %135
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.func-c.html b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.func-c.html new file mode 100644 index 00000000000..9f13e5515d6 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.func-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:74.6 %5944
Test Date:2024-03-31 18:46:36Functions:80.0 %108
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.3 %2611
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_findmyphone_plugin_handle_findmyphone_request0
valent_findmyphone_plugin_handle_packet0
ring_action1
valent_findmyphone_plugin_constructed4
valent_findmyphone_plugin_init4
valent_findmyphone_plugin_destroy8
valent_findmyphone_plugin_update_state9
valent_findmyphone_plugin_get_type13
valent_findmyphone_plugin_class_intern_init1
valent_findmyphone_plugin_get_type_once1
valent_findmyphone_plugin_get_type11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.func.html b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.func.html new file mode 100644 index 00000000000..b29baba5d68 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:74.6 %5944
Test Date:2024-03-31 18:46:36Functions:80.0 %108
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.3 %2611
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ring_action1
valent_findmyphone_plugin_constructed4
valent_findmyphone_plugin_destroy8
valent_findmyphone_plugin_get_type13
valent_findmyphone_plugin_class_intern_init1
valent_findmyphone_plugin_get_type11
valent_findmyphone_plugin_get_type_once1
valent_findmyphone_plugin_handle_findmyphone_request0
valent_findmyphone_plugin_handle_packet0
valent_findmyphone_plugin_init4
valent_findmyphone_plugin_update_state9
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.gcov.html b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.gcov.html new file mode 100644 index 00000000000..a2df8cacca8 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.c.gcov.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:74.6 %5944
Test Date:2024-03-31 18:46:36Functions:80.0 %108
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.3 %2611
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-findmyphone-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-findmyphone-plugin.h"
+      14                 :             : #include "valent-findmyphone-ringer.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentFindmyphonePlugin
+      18                 :             : {
+      19                 :             :   ValentDevicePlugin       parent_instance;
+      20                 :             : 
+      21                 :             :   ValentFindmyphoneRinger *ringer;
+      22                 :             :   ValentSession           *session;
+      23                 :             : };
+      24                 :             : 
+      25   [ +  +  +  - ]:          13 : G_DEFINE_FINAL_TYPE (ValentFindmyphonePlugin, valent_findmyphone_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      26                 :             : 
+      27                 :             : 
+      28                 :             : static void
+      29                 :           0 : valent_findmyphone_plugin_handle_findmyphone_request (ValentFindmyphonePlugin *self)
+      30                 :             : {
+      31         [ #  # ]:           0 :   g_assert (VALENT_IS_FINDMYPHONE_PLUGIN (self));
+      32                 :             : 
+      33                 :           0 :   valent_session_set_locked (self->session, FALSE);
+      34                 :           0 :   valent_findmyphone_ringer_toggle (self->ringer, self);
+      35                 :           0 : }
+      36                 :             : 
+      37                 :             : /*
+      38                 :             :  * GActions
+      39                 :             :  */
+      40                 :             : static void
+      41                 :           1 : ring_action (GSimpleAction *action,
+      42                 :             :              GVariant      *parameter,
+      43                 :             :              gpointer       user_data)
+      44                 :             : {
+      45                 :           1 :   ValentFindmyphonePlugin *self = VALENT_FINDMYPHONE_PLUGIN (user_data);
+      46                 :           2 :   g_autoptr (JsonNode) packet = NULL;
+      47                 :             : 
+      48         [ +  - ]:           1 :   g_assert (VALENT_IS_FINDMYPHONE_PLUGIN (self));
+      49                 :             : 
+      50                 :           1 :   packet = valent_packet_new ("kdeconnect.findmyphone.request");
+      51         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      52                 :           1 : }
+      53                 :             : 
+      54                 :             : static const GActionEntry actions[] = {
+      55                 :             :     {"ring", ring_action, NULL, NULL, NULL}
+      56                 :             : };
+      57                 :             : 
+      58                 :             : /*
+      59                 :             :  * ValentDevicePlugin
+      60                 :             :  */
+      61                 :             : static void
+      62                 :           9 : valent_findmyphone_plugin_update_state (ValentDevicePlugin *plugin,
+      63                 :             :                                         ValentDeviceState   state)
+      64                 :             : {
+      65                 :           9 :   ValentFindmyphonePlugin *self = VALENT_FINDMYPHONE_PLUGIN (plugin);
+      66                 :           9 :   gboolean available;
+      67                 :             : 
+      68         [ +  - ]:           9 :   g_assert (VALENT_IS_FINDMYPHONE_PLUGIN (self));
+      69                 :             : 
+      70                 :           9 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+      71                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+      72                 :             : 
+      73                 :             :   /* Stop any ringing */
+      74   [ +  +  -  + ]:           9 :   if (!available && valent_findmyphone_ringer_is_owner (self->ringer, self))
+      75                 :           0 :     valent_findmyphone_ringer_hide (self->ringer);
+      76                 :             : 
+      77                 :           9 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+      78                 :           9 : }
+      79                 :             : 
+      80                 :             : static void
+      81                 :           0 : valent_findmyphone_plugin_handle_packet (ValentDevicePlugin *plugin,
+      82                 :             :                                          const char         *type,
+      83                 :             :                                          JsonNode           *packet)
+      84                 :             : {
+      85                 :           0 :   ValentFindmyphonePlugin *self = VALENT_FINDMYPHONE_PLUGIN (plugin);
+      86                 :             : 
+      87         [ #  # ]:           0 :   g_assert (VALENT_IS_FINDMYPHONE_PLUGIN (self));
+      88         [ #  # ]:           0 :   g_assert (type != NULL);
+      89         [ #  # ]:           0 :   g_assert (VALENT_IS_PACKET (packet));
+      90                 :             : 
+      91         [ #  # ]:           0 :   if (g_str_equal (type, "kdeconnect.findmyphone.request"))
+      92                 :           0 :     valent_findmyphone_plugin_handle_findmyphone_request (self);
+      93                 :             :   else
+      94                 :           0 :     g_assert_not_reached ();
+      95                 :           0 : }
+      96                 :             : 
+      97                 :             : /*
+      98                 :             :  * ValentObject
+      99                 :             :  */
+     100                 :             : static void
+     101                 :           8 : valent_findmyphone_plugin_destroy (ValentObject *object)
+     102                 :             : {
+     103                 :           8 :   ValentFindmyphonePlugin *self = VALENT_FINDMYPHONE_PLUGIN (object);
+     104                 :           8 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     105                 :             : 
+     106                 :             :   /* Release the ringer singleton */
+     107         [ +  + ]:           8 :   g_clear_pointer (&self->ringer, valent_findmyphone_ringer_release);
+     108                 :           8 :   self->session = NULL;
+     109                 :             : 
+     110                 :           8 :   valent_device_plugin_set_menu_item (plugin, "device.findmyphone.ring", NULL);
+     111                 :             : 
+     112                 :           8 :   VALENT_OBJECT_CLASS (valent_findmyphone_plugin_parent_class)->destroy (object);
+     113                 :           8 : }
+     114                 :             : 
+     115                 :             : /*
+     116                 :             :  * GObject
+     117                 :             :  */
+     118                 :             : static void
+     119                 :           4 : valent_findmyphone_plugin_constructed (GObject *object)
+     120                 :             : {
+     121                 :           4 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     122                 :           4 :   ValentFindmyphonePlugin *self = VALENT_FINDMYPHONE_PLUGIN (object);
+     123                 :             : 
+     124                 :           4 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     125                 :             :                                    actions,
+     126                 :             :                                    G_N_ELEMENTS (actions),
+     127                 :             :                                    plugin);
+     128                 :           4 :   valent_device_plugin_set_menu_action (plugin,
+     129                 :             :                                         "device.findmyphone.ring",
+     130                 :           4 :                                         _("Ring"),
+     131                 :             :                                         "phonelink-ring-symbolic");
+     132                 :             : 
+     133                 :             :   /* Acquire the ringer singleton and ensure the ValentSession component is
+     134                 :             :    * prepared. */
+     135                 :           4 :   self->ringer = valent_findmyphone_ringer_acquire ();
+     136                 :           4 :   self->session = valent_session_get_default ();
+     137                 :             : 
+     138                 :           4 :   G_OBJECT_CLASS (valent_findmyphone_plugin_parent_class)->constructed (object);
+     139                 :           4 : }
+     140                 :             : 
+     141                 :             : static void
+     142                 :           1 : valent_findmyphone_plugin_class_init (ValentFindmyphonePluginClass *klass)
+     143                 :             : {
+     144                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     145                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     146                 :           1 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     147                 :             : 
+     148                 :           1 :   object_class->constructed = valent_findmyphone_plugin_constructed;
+     149                 :             : 
+     150                 :           1 :   vobject_class->destroy = valent_findmyphone_plugin_destroy;
+     151                 :             : 
+     152                 :           1 :   plugin_class->handle_packet = valent_findmyphone_plugin_handle_packet;
+     153                 :           1 :   plugin_class->update_state = valent_findmyphone_plugin_update_state;
+     154                 :             : }
+     155                 :             : 
+     156                 :             : static void
+     157                 :           4 : valent_findmyphone_plugin_init (ValentFindmyphonePlugin *self)
+     158                 :             : {
+     159                 :           4 : }
+     160                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.func-c.html b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.func-c.html new file mode 100644 index 00000000000..40fbd8f802b --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_FINDMYPHONE_PLUGIN10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.func.html b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.func.html new file mode 100644 index 00000000000..9c47731d451 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_FINDMYPHONE_PLUGIN10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.gcov.html b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.gcov.html new file mode 100644 index 00000000000..47cbdc3325c --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_FINDMYPHONE_PLUGIN (valent_findmyphone_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          10 : G_DECLARE_FINAL_TYPE (ValentFindmyphonePlugin, valent_findmyphone_plugin, VALENT, FINDMYPHONE_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.func-c.html b/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.func-c.html new file mode 100644 index 00000000000..9506351b0c3 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.func-c.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-ringer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-ringer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:26.0 %9625
Test Date:2024-03-31 18:46:36Functions:38.5 %135
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.9 %628
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_window_destroy_idle0
on_motion_event0
ringer_source_func0
valent_findmyphone_ringer_hide0
valent_findmyphone_ringer_show0
valent_findmyphone_ringer_start0
valent_findmyphone_ringer_stop0
valent_findmyphone_ringer_toggle0
valent_findmyphone_ringer_acquire4
valent_findmyphone_ringer_free4
valent_findmyphone_ringer_new4
valent_findmyphone_ringer_release4
valent_findmyphone_ringer_is_owner7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.func.html b/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.func.html new file mode 100644 index 00000000000..2bd66a0d041 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.func.html @@ -0,0 +1,182 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-ringer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-ringer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:26.0 %9625
Test Date:2024-03-31 18:46:36Functions:38.5 %135
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.9 %628
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_window_destroy_idle0
on_motion_event0
ringer_source_func0
valent_findmyphone_ringer_acquire4
valent_findmyphone_ringer_free4
valent_findmyphone_ringer_hide0
valent_findmyphone_ringer_is_owner7
valent_findmyphone_ringer_new4
valent_findmyphone_ringer_release4
valent_findmyphone_ringer_show0
valent_findmyphone_ringer_start0
valent_findmyphone_ringer_stop0
valent_findmyphone_ringer_toggle0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.gcov.html b/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.gcov.html new file mode 100644 index 00000000000..50535e9df49 --- /dev/null +++ b/coverage/src/plugins/findmyphone/valent-findmyphone-ringer.c.gcov.html @@ -0,0 +1,414 @@ + + + + + + + LCOV - Code Coverage - src/plugins/findmyphone/valent-findmyphone-ringer.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/findmyphone - valent-findmyphone-ringer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:26.0 %9625
Test Date:2024-03-31 18:46:36Functions:38.5 %135
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.9 %628
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-findmyphone-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gst/gst.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <adwaita.h>
+      12                 :             : 
+      13                 :             : #include "valent-findmyphone-ringer.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentFindmyphoneRinger
+      17                 :             : {
+      18                 :             :   GtkWindow    *dialog;
+      19                 :             :   GstElement   *playbin;
+      20                 :             :   unsigned int  source_id;
+      21                 :             :   gpointer      owner;
+      22                 :             : };
+      23                 :             : 
+      24                 :             : static ValentFindmyphoneRinger *default_ringer = NULL;
+      25                 :             : 
+      26                 :             : 
+      27                 :             : static gboolean
+      28                 :           0 : gtk_window_destroy_idle (gpointer data)
+      29                 :             : {
+      30                 :           0 :   gtk_window_destroy (GTK_WINDOW (data));
+      31                 :           0 :   return G_SOURCE_REMOVE;
+      32                 :             : }
+      33                 :             : 
+      34                 :             : static void
+      35                 :           0 : on_motion_event (GtkWindow *dialog)
+      36                 :             : {
+      37                 :           0 :   g_idle_add (gtk_window_destroy_idle, dialog);
+      38                 :           0 : }
+      39                 :             : 
+      40                 :             : static gboolean
+      41                 :           0 : ringer_source_func (GstBus     *bus,
+      42                 :             :                     GstMessage *message,
+      43                 :             :                     gpointer    user_data)
+      44                 :             : {
+      45                 :           0 :   ValentFindmyphoneRinger *ringer = user_data;
+      46                 :             : 
+      47         [ #  # ]:           0 :   if (message->type == GST_MESSAGE_ERROR)
+      48                 :             :     {
+      49                 :           0 :       g_autoptr (GError) error = NULL;
+      50         [ #  # ]:           0 :       g_autofree char *debug = NULL;
+      51                 :             : 
+      52                 :           0 :       gst_message_parse_error (message, &error, &debug);
+      53                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+      54         [ #  # ]:           0 :       g_debug ("%s: %s", G_STRFUNC, (debug) ? debug : "none");
+      55                 :             : 
+      56                 :           0 :       return G_SOURCE_REMOVE;
+      57                 :             :     }
+      58                 :             : 
+      59                 :             :   /* Rewind to beginning */
+      60         [ #  # ]:           0 :   if (message->type == GST_MESSAGE_EOS)
+      61                 :             :     {
+      62                 :           0 :       return gst_element_seek_simple (ringer->playbin,
+      63                 :             :                                       GST_FORMAT_TIME,
+      64                 :             :                                       GST_SEEK_FLAG_FLUSH,
+      65                 :             :                                       0);
+      66                 :             :     }
+      67                 :             : 
+      68                 :             :   return G_SOURCE_CONTINUE;
+      69                 :             : }
+      70                 :             : 
+      71                 :             : static void
+      72                 :           4 : valent_findmyphone_ringer_free (gpointer data)
+      73                 :             : {
+      74                 :           4 :   ValentFindmyphoneRinger *ringer = data;
+      75                 :             : 
+      76         [ -  + ]:           4 :   g_clear_pointer (&ringer->dialog, gtk_window_destroy);
+      77                 :             : 
+      78         [ -  + ]:           4 :   if (ringer->playbin != NULL)
+      79                 :             :     {
+      80                 :           0 :       gst_element_set_state (ringer->playbin, GST_STATE_NULL);
+      81         [ #  # ]:           0 :       gst_clear_object (&ringer->playbin);
+      82                 :             :     }
+      83                 :             : 
+      84                 :           4 :   default_ringer = NULL;
+      85                 :           4 : }
+      86                 :             : 
+      87                 :             : /**
+      88                 :             :  * valent_findmyphone_ringer_new:
+      89                 :             :  *
+      90                 :             :  * Create a new `ValentFindmyphoneRinger`.
+      91                 :             :  *
+      92                 :             :  * Returns: (transfer full): a `ValentFindmyphoneRinger`
+      93                 :             :  */
+      94                 :             : ValentFindmyphoneRinger *
+      95                 :           4 : valent_findmyphone_ringer_new (void)
+      96                 :             : {
+      97                 :           4 :   ValentFindmyphoneRinger *ringer;
+      98                 :           8 :   g_autoptr (GError) error = NULL;
+      99                 :             : 
+     100                 :           4 :   ringer = g_rc_box_new0 (ValentFindmyphoneRinger);
+     101                 :             : 
+     102         [ -  + ]:           4 :   if (!gst_init_check (NULL, NULL, &error))
+     103                 :             :     {
+     104                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     105                 :           0 :       return ringer;
+     106                 :             :     }
+     107                 :             : 
+     108                 :             :   /* Playbin */
+     109                 :           4 :   ringer->playbin = gst_element_factory_make ("playbin", "findmyphone-ringer");
+     110                 :             : 
+     111         [ -  + ]:           4 :   if (ringer->playbin != NULL)
+     112                 :             :     {
+     113                 :           0 :       g_object_set (ringer->playbin,
+     114                 :             :                     "uri", "resource:///plugins/findmyphone/alert.oga",
+     115                 :             :                     NULL);
+     116                 :             :     }
+     117                 :             : 
+     118                 :             :   return ringer;
+     119                 :             : }
+     120                 :             : 
+     121                 :             : /**
+     122                 :             :  * valent_findmyphone_ringer_start:
+     123                 :             :  * @ringer: a `ValentFindmyphoneRinger`
+     124                 :             :  *
+     125                 :             :  * Enable the ringing state of @ringer.
+     126                 :             :  */
+     127                 :             : void
+     128                 :           0 : valent_findmyphone_ringer_start (ValentFindmyphoneRinger *ringer)
+     129                 :             : {
+     130                 :           0 :   g_autoptr (GstBus) playbus = NULL;
+     131                 :             : 
+     132         [ #  # ]:           0 :   g_return_if_fail (ringer != NULL);
+     133                 :             : 
+     134   [ #  #  #  # ]:           0 :   if (ringer->playbin == NULL || ringer->source_id > 0)
+     135                 :             :     return;
+     136                 :             : 
+     137                 :           0 :   playbus = gst_element_get_bus (ringer->playbin);
+     138                 :           0 :   ringer->source_id = gst_bus_add_watch (playbus, ringer_source_func, ringer);
+     139                 :             : 
+     140         [ #  # ]:           0 :   if (gst_element_set_state (ringer->playbin, GST_STATE_PLAYING) == 0)
+     141   [ #  #  #  # ]:           0 :     g_clear_handle_id (&ringer->source_id, g_source_remove);
+     142                 :             : }
+     143                 :             : 
+     144                 :             : /**
+     145                 :             :  * valent_findmyphone_ringer_stop:
+     146                 :             :  * @ringer: a `ValentFindmyphoneRinger`
+     147                 :             :  *
+     148                 :             :  * Disable the ringing state of @ringer.
+     149                 :             :  */
+     150                 :             : void
+     151                 :           0 : valent_findmyphone_ringer_stop (ValentFindmyphoneRinger *ringer)
+     152                 :             : {
+     153         [ #  # ]:           0 :   g_return_if_fail (ringer != NULL);
+     154                 :             : 
+     155   [ #  #  #  # ]:           0 :   if (ringer->playbin == NULL || ringer->source_id == 0)
+     156                 :             :     return;
+     157                 :             : 
+     158                 :           0 :   gst_element_set_state (ringer->playbin, GST_STATE_NULL);
+     159         [ #  # ]:           0 :   g_clear_handle_id (&ringer->source_id, g_source_remove);
+     160                 :           0 :   ringer->owner = NULL;
+     161                 :             : }
+     162                 :             : 
+     163                 :             : /**
+     164                 :             :  * valent_findmyphone_ringer_show:
+     165                 :             :  * @ringer: a `ValentFindmyphoneRinger`
+     166                 :             :  *
+     167                 :             :  * Enable the ringing state of @ringer and show a dialog.
+     168                 :             :  */
+     169                 :             : void
+     170                 :           0 : valent_findmyphone_ringer_show (ValentFindmyphoneRinger *ringer)
+     171                 :             : {
+     172                 :           0 :   GtkEventController *controller;
+     173                 :           0 :   GtkWidget *label;
+     174                 :             : 
+     175         [ #  # ]:           0 :   g_return_if_fail (ringer != NULL);
+     176                 :             : 
+     177                 :           0 :   valent_findmyphone_ringer_start (ringer);
+     178                 :             : 
+     179   [ #  #  #  # ]:           0 :   if (!gtk_is_initialized () || ringer->dialog != NULL)
+     180                 :             :     return;
+     181                 :             : 
+     182                 :             :   /* Create the dialog */
+     183                 :           0 :   ringer->dialog = g_object_new (GTK_TYPE_WINDOW,
+     184                 :             :                                  "fullscreened", TRUE,
+     185                 :             :                                  "maximized",    TRUE,
+     186                 :             :                                  NULL);
+     187                 :           0 :   g_object_add_weak_pointer (G_OBJECT (ringer->dialog),
+     188                 :           0 :                              (gpointer)&ringer->dialog);
+     189                 :             : 
+     190                 :           0 :   label = g_object_new (ADW_TYPE_STATUS_PAGE,
+     191                 :             :                         "title",     _("Found"),
+     192                 :             :                         "icon-name", "phonelink-ring-symbolic",
+     193                 :             :                         NULL);
+     194                 :           0 :   gtk_window_set_child (ringer->dialog, label);
+     195                 :             : 
+     196                 :           0 :   g_signal_connect_swapped (ringer->dialog,
+     197                 :             :                             "destroy",
+     198                 :             :                             G_CALLBACK (valent_findmyphone_ringer_stop),
+     199                 :             :                             ringer);
+     200                 :             : 
+     201                 :             :   /* Close on keypress, pointer motion or click */
+     202                 :           0 :   controller = gtk_event_controller_key_new ();
+     203                 :           0 :   gtk_widget_add_controller (GTK_WIDGET (ringer->dialog), controller);
+     204                 :           0 :   g_signal_connect_swapped (G_OBJECT (controller),
+     205                 :             :                             "key-pressed",
+     206                 :             :                             G_CALLBACK (gtk_window_destroy),
+     207                 :             :                             ringer->dialog);
+     208                 :             : 
+     209                 :           0 :   controller = gtk_event_controller_motion_new ();
+     210                 :           0 :   gtk_widget_add_controller (GTK_WIDGET (ringer->dialog), controller);
+     211                 :           0 :   g_signal_connect_swapped (G_OBJECT (controller),
+     212                 :             :                             "motion",
+     213                 :             :                             G_CALLBACK (on_motion_event),
+     214                 :             :                             ringer->dialog);
+     215                 :             : 
+     216                 :           0 :   controller = (GtkEventController *)gtk_gesture_click_new ();
+     217                 :           0 :   gtk_widget_add_controller (GTK_WIDGET (ringer->dialog), controller);
+     218                 :           0 :   g_signal_connect_swapped (G_OBJECT (controller),
+     219                 :             :                             "pressed",
+     220                 :             :                             G_CALLBACK (gtk_window_destroy),
+     221                 :             :                             ringer->dialog);
+     222                 :             : 
+     223                 :             :   /* Show the dialog */
+     224                 :           0 :   gtk_window_present_with_time (ringer->dialog, GDK_CURRENT_TIME);
+     225                 :             : }
+     226                 :             : 
+     227                 :             : /**
+     228                 :             :  * valent_findmyphone_ringer_hide:
+     229                 :             :  * @ringer: a `ValentFindmyphoneRinger`
+     230                 :             :  *
+     231                 :             :  * Disable the ringing state of @ringer and hide the dialog.
+     232                 :             :  */
+     233                 :             : void
+     234                 :           0 : valent_findmyphone_ringer_hide (ValentFindmyphoneRinger *ringer)
+     235                 :             : {
+     236         [ #  # ]:           0 :   g_return_if_fail (ringer != NULL);
+     237                 :             : 
+     238         [ #  # ]:           0 :   if (ringer->dialog != NULL)
+     239                 :           0 :     g_clear_pointer (&ringer->dialog, gtk_window_destroy);
+     240                 :             :   else
+     241                 :           0 :     valent_findmyphone_ringer_stop (ringer);
+     242                 :             : }
+     243                 :             : 
+     244                 :             : /**
+     245                 :             :  * valent_findmyphone_ringer_acquire:
+     246                 :             :  *
+     247                 :             :  * Acquire a reference on the default `ValentFindmyphoneRinger`.
+     248                 :             :  *
+     249                 :             :  * Returns: (transfer full): a `ValentFindmyphoneRinger`
+     250                 :             :  */
+     251                 :             : ValentFindmyphoneRinger *
+     252                 :           4 : valent_findmyphone_ringer_acquire (void)
+     253                 :             : {
+     254         [ +  - ]:           4 :   if (default_ringer == NULL)
+     255                 :             :     {
+     256                 :           4 :       default_ringer = valent_findmyphone_ringer_new ();
+     257                 :           4 :       return default_ringer;
+     258                 :             :     }
+     259                 :             : 
+     260                 :           0 :   return g_rc_box_acquire (default_ringer);
+     261                 :             : }
+     262                 :             : 
+     263                 :             : /**
+     264                 :             :  * valent_findmyphone_ringer_release:
+     265                 :             :  * @data: (type Valent.FindmyphoneRinger): a `ValentFindmyphoneRinger`
+     266                 :             :  *
+     267                 :             :  * Release a reference on the default `ValentFindmyphoneRinger`.
+     268                 :             :  */
+     269                 :             : void
+     270                 :           4 : valent_findmyphone_ringer_release (gpointer data)
+     271                 :             : {
+     272                 :           4 :   ValentFindmyphoneRinger *ringer = data;
+     273                 :             : 
+     274         [ +  - ]:           4 :   g_return_if_fail (ringer != NULL);
+     275                 :             : 
+     276                 :           4 :   g_rc_box_release_full (ringer, valent_findmyphone_ringer_free);
+     277                 :             : }
+     278                 :             : 
+     279                 :             : /**
+     280                 :             :  * valent_findmyphone_ringer_toggle:
+     281                 :             :  * @ringer: a `ValentFindmyphoneRinger`
+     282                 :             :  * @owner: (type GObject.Object): a `GObject`
+     283                 :             :  *
+     284                 :             :  * Toggle the ringing state of @ringer.
+     285                 :             :  */
+     286                 :             : void
+     287                 :           0 : valent_findmyphone_ringer_toggle (ValentFindmyphoneRinger *ringer,
+     288                 :             :                                   gpointer                 owner)
+     289                 :             : {
+     290         [ #  # ]:           0 :   g_return_if_fail (ringer != NULL);
+     291                 :             : 
+     292   [ #  #  #  # ]:           0 :   if (ringer->dialog != NULL || ringer->source_id > 0)
+     293                 :             :     {
+     294                 :           0 :       valent_findmyphone_ringer_hide (ringer);
+     295                 :           0 :       ringer->owner = NULL;
+     296                 :             :     }
+     297                 :             :   else
+     298                 :             :     {
+     299                 :           0 :       valent_findmyphone_ringer_show (ringer);
+     300                 :           0 :       ringer->owner = owner;
+     301                 :             :     }
+     302                 :             : }
+     303                 :             : 
+     304                 :             : /**
+     305                 :             :  * valent_findmyphone_ringer_is_owner:
+     306                 :             :  * @ringer: a `ValentFindmyphoneRinger`
+     307                 :             :  * @owner: (type GObject.Object): a `GObject`
+     308                 :             :  *
+     309                 :             :  * Check if @owner is responsible for the current state of @ringer.
+     310                 :             :  *
+     311                 :             :  * Returns: %TRUE if @owner controls the ringer
+     312                 :             :  */
+     313                 :             : gboolean
+     314                 :           7 : valent_findmyphone_ringer_is_owner (ValentFindmyphoneRinger *ringer,
+     315                 :             :                                     gpointer                 owner)
+     316                 :             : {
+     317         [ +  - ]:           7 :   g_return_val_if_fail (ringer != NULL, FALSE);
+     318         [ -  + ]:           7 :   g_return_val_if_fail (G_IS_OBJECT (owner), FALSE);
+     319                 :             : 
+     320                 :           7 :   return ringer->owner == owner;
+     321                 :             : }
+     322                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/gnome-plugin.c.func-c.html b/coverage/src/plugins/gnome/gnome-plugin.c.func-c.html new file mode 100644 index 00000000000..f7979255412 --- /dev/null +++ b/coverage/src/plugins/gnome/gnome-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/gnome-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - gnome-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_gnome_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/gnome-plugin.c.func.html b/coverage/src/plugins/gnome/gnome-plugin.c.func.html new file mode 100644 index 00000000000..aba5fa44acf --- /dev/null +++ b/coverage/src/plugins/gnome/gnome-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/gnome-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - gnome-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_gnome_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/gnome-plugin.c.gcov.html b/coverage/src/plugins/gnome/gnome-plugin.c.gcov.html new file mode 100644 index 00000000000..94a00f1e49c --- /dev/null +++ b/coverage/src/plugins/gnome/gnome-plugin.c.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/gnome-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - gnome-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : #include <libpeas.h>
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : #include "valent-mutter-clipboard.h"
+      11                 :             : #include "valent-mutter-input.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : _VALENT_EXTERN void
+      15                 :           1 : valent_gnome_plugin_register_types (PeasObjectModule *module)
+      16                 :             : {
+      17                 :           1 :   peas_object_module_register_extension_type (module,
+      18                 :             :                                               VALENT_TYPE_CLIPBOARD_ADAPTER,
+      19                 :             :                                               VALENT_TYPE_MUTTER_CLIPBOARD);
+      20                 :           1 :   peas_object_module_register_extension_type (module,
+      21                 :             :                                               VALENT_TYPE_INPUT_ADAPTER,
+      22                 :             :                                               VALENT_TYPE_MUTTER_INPUT);
+      23                 :           1 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-detail-sort-b.html b/coverage/src/plugins/gnome/index-detail-sort-b.html new file mode 100644 index 00000000000..7a656b4111e --- /dev/null +++ b/coverage/src/plugins/gnome/index-detail-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-detail-sort-f.html b/coverage/src/plugins/gnome/index-detail-sort-f.html new file mode 100644 index 00000000000..0133b4d68e3 --- /dev/null +++ b/coverage/src/plugins/gnome/index-detail-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-detail-sort-l.html b/coverage/src/plugins/gnome/index-detail-sort-l.html new file mode 100644 index 00000000000..c5914bf605d --- /dev/null +++ b/coverage/src/plugins/gnome/index-detail-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-detail.html b/coverage/src/plugins/gnome/index-detail.html new file mode 100644 index 00000000000..faa98bfb27a --- /dev/null +++ b/coverage/src/plugins/gnome/index-detail.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-sort-b.html b/coverage/src/plugins/gnome/index-sort-b.html new file mode 100644 index 00000000000..7a656b4111e --- /dev/null +++ b/coverage/src/plugins/gnome/index-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-sort-f.html b/coverage/src/plugins/gnome/index-sort-f.html new file mode 100644 index 00000000000..0133b4d68e3 --- /dev/null +++ b/coverage/src/plugins/gnome/index-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index-sort-l.html b/coverage/src/plugins/gnome/index-sort-l.html new file mode 100644 index 00000000000..c5914bf605d --- /dev/null +++ b/coverage/src/plugins/gnome/index-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/index.html b/coverage/src/plugins/gnome/index.html new file mode 100644 index 00000000000..faa98bfb27a --- /dev/null +++ b/coverage/src/plugins/gnome/index.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnomeCoverageTotalHit
Test:Code CoverageLines:15.2 %46871
Test Date:2024-03-31 18:46:36Functions:31.4 %5116
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:5.1 %42822
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
gnome-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mutter-clipboard.c +
3.5%3.5%
+
3.5 %312111.2 %244310.7 %283
valent-mutter-clipboard.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-mutter-input.c +
36.7%36.7%
+
36.7 %150559.3 %1721655.0 %2011
valent-mutter-input.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-clipboard.c.func-c.html b/coverage/src/plugins/gnome/valent-mutter-clipboard.c.func-c.html new file mode 100644 index 00000000000..55de3423311 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-clipboard.c.func-c.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-clipboard.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:3.5 %31211
Test Date:2024-03-31 18:46:36Functions:10.7 %283
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:1.2 %2443
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
create_session_cb0
create_session_error_handler0
enable_clipboard_cb0
g_input_stream_read_bytes_cb0
g_output_stream_write_bytes_cb0
on_closed0
on_name_appeared0
on_name_vanished0
on_selection_owner_changed0
on_selection_transfer0
selection_data_free0
selection_read_cb0
selection_transfer_cb0
selection_write_cb0
selection_write_done_cb0
set_selection_cb0
unix_fd_list_get0
valent_mutter_clipboard_constructed0
valent_mutter_clipboard_destroy0
valent_mutter_clipboard_get_mimetypes0
valent_mutter_clipboard_get_timestamp0
valent_mutter_clipboard_init0
valent_mutter_clipboard_read_bytes0
valent_mutter_clipboard_selection_write0
valent_mutter_clipboard_write_bytes0
valent_mutter_clipboard_get_type3
valent_mutter_clipboard_class_intern_init1
valent_mutter_clipboard_get_type1
valent_mutter_clipboard_get_type_once1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-clipboard.c.func.html b/coverage/src/plugins/gnome/valent-mutter-clipboard.c.func.html new file mode 100644 index 00000000000..384ac1c95b4 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-clipboard.c.func.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-clipboard.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:3.5 %31211
Test Date:2024-03-31 18:46:36Functions:10.7 %283
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:1.2 %2443
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
create_session_cb0
create_session_error_handler0
enable_clipboard_cb0
g_input_stream_read_bytes_cb0
g_output_stream_write_bytes_cb0
on_closed0
on_name_appeared0
on_name_vanished0
on_selection_owner_changed0
on_selection_transfer0
selection_data_free0
selection_read_cb0
selection_transfer_cb0
selection_write_cb0
selection_write_done_cb0
set_selection_cb0
unix_fd_list_get0
valent_mutter_clipboard_constructed0
valent_mutter_clipboard_destroy0
valent_mutter_clipboard_get_mimetypes0
valent_mutter_clipboard_get_timestamp0
valent_mutter_clipboard_get_type3
valent_mutter_clipboard_class_intern_init1
valent_mutter_clipboard_get_type1
valent_mutter_clipboard_get_type_once1
valent_mutter_clipboard_init0
valent_mutter_clipboard_read_bytes0
valent_mutter_clipboard_selection_write0
valent_mutter_clipboard_write_bytes0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-clipboard.c.gcov.html b/coverage/src/plugins/gnome/valent-mutter-clipboard.c.gcov.html new file mode 100644 index 00000000000..4856b0e8c01 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-clipboard.c.gcov.html @@ -0,0 +1,952 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-clipboard.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:3.5 %31211
Test Date:2024-03-31 18:46:36Functions:10.7 %283
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:1.2 %2443
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mutter-clipboard"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gio/gunixinputstream.h>
+      10                 :             : #include <gio/gunixoutputstream.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-mutter-clipboard.h"
+      14                 :             : 
+      15                 :             : #define REMOTE_DESKTOP_NAME          "org.gnome.Mutter.RemoteDesktop"
+      16                 :             : #define REMOTE_DESKTOP_PATH          "/org/gnome/Mutter/RemoteDesktop"
+      17                 :             : #define REMOTE_DESKTOP_IFACE         "org.gnome.Mutter.RemoteDesktop"
+      18                 :             : #define REMOTE_DESKTOP_SESSION_IFACE "org.gnome.Mutter.RemoteDesktop.Session"
+      19                 :             : 
+      20                 :             : #define CLIPBOARD_MAXSIZE (16 * 1024)
+      21                 :             : 
+      22                 :             : 
+      23                 :             : struct _ValentMutterClipboard
+      24                 :             : {
+      25                 :             :   ValentClipboardAdapter  parent_instance;
+      26                 :             : 
+      27                 :             :   GDBusConnection        *connection;
+      28                 :             :   char                   *session_path;
+      29                 :             :   unsigned int            closed_id;
+      30                 :             :   unsigned int            selection_owner_changed_id;
+      31                 :             :   unsigned int            selection_transfer_id;
+      32                 :             :   unsigned int            watcher_id;
+      33                 :             : 
+      34                 :             :   GBytes                 *content;
+      35                 :             :   GVariant               *mimetypes;
+      36                 :             :   int64_t                 timestamp;
+      37                 :             :   gboolean                is_owner;
+      38                 :             : };
+      39                 :             : 
+      40   [ +  +  +  - ]:           3 : G_DEFINE_FINAL_TYPE (ValentMutterClipboard, valent_mutter_clipboard, VALENT_TYPE_CLIPBOARD_ADAPTER);
+      41                 :             : 
+      42                 :             : 
+      43                 :             : /*< private >
+      44                 :             :  * SelectionData:
+      45                 :             :  * @content: the data being transferred
+      46                 :             :  * @mimetype: the data format
+      47                 :             :  * @fd: the file descriptor
+      48                 :             :  * @serial: the transfer ID
+      49                 :             :  *
+      50                 :             :  * A `struct` for clipboard transfer data.
+      51                 :             :  */
+      52                 :             : typedef struct
+      53                 :             : {
+      54                 :             :   GBytes   *content;
+      55                 :             :   char     *mimetype;
+      56                 :             :   int       fd;
+      57                 :             :   uint32_t  serial;
+      58                 :             : } SelectionData;
+      59                 :             : 
+      60                 :             : static void
+      61                 :           0 : selection_data_free (gpointer data)
+      62                 :             : {
+      63                 :           0 :   SelectionData *selection = (SelectionData *)data;
+      64                 :             : 
+      65         [ #  # ]:           0 :   g_clear_pointer (&selection->content, g_bytes_unref);
+      66         [ #  # ]:           0 :   g_clear_pointer (&selection->mimetype, g_free);
+      67                 :           0 :   g_clear_pointer (&selection, g_free);
+      68                 :           0 : }
+      69                 :             : 
+      70                 :             : static int
+      71                 :           0 : unix_fd_list_get (GUnixFDList  *list,
+      72                 :             :                   int           index_,
+      73                 :             :                   GError      **error)
+      74                 :             : {
+      75                 :           0 :   int fd;
+      76                 :           0 :   int flags;
+      77                 :             : 
+      78   [ #  #  #  #  :           0 :   g_assert (G_IS_UNIX_FD_LIST (list));
+             #  #  #  # ]
+      79                 :             : 
+      80         [ #  # ]:           0 :   if ((fd = g_unix_fd_list_get (list, index_, error)) == -1)
+      81                 :             :     return -1;
+      82                 :             : 
+      83         [ #  # ]:           0 :   if ((flags = fcntl (fd, F_GETFD)) == -1)
+      84                 :             :     {
+      85                 :           0 :       g_set_error (error,
+      86                 :             :                    G_IO_ERROR,
+      87                 :           0 :                    g_io_error_from_errno (errno),
+      88                 :           0 :                    "fcntl: %s", g_strerror (errno));
+      89                 :           0 :       close (fd);
+      90                 :           0 :       return -1;
+      91                 :             :     }
+      92                 :             : 
+      93         [ #  # ]:           0 :   if (fcntl (fd, F_SETFD, flags | FD_CLOEXEC) == -1)
+      94                 :             :     {
+      95                 :           0 :       g_set_error (error,
+      96                 :             :                    G_IO_ERROR,
+      97                 :           0 :                    g_io_error_from_errno (errno),
+      98                 :           0 :                    "fcntl: %s", g_strerror (errno));
+      99                 :           0 :       close (fd);
+     100                 :           0 :       return -1;
+     101                 :             :     }
+     102                 :             : 
+     103                 :             :   return fd;
+     104                 :             : }
+     105                 :             : 
+     106                 :             : /*
+     107                 :             :  * Read
+     108                 :             :  */
+     109                 :             : static void
+     110                 :           0 : g_input_stream_read_bytes_cb (GInputStream *stream,
+     111                 :             :                               GAsyncResult *result,
+     112                 :             :                               gpointer      user_data)
+     113                 :             : {
+     114                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     115         [ #  # ]:           0 :   g_autoptr (GBytes) bytes = NULL;
+     116         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     117                 :             : 
+     118                 :           0 :   bytes = g_input_stream_read_bytes_finish (stream, result, &error);
+     119                 :             : 
+     120         [ #  # ]:           0 :   if (bytes == NULL)
+     121                 :           0 :     g_task_return_error (task, g_steal_pointer (&error));
+     122                 :             : 
+     123         [ #  # ]:           0 :   g_task_return_pointer (task,
+     124                 :             :                          g_steal_pointer (&bytes),
+     125                 :             :                          (GDestroyNotify)g_bytes_unref);
+     126                 :           0 : }
+     127                 :             : 
+     128                 :             : static void
+     129                 :           0 : selection_read_cb (GDBusConnection *connection,
+     130                 :             :                    GAsyncResult    *result,
+     131                 :             :                    gpointer         user_data)
+     132                 :             : {
+     133                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     134                 :           0 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     135         [ #  # ]:           0 :   g_autoptr (GVariant) reply = NULL;
+     136         [ #  # ]:           0 :   g_autoptr (GInputStream) stream = NULL;
+     137                 :           0 :   GUnixFDList *list = NULL;
+     138                 :           0 :   int index_;
+     139                 :           0 :   int fd;
+     140   [ #  #  #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     141                 :             : 
+     142                 :           0 :   reply = g_dbus_connection_call_with_unix_fd_list_finish (connection,
+     143                 :             :                                                            &list,
+     144                 :             :                                                            result,
+     145                 :             :                                                            &error);
+     146                 :             : 
+     147         [ #  # ]:           0 :   if (reply == NULL)
+     148                 :             :     {
+     149                 :           0 :       g_dbus_error_strip_remote_error (error);
+     150                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     151                 :             :     }
+     152                 :             : 
+     153                 :           0 :   g_variant_get (reply, "(h)", &index_);
+     154                 :             : 
+     155         [ #  # ]:           0 :   if ((fd = unix_fd_list_get (list, index_, &error)) == -1)
+     156                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     157                 :             : 
+     158                 :           0 :   stream = g_unix_input_stream_new (fd, TRUE);
+     159         [ #  # ]:           0 :   g_input_stream_read_bytes_async (stream,
+     160                 :             :                                    CLIPBOARD_MAXSIZE,
+     161                 :             :                                    G_PRIORITY_DEFAULT,
+     162                 :             :                                    cancellable,
+     163                 :             :                                    (GAsyncReadyCallback)g_input_stream_read_bytes_cb,
+     164                 :             :                                    g_steal_pointer (&task));
+     165                 :             : }
+     166                 :             : 
+     167                 :             : /*
+     168                 :             :  * Write
+     169                 :             :  */
+     170                 :             : static void
+     171                 :           0 : selection_transfer_cb (GObject      *object,
+     172                 :             :                        GAsyncResult *result,
+     173                 :             :                        gpointer      user_data)
+     174                 :             : {
+     175                 :           0 :   g_autoptr (GError) error = NULL;
+     176                 :             : 
+     177   [ #  #  #  # ]:           0 :   if (!g_task_propagate_boolean (G_TASK (result), &error) &&
+     178                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     179                 :           0 :     g_warning ("%s: %s", G_OBJECT_TYPE_NAME (object), error->message);
+     180                 :           0 : }
+     181                 :             : 
+     182                 :             : static void
+     183                 :           0 : selection_write_done_cb (GDBusConnection *connection,
+     184                 :             :                          GAsyncResult    *result,
+     185                 :             :                          gpointer         user_data)
+     186                 :             : {
+     187                 :           0 :   g_autoptr (GVariant) reply = NULL;
+     188         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     189                 :             : 
+     190                 :           0 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     191                 :             : 
+     192         [ #  # ]:           0 :   if (reply == NULL)
+     193                 :             :     {
+     194                 :           0 :       g_dbus_error_strip_remote_error (error);
+     195                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     196                 :             :     }
+     197                 :           0 : }
+     198                 :             : 
+     199                 :             : static void
+     200                 :           0 : g_output_stream_write_bytes_cb (GOutputStream *stream,
+     201                 :             :                                 GAsyncResult  *result,
+     202                 :             :                                 gpointer       user_data)
+     203                 :             : {
+     204                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     205                 :           0 :   ValentMutterClipboard *self = g_task_get_source_object (task);
+     206                 :           0 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     207                 :           0 :   SelectionData *selection = g_task_get_task_data (task);
+     208                 :           0 :   gboolean success = FALSE;
+     209   [ #  #  #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     210                 :             : 
+     211                 :           0 :   success = g_output_stream_write_bytes_finish (stream, result, &error) != -1;
+     212                 :           0 :   g_dbus_connection_call (self->connection,
+     213                 :             :                           REMOTE_DESKTOP_NAME,
+     214                 :           0 :                           self->session_path,
+     215                 :             :                           REMOTE_DESKTOP_SESSION_IFACE,
+     216                 :             :                           "SelectionWriteDone",
+     217                 :             :                           g_variant_new ("(ub)", selection->serial, success),
+     218                 :             :                           NULL,
+     219                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     220                 :             :                           -1,
+     221                 :             :                           cancellable,
+     222                 :             :                           (GAsyncReadyCallback)selection_write_done_cb,
+     223                 :             :                           NULL);
+     224                 :             : 
+     225         [ #  # ]:           0 :   if (!success)
+     226         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     227                 :             : 
+     228         [ #  # ]:           0 :   g_task_return_boolean (task, TRUE);
+     229                 :             : }
+     230                 :             : 
+     231                 :             : static void
+     232                 :           0 : selection_write_cb (GDBusConnection *connection,
+     233                 :             :                     GAsyncResult    *result,
+     234                 :             :                     gpointer         user_data)
+     235                 :             : {
+     236                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     237                 :           0 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     238                 :           0 :   SelectionData *selection = g_task_get_task_data (task);
+     239         [ #  # ]:           0 :   g_autoptr (GVariant) reply = NULL;
+     240         [ #  # ]:           0 :   g_autoptr (GOutputStream) stream = NULL;
+     241   [ #  #  #  # ]:           0 :   g_autoptr (GUnixFDList) fd_list = NULL;
+     242                 :           0 :   int index_;
+     243   [ #  #  #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     244                 :             : 
+     245                 :           0 :   reply = g_dbus_connection_call_with_unix_fd_list_finish (connection,
+     246                 :             :                                                            &fd_list,
+     247                 :             :                                                            result,
+     248                 :             :                                                            &error);
+     249                 :             : 
+     250         [ #  # ]:           0 :   if (reply == NULL)
+     251                 :             :     {
+     252                 :           0 :       g_dbus_error_strip_remote_error (error);
+     253                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     254                 :             :     }
+     255                 :             : 
+     256                 :           0 :   g_variant_get (reply, "(h)", &index_);
+     257                 :             : 
+     258         [ #  # ]:           0 :   if ((selection->fd = unix_fd_list_get (fd_list, index_, &error)) == -1)
+     259                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     260                 :             : 
+     261                 :           0 :   stream = g_unix_output_stream_new (selection->fd, TRUE);
+     262         [ #  # ]:           0 :   g_output_stream_write_bytes_async (stream,
+     263                 :             :                                      selection->content,
+     264                 :             :                                      G_PRIORITY_DEFAULT,
+     265                 :             :                                      cancellable,
+     266                 :             :                                      (GAsyncReadyCallback)g_output_stream_write_bytes_cb,
+     267                 :             :                                      g_steal_pointer (&task));
+     268                 :             : }
+     269                 :             : 
+     270                 :             : static void
+     271                 :           0 : valent_mutter_clipboard_selection_write (ValentMutterClipboard *self,
+     272                 :             :                                          const char            *mimetype,
+     273                 :             :                                          uint32_t               serial)
+     274                 :             : {
+     275                 :           0 :   g_autoptr (GCancellable) cancellable = NULL;
+     276         [ #  # ]:           0 :   g_autoptr (GTask) task = NULL;
+     277                 :           0 :   SelectionData *selection = NULL;
+     278                 :             : 
+     279         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     280                 :             : 
+     281                 :           0 :   selection = g_new0 (SelectionData, 1);
+     282                 :           0 :   selection->content = g_bytes_ref (self->content);
+     283         [ #  # ]:           0 :   selection->mimetype = g_strdup (mimetype);
+     284                 :           0 :   selection->serial = serial;
+     285                 :             : 
+     286                 :           0 :   cancellable = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     287                 :             : 
+     288                 :           0 :   task = g_task_new (self, cancellable, selection_transfer_cb, NULL);
+     289                 :           0 :   g_task_set_task_data (task, selection, selection_data_free);
+     290         [ #  # ]:           0 :   g_task_set_source_tag (task, valent_mutter_clipboard_selection_write);
+     291                 :             : 
+     292         [ #  # ]:           0 :   g_dbus_connection_call (self->connection,
+     293                 :             :                           REMOTE_DESKTOP_NAME,
+     294                 :           0 :                           self->session_path,
+     295                 :             :                           REMOTE_DESKTOP_SESSION_IFACE,
+     296                 :             :                           "SelectionWrite",
+     297                 :             :                           g_variant_new ("(u)", selection->serial),
+     298                 :             :                           G_VARIANT_TYPE ("(h)"),
+     299                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     300                 :             :                           -1,
+     301                 :             :                           cancellable,
+     302                 :             :                           (GAsyncReadyCallback)selection_write_cb,
+     303                 :             :                           g_steal_pointer (&task));
+     304                 :           0 : }
+     305                 :             : 
+     306                 :             : /*
+     307                 :             :  * org.gnome.Mutter.RemoteDesktop.Session Callbacks
+     308                 :             :  */
+     309                 :             : static void
+     310                 :           0 : on_closed (GDBusConnection *connection,
+     311                 :             :            const char      *sender_name,
+     312                 :             :            const char      *object_path,
+     313                 :             :            const char      *interface_name,
+     314                 :             :            const char      *signal_name,
+     315                 :             :            GVariant        *parameters,
+     316                 :             :            gpointer         user_data)
+     317                 :             : {
+     318                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (user_data);
+     319                 :             : 
+     320         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     321         [ #  # ]:           0 :   g_assert (g_str_equal (signal_name, "Closed"));
+     322                 :             : 
+     323         [ #  # ]:           0 :   if (self->closed_id != 0)
+     324                 :             :     {
+     325                 :           0 :       g_dbus_connection_signal_unsubscribe (connection,
+     326                 :             :                                             self->closed_id);
+     327                 :           0 :       self->closed_id = 0;
+     328                 :             :     }
+     329                 :             : 
+     330         [ #  # ]:           0 :   if (self->selection_owner_changed_id != 0)
+     331                 :             :     {
+     332                 :           0 :       g_dbus_connection_signal_unsubscribe (connection,
+     333                 :             :                                             self->selection_owner_changed_id);
+     334                 :           0 :       self->selection_owner_changed_id = 0;
+     335                 :             :     }
+     336                 :             : 
+     337         [ #  # ]:           0 :   if (self->selection_transfer_id != 0)
+     338                 :             :     {
+     339                 :           0 :       g_dbus_connection_signal_unsubscribe (connection,
+     340                 :             :                                             self->selection_transfer_id);
+     341                 :           0 :       self->selection_transfer_id = 0;
+     342                 :             :     }
+     343                 :             : 
+     344         [ #  # ]:           0 :   g_clear_pointer (&self->session_path, g_free);
+     345                 :           0 : }
+     346                 :             : 
+     347                 :             : static void
+     348                 :           0 : on_selection_owner_changed (GDBusConnection *connection,
+     349                 :             :                             const char      *sender_name,
+     350                 :             :                             const char      *object_path,
+     351                 :             :                             const char      *interface_name,
+     352                 :             :                             const char      *signal_name,
+     353                 :             :                             GVariant        *parameters,
+     354                 :             :                             gpointer         user_data)
+     355                 :             : {
+     356                 :           0 :   ValentClipboardAdapter *adapter = VALENT_CLIPBOARD_ADAPTER (user_data);
+     357                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (user_data);
+     358                 :           0 :   g_autoptr (GVariant) options = NULL;
+     359         [ #  # ]:           0 :   g_autoptr (GVariant) mimetypes = NULL;
+     360                 :             : 
+     361         [ #  # ]:           0 :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+     362         [ #  # ]:           0 :   g_assert (g_str_equal (signal_name, "SelectionOwnerChanged"));
+     363                 :             : 
+     364                 :           0 :   options = g_variant_get_child_value (parameters, 0);
+     365                 :             : 
+     366         [ #  # ]:           0 :   if (g_variant_lookup (options, "mime-types", "(@as)", &mimetypes))
+     367                 :             :     {
+     368         [ #  # ]:           0 :       g_clear_pointer (&self->mimetypes, g_variant_unref);
+     369                 :           0 :       self->mimetypes = g_variant_ref_sink (g_steal_pointer (&mimetypes));
+     370                 :             :     }
+     371                 :             : 
+     372         [ #  # ]:           0 :   if (!g_variant_lookup (options, "session-is-owner", "b", &self->is_owner))
+     373                 :           0 :     self->is_owner = FALSE;
+     374                 :             : 
+     375                 :             :   /* Free the cache if ownership of the selection has been lost */
+     376         [ #  # ]:           0 :   if (!self->is_owner)
+     377                 :             :     {
+     378         [ #  # ]:           0 :       g_clear_pointer (&self->content, g_bytes_unref);
+     379                 :           0 :       self->timestamp = valent_timestamp_ms ();
+     380                 :             :     }
+     381                 :             : 
+     382         [ #  # ]:           0 :   valent_clipboard_adapter_changed (adapter);
+     383                 :           0 : }
+     384                 :             : 
+     385                 :             : static void
+     386                 :           0 : on_selection_transfer (GDBusConnection *connection,
+     387                 :             :                        const char      *sender_name,
+     388                 :             :                        const char      *object_path,
+     389                 :             :                        const char      *interface_name,
+     390                 :             :                        const char      *signal_name,
+     391                 :             :                        GVariant        *parameters,
+     392                 :             :                        gpointer         user_data)
+     393                 :             : {
+     394                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (user_data);
+     395                 :           0 :   const char *mimetype;
+     396                 :           0 :   uint32_t serial;
+     397                 :             : 
+     398         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     399         [ #  # ]:           0 :   g_assert (g_str_equal (signal_name, "SelectionTransfer"));
+     400                 :             : 
+     401                 :           0 :   g_variant_get (parameters, "(&su)", &mimetype, &serial);
+     402                 :           0 :   valent_mutter_clipboard_selection_write (self, mimetype, serial);
+     403                 :           0 : }
+     404                 :             : 
+     405                 :             : /*
+     406                 :             :  * ValentClipboardAdapter
+     407                 :             :  */
+     408                 :             : static GStrv
+     409                 :           0 : valent_mutter_clipboard_get_mimetypes (ValentClipboardAdapter *adapter)
+     410                 :             : {
+     411                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (adapter);
+     412                 :             : 
+     413         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     414                 :             : 
+     415         [ #  # ]:           0 :   if (self->mimetypes == NULL)
+     416                 :             :     return NULL;
+     417                 :             : 
+     418                 :           0 :   return g_variant_dup_strv (self->mimetypes, NULL);
+     419                 :             : }
+     420                 :             : 
+     421                 :             : static int64_t
+     422                 :           0 : valent_mutter_clipboard_get_timestamp (ValentClipboardAdapter *adapter)
+     423                 :             : {
+     424                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (adapter);
+     425                 :             : 
+     426         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     427                 :             : 
+     428                 :           0 :   return self->timestamp;
+     429                 :             : }
+     430                 :             : 
+     431                 :             : static void
+     432                 :           0 : valent_mutter_clipboard_read_bytes (ValentClipboardAdapter *adapter,
+     433                 :             :                                     const char             *mimetype,
+     434                 :             :                                     GCancellable           *cancellable,
+     435                 :             :                                     GAsyncReadyCallback     callback,
+     436                 :             :                                     gpointer                user_data)
+     437                 :             : {
+     438                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (adapter);
+     439                 :           0 :   g_autoptr (GTask) task = NULL;
+     440         [ #  # ]:           0 :   g_autofree const char **mimetypes = NULL;
+     441                 :             : 
+     442         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     443   [ #  #  #  # ]:           0 :   g_assert (mimetype != NULL && *mimetype != '\0');
+     444                 :             : 
+     445   [ #  #  #  # ]:           0 :   if (self->connection == NULL || self->session_path == NULL)
+     446                 :           0 :     return g_task_report_new_error (adapter, callback, user_data, callback,
+     447                 :             :                                     G_IO_ERROR,
+     448                 :             :                                     G_IO_ERROR_DBUS_ERROR,
+     449                 :             :                                     "Clipboard service not available.");
+     450                 :             : 
+     451         [ #  # ]:           0 :   if (self->mimetypes == NULL)
+     452                 :           0 :     return g_task_report_new_error (adapter, callback, user_data, callback,
+     453                 :             :                                     G_IO_ERROR,
+     454                 :             :                                     G_IO_ERROR_NOT_SUPPORTED,
+     455                 :             :                                     "Clipboard empty");
+     456                 :             : 
+     457                 :           0 :   mimetypes = g_variant_get_strv (self->mimetypes, NULL);
+     458                 :             : 
+     459         [ #  # ]:           0 :   if (!g_strv_contains (mimetypes, mimetype))
+     460                 :           0 :     return g_task_report_new_error (adapter, callback, user_data, callback,
+     461                 :             :                                     G_IO_ERROR,
+     462                 :             :                                     G_IO_ERROR_NOT_SUPPORTED,
+     463                 :             :                                     "%s format not available.",
+     464                 :             :                                     mimetype);
+     465                 :             : 
+     466                 :           0 :   task = g_task_new (adapter, cancellable, callback, user_data);
+     467         [ #  # ]:           0 :   g_task_set_source_tag (task, valent_mutter_clipboard_read_bytes);
+     468                 :             : 
+     469   [ #  #  #  # ]:           0 :   if (self->is_owner && self->content != NULL)
+     470                 :           0 :     return g_task_return_pointer (task,
+     471                 :           0 :                                   g_bytes_ref (self->content),
+     472                 :             :                                   (GDestroyNotify)g_bytes_unref);
+     473                 :             : 
+     474                 :           0 :   g_dbus_connection_call (self->connection,
+     475                 :             :                           REMOTE_DESKTOP_NAME,
+     476                 :           0 :                           self->session_path,
+     477                 :             :                           REMOTE_DESKTOP_SESSION_IFACE,
+     478                 :             :                           "SelectionRead",
+     479                 :             :                           g_variant_new ("(s)", mimetype),
+     480                 :             :                           G_VARIANT_TYPE ("(h)"),
+     481                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     482                 :             :                           -1,
+     483                 :             :                           cancellable,
+     484                 :             :                           (GAsyncReadyCallback)selection_read_cb,
+     485                 :             :                           g_steal_pointer (&task));
+     486                 :             : }
+     487                 :             : 
+     488                 :             : static void
+     489                 :           0 : set_selection_cb (GDBusConnection *connection,
+     490                 :             :                   GAsyncResult    *result,
+     491                 :             :                   gpointer         user_data)
+     492                 :             : {
+     493                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     494   [ #  #  #  # ]:           0 :   g_autoptr (GVariant) reply = NULL;
+     495         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     496                 :             : 
+     497                 :           0 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     498                 :             : 
+     499         [ #  # ]:           0 :   if (reply == NULL)
+     500                 :             :     {
+     501                 :           0 :       g_dbus_error_strip_remote_error (error);
+     502         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     503                 :             :     }
+     504                 :             : 
+     505         [ #  # ]:           0 :   g_task_return_boolean (task, TRUE);
+     506                 :             : }
+     507                 :             : 
+     508                 :             : static void
+     509                 :           0 : valent_mutter_clipboard_write_bytes (ValentClipboardAdapter *adapter,
+     510                 :             :                                      const char             *mimetype,
+     511                 :             :                                      GBytes                 *bytes,
+     512                 :             :                                      GCancellable           *cancellable,
+     513                 :             :                                      GAsyncReadyCallback     callback,
+     514                 :             :                                      gpointer                user_data)
+     515                 :             : {
+     516                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (adapter);
+     517                 :           0 :   g_autoptr (GTask) task = NULL;
+     518                 :           0 :   GVariantBuilder options;
+     519                 :             : 
+     520         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     521   [ #  #  #  #  :           0 :   g_assert (bytes != NULL || (mimetype != NULL && *mimetype != '\0'));
+                   #  # ]
+     522                 :             : 
+     523   [ #  #  #  # ]:           0 :   if (self->connection == NULL || self->session_path == NULL)
+     524                 :           0 :     return g_task_report_new_error (adapter, callback, user_data, callback,
+     525                 :             :                                     G_IO_ERROR,
+     526                 :             :                                     G_IO_ERROR_DBUS_ERROR,
+     527                 :             :                                     "Clipboard service not available.");
+     528                 :             : 
+     529                 :             :   /* Update the local content */
+     530         [ #  # ]:           0 :   g_clear_pointer (&self->content, g_bytes_unref);
+     531                 :           0 :   self->content = g_bytes_ref (bytes);
+     532         [ #  # ]:           0 :   g_clear_pointer (&self->mimetypes, g_variant_unref);
+     533                 :           0 :   self->mimetypes = g_variant_new_strv (VALENT_STRV_INIT (mimetype), -1);
+     534                 :           0 :   g_variant_ref_sink (self->mimetypes);
+     535                 :           0 :   self->timestamp = valent_timestamp_ms ();
+     536                 :             : 
+     537                 :             :   /* Inform Mutter */
+     538                 :           0 :   task = g_task_new (adapter, cancellable, callback, user_data);
+     539         [ #  # ]:           0 :   g_task_set_source_tag (task, valent_mutter_clipboard_write_bytes);
+     540                 :             : 
+     541                 :           0 :   g_variant_builder_init (&options, G_VARIANT_TYPE_VARDICT);
+     542                 :           0 :   g_variant_builder_add (&options, "{sv}", "mime-types", self->mimetypes);
+     543                 :             : 
+     544                 :           0 :   g_dbus_connection_call (self->connection,
+     545                 :             :                           REMOTE_DESKTOP_NAME,
+     546                 :           0 :                           self->session_path,
+     547                 :             :                           REMOTE_DESKTOP_SESSION_IFACE,
+     548                 :             :                           "SetSelection",
+     549                 :             :                           g_variant_new ("(@a{sv})",
+     550                 :             :                                          g_variant_builder_end (&options)),
+     551                 :             :                           NULL,
+     552                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     553                 :             :                           -1,
+     554                 :             :                           cancellable,
+     555                 :             :                           (GAsyncReadyCallback)set_selection_cb,
+     556                 :             :                           g_steal_pointer (&task));
+     557                 :             : }
+     558                 :             : 
+     559                 :             : /*
+     560                 :             :  * GAsyncInitable
+     561                 :             :  */
+     562                 :             : static void
+     563                 :           0 : create_session_error_handler (GObject      *object,
+     564                 :             :                               GAsyncResult *result,
+     565                 :             :                               gpointer      user_data)
+     566                 :             : {
+     567                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (object);
+     568                 :           0 :   g_autoptr (GError) error = NULL;
+     569                 :             : 
+     570   [ #  #  #  # ]:           0 :   if (g_task_propagate_boolean (G_TASK (result), &error) ||
+     571                 :           0 :       valent_object_in_destruction (VALENT_OBJECT (self)))
+     572         [ #  # ]:           0 :     return;
+     573                 :             : 
+     574         [ #  # ]:           0 :   if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     575                 :             :     {
+     576                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     577                 :             :                                              VALENT_PLUGIN_STATE_INACTIVE,
+     578                 :             :                                              NULL);
+     579                 :             :     }
+     580                 :             :   else
+     581                 :             :     {
+     582                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     583                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     584                 :             :                                              error);
+     585                 :             :     }
+     586                 :             : }
+     587                 :             : 
+     588                 :             : static void
+     589                 :           0 : enable_clipboard_cb (GDBusConnection *connection,
+     590                 :             :                      GAsyncResult    *result,
+     591                 :             :                      gpointer         user_data)
+     592                 :             : {
+     593                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     594                 :           0 :   ValentMutterClipboard *self = g_task_get_source_object (task);
+     595   [ #  #  #  # ]:           0 :   g_autoptr (GVariant) reply = NULL;
+     596         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     597                 :             : 
+     598                 :           0 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     599                 :             : 
+     600         [ #  # ]:           0 :   if (reply == NULL)
+     601                 :             :     {
+     602                 :           0 :       g_dbus_error_strip_remote_error (error);
+     603         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     604                 :             :     }
+     605                 :             : 
+     606                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     607                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     608                 :             :                                          NULL);
+     609         [ #  # ]:           0 :   g_task_return_boolean (task, TRUE);
+     610                 :             : }
+     611                 :             : 
+     612                 :             : static void
+     613                 :           0 : create_session_cb (GDBusConnection *connection,
+     614                 :             :                    GAsyncResult    *result,
+     615                 :             :                    gpointer         user_data)
+     616                 :             : {
+     617                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+     618                 :           0 :   ValentMutterClipboard *self = g_task_get_source_object (task);
+     619                 :           0 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     620         [ #  # ]:           0 :   g_autoptr (GVariant) reply = NULL;
+     621         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     622                 :             : 
+     623                 :           0 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     624                 :             : 
+     625         [ #  # ]:           0 :   if (reply == NULL)
+     626                 :             :     {
+     627                 :           0 :       g_dbus_error_strip_remote_error (error);
+     628         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     629                 :             :     }
+     630                 :             : 
+     631         [ #  # ]:           0 :   g_clear_pointer (&self->session_path, g_free);
+     632                 :           0 :   g_variant_get (reply, "(o)", &self->session_path);
+     633                 :             : 
+     634                 :           0 :   self->closed_id =
+     635                 :           0 :     g_dbus_connection_signal_subscribe (connection,
+     636                 :             :                                         NULL,
+     637                 :             :                                         REMOTE_DESKTOP_SESSION_IFACE,
+     638                 :             :                                         "Closed",
+     639                 :           0 :                                         self->session_path,
+     640                 :             :                                         NULL,
+     641                 :             :                                         G_DBUS_SIGNAL_FLAGS_NONE,
+     642                 :             :                                         on_closed,
+     643                 :             :                                         self, NULL);
+     644                 :             : 
+     645                 :           0 :   self->selection_owner_changed_id =
+     646                 :           0 :     g_dbus_connection_signal_subscribe (connection,
+     647                 :             :                                         NULL,
+     648                 :             :                                         REMOTE_DESKTOP_SESSION_IFACE,
+     649                 :             :                                         "SelectionOwnerChanged",
+     650                 :           0 :                                         self->session_path,
+     651                 :             :                                         NULL,
+     652                 :             :                                         G_DBUS_SIGNAL_FLAGS_NONE,
+     653                 :             :                                         on_selection_owner_changed,
+     654                 :             :                                         self, NULL);
+     655                 :             : 
+     656                 :           0 :   self->selection_transfer_id =
+     657                 :           0 :     g_dbus_connection_signal_subscribe (connection,
+     658                 :             :                                         NULL,
+     659                 :             :                                         REMOTE_DESKTOP_SESSION_IFACE,
+     660                 :             :                                         "SelectionTransfer",
+     661                 :           0 :                                         self->session_path,
+     662                 :             :                                         NULL,
+     663                 :             :                                         G_DBUS_SIGNAL_FLAGS_NONE,
+     664                 :             :                                         on_selection_transfer,
+     665                 :             :                                         self, NULL);
+     666                 :             : 
+     667         [ #  # ]:           0 :   g_dbus_connection_call (connection,
+     668                 :             :                           REMOTE_DESKTOP_NAME,
+     669                 :           0 :                           self->session_path,
+     670                 :             :                           REMOTE_DESKTOP_SESSION_IFACE,
+     671                 :             :                           "EnableClipboard",
+     672                 :             :                           g_variant_parse (G_VARIANT_TYPE ("(a{sv})"),
+     673                 :             :                                            "(@a{sv} {},)",
+     674                 :             :                                            NULL,
+     675                 :             :                                            NULL,
+     676                 :             :                                            &error),
+     677                 :             :                           NULL,
+     678                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     679                 :             :                           -1,
+     680                 :             :                           cancellable,
+     681                 :             :                           (GAsyncReadyCallback)enable_clipboard_cb,
+     682                 :             :                           g_steal_pointer (&task));
+     683                 :             : }
+     684                 :             : 
+     685                 :             : static void
+     686                 :           0 : on_name_appeared (GDBusConnection       *connection,
+     687                 :             :                   const char            *name,
+     688                 :             :                   const char            *name_owner,
+     689                 :             :                   ValentMutterClipboard *self)
+     690                 :             : {
+     691                 :           0 :   g_autoptr (GTask) task = NULL;
+     692                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     693                 :             : 
+     694         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     695                 :             : 
+     696         [ #  # ]:           0 :   if (!g_set_object (&self->connection, connection))
+     697                 :             :     return;
+     698                 :             : 
+     699                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     700                 :           0 :   task = g_task_new (self, destroy, create_session_error_handler, NULL);
+     701         [ #  # ]:           0 :   g_task_set_source_tag (task, on_name_appeared);
+     702                 :             : 
+     703         [ #  # ]:           0 :   g_dbus_connection_call (self->connection,
+     704                 :             :                           REMOTE_DESKTOP_NAME,
+     705                 :             :                           REMOTE_DESKTOP_PATH,
+     706                 :             :                           REMOTE_DESKTOP_IFACE,
+     707                 :             :                           "CreateSession",
+     708                 :             :                           NULL,
+     709                 :             :                           G_VARIANT_TYPE ("(o)"),
+     710                 :             :                           G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     711                 :             :                           -1,
+     712                 :             :                           destroy,
+     713                 :             :                           (GAsyncReadyCallback)create_session_cb,
+     714                 :             :                           g_steal_pointer (&task));
+     715                 :             : }
+     716                 :             : 
+     717                 :             : static void
+     718                 :           0 : on_name_vanished (GDBusConnection       *connection,
+     719                 :             :                   const char            *name,
+     720                 :             :                   ValentMutterClipboard *self)
+     721                 :             : {
+     722         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_CLIPBOARD (self));
+     723                 :             : 
+     724         [ #  # ]:           0 :   if (self->connection != NULL)
+     725                 :             :     {
+     726         [ #  # ]:           0 :       if (self->closed_id != 0)
+     727                 :             :         {
+     728                 :           0 :           g_dbus_connection_signal_unsubscribe (self->connection,
+     729                 :             :                                                 self->closed_id);
+     730                 :           0 :           self->closed_id = 0;
+     731                 :             :         }
+     732                 :             : 
+     733         [ #  # ]:           0 :       if (self->selection_owner_changed_id != 0)
+     734                 :             :         {
+     735                 :           0 :           g_dbus_connection_signal_unsubscribe (self->connection,
+     736                 :             :                                                 self->selection_owner_changed_id);
+     737                 :           0 :           self->selection_owner_changed_id = 0;
+     738                 :             :         }
+     739                 :             : 
+     740         [ #  # ]:           0 :       if (self->selection_transfer_id != 0)
+     741                 :             :         {
+     742                 :           0 :           g_dbus_connection_signal_unsubscribe (self->connection,
+     743                 :             :                                                 self->selection_transfer_id);
+     744                 :           0 :           self->selection_transfer_id = 0;
+     745                 :             :         }
+     746                 :             : 
+     747         [ #  # ]:           0 :       if (self->session_path != NULL)
+     748                 :             :         {
+     749                 :           0 :           g_dbus_connection_call (self->connection,
+     750                 :             :                                   REMOTE_DESKTOP_NAME,
+     751                 :             :                                   self->session_path,
+     752                 :             :                                   REMOTE_DESKTOP_SESSION_IFACE,
+     753                 :             :                                   "DisableClipboard",
+     754                 :             :                                   NULL,
+     755                 :             :                                   NULL,
+     756                 :             :                                   G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     757                 :             :                                   -1,
+     758                 :             :                                   NULL,
+     759                 :             :                                   NULL,
+     760                 :             :                                   NULL);
+     761                 :             : 
+     762                 :             :           // HACK: `Start()` must called before `Stop()` will close the session
+     763                 :           0 :           g_dbus_connection_call (self->connection,
+     764                 :             :                                   REMOTE_DESKTOP_NAME,
+     765                 :           0 :                                   self->session_path,
+     766                 :             :                                   REMOTE_DESKTOP_SESSION_IFACE,
+     767                 :             :                                   "Start",
+     768                 :             :                                   NULL,
+     769                 :             :                                   NULL,
+     770                 :             :                                   G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     771                 :             :                                   -1,
+     772                 :             :                                   NULL,
+     773                 :             :                                   NULL,
+     774                 :             :                                   NULL);
+     775                 :           0 :           g_dbus_connection_call (self->connection,
+     776                 :             :                                   REMOTE_DESKTOP_NAME,
+     777                 :           0 :                                   self->session_path,
+     778                 :             :                                   REMOTE_DESKTOP_SESSION_IFACE,
+     779                 :             :                                   "Stop",
+     780                 :             :                                   NULL,
+     781                 :             :                                   NULL,
+     782                 :             :                                   G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     783                 :             :                                   -1,
+     784                 :             :                                   NULL,
+     785                 :             :                                   NULL,
+     786                 :             :                                   NULL);
+     787                 :             :         }
+     788                 :             :     }
+     789                 :             : 
+     790         [ #  # ]:           0 :   g_clear_object (&self->connection);
+     791         [ #  # ]:           0 :   g_clear_pointer (&self->session_path, g_free);
+     792                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     793                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     794                 :             :                                          NULL);
+     795                 :           0 : }
+     796                 :             : 
+     797                 :             : /*
+     798                 :             :  * ValentObject
+     799                 :             :  */
+     800                 :             : static void
+     801                 :           0 : valent_mutter_clipboard_destroy (ValentObject *object)
+     802                 :             : {
+     803                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (object);
+     804                 :             : 
+     805         [ #  # ]:           0 :   g_clear_handle_id (&self->watcher_id, g_bus_unwatch_name);
+     806                 :           0 :   on_name_vanished (self->connection, REMOTE_DESKTOP_NAME, self);
+     807                 :             : 
+     808         [ #  # ]:           0 :   g_clear_pointer (&self->content, g_bytes_unref);
+     809         [ #  # ]:           0 :   g_clear_pointer (&self->mimetypes, g_variant_unref);
+     810                 :             : 
+     811                 :           0 :   VALENT_OBJECT_CLASS (valent_mutter_clipboard_parent_class)->destroy (object);
+     812                 :           0 : }
+     813                 :             : 
+     814                 :             : /*
+     815                 :             :  * GObject
+     816                 :             :  */
+     817                 :             : static void
+     818                 :           0 : valent_mutter_clipboard_constructed (GObject *object)
+     819                 :             : {
+     820                 :           0 :   ValentMutterClipboard *self = VALENT_MUTTER_CLIPBOARD (object);
+     821                 :             : 
+     822                 :             :   /* Cede the primary position until the clipboard is enabled */
+     823                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     824                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     825                 :             :                                          NULL);
+     826                 :             : 
+     827                 :           0 :   self->watcher_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
+     828                 :             :                                        REMOTE_DESKTOP_NAME,
+     829                 :             :                                        G_BUS_NAME_WATCHER_FLAGS_NONE,
+     830                 :             :                                        (GBusNameAppearedCallback)on_name_appeared,
+     831                 :             :                                        (GBusNameVanishedCallback)on_name_vanished,
+     832                 :             :                                        self, NULL);
+     833                 :             : 
+     834                 :           0 :   G_OBJECT_CLASS (valent_mutter_clipboard_parent_class)->constructed (object);
+     835                 :           0 : }
+     836                 :             : 
+     837                 :             : static void
+     838                 :           1 : valent_mutter_clipboard_class_init (ValentMutterClipboardClass *klass)
+     839                 :             : {
+     840                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     841                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     842                 :           1 :   ValentClipboardAdapterClass *clipboard_class = VALENT_CLIPBOARD_ADAPTER_CLASS (klass);
+     843                 :             : 
+     844                 :           1 :   object_class->constructed = valent_mutter_clipboard_constructed;
+     845                 :             : 
+     846                 :           1 :   vobject_class->destroy = valent_mutter_clipboard_destroy;
+     847                 :             : 
+     848                 :           1 :   clipboard_class->get_mimetypes = valent_mutter_clipboard_get_mimetypes;
+     849                 :           1 :   clipboard_class->get_timestamp = valent_mutter_clipboard_get_timestamp;
+     850                 :           1 :   clipboard_class->read_bytes = valent_mutter_clipboard_read_bytes;
+     851                 :           1 :   clipboard_class->write_bytes = valent_mutter_clipboard_write_bytes;
+     852                 :             : }
+     853                 :             : 
+     854                 :             : static void
+     855                 :           0 : valent_mutter_clipboard_init (ValentMutterClipboard *self)
+     856                 :             : {
+     857                 :           0 : }
+     858                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-clipboard.h.func-c.html b/coverage/src/plugins/gnome/valent-mutter-clipboard.h.func-c.html new file mode 100644 index 00000000000..93abc6167a8 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-clipboard.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-clipboard.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MUTTER_CLIPBOARD0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-clipboard.h.func.html b/coverage/src/plugins/gnome/valent-mutter-clipboard.h.func.html new file mode 100644 index 00000000000..3148a211f1f --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-clipboard.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-clipboard.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MUTTER_CLIPBOARD0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-clipboard.h.gcov.html b/coverage/src/plugins/gnome/valent-mutter-clipboard.h.gcov.html new file mode 100644 index 00000000000..83863722866 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-clipboard.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-clipboard.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MUTTER_CLIPBOARD (valent_mutter_clipboard_get_type ())
+      11                 :             : 
+      12   [ #  #  #  #  :           0 : G_DECLARE_FINAL_TYPE (ValentMutterClipboard, valent_mutter_clipboard, VALENT, MUTTER_CLIPBOARD, ValentClipboardAdapter)
+                   #  # ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-input.c.func-c.html b/coverage/src/plugins/gnome/valent-mutter-input.c.func-c.html new file mode 100644 index 00000000000..7a3ea30c961 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-input.c.func-c.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-input.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:36.7 %15055
Test Date:2024-03-31 18:46:36Functions:55.0 %2011
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:9.3 %17216
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_g_signal0
remote_desktop_create_proxy_cb0
remote_desktop_create_session_cb0
remote_desktop_start_session_cb0
valent_mutter_input_check0
valent_mutter_input_keyboard_keysym0
valent_mutter_input_pointer_axis0
valent_mutter_input_pointer_button0
valent_mutter_input_pointer_motion0
g_async_initable_iface_init1
g_dbus_proxy_new_for_bus_cb1
on_name_owner_changed1
valent_mutter_input_close1
valent_mutter_input_destroy1
valent_mutter_input_finalize1
valent_mutter_input_init1
valent_mutter_input_init_async1
valent_mutter_input_get_type5
valent_mutter_input_class_intern_init1
valent_mutter_input_get_type_once1
valent_mutter_input_get_type3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-input.c.func.html b/coverage/src/plugins/gnome/valent-mutter-input.c.func.html new file mode 100644 index 00000000000..62bd73b5b38 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-input.c.func.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-input.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:36.7 %15055
Test Date:2024-03-31 18:46:36Functions:55.0 %2011
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:9.3 %17216
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init1
g_dbus_proxy_new_for_bus_cb1
on_g_signal0
on_name_owner_changed1
remote_desktop_create_proxy_cb0
remote_desktop_create_session_cb0
remote_desktop_start_session_cb0
valent_mutter_input_check0
valent_mutter_input_close1
valent_mutter_input_destroy1
valent_mutter_input_finalize1
valent_mutter_input_get_type5
valent_mutter_input_class_intern_init1
valent_mutter_input_get_type3
valent_mutter_input_get_type_once1
valent_mutter_input_init1
valent_mutter_input_init_async1
valent_mutter_input_keyboard_keysym0
valent_mutter_input_pointer_axis0
valent_mutter_input_pointer_button0
valent_mutter_input_pointer_motion0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-input.c.gcov.html b/coverage/src/plugins/gnome/valent-mutter-input.c.gcov.html new file mode 100644 index 00000000000..47afa5c7024 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-input.c.gcov.html @@ -0,0 +1,624 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-input.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:36.7 %15055
Test Date:2024-03-31 18:46:36Functions:55.0 %2011
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:9.3 %17216
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-xdp-input"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #ifdef __linux__
+       9                 :             : # include <linux/input-event-codes.h>
+      10                 :             : #else
+      11                 :             : # define BTN_LEFT    0x110
+      12                 :             : # define BTN_RIGHT   0x111
+      13                 :             : # define BTN_MIDDLE  0x112
+      14                 :             : #endif /* __linux */
+      15                 :             : 
+      16                 :             : #include <gio/gio.h>
+      17                 :             : #include <valent.h>
+      18                 :             : 
+      19                 :             : #include "valent-mutter-input.h"
+      20                 :             : 
+      21                 :             : #define SERVICE_NAME "org.gnome.Shell"
+      22                 :             : #define SERVICE_PATH "/org/gnome/Mutter/RemoteDesktop"
+      23                 :             : #define SERVICE_IFACE "org.gnome.Mutter.RemoteDesktop"
+      24                 :             : 
+      25                 :             : #define SESSION_NAME "org.gnome.Shell"
+      26                 :             : #define SESSION_IFACE "org.gnome.Mutter.RemoteDesktop.Session"
+      27                 :             : 
+      28                 :             : 
+      29                 :             : struct _ValentMutterInput
+      30                 :             : {
+      31                 :             :   ValentInputAdapter  parent_instance;
+      32                 :             : 
+      33                 :             :   GDBusProxy         *proxy;
+      34                 :             :   GDBusProxy         *session;
+      35                 :             :   uint8_t             session_state : 2;
+      36                 :             : };
+      37                 :             : 
+      38                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      39                 :             : 
+      40   [ +  +  +  - ]:           5 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentMutterInput, valent_mutter_input, VALENT_TYPE_INPUT_ADAPTER,
+      41                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init));
+      42                 :             : 
+      43                 :             : enum {
+      44                 :             :   SESSION_STATE_CLOSED,
+      45                 :             :   SESSION_STATE_STARTING = (1 << 0),
+      46                 :             :   SESSION_STATE_ACTIVE  =  (1 << 1),
+      47                 :             : };
+      48                 :             : 
+      49                 :             : /*< private >
+      50                 :             :  * KeyboardKeyState:
+      51                 :             :  * @KEYBOARD_KEY_RELEASED: The key is pressed
+      52                 :             :  * @KEYBOARD_KEY_PRESSED: The key is released
+      53                 :             :  *
+      54                 :             :  * Enumeration of keyboard bey states.
+      55                 :             :  */
+      56                 :             : typedef enum {
+      57                 :             :   KEYBOARD_KEY_RELEASED,
+      58                 :             :   KEYBOARD_KEY_PRESSED,
+      59                 :             : } KeyboardKeyState;
+      60                 :             : 
+      61                 :             : /*< private >
+      62                 :             :  * PointerAxisFlags:
+      63                 :             :  * @POINTER_AXIS_FINISH: scroll motion was finished (e.g. fingers lifted)
+      64                 :             :  * @POINTER_AXIS_WHEEL: The scroll event is originated by a mouse wheel.
+      65                 :             :  * @POINTER_AXIS_TOUCH: The scroll event is originated by one or more fingers
+      66                 :             :  *                       on the device (eg. touchpads).
+      67                 :             :  * @POINTER_AXIS_CONTINUOUS: The scroll event is originated by the motion of
+      68                 :             :  *                           some device (eg. a scroll button is set).
+      69                 :             :  *
+      70                 :             :  * Flags for pointer axis events.
+      71                 :             :  */
+      72                 :             : typedef enum {
+      73                 :             :   POINTER_AXIS_NONE,
+      74                 :             :   POINTER_AXIS_FINISH     = (1 << 0),
+      75                 :             :   POINTER_AXIS_WHEEL      = (1 << 1),
+      76                 :             :   POINTER_AXIS_TOUCH      = (1 << 2),
+      77                 :             :   POINTER_AXIS_CONTINUOUS = (1 << 3),
+      78                 :             : } PointerAxisFlags;
+      79                 :             : 
+      80                 :             : /*< private >
+      81                 :             :  * PointerAxisOrientation:
+      82                 :             :  * @POINTER_AXIS_HORIZONTAL: The x-axis
+      83                 :             :  * @POINTER_AXIS_VERTICAL: The y-axis
+      84                 :             :  *
+      85                 :             :  * Enumeration of pointer axis.
+      86                 :             :  */
+      87                 :             : typedef enum {
+      88                 :             :   POINTER_AXIS_HORIZONTAL,
+      89                 :             :   POINTER_AXIS_VERTICAL,
+      90                 :             : } PointerAxisOrientation;
+      91                 :             : 
+      92                 :             : 
+      93                 :             : /*
+      94                 :             :  * org.gnome.Mutter.RemoteDesktop.Session Callbacks
+      95                 :             :  */
+      96                 :             : static void
+      97                 :           0 : on_g_signal (GDBusProxy        *proxy,
+      98                 :             :              const char        *sender_name,
+      99                 :             :              const char        *signal_name,
+     100                 :             :              GVariant          *parameters,
+     101                 :             :              ValentMutterInput *self)
+     102                 :             : {
+     103   [ #  #  #  #  :           0 :   g_assert (G_IS_DBUS_PROXY (proxy));
+             #  #  #  # ]
+     104   [ #  #  #  # ]:           0 :   g_assert (sender_name != NULL && *sender_name != '\0');
+     105         [ #  # ]:           0 :   g_assert (VALENT_MUTTER_INPUT (self));
+     106                 :             : 
+     107                 :             :   /* This is the only signal relevant to this adapter */
+     108         [ #  # ]:           0 :   if (g_str_equal (signal_name, "Closed"))
+     109                 :             :     {
+     110                 :           0 :       g_signal_handlers_disconnect_by_func (proxy, self, on_g_signal);
+     111                 :             : 
+     112         [ #  # ]:           0 :       if (self->session == proxy)
+     113                 :             :         {
+     114                 :           0 :           g_clear_object (&self->session);
+     115                 :           0 :           self->session_state = SESSION_STATE_CLOSED;
+     116                 :             :         }
+     117                 :             :     }
+     118                 :           0 : }
+     119                 :             : 
+     120                 :             : static void
+     121                 :           0 : remote_desktop_start_session_cb (GDBusProxy        *proxy,
+     122                 :             :                                  GAsyncResult      *result,
+     123                 :             :                                  ValentMutterInput *self)
+     124                 :             : {
+     125                 :           0 :   g_autoptr (GVariant) reply = NULL;
+     126                 :           0 :   g_autoptr (GError) error = NULL;
+     127                 :             : 
+     128   [ #  #  #  #  :           0 :   g_assert (G_IS_DBUS_PROXY (proxy));
+             #  #  #  # ]
+     129   [ #  #  #  #  :           0 :   g_assert (G_IS_TASK (result));
+             #  #  #  # ]
+     130                 :             : 
+     131         [ #  # ]:           0 :   if ((reply = g_dbus_proxy_call_finish (proxy, result, &error)) == NULL)
+     132                 :             :     {
+     133         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     134                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     135                 :             : 
+     136         [ #  # ]:           0 :       g_clear_object (&self->session);
+     137                 :           0 :       self->session_state = SESSION_STATE_CLOSED;
+     138         [ #  # ]:           0 :       return;
+     139                 :             :     }
+     140                 :             : 
+     141         [ #  # ]:           0 :   self->session_state = SESSION_STATE_ACTIVE;
+     142                 :             : }
+     143                 :             : 
+     144                 :             : static void
+     145                 :           0 : remote_desktop_create_proxy_cb (GDBusProxy        *proxy,
+     146                 :             :                                 GAsyncResult      *result,
+     147                 :             :                                 ValentMutterInput *self)
+     148                 :             : {
+     149                 :           0 :   GCancellable *destroy = NULL;
+     150                 :           0 :   g_autoptr (GError) error = NULL;
+     151                 :             : 
+     152   [ #  #  #  #  :           0 :   g_assert (G_IS_DBUS_PROXY (proxy));
+             #  #  #  # ]
+     153   [ #  #  #  #  :           0 :   g_assert (G_IS_TASK (result));
+             #  #  #  # ]
+     154                 :             : 
+     155         [ #  # ]:           0 :   if ((self->session = g_dbus_proxy_new_for_bus_finish (result, &error)) == NULL)
+     156                 :             :     {
+     157         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     158                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     159                 :             : 
+     160                 :           0 :       self->session_state = SESSION_STATE_CLOSED;
+     161         [ #  # ]:           0 :       return;
+     162                 :             :     }
+     163                 :             : 
+     164                 :           0 :   g_signal_connect_object (self->session,
+     165                 :             :                            "g-signal",
+     166                 :             :                            G_CALLBACK (on_g_signal),
+     167                 :             :                            self, 0);
+     168                 :             : 
+     169                 :           0 :   destroy = g_task_get_cancellable (G_TASK (result));
+     170         [ #  # ]:           0 :   g_dbus_proxy_call (self->session,
+     171                 :             :                      "Start",
+     172                 :             :                      NULL,
+     173                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     174                 :             :                      -1,
+     175                 :             :                      destroy,
+     176                 :             :                      (GAsyncReadyCallback)remote_desktop_start_session_cb,
+     177                 :             :                      self);
+     178                 :             : }
+     179                 :             : 
+     180                 :             : static void
+     181                 :           0 : remote_desktop_create_session_cb (GDBusProxy        *proxy,
+     182                 :             :                                   GAsyncResult      *result,
+     183                 :             :                                   ValentMutterInput *self)
+     184                 :             : {
+     185                 :           0 :   g_autoptr (GVariant) reply = NULL;
+     186                 :           0 :   const char *object_path = NULL;
+     187                 :           0 :   GCancellable *destroy = NULL;
+     188         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     189                 :             : 
+     190   [ #  #  #  #  :           0 :   g_assert (G_IS_DBUS_PROXY (proxy));
+             #  #  #  # ]
+     191   [ #  #  #  #  :           0 :   g_assert (G_IS_TASK (result));
+             #  #  #  # ]
+     192                 :             : 
+     193         [ #  # ]:           0 :   if ((reply = g_dbus_proxy_call_finish (proxy, result, &error)) == NULL)
+     194                 :             :     {
+     195         [ #  # ]:           0 :       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     196                 :             :         return;
+     197                 :             : 
+     198                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     199                 :           0 :       self->session_state = SESSION_STATE_CLOSED;
+     200                 :             : 
+     201                 :           0 :       return;
+     202                 :             :     }
+     203                 :             : 
+     204         [ #  # ]:           0 :   g_return_if_fail (g_variant_is_of_type (reply, G_VARIANT_TYPE ("(o)")));
+     205                 :           0 :   g_variant_get (reply, "(&o)", &object_path);
+     206                 :             : 
+     207                 :           0 :   destroy = g_task_get_cancellable (G_TASK (result));
+     208         [ #  # ]:           0 :   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+     209                 :             :                             G_DBUS_PROXY_FLAGS_NONE,
+     210                 :             :                             NULL,
+     211                 :             :                             SESSION_NAME,
+     212                 :             :                             object_path,
+     213                 :             :                             SESSION_IFACE,
+     214                 :             :                             destroy,
+     215                 :             :                             (GAsyncReadyCallback)remote_desktop_create_proxy_cb,
+     216                 :             :                             self);
+     217                 :             : }
+     218                 :             : 
+     219                 :             : static inline gboolean
+     220                 :           0 : valent_mutter_input_check (ValentMutterInput *self)
+     221                 :             : {
+     222                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     223                 :             : 
+     224         [ #  # ]:           0 :   if G_LIKELY (self->session_state == SESSION_STATE_ACTIVE)
+     225                 :             :     return TRUE;
+     226                 :             : 
+     227         [ #  # ]:           0 :   if (self->session_state == SESSION_STATE_STARTING)
+     228                 :             :     return FALSE;
+     229                 :             : 
+     230                 :           0 :   self->session_state = SESSION_STATE_STARTING;
+     231                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     232                 :           0 :   g_dbus_proxy_call (self->proxy,
+     233                 :             :                      "CreateSession",
+     234                 :             :                      NULL,
+     235                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     236                 :             :                      -1,
+     237                 :             :                      destroy,
+     238                 :             :                      (GAsyncReadyCallback)remote_desktop_create_session_cb,
+     239                 :             :                      self);
+     240                 :             : 
+     241         [ #  # ]:           0 :   return FALSE;
+     242                 :             : }
+     243                 :             : 
+     244                 :             : static void
+     245                 :           1 : valent_mutter_input_close (ValentMutterInput *self)
+     246                 :             : {
+     247         [ -  + ]:           1 :   if (self->session_state == SESSION_STATE_CLOSED)
+     248                 :             :     return;
+     249                 :             : 
+     250                 :           0 :   g_dbus_proxy_call (self->session,
+     251                 :             :                      "Stop",
+     252                 :             :                      NULL,
+     253                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     254                 :             :                      -1,
+     255                 :             :                      NULL, NULL, NULL);
+     256                 :           0 :   self->session_state = SESSION_STATE_CLOSED;
+     257                 :             : }
+     258                 :             : 
+     259                 :             : 
+     260                 :             : /*
+     261                 :             :  * ValentInputAdapter
+     262                 :             :  */
+     263                 :             : static void
+     264                 :           0 : valent_mutter_input_keyboard_keysym (ValentInputAdapter *adapter,
+     265                 :             :                                      uint32_t            keysym,
+     266                 :             :                                      gboolean            state)
+     267                 :             : {
+     268                 :           0 :   ValentMutterInput *self = VALENT_MUTTER_INPUT (adapter);
+     269                 :             : 
+     270         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     271         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_INPUT (self));
+     272                 :             : 
+     273         [ #  # ]:           0 :   if G_UNLIKELY (!valent_mutter_input_check (self))
+     274                 :             :     return;
+     275                 :             : 
+     276                 :             :   // TODO: XDP_KEY_PRESSED/XDP_KEY_RELEASED
+     277                 :           0 :   g_dbus_proxy_call (self->session,
+     278                 :             :                      "NotifyKeyboardKeysym",
+     279                 :             :                      g_variant_new ("(ub)", keysym, state),
+     280                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     281                 :             :                      -1,
+     282                 :             :                      NULL, NULL, NULL);
+     283                 :             : }
+     284                 :             : 
+     285                 :             : static unsigned int
+     286                 :           0 : translate_to_evdev_button (unsigned int button)
+     287                 :             : {
+     288                 :           0 :   switch (button)
+     289                 :             :     {
+     290                 :             :     case VALENT_POINTER_PRIMARY:
+     291                 :             :       return BTN_LEFT;
+     292                 :             : 
+     293                 :             :     case VALENT_POINTER_MIDDLE:
+     294                 :             :       return BTN_MIDDLE;
+     295                 :             : 
+     296                 :             :     case VALENT_POINTER_SECONDARY:
+     297                 :             :       return BTN_RIGHT;
+     298                 :             : 
+     299                 :           0 :     default:
+     300                 :             :       /* Any other buttons go after the legacy scroll buttons (4-7). */
+     301                 :           0 :       return button + (BTN_LEFT - 1) - 4;
+     302                 :             :     }
+     303                 :             : }
+     304                 :             : 
+     305                 :             : static void
+     306                 :           0 : valent_mutter_input_pointer_axis (ValentInputAdapter *adapter,
+     307                 :             :                                   double              dx,
+     308                 :             :                                   double              dy)
+     309                 :             : {
+     310                 :           0 :   ValentMutterInput *self = VALENT_MUTTER_INPUT (adapter);
+     311                 :             : 
+     312         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     313         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_INPUT (self));
+     314   [ #  #  #  #  :           0 :   g_assert (!G_APPROX_VALUE (dx, 0.0, 0.01) || !G_APPROX_VALUE (dy, 0.0, 0.01));
+          #  #  #  #  #  
+                #  #  # ]
+     315                 :             : 
+     316         [ #  # ]:           0 :   if G_UNLIKELY (!valent_mutter_input_check (self))
+     317                 :             :     return;
+     318                 :             : 
+     319                 :           0 :   g_dbus_proxy_call (self->session,
+     320                 :             :                      "NotifyPointerAxis",
+     321                 :             :                      g_variant_new ("(ddu)", dx, dy, POINTER_AXIS_TOUCH),
+     322                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     323                 :             :                      -1,
+     324                 :             :                      NULL, NULL, NULL);
+     325                 :           0 :   g_dbus_proxy_call (self->session,
+     326                 :             :                      "NotifyPointerAxis",
+     327                 :             :                      g_variant_new ("(ddu)", 0.0, 0.0, POINTER_AXIS_FINISH),
+     328                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     329                 :             :                      -1,
+     330                 :             :                      NULL, NULL, NULL);
+     331                 :             : }
+     332                 :             : 
+     333                 :             : static void
+     334                 :           0 : valent_mutter_input_pointer_button (ValentInputAdapter *adapter,
+     335                 :             :                                     unsigned int        button,
+     336                 :             :                                     gboolean            pressed)
+     337                 :             : {
+     338                 :           0 :   ValentMutterInput *self = VALENT_MUTTER_INPUT (adapter);
+     339                 :             : 
+     340         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     341         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_INPUT (self));
+     342                 :             : 
+     343         [ #  # ]:           0 :   if G_UNLIKELY (!valent_mutter_input_check (self))
+     344                 :             :     return;
+     345                 :             : 
+     346                 :             :   /* Translate the button to EVDEV constant */
+     347         [ #  # ]:           0 :   button = translate_to_evdev_button (button);
+     348                 :           0 :   g_dbus_proxy_call (self->session,
+     349                 :             :                      "NotifyPointerButton",
+     350                 :             :                      g_variant_new ("(ib)", (int32_t)button, pressed),
+     351                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     352                 :             :                      -1,
+     353                 :             :                      NULL, NULL, NULL);
+     354                 :             : }
+     355                 :             : 
+     356                 :             : static void
+     357                 :           0 : valent_mutter_input_pointer_motion (ValentInputAdapter *adapter,
+     358                 :             :                                     double              dx,
+     359                 :             :                                     double              dy)
+     360                 :             : {
+     361                 :           0 :   ValentMutterInput *self = VALENT_MUTTER_INPUT (adapter);
+     362                 :             : 
+     363         [ #  # ]:           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     364         [ #  # ]:           0 :   g_assert (VALENT_IS_MUTTER_INPUT (self));
+     365                 :             : 
+     366         [ #  # ]:           0 :   if G_UNLIKELY (!valent_mutter_input_check (self))
+     367                 :             :     return;
+     368                 :             : 
+     369                 :           0 :   g_dbus_proxy_call (self->session,
+     370                 :             :                      "NotifyPointerMotionRelative",
+     371                 :             :                      g_variant_new ("(dd)", dx, dy),
+     372                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     373                 :             :                      -1,
+     374                 :             :                      NULL, NULL, NULL);
+     375                 :             : }
+     376                 :             : 
+     377                 :             : /*
+     378                 :             :  * GAsyncInitable
+     379                 :             :  */
+     380                 :             : static void
+     381                 :           1 : on_name_owner_changed (GDBusProxy        *proxy,
+     382                 :             :                        GParamSpec        *pspec,
+     383                 :             :                        ValentMutterInput *self)
+     384                 :             : {
+     385                 :           2 :   g_autofree char *name_owner = NULL;
+     386                 :             : 
+     387         [ +  - ]:           1 :   g_assert (VALENT_IS_MUTTER_INPUT (self));
+     388                 :             : 
+     389         [ -  + ]:           1 :   if ((name_owner = g_dbus_proxy_get_name_owner (proxy)) != NULL)
+     390                 :             :     {
+     391                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     392                 :             :                                              VALENT_PLUGIN_STATE_ACTIVE,
+     393                 :             :                                              NULL);
+     394                 :             :     }
+     395                 :             :   else
+     396                 :             :     {
+     397                 :           1 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     398                 :             :                                              VALENT_PLUGIN_STATE_INACTIVE,
+     399                 :             :                                              NULL);
+     400                 :             :     }
+     401                 :           1 : }
+     402                 :             : 
+     403                 :             : static void
+     404                 :           1 : g_dbus_proxy_new_for_bus_cb (GDBusProxy   *proxy,
+     405                 :             :                              GAsyncResult *result,
+     406                 :             :                              gpointer      user_data)
+     407                 :             : {
+     408                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     409                 :           1 :   ValentMutterInput *self = g_task_get_source_object (task);
+     410                 :           1 :   g_autoptr (GError) error = NULL;
+     411                 :             : 
+     412   [ +  -  +  -  :           1 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     413                 :             : 
+     414         [ -  + ]:           1 :   if ((self->proxy = g_dbus_proxy_new_for_bus_finish (result, &error)) == NULL)
+     415                 :             :     {
+     416                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     417                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     418                 :             :                                              error);
+     419         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     420                 :             :     }
+     421                 :             : 
+     422                 :           1 :   g_signal_connect_object (self->proxy,
+     423                 :             :                            "notify::g-name-owner",
+     424                 :             :                            G_CALLBACK (on_name_owner_changed),
+     425                 :             :                            self, 0);
+     426                 :           1 :   on_name_owner_changed (self->proxy, NULL, self);
+     427                 :             : 
+     428         [ -  + ]:           1 :   g_task_return_boolean (task, TRUE);
+     429                 :             : }
+     430                 :             : 
+     431                 :             : static void
+     432                 :           1 : valent_mutter_input_init_async (GAsyncInitable      *initable,
+     433                 :             :                                 int                  io_priority,
+     434                 :             :                                 GCancellable        *cancellable,
+     435                 :             :                                 GAsyncReadyCallback  callback,
+     436                 :             :                                 gpointer             user_data)
+     437                 :             : {
+     438                 :           2 :   g_autoptr (GTask) task = NULL;
+     439                 :           2 :   g_autoptr (GCancellable) destroy = NULL;
+     440                 :             : 
+     441         [ +  - ]:           1 :   g_assert (VALENT_IS_MUTTER_INPUT (initable));
+     442                 :             : 
+     443                 :             :   /* Cede the primary position until complete */
+     444                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     445                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     446                 :             :                                          NULL);
+     447                 :             : 
+     448                 :             :   /* Cancel initialization if the object is destroyed */
+     449                 :           1 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     450                 :             :                                              cancellable);
+     451                 :             : 
+     452                 :           1 :   task = g_task_new (initable, destroy, callback, user_data);
+     453                 :           1 :   g_task_set_priority (task, io_priority);
+     454         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_mutter_input_init_async);
+     455                 :             : 
+     456         [ +  - ]:           1 :   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+     457                 :             :                             G_DBUS_PROXY_FLAGS_NONE,
+     458                 :             :                             NULL,
+     459                 :             :                             SERVICE_NAME,
+     460                 :             :                             SERVICE_PATH,
+     461                 :             :                             SERVICE_IFACE,
+     462                 :             :                             destroy,
+     463                 :             :                             (GAsyncReadyCallback)g_dbus_proxy_new_for_bus_cb,
+     464                 :             :                             g_steal_pointer (&task));
+     465                 :           1 : }
+     466                 :             : 
+     467                 :             : static void
+     468                 :           1 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     469                 :             : {
+     470                 :           1 :   iface->init_async = valent_mutter_input_init_async;
+     471                 :           1 : }
+     472                 :             : 
+     473                 :             : /*
+     474                 :             :  * ValentObject
+     475                 :             :  */
+     476                 :             : static void
+     477                 :           1 : valent_mutter_input_destroy (ValentObject *object)
+     478                 :             : {
+     479                 :           1 :   ValentMutterInput *self = VALENT_MUTTER_INPUT (object);
+     480                 :             : 
+     481                 :           1 :   valent_mutter_input_close (self);
+     482                 :             : 
+     483                 :           1 :   VALENT_OBJECT_CLASS (valent_mutter_input_parent_class)->destroy (object);
+     484                 :           1 : }
+     485                 :             : 
+     486                 :             : /*
+     487                 :             :  * GObject
+     488                 :             :  */
+     489                 :             : static void
+     490                 :           1 : valent_mutter_input_finalize (GObject *object)
+     491                 :             : {
+     492                 :           1 :   ValentMutterInput *self = VALENT_MUTTER_INPUT (object);
+     493                 :             : 
+     494         [ +  - ]:           1 :   g_clear_object (&self->proxy);
+     495         [ -  + ]:           1 :   g_clear_object (&self->session);
+     496                 :             : 
+     497                 :           1 :   G_OBJECT_CLASS (valent_mutter_input_parent_class)->finalize (object);
+     498                 :           1 : }
+     499                 :             : 
+     500                 :             : static void
+     501                 :           1 : valent_mutter_input_class_init (ValentMutterInputClass *klass)
+     502                 :             : {
+     503                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     504                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     505                 :           1 :   ValentInputAdapterClass *adapter_class = VALENT_INPUT_ADAPTER_CLASS (klass);
+     506                 :             : 
+     507                 :           1 :   object_class->finalize = valent_mutter_input_finalize;
+     508                 :             : 
+     509                 :           1 :   vobject_class->destroy = valent_mutter_input_destroy;
+     510                 :             : 
+     511                 :           1 :   adapter_class->keyboard_keysym = valent_mutter_input_keyboard_keysym;
+     512                 :           1 :   adapter_class->pointer_axis = valent_mutter_input_pointer_axis;
+     513                 :           1 :   adapter_class->pointer_button = valent_mutter_input_pointer_button;
+     514                 :           1 :   adapter_class->pointer_motion = valent_mutter_input_pointer_motion;
+     515                 :             : }
+     516                 :             : 
+     517                 :             : static void
+     518                 :           1 : valent_mutter_input_init (ValentMutterInput *self)
+     519                 :             : {
+     520                 :           1 : }
+     521                 :             : 
+     522                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-input.h.func-c.html b/coverage/src/plugins/gnome/valent-mutter-input.h.func-c.html new file mode 100644 index 00000000000..c9a4df0016c --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-input.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-input.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MUTTER_INPUT2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-input.h.func.html b/coverage/src/plugins/gnome/valent-mutter-input.h.func.html new file mode 100644 index 00000000000..bac4ca16f67 --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-input.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-input.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MUTTER_INPUT2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gnome/valent-mutter-input.h.gcov.html b/coverage/src/plugins/gnome/valent-mutter-input.h.gcov.html new file mode 100644 index 00000000000..805b685686d --- /dev/null +++ b/coverage/src/plugins/gnome/valent-mutter-input.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gnome/valent-mutter-input.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gnome - valent-mutter-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MUTTER_INPUT (valent_mutter_input_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           2 : G_DECLARE_FINAL_TYPE (ValentMutterInput, valent_mutter_input, VALENT, MUTTER_INPUT, ValentInputAdapter)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/gtk-plugin.c.func-c.html b/coverage/src/plugins/gtk/gtk-plugin.c.func-c.html new file mode 100644 index 00000000000..d33db0a687d --- /dev/null +++ b/coverage/src/plugins/gtk/gtk-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/gtk-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - gtk-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %21
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_gtk_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/gtk-plugin.c.func.html b/coverage/src/plugins/gtk/gtk-plugin.c.func.html new file mode 100644 index 00000000000..bf3f04d0316 --- /dev/null +++ b/coverage/src/plugins/gtk/gtk-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/gtk-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - gtk-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %21
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_gtk_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/gtk-plugin.c.gcov.html b/coverage/src/plugins/gtk/gtk-plugin.c.gcov.html new file mode 100644 index 00000000000..ec1a9277054 --- /dev/null +++ b/coverage/src/plugins/gtk/gtk-plugin.c.gcov.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/gtk-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - gtk-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %21
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : #include <libpeas.h>
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : #include "valent-gdk-clipboard.h"
+      11                 :             : #include "valent-gtk-notifications.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : _VALENT_EXTERN void
+      15                 :           2 : valent_gtk_plugin_register_types (PeasObjectModule *module)
+      16                 :             : {
+      17                 :             :   /* These extensions inherently rely on GTK being initialized */
+      18         [ +  - ]:           2 :   if (gtk_is_initialized ())
+      19                 :             :     {
+      20                 :           2 :       peas_object_module_register_extension_type (module,
+      21                 :             :                                                   VALENT_TYPE_CLIPBOARD_ADAPTER,
+      22                 :             :                                                   VALENT_TYPE_GDK_CLIPBOARD);
+      23                 :           2 :       peas_object_module_register_extension_type (module,
+      24                 :             :                                                   VALENT_TYPE_NOTIFICATIONS_ADAPTER,
+      25                 :             :                                                   VALENT_TYPE_GTK_NOTIFICATIONS);
+      26                 :             :     }
+      27                 :           2 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-detail-sort-b.html b/coverage/src/plugins/gtk/index-detail-sort-b.html new file mode 100644 index 00000000000..c6d00870cf2 --- /dev/null +++ b/coverage/src/plugins/gtk/index-detail-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-detail-sort-f.html b/coverage/src/plugins/gtk/index-detail-sort-f.html new file mode 100644 index 00000000000..1e27a0a5ef1 --- /dev/null +++ b/coverage/src/plugins/gtk/index-detail-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-detail-sort-l.html b/coverage/src/plugins/gtk/index-detail-sort-l.html new file mode 100644 index 00000000000..86578d274d2 --- /dev/null +++ b/coverage/src/plugins/gtk/index-detail-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-detail.html b/coverage/src/plugins/gtk/index-detail.html new file mode 100644 index 00000000000..529424f131c --- /dev/null +++ b/coverage/src/plugins/gtk/index-detail.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-sort-b.html b/coverage/src/plugins/gtk/index-sort-b.html new file mode 100644 index 00000000000..c6d00870cf2 --- /dev/null +++ b/coverage/src/plugins/gtk/index-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-sort-f.html b/coverage/src/plugins/gtk/index-sort-f.html new file mode 100644 index 00000000000..1e27a0a5ef1 --- /dev/null +++ b/coverage/src/plugins/gtk/index-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index-sort-l.html b/coverage/src/plugins/gtk/index-sort-l.html new file mode 100644 index 00000000000..86578d274d2 --- /dev/null +++ b/coverage/src/plugins/gtk/index-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/index.html b/coverage/src/plugins/gtk/index.html new file mode 100644 index 00000000000..529424f131c --- /dev/null +++ b/coverage/src/plugins/gtk/index.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtkCoverageTotalHit
Test:Code CoverageLines:75.6 %266201
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.3 %23884
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
gtk-plugin.c +
100.0%
+
100.0 %5550.0 %21100.0 %11
valent-gdk-clipboard.c +
68.9%68.9%
+
68.9 %1228432.6 %1384585.7 %1412
valent-gdk-clipboard.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-gtk-notifications.c +
80.3%80.3%
+
80.3 %13711037.2 %863293.3 %1514
valent-gtk-notifications.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gdk-clipboard.c.func-c.html b/coverage/src/plugins/gtk/valent-gdk-clipboard.c.func-c.html new file mode 100644 index 00000000000..cc376a2c7ba --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gdk-clipboard.c.func-c.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gdk-clipboard.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gdk-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:68.9 %12284
Test Date:2024-03-31 18:46:36Functions:85.7 %1412
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:32.6 %13845
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_input_stream_read_bytes_cb0
gdk_clipboard_read_cb0
valent_gdk_clipboard_constructed1
valent_gdk_clipboard_destroy1
valent_gdk_clipboard_init1
valent_gdk_clipboard_get_timestamp2
valent_gdk_clipboard_write_bytes2
gdk_clipboard_read_text_cb3
on_changed3
valent_gdk_clipboard_read_bytes3
valent_gdk_clipboard_get_mimetypes4
valent_gdk_clipboard_get_type20
valent_gdk_clipboard_class_intern_init2
valent_gdk_clipboard_get_type_once2
valent_gdk_clipboard_get_type16
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gdk-clipboard.c.func.html b/coverage/src/plugins/gtk/valent-gdk-clipboard.c.func.html new file mode 100644 index 00000000000..0c6cb0e0271 --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gdk-clipboard.c.func.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gdk-clipboard.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gdk-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:68.9 %12284
Test Date:2024-03-31 18:46:36Functions:85.7 %1412
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:32.6 %13845
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_input_stream_read_bytes_cb0
gdk_clipboard_read_cb0
gdk_clipboard_read_text_cb3
on_changed3
valent_gdk_clipboard_constructed1
valent_gdk_clipboard_destroy1
valent_gdk_clipboard_get_mimetypes4
valent_gdk_clipboard_get_timestamp2
valent_gdk_clipboard_get_type20
valent_gdk_clipboard_class_intern_init2
valent_gdk_clipboard_get_type16
valent_gdk_clipboard_get_type_once2
valent_gdk_clipboard_init1
valent_gdk_clipboard_read_bytes3
valent_gdk_clipboard_write_bytes2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gdk-clipboard.c.gcov.html b/coverage/src/plugins/gtk/valent-gdk-clipboard.c.gcov.html new file mode 100644 index 00000000000..0dd57c6440c --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gdk-clipboard.c.gcov.html @@ -0,0 +1,422 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gdk-clipboard.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gdk-clipboard.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:68.9 %12284
Test Date:2024-03-31 18:46:36Functions:85.7 %1412
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:32.6 %13845
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-gdk-clipboard"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gdk/gdk.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-gdk-clipboard.h"
+      12                 :             : 
+      13                 :             : #define CLIPBOARD_MAXSIZE (16 * 1024)
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentGdkClipboard
+      17                 :             : {
+      18                 :             :   ValentClipboardAdapter  parent_instance;
+      19                 :             : 
+      20                 :             :   GdkClipboard           *clipboard;
+      21                 :             :   int64_t                 timestamp;
+      22                 :             : };
+      23                 :             : 
+      24   [ +  +  +  - ]:          20 : G_DEFINE_FINAL_TYPE (ValentGdkClipboard, valent_gdk_clipboard, VALENT_TYPE_CLIPBOARD_ADAPTER)
+      25                 :             : 
+      26                 :             : static const char * const text_mimetypes[] = {
+      27                 :             :   "text/plain;charset=utf-8",
+      28                 :             :   "text/plain",
+      29                 :             :   "UTF8_STRING",
+      30                 :             :   "STRING",
+      31                 :             :   "TEXT",
+      32                 :             :   "COMPOUND_TEXT",
+      33                 :             :   NULL,
+      34                 :             : };
+      35                 :             : 
+      36                 :             : 
+      37                 :             : /*
+      38                 :             :  * GdkClipboard Callbacks
+      39                 :             :  */
+      40                 :             : static void
+      41                 :           3 : on_changed (GdkClipboard       *clipboard,
+      42                 :             :             ValentGdkClipboard *self)
+      43                 :             : {
+      44                 :           3 :   ValentClipboardAdapter *adapter = VALENT_CLIPBOARD_ADAPTER (self);
+      45                 :             : 
+      46         [ +  - ]:           3 :   g_assert (VALENT_IS_GDK_CLIPBOARD (self));
+      47         [ -  + ]:           3 :   g_assert (VALENT_IS_CLIPBOARD_ADAPTER (adapter));
+      48                 :             : 
+      49                 :             :   // TODO: get the actual TIMESTAMP value
+      50                 :           3 :   self->timestamp = valent_timestamp_ms ();
+      51                 :           3 :   valent_clipboard_adapter_changed (adapter);
+      52                 :           3 : }
+      53                 :             : 
+      54                 :             : static void
+      55                 :           0 : g_input_stream_read_bytes_cb (GInputStream *stream,
+      56                 :             :                               GAsyncResult *result,
+      57                 :             :                               gpointer      user_data)
+      58                 :             : {
+      59                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+      60   [ #  #  #  # ]:           0 :   g_autoptr (GBytes) bytes = NULL;
+      61         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+      62                 :             : 
+      63                 :           0 :   bytes = g_input_stream_read_bytes_finish (stream, result, &error);
+      64                 :             : 
+      65         [ #  # ]:           0 :   if (bytes == NULL)
+      66         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+      67                 :             : 
+      68         [ #  # ]:           0 :   g_task_return_pointer (task,
+      69                 :           0 :                          g_bytes_ref (bytes),
+      70                 :             :                          (GDestroyNotify)g_bytes_unref);
+      71                 :             : }
+      72                 :             : 
+      73                 :             : static void
+      74                 :           0 : gdk_clipboard_read_cb (GdkClipboard *clipboard,
+      75                 :             :                        GAsyncResult *result,
+      76                 :             :                        gpointer      user_data)
+      77                 :             : {
+      78                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+      79                 :           0 :   GCancellable *cancellable = g_task_get_cancellable (task);
+      80         [ #  # ]:           0 :   g_autoptr (GInputStream) input = NULL;
+      81                 :           0 :   const char *mimetype = NULL;
+      82         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+      83                 :             : 
+      84   [ #  #  #  #  :           0 :   g_assert (GDK_IS_CLIPBOARD (clipboard));
+             #  #  #  # ]
+      85         [ #  # ]:           0 :   g_assert (g_task_is_valid (result, clipboard));
+      86                 :             : 
+      87                 :           0 :   input = gdk_clipboard_read_finish (clipboard, result, &mimetype, &error);
+      88                 :             : 
+      89         [ #  # ]:           0 :   if (input == NULL)
+      90         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+      91                 :             : 
+      92         [ #  # ]:           0 :   g_input_stream_read_bytes_async (input,
+      93                 :             :                                    G_PRIORITY_DEFAULT,
+      94                 :             :                                    CLIPBOARD_MAXSIZE,
+      95                 :             :                                    cancellable,
+      96                 :             :                                    (GAsyncReadyCallback)g_input_stream_read_bytes_cb,
+      97                 :             :                                    g_steal_pointer (&task));
+      98                 :             : }
+      99                 :             : 
+     100                 :             : static void
+     101                 :           3 : gdk_clipboard_read_text_cb (GdkClipboard *clipboard,
+     102                 :             :                             GAsyncResult *result,
+     103                 :             :                             gpointer      user_data)
+     104                 :             : {
+     105                 :           3 :   g_autoptr (GTask) task = G_TASK (user_data);
+     106                 :           3 :   char *text = NULL;
+     107                 :           3 :   GError *error = NULL;
+     108                 :             : 
+     109   [ +  -  +  -  :           3 :   g_assert (GDK_IS_CLIPBOARD (clipboard));
+             +  -  -  + ]
+     110         [ -  + ]:           3 :   g_assert (g_task_is_valid (result, clipboard));
+     111                 :             : 
+     112                 :           3 :   text = gdk_clipboard_read_text_finish (clipboard, result, &error);
+     113                 :             : 
+     114         [ -  + ]:           3 :   if (text == NULL)
+     115         [ #  # ]:           0 :     return g_task_return_error (task, error);
+     116                 :             : 
+     117         [ +  - ]:           3 :   g_task_return_pointer (task,
+     118                 :           3 :                          g_bytes_new_take (text, strlen (text) + 1),
+     119                 :             :                          (GDestroyNotify)g_bytes_unref);
+     120                 :             : }
+     121                 :             : 
+     122                 :             : /*
+     123                 :             :  * ValentClipboardAdapter
+     124                 :             :  */
+     125                 :             : static GStrv
+     126                 :           4 : valent_gdk_clipboard_get_mimetypes (ValentClipboardAdapter *adapter)
+     127                 :             : {
+     128                 :           4 :   ValentGdkClipboard *self = VALENT_GDK_CLIPBOARD (adapter);
+     129                 :           4 :   GdkContentFormats *formats = NULL;
+     130                 :           4 :   const char * const *mimetypes = NULL;
+     131                 :             : 
+     132         [ +  - ]:           4 :   g_assert (VALENT_IS_GDK_CLIPBOARD (self));
+     133   [ +  -  +  -  :           4 :   g_return_val_if_fail (GDK_IS_CLIPBOARD (self->clipboard), NULL);
+             +  -  -  + ]
+     134                 :             : 
+     135         [ -  + ]:           4 :   if ((formats = gdk_clipboard_get_formats (self->clipboard)) == NULL)
+     136                 :             :     return NULL;
+     137                 :             : 
+     138                 :           4 :   mimetypes = gdk_content_formats_get_mime_types (formats, NULL);
+     139                 :             : 
+     140                 :           4 :   return g_strdupv ((char **)mimetypes);
+     141                 :             : }
+     142                 :             : 
+     143                 :             : static int64_t
+     144                 :           2 : valent_gdk_clipboard_get_timestamp (ValentClipboardAdapter *adapter)
+     145                 :             : {
+     146                 :           2 :   ValentGdkClipboard *self = VALENT_GDK_CLIPBOARD (adapter);
+     147                 :             : 
+     148         [ +  - ]:           2 :   g_assert (VALENT_IS_GDK_CLIPBOARD (self));
+     149   [ +  -  +  -  :           2 :   g_return_val_if_fail (GDK_IS_CLIPBOARD (self->clipboard), 0);
+             +  -  -  + ]
+     150                 :             : 
+     151                 :           2 :   return self->timestamp;
+     152                 :             : }
+     153                 :             : 
+     154                 :             : static void
+     155                 :           3 : valent_gdk_clipboard_read_bytes (ValentClipboardAdapter *adapter,
+     156                 :             :                                  const char             *mimetype,
+     157                 :             :                                  GCancellable           *cancellable,
+     158                 :             :                                  GAsyncReadyCallback     callback,
+     159                 :             :                                  gpointer                user_data)
+     160                 :             : {
+     161                 :           3 :   ValentGdkClipboard *self = VALENT_GDK_CLIPBOARD (adapter);
+     162                 :           3 :   g_autoptr (GTask) task = NULL;
+     163                 :           3 :   GdkContentFormats *formats = NULL;
+     164                 :             : 
+     165         [ +  - ]:           3 :   g_assert (VALENT_IS_GDK_CLIPBOARD (self));
+     166   [ +  -  -  + ]:           3 :   g_assert (mimetype != NULL && *mimetype != '\0');
+     167                 :             : 
+     168   [ +  -  +  -  :           3 :   if G_UNLIKELY (!GDK_IS_CLIPBOARD (self->clipboard))
+             +  -  +  - ]
+     169                 :             :     {
+     170                 :           0 :       g_task_report_new_error (adapter, callback, user_data,
+     171                 :             :                                valent_gdk_clipboard_read_bytes,
+     172                 :             :                                G_IO_ERROR,
+     173                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     174                 :             :                                "Clipboard not available");
+     175                 :           0 :       return;
+     176                 :             :     }
+     177                 :             : 
+     178                 :             :   /* Special case for text */
+     179         [ +  - ]:           3 :   if (g_strv_contains (text_mimetypes, mimetype))
+     180                 :             :     {
+     181                 :           3 :       task = g_task_new (adapter, cancellable, callback, user_data);
+     182         [ +  - ]:           3 :       g_task_set_source_tag (task, valent_gdk_clipboard_read_bytes);
+     183                 :             : 
+     184                 :           3 :       gdk_clipboard_read_text_async (self->clipboard,
+     185                 :             :                                      cancellable,
+     186                 :             :                                      (GAsyncReadyCallback)gdk_clipboard_read_text_cb,
+     187                 :             :                                      g_steal_pointer (&task));
+     188                 :           3 :       return;
+     189                 :             :     }
+     190                 :             : 
+     191         [ #  # ]:           0 :   if ((formats = gdk_clipboard_get_formats (self->clipboard)) == NULL)
+     192                 :             :     {
+     193                 :           0 :       g_task_report_new_error (adapter, callback, user_data,
+     194                 :             :                                valent_gdk_clipboard_read_bytes,
+     195                 :             :                                G_IO_ERROR,
+     196                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     197                 :             :                                "Clipboard empty");
+     198                 :           0 :       return;
+     199                 :             :     }
+     200                 :             : 
+     201         [ #  # ]:           0 :   if (!gdk_content_formats_contain_mime_type (formats, mimetype))
+     202                 :             :     {
+     203                 :           0 :       g_task_report_new_error (adapter, callback, user_data,
+     204                 :             :                                valent_gdk_clipboard_read_bytes,
+     205                 :             :                                G_IO_ERROR,
+     206                 :             :                                G_IO_ERROR_NOT_SUPPORTED,
+     207                 :             :                                "%s format not available.",
+     208                 :             :                                mimetype);
+     209                 :           0 :       return;
+     210                 :             :     }
+     211                 :             : 
+     212                 :           0 :   task = g_task_new (adapter, cancellable, callback, user_data);
+     213         [ #  # ]:           0 :   g_task_set_source_tag (task, valent_gdk_clipboard_read_bytes);
+     214         [ #  # ]:           0 :   g_task_set_task_data (task, g_strdup (mimetype), g_free);
+     215                 :             : 
+     216                 :           0 :   gdk_clipboard_read_async (self->clipboard,
+     217                 :           0 :                             (const char *[]){ mimetype, NULL },
+     218                 :             :                             G_PRIORITY_DEFAULT,
+     219                 :             :                             cancellable,
+     220                 :             :                             (GAsyncReadyCallback)gdk_clipboard_read_cb,
+     221                 :             :                             g_steal_pointer (&task));
+     222                 :             : }
+     223                 :             : 
+     224                 :             : static void
+     225                 :           2 : valent_gdk_clipboard_write_bytes (ValentClipboardAdapter *adapter,
+     226                 :             :                                   const char             *mimetype,
+     227                 :             :                                   GBytes                 *bytes,
+     228                 :             :                                   GCancellable           *cancellable,
+     229                 :             :                                   GAsyncReadyCallback     callback,
+     230                 :             :                                   gpointer                user_data)
+     231                 :             : {
+     232                 :           2 :   ValentGdkClipboard *self = VALENT_GDK_CLIPBOARD (adapter);
+     233                 :           4 :   g_autoptr (GdkContentProvider) content = NULL;
+     234   [ -  -  +  - ]:           2 :   g_autoptr (GTask) task = NULL;
+     235                 :             : 
+     236         [ +  - ]:           2 :   g_assert (VALENT_IS_GDK_CLIPBOARD (self));
+     237   [ -  +  -  -  :           2 :   g_assert (bytes != NULL || (mimetype != NULL && *mimetype != '\0'));
+                   -  - ]
+     238   [ +  -  +  -  :           2 :   g_return_if_fail (GDK_IS_CLIPBOARD (self->clipboard));
+             +  -  -  + ]
+     239                 :             : 
+     240         [ +  - ]:           2 :   if (bytes != NULL)
+     241                 :           2 :     content = gdk_content_provider_new_for_bytes (mimetype, bytes);
+     242                 :             : 
+     243         [ -  + ]:           2 :   if (!gdk_clipboard_set_content (self->clipboard, content))
+     244                 :             :     {
+     245                 :           0 :       g_task_report_new_error (adapter, callback, user_data,
+     246                 :             :                                valent_gdk_clipboard_write_bytes,
+     247                 :             :                                G_IO_ERROR,
+     248                 :             :                                G_IO_ERROR_FAILED,
+     249                 :             :                                "Failed to set clipboard content");
+     250         [ #  # ]:           0 :       return;
+     251                 :             :     }
+     252                 :             : 
+     253                 :           2 :   task = g_task_new (adapter, cancellable, callback, user_data);
+     254         [ +  - ]:           2 :   g_task_set_source_tag (task, valent_gdk_clipboard_write_bytes);
+     255         [ +  - ]:           2 :   g_task_return_boolean (task, TRUE);
+     256                 :             : }
+     257                 :             : 
+     258                 :             : /*
+     259                 :             :  * ValentObject
+     260                 :             :  */
+     261                 :             : static void
+     262                 :           1 : valent_gdk_clipboard_destroy (ValentObject *object)
+     263                 :             : {
+     264                 :           1 :   ValentGdkClipboard *self = VALENT_GDK_CLIPBOARD (object);
+     265                 :             : 
+     266         [ +  - ]:           1 :   if (self->clipboard != NULL)
+     267                 :             :     {
+     268                 :           1 :       g_signal_handlers_disconnect_by_data (self->clipboard, self);
+     269                 :           1 :       self->clipboard = NULL;
+     270                 :             :     }
+     271                 :             : 
+     272                 :           1 :   VALENT_OBJECT_CLASS (valent_gdk_clipboard_parent_class)->destroy (object);
+     273                 :           1 : }
+     274                 :             : 
+     275                 :             : /*
+     276                 :             :  * GObject
+     277                 :             :  */
+     278                 :             : static void
+     279                 :           1 : valent_gdk_clipboard_constructed (GObject *object)
+     280                 :             : {
+     281                 :           1 :   ValentGdkClipboard *self = VALENT_GDK_CLIPBOARD (object);
+     282                 :           1 :   GdkDisplay *display;
+     283                 :             : 
+     284         [ +  - ]:           1 :   if ((display = gdk_display_get_default ()) != NULL)
+     285                 :             :     {
+     286                 :           1 :       self->clipboard = gdk_display_get_clipboard (display);
+     287                 :           1 :       g_signal_connect_object (self->clipboard,
+     288                 :             :                                "changed",
+     289                 :             :                                G_CALLBACK (on_changed),
+     290                 :             :                                self, 0);
+     291                 :             :     }
+     292                 :             :   else
+     293                 :             :     {
+     294                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     295                 :             :                                              VALENT_PLUGIN_STATE_INACTIVE,
+     296                 :             :                                              NULL);
+     297                 :             :     }
+     298                 :             : 
+     299                 :           1 :   G_OBJECT_CLASS (valent_gdk_clipboard_parent_class)->constructed (object);
+     300                 :           1 : }
+     301                 :             : 
+     302                 :             : static void
+     303                 :           2 : valent_gdk_clipboard_class_init (ValentGdkClipboardClass *klass)
+     304                 :             : {
+     305                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     306                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     307                 :           2 :   ValentClipboardAdapterClass *clipboard_class = VALENT_CLIPBOARD_ADAPTER_CLASS (klass);
+     308                 :             : 
+     309                 :           2 :   object_class->constructed = valent_gdk_clipboard_constructed;
+     310                 :             : 
+     311                 :           2 :   vobject_class->destroy = valent_gdk_clipboard_destroy;
+     312                 :             : 
+     313                 :           2 :   clipboard_class->get_mimetypes = valent_gdk_clipboard_get_mimetypes;
+     314                 :           2 :   clipboard_class->get_timestamp = valent_gdk_clipboard_get_timestamp;
+     315                 :           2 :   clipboard_class->read_bytes = valent_gdk_clipboard_read_bytes;
+     316                 :           2 :   clipboard_class->write_bytes = valent_gdk_clipboard_write_bytes;
+     317                 :             : }
+     318                 :             : 
+     319                 :             : static void
+     320                 :           1 : valent_gdk_clipboard_init (ValentGdkClipboard *self)
+     321                 :             : {
+     322                 :           1 : }
+     323                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gdk-clipboard.h.func-c.html b/coverage/src/plugins/gtk/valent-gdk-clipboard.h.func-c.html new file mode 100644 index 00000000000..37c70b33b9c --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gdk-clipboard.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gdk-clipboard.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gdk-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_GDK_CLIPBOARD14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gdk-clipboard.h.func.html b/coverage/src/plugins/gtk/valent-gdk-clipboard.h.func.html new file mode 100644 index 00000000000..ba67f2b90d4 --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gdk-clipboard.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gdk-clipboard.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gdk-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_GDK_CLIPBOARD14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gdk-clipboard.h.gcov.html b/coverage/src/plugins/gtk/valent-gdk-clipboard.h.gcov.html new file mode 100644 index 00000000000..1a1a1ce6a93 --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gdk-clipboard.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gdk-clipboard.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gdk-clipboard.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_GDK_CLIPBOARD (valent_gdk_clipboard_get_type ())
+      11                 :             : 
+      12   [ +  -  +  -  :          14 : G_DECLARE_FINAL_TYPE (ValentGdkClipboard, valent_gdk_clipboard, VALENT, GDK_CLIPBOARD, ValentClipboardAdapter)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gtk-notifications.c.func-c.html b/coverage/src/plugins/gtk/valent-gtk-notifications.c.func-c.html new file mode 100644 index 00000000000..40fe270f1d9 --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gtk-notifications.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gtk-notifications.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gtk-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:80.3 %137110
Test Date:2024-03-31 18:46:36Functions:93.3 %1514
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:37.2 %8632
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_name_vanished0
_add_notification1
_remove_notification1
become_monitor_cb1
new_for_address_cb1
on_name_appeared1
valent_gtk_notifications_destroy1
valent_gtk_notifications_finalize1
valent_gtk_notifications_init1
valent_gtk_notifications_init_async1
g_async_initable_iface_init2
valent_gtk_notifications_method_call2
valent_gtk_notifications_get_type10
valent_gtk_notifications_class_intern_init2
valent_gtk_notifications_get_type_once2
valent_gtk_notifications_get_type6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gtk-notifications.c.func.html b/coverage/src/plugins/gtk/valent-gtk-notifications.c.func.html new file mode 100644 index 00000000000..a832de0b0b5 --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gtk-notifications.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gtk-notifications.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gtk-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:80.3 %137110
Test Date:2024-03-31 18:46:36Functions:93.3 %1514
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:37.2 %8632
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_add_notification1
_remove_notification1
become_monitor_cb1
g_async_initable_iface_init2
new_for_address_cb1
on_name_appeared1
on_name_vanished0
valent_gtk_notifications_destroy1
valent_gtk_notifications_finalize1
valent_gtk_notifications_get_type10
valent_gtk_notifications_class_intern_init2
valent_gtk_notifications_get_type6
valent_gtk_notifications_get_type_once2
valent_gtk_notifications_init1
valent_gtk_notifications_init_async1
valent_gtk_notifications_method_call2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gtk-notifications.c.gcov.html b/coverage/src/plugins/gtk/valent-gtk-notifications.c.gcov.html new file mode 100644 index 00000000000..825a53f5db4 --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gtk-notifications.c.gcov.html @@ -0,0 +1,487 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gtk-notifications.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gtk-notifications.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:80.3 %137110
Test Date:2024-03-31 18:46:36Functions:93.3 %1514
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:37.2 %8632
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-gtk-notifications"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <time.h>
+       9                 :             : 
+      10                 :             : #include <gio/gdesktopappinfo.h>
+      11                 :             : #include <gio/gio.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-gtk-notifications.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentGtkNotifications
+      18                 :             : {
+      19                 :             :   ValentNotificationsAdapter  parent_instance;
+      20                 :             : 
+      21                 :             :   GDBusInterfaceVTable        vtable;
+      22                 :             :   GDBusNodeInfo              *node_info;
+      23                 :             :   GDBusInterfaceInfo         *iface_info;
+      24                 :             :   GDBusConnection            *monitor;
+      25                 :             :   unsigned int                monitor_id;
+      26                 :             :   char                       *name_owner;
+      27                 :             :   unsigned int                name_owner_id;
+      28                 :             : };
+      29                 :             : 
+      30                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      31                 :             : 
+      32   [ +  +  +  - ]:          10 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentGtkNotifications, valent_gtk_notifications, VALENT_TYPE_NOTIFICATIONS_ADAPTER,
+      33                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      34                 :             : 
+      35                 :             : 
+      36                 :             : /*
+      37                 :             :  * GDBusInterfaceSkeleton
+      38                 :             :  */
+      39                 :             : static const char interface_xml[] =
+      40                 :             :   "<node>"
+      41                 :             :   "  <interface name='org.gtk.Notifications'>"
+      42                 :             :   "    <method name='AddNotification'>"
+      43                 :             :   "      <arg name='applicationId' type='s' direction='in'/>"
+      44                 :             :   "      <arg name='notificationId' type='s' direction='in'/>"
+      45                 :             :   "      <arg name='parameters' type='a{sv}' direction='in'/>"
+      46                 :             :   "    </method>"
+      47                 :             :   "    <method name='RemoveNotification'>"
+      48                 :             :   "      <arg name='applicationId' type='s' direction='in'/>"
+      49                 :             :   "      <arg name='notificationId' type='s' direction='in'/>"
+      50                 :             :   "    </method>"
+      51                 :             :   "  </interface>"
+      52                 :             :   "</node>";
+      53                 :             : 
+      54                 :             : static const char *interface_matches[] = {
+      55                 :             :   "interface='org.gtk.Notifications',member='AddNotification',type='method_call'",
+      56                 :             :   "interface='org.gtk.Notifications',member='RemoveNotification',type='method_call'",
+      57                 :             :   NULL
+      58                 :             : };
+      59                 :             : 
+      60                 :             : 
+      61                 :             : static void
+      62                 :           1 : _add_notification (ValentNotificationsAdapter *adapter,
+      63                 :             :                    GVariant                   *parameters)
+      64                 :             : {
+      65                 :           1 :   g_autoptr (ValentNotification) notification = NULL;
+      66         [ +  - ]:           1 :   g_autofree char *desktop_id = NULL;
+      67                 :           1 :   g_autoptr (GDesktopAppInfo) desktop_info = NULL;
+      68         [ -  + ]:           1 :   g_autoptr (GVariant) props = NULL;
+      69                 :           1 :   const char *app_id;
+      70                 :           1 :   const char *notif_id;
+      71                 :             : 
+      72                 :             :   /* Extract what we need from the parameters */
+      73                 :           1 :   g_variant_get (parameters, "(&s&s@a{sv})", &app_id, &notif_id, &props);
+      74                 :             : 
+      75                 :             :   /* Ignore our own notifications */
+      76         [ -  + ]:           1 :   if (g_str_equal (app_id, APPLICATION_ID))
+      77         [ #  # ]:           0 :     return;
+      78                 :             : 
+      79                 :             :   /* Deserialize GNotification into ValentNotification */
+      80                 :           1 :   notification = valent_notification_deserialize (props);
+      81                 :           1 :   valent_notification_set_id (notification, notif_id);
+      82                 :             : 
+      83                 :             :   /* Set a timestamp */
+      84                 :           1 :   valent_notification_set_time (notification, valent_timestamp_ms ());
+      85                 :             : 
+      86                 :             :   /* Try and get an application name */
+      87                 :           1 :   desktop_id = g_strdup_printf ("%s.desktop", app_id);
+      88                 :             : 
+      89         [ -  + ]:           1 :   if ((desktop_info = g_desktop_app_info_new (desktop_id)))
+      90                 :             :     {
+      91                 :           0 :       const char *app_name;
+      92                 :             : 
+      93                 :           0 :       app_name = g_app_info_get_display_name (G_APP_INFO (desktop_info));
+      94                 :           0 :       valent_notification_set_application (notification, app_name);
+      95                 :             :     }
+      96                 :             : 
+      97         [ +  - ]:           1 :   valent_notifications_adapter_notification_added (adapter, notification);
+      98                 :             : }
+      99                 :             : 
+     100                 :             : static void
+     101                 :           1 : _remove_notification (ValentNotificationsAdapter *adapter,
+     102                 :             :                       GVariant                   *parameters)
+     103                 :             : {
+     104                 :           1 :   const char *app_id;
+     105                 :           1 :   const char *notif_id;
+     106                 :             : 
+     107                 :           1 :   g_variant_get (parameters, "(&s&s)", &app_id, &notif_id);
+     108                 :             : 
+     109                 :             :   /* Ignore our own notifications */
+     110         [ -  + ]:           1 :   if (g_str_equal (app_id, APPLICATION_ID))
+     111                 :           0 :     return;
+     112                 :             : 
+     113                 :           1 :   valent_notifications_adapter_notification_removed (adapter, notif_id);
+     114                 :             : }
+     115                 :             : 
+     116                 :             : static void
+     117                 :           2 : valent_gtk_notifications_method_call (GDBusConnection       *connection,
+     118                 :             :                                       const char            *sender,
+     119                 :             :                                       const char            *object_path,
+     120                 :             :                                       const char            *interface_name,
+     121                 :             :                                       const char            *method_name,
+     122                 :             :                                       GVariant              *parameters,
+     123                 :             :                                       GDBusMethodInvocation *invocation,
+     124                 :             :                                       gpointer               user_data)
+     125                 :             : {
+     126                 :           2 :   ValentNotificationsAdapter *adapter = VALENT_NOTIFICATIONS_ADAPTER (user_data);
+     127                 :           2 :   ValentGtkNotifications *self = VALENT_GTK_NOTIFICATIONS (user_data);
+     128                 :           2 :   GDBusMessage *message;
+     129                 :           2 :   const char *destination;
+     130                 :             : 
+     131         [ +  - ]:           2 :   g_assert (VALENT_IS_GTK_NOTIFICATIONS (adapter));
+     132                 :             : 
+     133                 :           2 :   message = g_dbus_method_invocation_get_message (invocation);
+     134                 :           2 :   destination = g_dbus_message_get_destination (message);
+     135                 :             : 
+     136   [ -  +  -  - ]:           2 :   if (g_strcmp0 ("org.gtk.Notifications", destination) != 0 &&
+     137                 :           0 :       g_strcmp0 (self->name_owner, destination) != 0)
+     138                 :           0 :     goto out;
+     139                 :             : 
+     140         [ +  + ]:           2 :   if (g_strcmp0 (method_name, "AddNotification") == 0)
+     141                 :           1 :     _add_notification (adapter, parameters);
+     142                 :             : 
+     143         [ -  + ]:           1 :   else if (g_strcmp0 (method_name, "RemoveNotification") == 0)
+     144                 :           1 :     _remove_notification (adapter, parameters);
+     145                 :             : 
+     146                 :           0 :   out:
+     147                 :           2 :     g_object_unref (invocation);
+     148                 :           2 : }
+     149                 :             : 
+     150                 :             : /*
+     151                 :             :  * Setup
+     152                 :             :  */
+     153                 :             : static void
+     154                 :           1 : on_name_appeared (GDBusConnection *connection,
+     155                 :             :                   const char      *name,
+     156                 :             :                   const char      *name_owner,
+     157                 :             :                   gpointer         user_data)
+     158                 :             : {
+     159                 :           1 :   ValentGtkNotifications *self = VALENT_GTK_NOTIFICATIONS (user_data);
+     160                 :             : 
+     161         [ +  - ]:           1 :   g_assert (VALENT_IS_GTK_NOTIFICATIONS (self));
+     162                 :             : 
+     163         [ -  + ]:           1 :   self->name_owner = g_strdup (name_owner);
+     164                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     165                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     166                 :             :                                          NULL);
+     167                 :           1 : }
+     168                 :             : 
+     169                 :             : static void
+     170                 :           0 : on_name_vanished (GDBusConnection *connection,
+     171                 :             :                   const char      *name,
+     172                 :             :                   gpointer         user_data)
+     173                 :             : {
+     174                 :           0 :   ValentGtkNotifications *self = VALENT_GTK_NOTIFICATIONS (user_data);
+     175                 :             : 
+     176         [ #  # ]:           0 :   g_assert (VALENT_IS_GTK_NOTIFICATIONS (self));
+     177                 :             : 
+     178         [ #  # ]:           0 :   g_clear_pointer (&self->name_owner, g_free);
+     179                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     180                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     181                 :             :                                          NULL);
+     182                 :           0 : }
+     183                 :             : 
+     184                 :             : static void
+     185                 :           1 : become_monitor_cb (GDBusConnection *connection,
+     186                 :             :                    GAsyncResult    *result,
+     187                 :             :                    gpointer         user_data)
+     188                 :             : {
+     189                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     190                 :           1 :   ValentGtkNotifications *self = g_task_get_source_object (task);
+     191   [ -  -  +  - ]:           1 :   g_autoptr (GVariant) reply = NULL;
+     192         [ -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     193                 :             : 
+     194                 :           1 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     195                 :             : 
+     196         [ -  + ]:           1 :   if (reply == NULL)
+     197                 :             :     {
+     198                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     199                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     200                 :             :                                              error);
+     201         [ #  # ]:           0 :       g_clear_object (&self->monitor);
+     202                 :           0 :       g_dbus_error_strip_remote_error (error);
+     203         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     204                 :             :     }
+     205                 :             : 
+     206                 :             :   /* Watch the true name owner*/
+     207                 :           1 :   self->name_owner_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
+     208                 :             :                                           "org.gtk.Notifications",
+     209                 :             :                                           G_BUS_NAME_WATCHER_FLAGS_NONE,
+     210                 :             :                                           on_name_appeared,
+     211                 :             :                                           on_name_vanished,
+     212                 :             :                                           self, NULL);
+     213                 :             : 
+     214                 :             :   /* Report the adapter as active */
+     215                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     216                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     217                 :             :                                          NULL);
+     218         [ -  + ]:           1 :   g_task_return_boolean (task, TRUE);
+     219                 :             : }
+     220                 :             : 
+     221                 :             : static void
+     222                 :           1 : new_for_address_cb (GObject      *object,
+     223                 :             :                     GAsyncResult *result,
+     224                 :             :                     gpointer      user_data)
+     225                 :             : {
+     226                 :           1 :   g_autoptr (GTask) task = G_TASK (user_data);
+     227                 :           1 :   ValentGtkNotifications *self = g_task_get_source_object (task);
+     228                 :           1 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     229         [ -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     230                 :             : 
+     231                 :           1 :   self->monitor = g_dbus_connection_new_for_address_finish (result, &error);
+     232                 :             : 
+     233         [ -  + ]:           1 :   if (self->monitor == NULL)
+     234                 :             :     {
+     235                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     236                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     237                 :             :                                              error);
+     238                 :           0 :       g_dbus_error_strip_remote_error (error);
+     239                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     240                 :             :     }
+     241                 :             : 
+     242                 :             :   /* Export the monitor interface */
+     243                 :           2 :   self->monitor_id =
+     244                 :           1 :     g_dbus_connection_register_object (self->monitor,
+     245                 :             :                                        "/org/gtk/Notifications",
+     246                 :             :                                        self->iface_info,
+     247                 :           1 :                                        &self->vtable,
+     248                 :             :                                        self, NULL,
+     249                 :             :                                        &error);
+     250                 :             : 
+     251         [ -  + ]:           1 :   if (self->monitor_id == 0)
+     252                 :             :     {
+     253                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     254                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     255                 :             :                                              error);
+     256         [ #  # ]:           0 :       g_clear_object (&self->monitor);
+     257                 :           0 :       g_dbus_error_strip_remote_error (error);
+     258                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     259                 :             :     }
+     260                 :             : 
+     261                 :             :   /* Become a monitor for notifications */
+     262         [ -  + ]:           1 :   g_dbus_connection_call (self->monitor,
+     263                 :             :                           "org.freedesktop.DBus",
+     264                 :             :                           "/org/freedesktop/DBus",
+     265                 :             :                           "org.freedesktop.DBus.Monitoring",
+     266                 :             :                           "BecomeMonitor",
+     267                 :             :                           g_variant_new ("(^asu)", interface_matches, 0),
+     268                 :             :                           NULL,
+     269                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     270                 :             :                           -1,
+     271                 :             :                           cancellable,
+     272                 :             :                           (GAsyncReadyCallback)become_monitor_cb,
+     273                 :             :                           g_steal_pointer (&task));
+     274                 :             : }
+     275                 :             : 
+     276                 :             : 
+     277                 :             : /*
+     278                 :             :  * GAsyncInitable
+     279                 :             :  */
+     280                 :             : static void
+     281                 :           1 : valent_gtk_notifications_init_async (GAsyncInitable      *initable,
+     282                 :             :                                      int                  io_priority,
+     283                 :             :                                      GCancellable        *cancellable,
+     284                 :             :                                      GAsyncReadyCallback  callback,
+     285                 :             :                                      gpointer             user_data)
+     286                 :             : {
+     287                 :           1 :   g_autoptr (GTask) task = NULL;
+     288         [ -  - ]:           1 :   g_autoptr (GCancellable) destroy = NULL;
+     289   [ -  -  +  - ]:           1 :   g_autofree char *address = NULL;
+     290                 :           1 :   g_autoptr (GError) error = NULL;
+     291                 :             : 
+     292         [ +  - ]:           1 :   g_assert (VALENT_IS_GTK_NOTIFICATIONS (initable));
+     293                 :             : 
+     294                 :             :   /* Cede the primary position until complete */
+     295                 :           1 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     296                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     297                 :             :                                          NULL);
+     298                 :             : 
+     299                 :             :   /* Cancel initialization if the object is destroyed */
+     300                 :           1 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     301                 :             :                                              cancellable);
+     302                 :             : 
+     303                 :           1 :   task = g_task_new (initable, destroy, callback, user_data);
+     304                 :           1 :   g_task_set_priority (task, io_priority);
+     305         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_gtk_notifications_init_async);
+     306                 :             : 
+     307                 :             :   /* Get a bus address */
+     308                 :           1 :   address = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION,
+     309                 :             :                                              destroy,
+     310                 :             :                                              &error);
+     311                 :             : 
+     312         [ -  + ]:           1 :   if (address == NULL)
+     313                 :             :     {
+     314                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     315                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     316                 :             :                                              error);
+     317         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     318                 :             :     }
+     319                 :             : 
+     320                 :             :   /* Get a dedicated connection for monitoring */
+     321         [ -  + ]:           1 :   g_dbus_connection_new_for_address (address,
+     322                 :             :                                      G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+     323                 :             :                                      G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
+     324                 :             :                                      NULL,
+     325                 :             :                                      destroy,
+     326                 :             :                                      (GAsyncReadyCallback)new_for_address_cb,
+     327                 :             :                                      g_steal_pointer (&task));
+     328                 :             : }
+     329                 :             : 
+     330                 :             : static void
+     331                 :           2 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     332                 :             : {
+     333                 :           2 :   iface->init_async = valent_gtk_notifications_init_async;
+     334                 :           2 : }
+     335                 :             : 
+     336                 :             : /*
+     337                 :             :  * ValentObject
+     338                 :             :  */
+     339                 :             : static void
+     340                 :           1 : valent_gtk_notifications_destroy (ValentObject *object)
+     341                 :             : {
+     342                 :           1 :   ValentGtkNotifications *self = VALENT_GTK_NOTIFICATIONS (object);
+     343                 :             : 
+     344         [ +  - ]:           1 :   if (self->name_owner_id > 0)
+     345                 :             :     {
+     346                 :           1 :       g_clear_handle_id (&self->name_owner_id, g_bus_unwatch_name);
+     347         [ +  - ]:           1 :       g_clear_pointer (&self->name_owner, g_free);
+     348                 :             :     }
+     349                 :             : 
+     350         [ +  - ]:           1 :   if (self->monitor_id != 0)
+     351                 :             :     {
+     352                 :           1 :       g_dbus_connection_unregister_object (self->monitor, self->monitor_id);
+     353                 :           1 :       self->monitor_id = 0;
+     354                 :             :     }
+     355                 :             : 
+     356         [ +  - ]:           1 :   g_clear_object (&self->monitor);
+     357                 :             : 
+     358                 :           1 :   VALENT_OBJECT_CLASS (valent_gtk_notifications_parent_class)->destroy (object);
+     359                 :           1 : }
+     360                 :             : 
+     361                 :             : /*
+     362                 :             :  * GObject
+     363                 :             :  */
+     364                 :             : static void
+     365                 :           1 : valent_gtk_notifications_finalize (GObject *object)
+     366                 :             : {
+     367                 :           1 :   ValentGtkNotifications *self = VALENT_GTK_NOTIFICATIONS (object);
+     368                 :             : 
+     369         [ +  - ]:           1 :   g_clear_pointer (&self->node_info, g_dbus_node_info_unref);
+     370                 :             : 
+     371                 :           1 :   G_OBJECT_CLASS (valent_gtk_notifications_parent_class)->finalize(object);
+     372                 :           1 : }
+     373                 :             : 
+     374                 :             : static void
+     375                 :           2 : valent_gtk_notifications_class_init (ValentGtkNotificationsClass *klass)
+     376                 :             : {
+     377                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     378                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     379                 :             : 
+     380                 :           2 :   object_class->finalize = valent_gtk_notifications_finalize;
+     381                 :             : 
+     382                 :           2 :   vobject_class->destroy = valent_gtk_notifications_destroy;
+     383                 :             : }
+     384                 :             : 
+     385                 :             : static void
+     386                 :           1 : valent_gtk_notifications_init (ValentGtkNotifications *self)
+     387                 :             : {
+     388                 :           1 :   self->node_info = g_dbus_node_info_new_for_xml (interface_xml, NULL);
+     389                 :           1 :   self->iface_info = self->node_info->interfaces[0];
+     390                 :             : 
+     391                 :           1 :   self->vtable.method_call = valent_gtk_notifications_method_call;
+     392                 :           1 :   self->vtable.get_property = NULL;
+     393                 :           1 :   self->vtable.set_property = NULL;
+     394                 :           1 : }
+     395                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gtk-notifications.h.func-c.html b/coverage/src/plugins/gtk/valent-gtk-notifications.h.func-c.html new file mode 100644 index 00000000000..730d6d05fca --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gtk-notifications.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gtk-notifications.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gtk-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_GTK_NOTIFICATIONS4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gtk-notifications.h.func.html b/coverage/src/plugins/gtk/valent-gtk-notifications.h.func.html new file mode 100644 index 00000000000..76413ed1e8e --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gtk-notifications.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gtk-notifications.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gtk-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_GTK_NOTIFICATIONS4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/gtk/valent-gtk-notifications.h.gcov.html b/coverage/src/plugins/gtk/valent-gtk-notifications.h.gcov.html new file mode 100644 index 00000000000..816aa835dcc --- /dev/null +++ b/coverage/src/plugins/gtk/valent-gtk-notifications.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/gtk/valent-gtk-notifications.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/gtk - valent-gtk-notifications.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_GTK_NOTIFICATIONS (valent_gtk_notifications_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           4 : G_DECLARE_FINAL_TYPE (ValentGtkNotifications, valent_gtk_notifications, VALENT, GTK_NOTIFICATIONS, ValentNotificationsAdapter)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-detail-sort-b.html b/coverage/src/plugins/lan/index-detail-sort-b.html new file mode 100644 index 00000000000..ae7a2a7012d --- /dev/null +++ b/coverage/src/plugins/lan/index-detail-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-detail-sort-f.html b/coverage/src/plugins/lan/index-detail-sort-f.html new file mode 100644 index 00000000000..b0c12133c1d --- /dev/null +++ b/coverage/src/plugins/lan/index-detail-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-detail-sort-l.html b/coverage/src/plugins/lan/index-detail-sort-l.html new file mode 100644 index 00000000000..cc914a2b59d --- /dev/null +++ b/coverage/src/plugins/lan/index-detail-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-detail.html b/coverage/src/plugins/lan/index-detail.html new file mode 100644 index 00000000000..7904c4e52c9 --- /dev/null +++ b/coverage/src/plugins/lan/index-detail.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-sort-b.html b/coverage/src/plugins/lan/index-sort-b.html new file mode 100644 index 00000000000..ae7a2a7012d --- /dev/null +++ b/coverage/src/plugins/lan/index-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-sort-f.html b/coverage/src/plugins/lan/index-sort-f.html new file mode 100644 index 00000000000..b0c12133c1d --- /dev/null +++ b/coverage/src/plugins/lan/index-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index-sort-l.html b/coverage/src/plugins/lan/index-sort-l.html new file mode 100644 index 00000000000..cc914a2b59d --- /dev/null +++ b/coverage/src/plugins/lan/index-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/index.html b/coverage/src/plugins/lan/index.html new file mode 100644 index 00000000000..7904c4e52c9 --- /dev/null +++ b/coverage/src/plugins/lan/index.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lanCoverageTotalHit
Test:Code CoverageLines:80.4 %12481004
Test Date:2024-03-31 18:46:36Functions:92.5 %9386
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:43.8 %1016445
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lan-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-lan-channel-service.c +
78.3%78.3%
+
78.3 %49839042.1 %40617189.3 %2825
valent-lan-channel-service.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-channel.c +
83.9%83.9%
+
83.9 %19216144.5 %1285793.8 %1615
valent-lan-channel.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-dnssd.c +
81.5%81.5%
+
81.5 %44336144.7 %28212691.7 %3633
valent-lan-dnssd.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lan-utils.c +
78.9%78.9%
+
78.9 %1098645.1 %18282100.0 %99
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/lan-plugin.c.func-c.html b/coverage/src/plugins/lan/lan-plugin.c.func-c.html new file mode 100644 index 00000000000..2ba07ecb33a --- /dev/null +++ b/coverage/src/plugins/lan/lan-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/lan-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - lan-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lan_channel_service_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/lan-plugin.c.func.html b/coverage/src/plugins/lan/lan-plugin.c.func.html new file mode 100644 index 00000000000..63dcb1548c8 --- /dev/null +++ b/coverage/src/plugins/lan/lan-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/lan-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - lan-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lan_channel_service_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/lan-plugin.c.gcov.html b/coverage/src/plugins/lan/lan-plugin.c.gcov.html new file mode 100644 index 00000000000..6b955e06d43 --- /dev/null +++ b/coverage/src/plugins/lan/lan-plugin.c.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/lan-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - lan-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-lan-channel-service.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           1 : valent_lan_channel_service_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           1 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_CHANNEL_SERVICE,
+      17                 :             :                                               VALENT_TYPE_LAN_CHANNEL_SERVICE);
+      18                 :           1 : }
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel-service.c.func-c.html b/coverage/src/plugins/lan/valent-lan-channel-service.c.func-c.html new file mode 100644 index 00000000000..a23fa6566c5 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel-service.c.func-c.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel-service.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel-service.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.3 %498390
Test Date:2024-03-31 18:46:36Functions:89.3 %2825
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.1 %406171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_channel_destroyed0
on_network_changed0
valent_lan_channel_service_get_property0
g_async_initable_iface_init1
incoming_connection_timeout_cb1
on_incoming_connection1
valent_lan_channel_service_class_init1
valent_lan_channel_service_identify1
incoming_broadcast_task2
valent_lan_channel_service_channel3
valent_lan_channel_service_finalize3
valent_lan_channel_service_init3
valent_lan_channel_service_init_async3
valent_lan_channel_service_init_task3
valent_lan_channel_service_socket_worker3
valent_lan_channel_service_tcp_setup3
valent_lan_channel_service_udp_setup3
valent_lan_channel_service_verify_channel3
valent_lan_channel_service_build_identity6
valent_lan_channel_service_destroy6
valent_lan_channel_service_set_property6
on_items_changed8
valent_lan_channel_service_socket_queue8
valent_lan_channel_service_socket_send8
valent_lan_channel_service_socket_recv12
valent_lan_channel_service_get_type47
valent_lan_channel_service_class_intern_init1
valent_lan_channel_service_get_type_once1
valent_lan_channel_service_get_type45
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel-service.c.func.html b/coverage/src/plugins/lan/valent-lan-channel-service.c.func.html new file mode 100644 index 00000000000..af043eb9150 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel-service.c.func.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel-service.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel-service.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.3 %498390
Test Date:2024-03-31 18:46:36Functions:89.3 %2825
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.1 %406171
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init1
incoming_broadcast_task2
incoming_connection_timeout_cb1
on_channel_destroyed0
on_incoming_connection1
on_items_changed8
on_network_changed0
valent_lan_channel_service_build_identity6
valent_lan_channel_service_channel3
valent_lan_channel_service_class_init1
valent_lan_channel_service_destroy6
valent_lan_channel_service_finalize3
valent_lan_channel_service_get_property0
valent_lan_channel_service_get_type47
valent_lan_channel_service_class_intern_init1
valent_lan_channel_service_get_type45
valent_lan_channel_service_get_type_once1
valent_lan_channel_service_identify1
valent_lan_channel_service_init3
valent_lan_channel_service_init_async3
valent_lan_channel_service_init_task3
valent_lan_channel_service_set_property6
valent_lan_channel_service_socket_queue8
valent_lan_channel_service_socket_recv12
valent_lan_channel_service_socket_send8
valent_lan_channel_service_socket_worker3
valent_lan_channel_service_tcp_setup3
valent_lan_channel_service_udp_setup3
valent_lan_channel_service_verify_channel3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel-service.c.gcov.html b/coverage/src/plugins/lan/valent-lan-channel-service.c.gcov.html new file mode 100644 index 00000000000..10aafe41564 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel-service.c.gcov.html @@ -0,0 +1,1264 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel-service.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel-service.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.3 %498390
Test Date:2024-03-31 18:46:36Functions:89.3 %2825
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:42.1 %406171
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-lan-channel-service"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gio/gunixinputstream.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-lan-channel.h"
+      13                 :             : #include "valent-lan-channel-service.h"
+      14                 :             : #include "valent-lan-dnssd.h"
+      15                 :             : #include "valent-lan-utils.h"
+      16                 :             : 
+      17                 :             : #define IDENTITY_BUFFER_MAX  (8192)
+      18                 :             : #define IDENTITY_TIMEOUT_MAX (1000)
+      19                 :             : 
+      20                 :             : 
+      21                 :             : struct _ValentLanChannelService
+      22                 :             : {
+      23                 :             :   ValentChannelService  parent_instance;
+      24                 :             : 
+      25                 :             :   GNetworkMonitor      *monitor;
+      26                 :             :   gboolean              network_available;
+      27                 :             : 
+      28                 :             :   /* Service */
+      29                 :             :   uint16_t              port;
+      30                 :             :   uint16_t              tcp_port;
+      31                 :             :   char                 *broadcast_address;
+      32                 :             :   GListModel           *dnssd;
+      33                 :             :   GSocketService       *listener;
+      34                 :             :   GMainLoop            *udp_context;
+      35                 :             :   GSocket              *udp_socket4;
+      36                 :             :   GSocket              *udp_socket6;
+      37                 :             :   GHashTable           *channels;
+      38                 :             : };
+      39                 :             : 
+      40                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      41                 :             : 
+      42   [ +  +  +  - ]:          47 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentLanChannelService, valent_lan_channel_service, VALENT_TYPE_CHANNEL_SERVICE,
+      43                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      44                 :             : 
+      45                 :             : enum {
+      46                 :             :   PROP_0,
+      47                 :             :   PROP_BROADCAST_ADDRESS,
+      48                 :             :   PROP_PORT,
+      49                 :             :   N_PROPERTIES
+      50                 :             : };
+      51                 :             : 
+      52                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      53                 :             : 
+      54                 :             : 
+      55                 :             : static void
+      56                 :           0 : on_network_changed (GNetworkMonitor         *monitor,
+      57                 :             :                     gboolean                 network_available,
+      58                 :             :                     ValentLanChannelService *self)
+      59                 :             : {
+      60         [ #  # ]:           0 :   if (self->network_available == network_available)
+      61                 :             :     return;
+      62                 :             : 
+      63         [ #  # ]:           0 :   if ((self->network_available = network_available))
+      64                 :           0 :     valent_channel_service_identify (VALENT_CHANNEL_SERVICE (self), NULL);
+      65                 :             : }
+      66                 :             : 
+      67                 :             : static void
+      68                 :           0 : on_channel_destroyed (ValentLanChannelService *self,
+      69                 :             :                       ValentLanChannel        *channel)
+      70                 :             : {
+      71                 :           0 :   g_autoptr (GTlsCertificate) certificate = NULL;
+      72                 :           0 :   const char *device_id = NULL;
+      73                 :             : 
+      74         [ #  # ]:           0 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+      75         [ #  # ]:           0 :   g_assert (VALENT_IS_LAN_CHANNEL (channel));
+      76                 :             : 
+      77                 :           0 :   certificate = valent_lan_channel_ref_peer_certificate (channel);
+      78                 :           0 :   device_id = valent_certificate_get_common_name (certificate);
+      79                 :             : 
+      80                 :           0 :   valent_object_lock (VALENT_OBJECT (self));
+      81         [ #  # ]:           0 :   if (g_hash_table_remove (self->channels, device_id))
+      82                 :           0 :     g_signal_handlers_disconnect_by_data (channel, self);
+      83         [ #  # ]:           0 :   valent_object_unlock (VALENT_OBJECT (self));
+      84                 :           0 : }
+      85                 :             : 
+      86                 :             : /**
+      87                 :             :  * valent_lan_channel_service_verify_channel:
+      88                 :             :  * @self: a `ValentLanChannelService`
+      89                 :             :  * @identity: a KDE Connect identity packet
+      90                 :             :  * @connection: a `GTlsConnection`
+      91                 :             :  *
+      92                 :             :  * Verify an encrypted TLS connection.
+      93                 :             :  *
+      94                 :             :  * @device_id should be the `deviceID` field from an identity packet. If it does
+      95                 :             :  * not match the common name for the peer certificate, %FALSE will be returned.
+      96                 :             :  *
+      97                 :             :  * @connection should be an encrypted TLS connection. If there is an existing
+      98                 :             :  * channel for @device_id with a different certificate, %FALSE will be returned.
+      99                 :             :  *
+     100                 :             :  * Returns: %TRUE if successful, or %FALSE on failure
+     101                 :             :  */
+     102                 :             : static gboolean
+     103                 :           3 : valent_lan_channel_service_verify_channel (ValentLanChannelService *self,
+     104                 :             :                                            JsonNode                *identity,
+     105                 :             :                                            GIOStream               *connection)
+     106                 :             : {
+     107                 :           3 :   ValentLanChannel *channel = NULL;
+     108                 :           6 :   g_autoptr (GTlsCertificate) certificate = NULL;
+     109         [ -  + ]:           3 :   g_autoptr (GTlsCertificate) peer_certificate = NULL;
+     110                 :           3 :   const char *peer_certificate_cn = NULL;
+     111                 :           3 :   const char *device_id = NULL;
+     112                 :             : 
+     113         [ +  - ]:           3 :   g_assert (VALENT_IS_CHANNEL_SERVICE (self));
+     114         [ -  + ]:           3 :   g_assert (VALENT_IS_PACKET (identity));;
+     115   [ +  -  +  -  :           3 :   g_assert (G_IS_TLS_CONNECTION (connection));
+             +  -  -  + ]
+     116                 :             : 
+     117         [ -  + ]:           3 :   if (!valent_packet_get_string (identity, "deviceId", &device_id))
+     118                 :             :     {
+     119                 :           0 :       g_debug ("%s(): expected \"deviceId\" field holding a string",
+     120                 :             :                G_STRFUNC);
+     121                 :           0 :       return FALSE;
+     122                 :             :     }
+     123                 :             : 
+     124                 :           3 :   g_object_get (connection, "peer-certificate", &peer_certificate, NULL);
+     125                 :           3 :   peer_certificate_cn = valent_certificate_get_common_name (peer_certificate);
+     126                 :             : 
+     127         [ -  + ]:           3 :   if (g_strcmp0 (device_id, peer_certificate_cn) != 0)
+     128                 :             :     {
+     129                 :           0 :       g_warning ("%s(): device ID does not match certificate common name",
+     130                 :             :                  G_STRFUNC);
+     131                 :           0 :       return FALSE;
+     132                 :             :     }
+     133                 :             : 
+     134                 :           3 :   valent_object_lock (VALENT_OBJECT (self));
+     135         [ -  + ]:           3 :   if ((channel = g_hash_table_lookup (self->channels, device_id)) != NULL)
+     136                 :           0 :     certificate = valent_lan_channel_ref_peer_certificate (channel);
+     137                 :           3 :   valent_object_unlock (VALENT_OBJECT (self));
+     138                 :             : 
+     139   [ -  +  -  - ]:           3 :   if (certificate && !g_tls_certificate_is_same (certificate, peer_certificate))
+     140                 :             :     {
+     141                 :           0 :       g_warning ("%s(): existing channel with different certificate",
+     142                 :             :                  G_STRFUNC);
+     143                 :           0 :       return FALSE;
+     144                 :             :     }
+     145                 :             : 
+     146                 :             :   return TRUE;
+     147                 :             : }
+     148                 :             : 
+     149                 :             : /*
+     150                 :             :  * Incoming TCP Connections
+     151                 :             :  *
+     152                 :             :  * When an incoming connection is opened to the TCP listener, we are operating
+     153                 :             :  * as the client. The server expects us to:
+     154                 :             :  *
+     155                 :             :  * 1) Accept the TCP connection
+     156                 :             :  * 2) Read the peer identity packet
+     157                 :             :  * 3) Negotiate TLS encryption (as the TLS Client)
+     158                 :             :  */
+     159                 :             : static gboolean
+     160                 :           1 : incoming_connection_timeout_cb (gpointer data)
+     161                 :             : {
+     162   [ +  -  +  -  :           1 :   g_assert (G_IS_CANCELLABLE (data));
+             -  +  -  - ]
+     163                 :             : 
+     164                 :           1 :   g_cancellable_cancel ((GCancellable *)data);
+     165                 :             : 
+     166                 :           1 :   return G_SOURCE_REMOVE;
+     167                 :             : }
+     168                 :             : 
+     169                 :             : static gboolean
+     170                 :           1 : on_incoming_connection (ValentChannelService   *service,
+     171                 :             :                         GSocketConnection      *connection,
+     172                 :             :                         GCancellable           *cancellable,
+     173                 :             :                         GThreadedSocketService *listener)
+     174                 :             : {
+     175                 :           1 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (service);
+     176                 :           2 :   g_autoptr (GCancellable) timeout = NULL;
+     177                 :           1 :   unsigned long cancellable_id = 0;
+     178         [ +  - ]:           1 :   g_autoptr (GSocketAddress) s_addr = NULL;
+     179                 :           1 :   GInetAddress *i_addr = NULL;
+     180         [ +  - ]:           1 :   g_autofree char *host = NULL;
+     181                 :           1 :   int64_t port = VALENT_LAN_PROTOCOL_PORT;
+     182                 :           1 :   g_autoptr (JsonNode) identity = NULL;
+     183         [ +  - ]:           1 :   g_autoptr (JsonNode) peer_identity = NULL;
+     184                 :           1 :   const char *device_id;
+     185         [ +  - ]:           1 :   g_autoptr (GTlsCertificate) certificate = NULL;
+     186         [ +  - ]:           1 :   g_autoptr (GIOStream) tls_stream = NULL;
+     187         [ +  - ]:           1 :   g_autoptr (ValentChannel) channel = NULL;
+     188         [ +  - ]:           1 :   g_autoptr (GError) warning = NULL;
+     189                 :             : 
+     190         [ +  - ]:           1 :   g_assert (VALENT_IS_CHANNEL_SERVICE (service));
+     191         [ -  + ]:           1 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+     192                 :             : 
+     193                 :             :   /* Timeout if the peer fails to authenticate in a timely fashion. */
+     194                 :           1 :   timeout = g_cancellable_new ();
+     195                 :           1 :   g_timeout_add_full (G_PRIORITY_DEFAULT,
+     196                 :             :                       IDENTITY_TIMEOUT_MAX,
+     197                 :             :                       incoming_connection_timeout_cb,
+     198                 :             :                       g_object_ref (timeout),
+     199                 :             :                       g_object_unref);
+     200                 :             : 
+     201         [ +  - ]:           1 :   if (cancellable != NULL)
+     202                 :           1 :     cancellable_id = g_cancellable_connect (cancellable,
+     203                 :             :                                             G_CALLBACK (g_cancellable_cancel),
+     204                 :             :                                             timeout,
+     205                 :             :                                             NULL);
+     206                 :             : 
+     207                 :             :   /* An incoming TCP connection is in response to an outgoing UDP packet, so the
+     208                 :             :    * the peer must now write its identity packet. */
+     209                 :           1 :   peer_identity = valent_packet_from_stream (g_io_stream_get_input_stream (G_IO_STREAM (connection)),
+     210                 :             :                                              IDENTITY_BUFFER_MAX,
+     211                 :             :                                              timeout,
+     212                 :             :                                              &warning);
+     213                 :             : 
+     214         [ -  + ]:           1 :   if (peer_identity == NULL)
+     215                 :             :     {
+     216         [ #  # ]:           0 :       if (!g_error_matches (warning, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     217                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, warning->message);
+     218         [ #  # ]:           0 :       else if (!g_cancellable_is_cancelled (cancellable))
+     219                 :           0 :         g_warning ("%s(): timed out waiting for peer identity", G_STRFUNC);
+     220                 :             : 
+     221                 :           0 :       g_cancellable_disconnect (cancellable, cancellable_id);
+     222                 :             : 
+     223                 :           0 :       return TRUE;
+     224                 :             :     }
+     225                 :             : 
+     226                 :             :   /* Ignore identity packets without a deviceId */
+     227         [ -  + ]:           1 :   if (!valent_packet_get_string (peer_identity, "deviceId", &device_id))
+     228                 :             :     {
+     229                 :           0 :       g_debug ("%s(): expected \"deviceId\" field holding a string",
+     230                 :             :                G_STRFUNC);
+     231                 :           0 :       return TRUE;
+     232                 :             :     }
+     233                 :             : 
+     234                 :           1 :   VALENT_JSON (peer_identity, host);
+     235                 :             : 
+     236                 :             :   /* NOTE: We're the client when accepting incoming connections */
+     237                 :           1 :   certificate = valent_channel_service_ref_certificate (service);
+     238                 :           1 :   tls_stream = valent_lan_encrypt_client_connection (connection,
+     239                 :             :                                                      certificate,
+     240                 :             :                                                      timeout,
+     241                 :             :                                                      &warning);
+     242                 :           1 :   g_cancellable_disconnect (cancellable, cancellable_id);
+     243                 :             : 
+     244         [ -  + ]:           1 :   if (tls_stream == NULL)
+     245                 :             :     {
+     246         [ #  # ]:           0 :       if (!g_error_matches (warning, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     247                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, warning->message);
+     248         [ #  # ]:           0 :       else if (!g_cancellable_is_cancelled (cancellable))
+     249                 :           0 :         g_warning ("%s(): timed out waiting for authentication", G_STRFUNC);
+     250                 :             : 
+     251                 :           0 :       return TRUE;
+     252                 :             :     }
+     253                 :             : 
+     254         [ +  - ]:           1 :   if (!valent_lan_channel_service_verify_channel (self, peer_identity, tls_stream))
+     255                 :             :     return TRUE;
+     256                 :             : 
+     257                 :             :   /* Get the host from the connection */
+     258                 :           1 :   s_addr = g_socket_connection_get_remote_address (connection, NULL);
+     259                 :           1 :   i_addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (s_addr));
+     260                 :           1 :   host = g_inet_address_to_string (i_addr);
+     261                 :           1 :   valent_packet_get_int (peer_identity, "tcpPort", &port);
+     262                 :             : 
+     263                 :             :   /* Create the new channel */
+     264                 :           1 :   identity = valent_channel_service_ref_identity (service);
+     265                 :           1 :   channel = g_object_new (VALENT_TYPE_LAN_CHANNEL,
+     266                 :             :                           "base-stream",   tls_stream,
+     267                 :             :                           "host",          host,
+     268                 :           1 :                           "port",          (uint16_t)port,
+     269                 :             :                           "identity",      identity,
+     270                 :             :                           "peer-identity", peer_identity,
+     271                 :             :                           NULL);
+     272                 :             : 
+     273                 :           1 :   valent_channel_service_channel (service, channel);
+     274                 :             : 
+     275                 :           1 :   return TRUE;
+     276                 :             : }
+     277                 :             : 
+     278                 :             : /**
+     279                 :             :  * valent_lan_channel_service_tcp_setup:
+     280                 :             :  * @self: a `ValentLanChannelService`
+     281                 :             :  * @error: (nullable): a `GError`
+     282                 :             :  *
+     283                 :             :  * A wrapper around g_socket_listener_add_inet_port() that can be called
+     284                 :             :  * multiple times.
+     285                 :             :  *
+     286                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     287                 :             :  */
+     288                 :             : static gboolean
+     289                 :           3 : valent_lan_channel_service_tcp_setup (ValentLanChannelService  *self,
+     290                 :             :                                       GCancellable             *cancellable,
+     291                 :             :                                       GError                  **error)
+     292                 :             : {
+     293                 :           6 :   g_autoptr (GCancellable) destroy = NULL;
+     294         [ +  - ]:           3 :   g_autoptr (GSocketService) listener = NULL;
+     295                 :           3 :   uint16_t tcp_port = VALENT_LAN_PROTOCOL_PORT;
+     296                 :           3 :   uint16_t tcp_port_max;
+     297                 :             : 
+     298         [ +  - ]:           3 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+     299   [ +  -  +  -  :           3 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     300   [ +  -  -  + ]:           3 :   g_assert (error == NULL || *error == NULL);
+     301                 :             : 
+     302         [ +  - ]:           3 :   if (g_cancellable_set_error_if_cancelled (cancellable, error))
+     303                 :             :     return FALSE;
+     304                 :             : 
+     305                 :             :   /* The effective port range is actually relative to the construct-time
+     306                 :             :    *  `port`property, for running in test environments.
+     307                 :             :    */
+     308                 :           3 :   valent_object_lock (VALENT_OBJECT (self));
+     309                 :           3 :   tcp_port = self->port;
+     310                 :           3 :   tcp_port_max = tcp_port + (VALENT_LAN_PROTOCOL_PORT_MAX -
+     311                 :             :                              VALENT_LAN_PROTOCOL_PORT_MIN);
+     312                 :           3 :   valent_object_unlock (VALENT_OBJECT (self));
+     313                 :             : 
+     314                 :             :   /* Pass the service as the callback data for the "run" signal, while the
+     315                 :             :    * listener holds a reference to the object cancellable.
+     316                 :             :    */
+     317                 :           3 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     318                 :           3 :   listener = g_threaded_socket_service_new (g_get_num_processors ());
+     319                 :           3 :   g_signal_connect_object (listener,
+     320                 :             :                            "run",
+     321                 :             :                            G_CALLBACK (on_incoming_connection),
+     322                 :             :                            self,
+     323                 :             :                            G_CONNECT_SWAPPED);
+     324                 :             : 
+     325         [ -  + ]:           3 :   while (!g_socket_listener_add_inet_port (G_SOCKET_LISTENER (listener),
+     326                 :             :                                            tcp_port,
+     327                 :             :                                            G_OBJECT (destroy),
+     328                 :             :                                            error))
+     329                 :             :     {
+     330         [ #  # ]:           0 :       if (tcp_port >= tcp_port_max)
+     331                 :             :         {
+     332                 :           0 :           g_socket_service_stop (listener);
+     333                 :           0 :           g_socket_listener_close (G_SOCKET_LISTENER (listener));
+     334                 :             : 
+     335                 :           0 :           return FALSE;
+     336                 :             :         }
+     337                 :             : 
+     338                 :           0 :       g_clear_error (error);
+     339                 :           0 :       tcp_port++;
+     340                 :             :     }
+     341                 :             : 
+     342                 :           3 :   valent_object_lock (VALENT_OBJECT (self));
+     343                 :           3 :   self->tcp_port = tcp_port;
+     344                 :           3 :   self->listener = g_object_ref (listener);
+     345                 :           3 :   valent_channel_service_build_identity (VALENT_CHANNEL_SERVICE (self));
+     346                 :           3 :   valent_object_unlock (VALENT_OBJECT (self));
+     347                 :             : 
+     348                 :           3 :   return TRUE;
+     349                 :             : }
+     350                 :             : 
+     351                 :             : /*
+     352                 :             :  * Incoming UDP Broadcasts
+     353                 :             :  *
+     354                 :             :  * When an identity packet is received over a UDP port (usually a broadcast), we
+     355                 :             :  * are operating as the server. The client expects us to:
+     356                 :             :  *
+     357                 :             :  * 1) Open a TCP connection
+     358                 :             :  * 2) Write our identity packet
+     359                 :             :  * 3) Negotiate TLS encryption (as the TLS Server)
+     360                 :             :  */
+     361                 :             : static void
+     362                 :           2 : incoming_broadcast_task (GTask        *task,
+     363                 :             :                          gpointer      source_object,
+     364                 :             :                          gpointer      task_data,
+     365                 :             :                          GCancellable *cancellable)
+     366                 :             : {
+     367                 :           2 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (source_object);
+     368                 :           2 :   ValentChannelService *service = VALENT_CHANNEL_SERVICE (source_object);
+     369                 :           2 :   GSocketAddress *address = G_SOCKET_ADDRESS (task_data);
+     370                 :           2 :   JsonNode *peer_identity = NULL;
+     371                 :           2 :   g_autoptr (GSocketClient) client = NULL;
+     372   [ +  -  -  - ]:           2 :   g_autoptr (GSocketConnection) connection = NULL;
+     373                 :           2 :   GInetAddress *addr = NULL;
+     374         [ -  - ]:           2 :   g_autoptr (JsonNode) identity = NULL;
+     375   [ +  -  -  - ]:           2 :   g_autoptr (ValentChannel) channel = NULL;
+     376   [ +  -  -  - ]:           2 :   g_autofree char *host = NULL;
+     377                 :           2 :   int64_t port = VALENT_LAN_PROTOCOL_PORT;
+     378                 :           2 :   GOutputStream *output_stream;
+     379                 :           2 :   g_autoptr (GTlsCertificate) certificate = NULL;
+     380   [ +  -  -  - ]:           2 :   g_autoptr (GIOStream) tls_stream = NULL;
+     381         [ -  - ]:           2 :   g_autoptr (GError) error = NULL;
+     382                 :             : 
+     383         [ +  - ]:           2 :   g_assert (VALENT_IS_CHANNEL_SERVICE (self));
+     384   [ +  -  +  -  :           2 :   g_assert (G_IS_SOCKET_ADDRESS (address));
+             +  -  -  + ]
+     385                 :             : 
+     386                 :           2 :   addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address));
+     387                 :           2 :   host = g_inet_address_to_string (addr);
+     388                 :           2 :   peer_identity = g_object_get_data (G_OBJECT (address), "valent-lan-broadcast");
+     389                 :           2 :   valent_packet_get_int (peer_identity, "tcpPort", &port);
+     390                 :             : 
+     391                 :             :   /* Open a TCP connection to the UDP sender and defined port.
+     392                 :             :    *
+     393                 :             :    * Disable the system proxy:
+     394                 :             :    *   - https://bugs.kde.org/show_bug.cgi?id=376187
+     395                 :             :    *   - https://github.com/andyholmes/gnome-shell-extension-gsconnect/issues/125
+     396                 :             :    */
+     397                 :           2 :   client = g_object_new (G_TYPE_SOCKET_CLIENT,
+     398                 :             :                          "enable-proxy", FALSE,
+     399                 :             :                          NULL);
+     400                 :           2 :   connection = g_socket_client_connect (client,
+     401                 :             :                                         G_SOCKET_CONNECTABLE (address),
+     402                 :             :                                         cancellable,
+     403                 :             :                                         &error);
+     404                 :             : 
+     405         [ -  + ]:           2 :   if (connection == NULL)
+     406                 :             :     {
+     407                 :           0 :       g_debug ("%s(): connecting to (%s:%"G_GINT64_FORMAT"): %s",
+     408                 :             :                G_STRFUNC, host, port, error->message);
+     409                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     410                 :             :     }
+     411                 :             : 
+     412                 :             :   /* Write the local identity. Once we do this, both peers will have the ability
+     413                 :             :    * to authenticate or reject TLS certificates.
+     414                 :             :    */
+     415                 :           2 :   identity = valent_channel_service_ref_identity (service);
+     416                 :           2 :   output_stream = g_io_stream_get_output_stream (G_IO_STREAM (connection));
+     417                 :             : 
+     418         [ -  + ]:           2 :   if (!valent_packet_to_stream (output_stream, identity, cancellable, &error))
+     419                 :             :     {
+     420                 :           0 :       g_debug ("%s(): sending identity to (%s:%"G_GINT64_FORMAT"): %s",
+     421                 :             :                G_STRFUNC, host, port, error->message);
+     422                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     423                 :             :     }
+     424                 :             : 
+     425                 :             :   /* NOTE: We're the server when opening outgoing connections */
+     426                 :           2 :   certificate = valent_channel_service_ref_certificate (service);
+     427                 :           2 :   tls_stream = valent_lan_encrypt_server_connection (connection,
+     428                 :             :                                                      certificate,
+     429                 :             :                                                      cancellable,
+     430                 :             :                                                      &error);
+     431                 :             : 
+     432         [ -  + ]:           2 :   if (tls_stream == NULL)
+     433                 :             :     {
+     434                 :           0 :       g_debug ("%s(): authenticating (%s:%"G_GINT64_FORMAT"): %s",
+     435                 :             :                G_STRFUNC, host, port, error->message);
+     436                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     437                 :             :     }
+     438                 :             : 
+     439         [ -  + ]:           2 :   if (!valent_lan_channel_service_verify_channel (self, peer_identity, tls_stream))
+     440                 :           0 :     return g_task_return_boolean (task, TRUE);
+     441                 :             : 
+     442                 :           2 :   channel = g_object_new (VALENT_TYPE_LAN_CHANNEL,
+     443                 :             :                           "base-stream",   tls_stream,
+     444                 :             :                           "host",          host,
+     445                 :             :                           "port",          port,
+     446                 :             :                           "identity",      identity,
+     447                 :             :                           "peer-identity", peer_identity,
+     448                 :             :                           NULL);
+     449                 :             : 
+     450                 :           2 :   valent_channel_service_channel (service, channel);
+     451         [ -  + ]:           2 :   g_task_return_boolean (task, TRUE);
+     452                 :             : }
+     453                 :             : 
+     454                 :             : static gboolean
+     455                 :          12 : valent_lan_channel_service_socket_recv (GSocket      *socket,
+     456                 :             :                                         GIOCondition  condition,
+     457                 :             :                                         gpointer      user_data)
+     458                 :             : {
+     459                 :          12 :   ValentChannelService *service = VALENT_CHANNEL_SERVICE (user_data);
+     460                 :          24 :   g_autoptr (GCancellable) cancellable = NULL;
+     461         [ +  + ]:          12 :   g_autoptr (GError) error = NULL;
+     462                 :          12 :   gssize read = 0;
+     463                 :          12 :   char buffer[IDENTITY_BUFFER_MAX + 1] = { 0, };
+     464         [ -  + ]:          12 :   g_autoptr (GSocketAddress) incoming = NULL;
+     465         [ +  + ]:          12 :   g_autoptr (GSocketAddress) outgoing = NULL;
+     466                 :          12 :   GInetAddress *addr = NULL;
+     467                 :          12 :   int64_t port = VALENT_LAN_PROTOCOL_PORT;
+     468         [ +  + ]:          12 :   g_autoptr (JsonNode) peer_identity = NULL;
+     469                 :          12 :   const char *device_id;
+     470         [ +  + ]:          12 :   g_autofree char *local_id = NULL;
+     471                 :          12 :   g_autoptr (GTask) task = NULL;
+     472         [ +  + ]:          12 :   g_autoptr (GError) warning = NULL;
+     473                 :             : 
+     474   [ +  -  +  -  :          12 :   g_assert (G_IS_SOCKET (socket));
+             -  +  -  - ]
+     475         [ -  + ]:          12 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (user_data));
+     476                 :             : 
+     477         [ +  + ]:          12 :   if (condition != G_IO_IN)
+     478                 :             :     return G_SOURCE_REMOVE;
+     479                 :             : 
+     480                 :           9 :   cancellable = valent_object_ref_cancellable (VALENT_OBJECT (service));
+     481                 :             : 
+     482                 :             :   /* Read the message data and extract the remote address */
+     483                 :           9 :   read = g_socket_receive_from (socket,
+     484                 :             :                                 &incoming,
+     485                 :             :                                 buffer,
+     486                 :             :                                 IDENTITY_BUFFER_MAX,
+     487                 :             :                                 cancellable,
+     488                 :             :                                 &error);
+     489                 :             : 
+     490         [ -  + ]:           9 :   if (read == -1)
+     491                 :             :     {
+     492         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     493                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     494                 :             : 
+     495                 :           0 :       return G_SOURCE_REMOVE;
+     496                 :             :     }
+     497                 :             : 
+     498         [ -  + ]:           9 :   if (read == 0)
+     499                 :             :     {
+     500                 :           0 :       g_warning ("%s(): Socket is closed", G_STRFUNC);
+     501                 :           0 :       return G_SOURCE_REMOVE;
+     502                 :             :     }
+     503                 :             : 
+     504                 :             :   /* Validate the message as a KDE Connect packet */
+     505         [ -  + ]:           9 :   if ((peer_identity = valent_packet_deserialize (buffer, &warning)) == NULL)
+     506                 :             :     {
+     507                 :           0 :       g_warning ("%s(): failed to parse peer-identity: %s",
+     508                 :             :                  G_STRFUNC,
+     509                 :             :                  warning->message);
+     510                 :           0 :       return G_SOURCE_CONTINUE;
+     511                 :             :     }
+     512                 :             : 
+     513                 :             :   /* Ignore broadcasts without a deviceId or from ourselves */
+     514         [ -  + ]:           9 :   if (!valent_packet_get_string (peer_identity, "deviceId", &device_id))
+     515                 :             :     {
+     516                 :           0 :       g_debug ("%s(): expected \"deviceId\" field holding a string",
+     517                 :             :                G_STRFUNC);
+     518                 :           0 :       return G_SOURCE_CONTINUE;
+     519                 :             :     }
+     520                 :             : 
+     521                 :           9 :   local_id = valent_channel_service_dup_id (service);
+     522                 :             : 
+     523         [ +  + ]:           9 :   if (g_strcmp0 (device_id, local_id) == 0)
+     524                 :             :     return G_SOURCE_CONTINUE;
+     525                 :             : 
+     526                 :           2 :   VALENT_JSON (peer_identity, device_id);
+     527                 :             : 
+     528                 :             :   /* Get the remote address and port */
+     529                 :           2 :   addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (incoming));
+     530                 :             : 
+     531         [ +  - ]:           2 :   if (!valent_packet_get_int (peer_identity, "tcpPort", &port) ||
+     532         [ -  + ]:           2 :       (port < VALENT_LAN_PROTOCOL_PORT_MIN || port > VALENT_LAN_PROTOCOL_PORT_MAX))
+     533                 :             :     {
+     534                 :           0 :       g_debug ("%s(): expected \"tcpPort\" field holding a uint16 between %u-%u",
+     535                 :             :                G_STRFUNC,
+     536                 :             :                VALENT_LAN_PROTOCOL_PORT_MIN,
+     537                 :             :                VALENT_LAN_PROTOCOL_PORT_MAX);
+     538                 :           0 :       return G_SOURCE_CONTINUE;
+     539                 :             :     }
+     540                 :             : 
+     541                 :             :   /* Defer the remaining work to another thread */
+     542                 :           2 :   outgoing = g_inet_socket_address_new (addr, port);
+     543                 :           2 :   g_object_set_data_full (G_OBJECT (outgoing),
+     544                 :             :                           "valent-lan-broadcast",
+     545                 :           2 :                           json_node_ref (peer_identity),
+     546                 :             :                           (GDestroyNotify)json_node_unref);
+     547                 :             : 
+     548                 :           2 :   task = g_task_new (service, cancellable, NULL, NULL);
+     549         [ +  - ]:           2 :   g_task_set_source_tag (task, valent_lan_channel_service_socket_recv);
+     550                 :           2 :   g_task_set_task_data (task, g_steal_pointer (&outgoing), g_object_unref);
+     551                 :           2 :   g_task_run_in_thread (task, incoming_broadcast_task);
+     552                 :             : 
+     553                 :           2 :   return G_SOURCE_CONTINUE;
+     554                 :             : }
+     555                 :             : 
+     556                 :             : static gboolean
+     557                 :           8 : valent_lan_channel_service_socket_send (GSocket      *socket,
+     558                 :             :                                         GIOCondition  condition,
+     559                 :             :                                         gpointer      user_data)
+     560                 :             : {
+     561                 :           8 :   GSocketAddress *address = G_SOCKET_ADDRESS (user_data);
+     562                 :           8 :   GBytes *bytes = NULL;
+     563                 :           8 :   gssize written;
+     564                 :          16 :   g_autoptr (GError) error = NULL;
+     565                 :             : 
+     566   [ +  -  +  -  :           8 :   g_assert (G_IS_SOCKET (socket));
+             -  +  -  - ]
+     567   [ +  -  +  -  :           8 :   g_assert (G_IS_SOCKET_ADDRESS (address));
+             +  -  -  + ]
+     568                 :             : 
+     569         [ +  - ]:           8 :   if (condition != G_IO_OUT)
+     570                 :             :     return G_SOURCE_REMOVE;
+     571                 :             : 
+     572                 :           8 :   bytes = g_object_get_data (G_OBJECT (address), "valent-lan-broadcast");
+     573                 :          16 :   written = g_socket_send_to (socket,
+     574                 :             :                               address,
+     575                 :           8 :                               g_bytes_get_data (bytes, NULL),
+     576                 :             :                               g_bytes_get_size (bytes),
+     577                 :             :                               NULL,
+     578                 :             :                               &error);
+     579                 :             : 
+     580                 :             :   /* We only check for real errors, not partial writes */
+     581         [ -  + ]:           8 :   if (written == -1)
+     582                 :           0 :     g_warning ("%s(): failed to identify: %s", G_STRFUNC, error->message);
+     583                 :             : 
+     584                 :             :   return G_SOURCE_REMOVE;
+     585                 :             : }
+     586                 :             : 
+     587                 :             : static void
+     588                 :           8 : valent_lan_channel_service_socket_queue (ValentLanChannelService *self,
+     589                 :             :                                          GSocketAddress          *address)
+     590                 :             : {
+     591                 :           0 :   g_autoptr (JsonNode) identity = NULL;
+     592         [ +  - ]:           8 :   g_autoptr (GBytes) identity_bytes = NULL;
+     593                 :           8 :   char *identity_json = NULL;
+     594                 :           8 :   GSocketFamily family = G_SOCKET_FAMILY_INVALID;
+     595                 :             : 
+     596         [ +  - ]:           8 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+     597   [ +  -  +  -  :           8 :   g_assert (G_IS_SOCKET_ADDRESS (address));
+             +  -  -  + ]
+     598                 :             : 
+     599                 :             :   /* Ignore errant socket addresses */
+     600                 :           8 :   family = g_socket_address_get_family (address);
+     601                 :             : 
+     602         [ -  + ]:           8 :   if (family != G_SOCKET_FAMILY_IPV4 && family != G_SOCKET_FAMILY_IPV6)
+     603                 :           0 :     g_return_if_reached ();
+     604                 :             : 
+     605                 :             :   /* Serialize the identity */
+     606                 :           8 :   identity = valent_channel_service_ref_identity (VALENT_CHANNEL_SERVICE (self));
+     607                 :           8 :   identity_json = valent_packet_serialize (identity);
+     608                 :           8 :   identity_bytes = g_bytes_new_take (identity_json, strlen (identity_json));
+     609                 :           8 :   g_object_set_data_full (G_OBJECT (address),
+     610                 :             :                           "valent-lan-broadcast",
+     611                 :           8 :                           g_bytes_ref (identity_bytes),
+     612                 :             :                           (GDestroyNotify)g_bytes_unref);
+     613                 :             : 
+     614                 :           8 :   valent_object_lock (VALENT_OBJECT (self));
+     615   [ +  -  +  -  :          16 :   if ((self->udp_socket6 != NULL && family == G_SOCKET_FAMILY_IPV6) ||
+                   +  - ]
+     616                 :           8 :       (self->udp_socket6 != NULL && g_socket_speaks_ipv4 (self->udp_socket6)))
+     617                 :             :     {
+     618                 :          16 :       g_autoptr (GSource) source = NULL;
+     619                 :             : 
+     620                 :           8 :       source = g_socket_create_source (self->udp_socket6, G_IO_OUT, NULL);
+     621                 :           8 :       g_source_set_callback (source,
+     622                 :             :                              G_SOURCE_FUNC (valent_lan_channel_service_socket_send),
+     623                 :             :                              g_object_ref (address),
+     624                 :             :                              g_object_unref);
+     625         [ +  - ]:           8 :       g_source_attach (source, g_main_loop_get_context (self->udp_context));
+     626                 :             :     }
+     627                 :             : 
+     628   [ -  +  -  - ]:           8 :   if (self->udp_socket4 != NULL && family == G_SOCKET_FAMILY_IPV4)
+     629                 :             :     {
+     630                 :           8 :       g_autoptr (GSource) source = NULL;
+     631                 :             : 
+     632                 :           0 :       source = g_socket_create_source (self->udp_socket4, G_IO_OUT, NULL);
+     633                 :           0 :       g_source_set_callback (source,
+     634                 :             :                              G_SOURCE_FUNC (valent_lan_channel_service_socket_send),
+     635                 :             :                              g_object_ref (address),
+     636                 :             :                              g_object_unref);
+     637         [ #  # ]:           0 :       g_source_attach (source, g_main_loop_get_context (self->udp_context));
+     638                 :             :     }
+     639         [ +  - ]:           8 :   valent_object_unlock (VALENT_OBJECT (self));
+     640                 :             : }
+     641                 :             : 
+     642                 :             : static gpointer
+     643                 :           3 : valent_lan_channel_service_socket_worker (gpointer data)
+     644                 :             : {
+     645                 :           6 :   g_autoptr (GMainLoop) loop = (GMainLoop *)data;
+     646                 :           3 :   GMainContext *context = g_main_loop_get_context (loop);
+     647                 :             : 
+     648                 :             :   /* The loop quits when the channel is closed, then the context is drained to
+     649                 :             :    * ensure all tasks return. */
+     650                 :           3 :   g_main_context_push_thread_default (context);
+     651                 :             : 
+     652                 :           3 :   g_main_loop_run (loop);
+     653                 :             : 
+     654         [ -  + ]:           3 :   while (g_main_context_pending (context))
+     655                 :           0 :     g_main_context_iteration (NULL, FALSE);
+     656                 :             : 
+     657                 :           3 :   g_main_context_pop_thread_default (context);
+     658                 :             : 
+     659         [ +  - ]:           3 :   return NULL;
+     660                 :             : }
+     661                 :             : 
+     662                 :             : static void
+     663                 :           8 : on_items_changed (GListModel              *list,
+     664                 :             :                   unsigned int             position,
+     665                 :             :                   unsigned int             removed,
+     666                 :             :                   unsigned int             added,
+     667                 :             :                   ValentLanChannelService *self)
+     668                 :             : {
+     669                 :           8 :   g_autofree char *service_id = NULL;
+     670                 :             : 
+     671         [ -  + ]:           8 :   if (added == 0)
+     672                 :           0 :     return;
+     673                 :             : 
+     674                 :           8 :   service_id = valent_channel_service_dup_id (VALENT_CHANNEL_SERVICE (self));
+     675                 :             : 
+     676         [ +  + ]:          16 :   for (unsigned int i = 0; i < added; i++)
+     677                 :             :     {
+     678                 :           8 :       g_autoptr (GSocketAddress) address = NULL;
+     679                 :           8 :       const char *device_id = NULL;
+     680                 :             : 
+     681                 :           8 :       address = g_list_model_get_item (list, position + i);
+     682                 :           8 :       device_id = _g_socket_address_get_dnssd_name (address);
+     683                 :             : 
+     684         [ +  + ]:           8 :       if (g_strcmp0 (service_id, device_id) == 0)
+     685         [ +  - ]:           1 :         continue;
+     686                 :             : 
+     687                 :           7 :       valent_object_lock (VALENT_OBJECT (self));
+     688         [ +  - ]:           7 :       if (!g_hash_table_contains (self->channels, device_id))
+     689                 :           7 :         valent_lan_channel_service_socket_queue (self, address);
+     690         [ +  - ]:           7 :       valent_object_unlock (VALENT_OBJECT (self));
+     691                 :             :     }
+     692                 :             : }
+     693                 :             : 
+     694                 :             : /**
+     695                 :             :  * valent_lan_channel_service_udp_setup:
+     696                 :             :  * @self: a `ValentLanChannelService`
+     697                 :             :  * @cancellable: (nullable): a `GCancellable`
+     698                 :             :  * @error: (nullable): a `GError`
+     699                 :             :  *
+     700                 :             :  * An analog to valent_lan_channel_service_tcp_setup() that prepares UDP sockets
+     701                 :             :  * for IPv4 and IPv6, including streams for reading.
+     702                 :             :  *
+     703                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     704                 :             :  */
+     705                 :             : static gboolean
+     706                 :           3 : valent_lan_channel_service_udp_setup (ValentLanChannelService  *self,
+     707                 :             :                                       GCancellable             *cancellable,
+     708                 :             :                                       GError                  **error)
+     709                 :             : {
+     710                 :           6 :   g_autoptr (GMainContext) context = NULL;
+     711         [ +  - ]:           3 :   g_autoptr (GMainLoop) loop = NULL;
+     712         [ +  - ]:           3 :   g_autoptr (GThread) thread = NULL;
+     713         [ +  - ]:           3 :   g_autoptr (GSocket) socket4 = NULL;
+     714         [ -  + ]:           3 :   g_autoptr (GSocket) socket6 = NULL;
+     715         [ +  - ]:           3 :   g_autoptr (GListModel) services = NULL;
+     716         [ +  - ]:           3 :   g_autoptr (GCancellable) destroy = NULL;
+     717                 :           3 :   uint16_t port = VALENT_LAN_PROTOCOL_PORT;
+     718                 :             : 
+     719                 :           3 :   VALENT_ENTRY;
+     720                 :             : 
+     721         [ +  - ]:           3 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+     722                 :           3 :   g_assert (cancellable == NULL || G_CANCELLABLE (cancellable));
+     723   [ +  -  -  + ]:           3 :   g_assert (error == NULL || *error == NULL);
+     724                 :             : 
+     725                 :             :   /* Prepare socket(s) for UDP-based discovery */
+     726                 :           3 :   valent_object_lock (VALENT_OBJECT (self));
+     727                 :           3 :   port = self->port;
+     728                 :           3 :   valent_object_unlock (VALENT_OBJECT (self));
+     729                 :             : 
+     730                 :           3 :   socket6 = g_socket_new (G_SOCKET_FAMILY_IPV6,
+     731                 :             :                           G_SOCKET_TYPE_DATAGRAM,
+     732                 :             :                           G_SOCKET_PROTOCOL_UDP,
+     733                 :             :                           NULL);
+     734                 :             : 
+     735         [ -  + ]:           3 :   if (socket6 != NULL)
+     736                 :             :     {
+     737                 :           6 :       g_autoptr (GInetAddress) inet_address = NULL;
+     738   [ -  -  +  -  :           3 :       g_autoptr (GSocketAddress) address = NULL;
+                   -  - ]
+     739                 :             : 
+     740                 :           3 :       inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV6);
+     741                 :           3 :       address = g_inet_socket_address_new (inet_address, port);
+     742                 :             : 
+     743         [ -  + ]:           3 :       if (!g_socket_bind (socket6, address, TRUE, NULL))
+     744                 :             :         {
+     745                 :           0 :           g_clear_object (&socket6);
+     746         [ #  # ]:           0 :           VALENT_GOTO (ipv4);
+     747                 :             :         }
+     748                 :             : 
+     749                 :           3 :       g_socket_set_broadcast (socket6, TRUE);
+     750                 :             : 
+     751                 :             :       /* If this socket also speaks IPv4, move on to DNS-SD */
+     752         [ +  - ]:           3 :       if (g_socket_speaks_ipv4 (socket6))
+     753   [ +  -  -  - ]:           3 :         VALENT_GOTO (dnssd);
+     754                 :             :     }
+     755                 :             : 
+     756                 :           0 : ipv4:
+     757                 :           0 :   socket4 = g_socket_new (G_SOCKET_FAMILY_IPV4,
+     758                 :             :                           G_SOCKET_TYPE_DATAGRAM,
+     759                 :             :                           G_SOCKET_PROTOCOL_UDP,
+     760                 :             :                           error);
+     761                 :             : 
+     762         [ #  # ]:           0 :   if (socket4 != NULL)
+     763                 :             :     {
+     764                 :           0 :       g_autoptr (GInetAddress) inet_address = NULL;
+     765   [ #  #  #  # ]:           0 :       g_autoptr (GSocketAddress) address = NULL;
+     766                 :             : 
+     767                 :           0 :       inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4);
+     768                 :           0 :       address = g_inet_socket_address_new (inet_address, port);
+     769                 :             : 
+     770         [ #  # ]:           0 :       if (!g_socket_bind (socket4, address, TRUE, error))
+     771                 :             :         {
+     772                 :           0 :           g_clear_object (&socket4);
+     773         [ #  # ]:           0 :           VALENT_GOTO (check);
+     774                 :             :         }
+     775                 :             : 
+     776         [ #  # ]:           0 :       g_socket_set_broadcast (socket4, TRUE);
+     777                 :             :     }
+     778                 :             : 
+     779         [ #  # ]:           0 : check:
+     780   [ #  #  #  # ]:           0 :   if (socket6 != NULL || socket4 != NULL)
+     781                 :           0 :     g_clear_error (error);
+     782                 :             :   else
+     783                 :           3 :     VALENT_RETURN (FALSE);
+     784                 :             : 
+     785                 :           3 : dnssd:
+     786                 :           3 :   services = valent_lan_dnssd_new (NULL);
+     787                 :           3 :   g_object_bind_property (self,     "identity",
+     788                 :             :                           services, "identity",
+     789                 :             :                           G_BINDING_SYNC_CREATE);
+     790                 :           3 :   g_signal_connect_object (services,
+     791                 :             :                            "items-changed",
+     792                 :             :                            G_CALLBACK (on_items_changed),
+     793                 :             :                            self, 0);
+     794                 :             : 
+     795                 :             :   /* Create a thread-context for UDP broadcasts, and the DNS-SD service */
+     796                 :           3 :   context = g_main_context_new ();
+     797                 :           3 :   loop = g_main_loop_new (context, FALSE);
+     798                 :           3 :   thread = g_thread_try_new ("valent-lan-channel-service",
+     799                 :             :                              valent_lan_channel_service_socket_worker,
+     800                 :           3 :                              g_main_loop_ref (loop),
+     801                 :             :                              error);
+     802                 :             : 
+     803         [ -  + ]:           3 :   if (thread == NULL)
+     804                 :             :     {
+     805                 :           0 :       g_main_loop_unref (loop);
+     806                 :           3 :       VALENT_RETURN (FALSE);
+     807                 :             :     }
+     808                 :             : 
+     809                 :             :   /* Set the thread-context variables before attaching to the context */
+     810                 :           3 :   valent_object_lock (VALENT_OBJECT (self));
+     811                 :           3 :   self->dnssd = g_object_ref (services);
+     812                 :           3 :   self->udp_context = g_main_loop_ref (loop);
+     813         [ -  + ]:           3 :   self->udp_socket4 = socket4 ? g_object_ref (socket4) : NULL;
+     814         [ +  - ]:           3 :   self->udp_socket6 = socket6 ? g_object_ref (socket6) : NULL;
+     815                 :           3 :   valent_object_unlock (VALENT_OBJECT (self));
+     816                 :             : 
+     817                 :           3 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     818                 :             : 
+     819         [ +  - ]:           3 :   if (socket6 != NULL)
+     820                 :             :     {
+     821                 :           6 :       g_autoptr (GSource) source = NULL;
+     822                 :             : 
+     823                 :           3 :       source = g_socket_create_source (socket6, G_IO_IN, destroy);
+     824                 :           3 :       g_source_set_callback (source,
+     825                 :             :                              G_SOURCE_FUNC (valent_lan_channel_service_socket_recv),
+     826                 :             :                              g_object_ref (self),
+     827                 :             :                              g_object_unref);
+     828         [ +  - ]:           3 :       g_source_attach (source, context);
+     829                 :             :     }
+     830                 :             : 
+     831         [ -  + ]:           3 :   if (socket4 != NULL)
+     832                 :             :     {
+     833                 :           3 :       g_autoptr (GSource) source = NULL;
+     834                 :             : 
+     835                 :           0 :       source = g_socket_create_source (socket4, G_IO_IN, destroy);
+     836                 :           0 :       g_source_set_callback (source,
+     837                 :             :                              G_SOURCE_FUNC (valent_lan_channel_service_socket_recv),
+     838                 :             :                              g_object_ref (self),
+     839                 :             :                              g_object_unref);
+     840         [ #  # ]:           0 :       g_source_attach (source, context);
+     841                 :             :     }
+     842                 :             : 
+     843                 :           3 :   valent_lan_dnssd_attach (VALENT_LAN_DNSSD (services), context);
+     844                 :             : 
+     845   [ -  +  +  - ]:           6 :   VALENT_RETURN (TRUE);
+     846                 :             : }
+     847                 :             : 
+     848                 :             : 
+     849                 :             : /*
+     850                 :             :  * ValentChannelService
+     851                 :             :  */
+     852                 :             : static void
+     853                 :           6 : valent_lan_channel_service_build_identity (ValentChannelService *service)
+     854                 :             : {
+     855                 :           6 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (service);
+     856                 :           6 :   ValentChannelServiceClass *klass;
+     857                 :          12 :   g_autoptr (JsonNode) identity = NULL;
+     858                 :             : 
+     859         [ +  - ]:           6 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (service));
+     860                 :             : 
+     861                 :             :   /* Chain-up */
+     862                 :           6 :   klass = VALENT_CHANNEL_SERVICE_CLASS (valent_lan_channel_service_parent_class);
+     863                 :           6 :   klass->build_identity (service);
+     864                 :             : 
+     865                 :             :   /* Set the tcpPort on the packet */
+     866                 :           6 :   identity = valent_channel_service_ref_identity (service);
+     867                 :             : 
+     868         [ +  - ]:           6 :   if (identity != NULL)
+     869                 :             :     {
+     870                 :           6 :       JsonObject *body;
+     871                 :             : 
+     872                 :           6 :       body = valent_packet_get_body (identity);
+     873                 :           6 :       json_object_set_int_member (body, "tcpPort", self->tcp_port);
+     874                 :             :     }
+     875                 :           6 : }
+     876                 :             : 
+     877                 :             : static void
+     878                 :           3 : valent_lan_channel_service_channel (ValentChannelService *service,
+     879                 :             :                                     ValentChannel        *channel)
+     880                 :             : {
+     881                 :           3 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (service);
+     882                 :           3 :   ValentLanChannel *lan_channel = VALENT_LAN_CHANNEL (channel);
+     883                 :           6 :   g_autoptr (GTlsCertificate) peer_certificate = NULL;
+     884                 :           3 :   const char *device_id = NULL;
+     885                 :             : 
+     886         [ +  - ]:           3 :   g_assert (VALENT_IS_MAIN_THREAD ());
+     887         [ -  + ]:           3 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+     888         [ -  + ]:           3 :   g_assert (VALENT_IS_LAN_CHANNEL (lan_channel));
+     889                 :             : 
+     890                 :           3 :   peer_certificate = valent_lan_channel_ref_peer_certificate (lan_channel);
+     891                 :           3 :   device_id = valent_certificate_get_common_name (peer_certificate);
+     892                 :             : 
+     893                 :           3 :   valent_object_lock (VALENT_OBJECT (service));
+     894         [ -  + ]:           6 :   g_hash_table_replace (self->channels, g_strdup (device_id), channel);
+     895                 :           3 :   g_signal_connect_object (channel,
+     896                 :             :                            "destroy",
+     897                 :             :                            G_CALLBACK (on_channel_destroyed),
+     898                 :             :                            self,
+     899                 :             :                            G_CONNECT_SWAPPED);
+     900         [ +  - ]:           3 :   valent_object_unlock (VALENT_OBJECT (service));
+     901                 :           3 : }
+     902                 :             : 
+     903                 :             : static void
+     904                 :           1 : valent_lan_channel_service_identify (ValentChannelService *service,
+     905                 :             :                                      const char           *target)
+     906                 :             : {
+     907                 :           1 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (service);
+     908                 :           2 :   g_autoptr (GSocketAddress) address = NULL;
+     909                 :             : 
+     910         [ +  - ]:           1 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (self));
+     911                 :             : 
+     912         [ +  - ]:           1 :   if (!self->network_available)
+     913                 :             :     return;
+     914                 :             : 
+     915         [ +  - ]:           1 :   if (target != NULL)
+     916                 :             :     {
+     917                 :           0 :       g_autoptr (GSocketConnectable) naddr = NULL;
+     918                 :           1 :       const char *hostname = NULL;
+     919                 :           1 :       uint16_t port = 0;
+     920                 :           1 :       g_autoptr (GError) error = NULL;
+     921                 :             : 
+     922                 :           1 :       naddr = g_network_address_parse (target,
+     923                 :             :                                        VALENT_LAN_PROTOCOL_PORT,
+     924                 :             :                                        &error);
+     925                 :             : 
+     926         [ -  + ]:           1 :       if (naddr == NULL)
+     927                 :             :         {
+     928                 :           0 :           g_warning ("%s(): failed to parse \"%s\": %s",
+     929                 :             :                      G_STRFUNC,
+     930                 :             :                      target,
+     931                 :             :                      error->message);
+     932         [ #  # ]:           0 :           return;
+     933                 :             :         }
+     934                 :             : 
+     935                 :           1 :       hostname = g_network_address_get_hostname (G_NETWORK_ADDRESS (naddr));
+     936                 :           1 :       port = g_network_address_get_port (G_NETWORK_ADDRESS (naddr));
+     937         [ -  + ]:           1 :       address = g_inet_socket_address_new_from_string (hostname, port);
+     938                 :             :     }
+     939                 :             : 
+     940         [ -  + ]:           1 :   if (address == NULL)
+     941                 :           0 :     address = g_inet_socket_address_new_from_string (self->broadcast_address,
+     942                 :           0 :                                                      self->port);
+     943                 :             : 
+     944         [ +  - ]:           1 :   valent_lan_channel_service_socket_queue (self, address);
+     945                 :             : }
+     946                 :             : 
+     947                 :             : static void
+     948                 :           3 : valent_lan_channel_service_init_task (GTask        *task,
+     949                 :             :                                       gpointer      source_object,
+     950                 :             :                                       gpointer      task_data,
+     951                 :             :                                       GCancellable *cancellable)
+     952                 :             : {
+     953                 :           3 :   ValentLanChannelService *self = source_object;
+     954                 :           3 :   g_autoptr (GError) error = NULL;
+     955                 :             : 
+     956         [ +  - ]:           3 :   if (g_task_return_error_if_cancelled (task))
+     957                 :             :     return;
+     958                 :             : 
+     959   [ +  -  -  + ]:           6 :   if (!valent_lan_channel_service_tcp_setup (self, cancellable, &error) ||
+     960                 :           3 :       !valent_lan_channel_service_udp_setup (self, cancellable, &error))
+     961                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     962                 :             : 
+     963         [ -  + ]:           3 :   g_task_return_boolean (task, TRUE);
+     964                 :             : }
+     965                 :             : 
+     966                 :             : /*
+     967                 :             :  * GAsyncInitable
+     968                 :             :  */
+     969                 :             : static void
+     970                 :           3 : valent_lan_channel_service_init_async (GAsyncInitable      *initable,
+     971                 :             :                                        int                  io_priority,
+     972                 :             :                                        GCancellable        *cancellable,
+     973                 :             :                                        GAsyncReadyCallback  callback,
+     974                 :             :                                        gpointer             user_data)
+     975                 :             : {
+     976                 :           3 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (initable);
+     977                 :           6 :   g_autoptr (GTask) task = NULL;
+     978         [ +  - ]:           3 :   g_autoptr (GCancellable) destroy = NULL;
+     979                 :             : 
+     980         [ +  - ]:           3 :   g_assert (VALENT_IS_LAN_CHANNEL_SERVICE (initable));
+     981   [ -  +  -  -  :           3 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     982                 :             : 
+     983                 :             :   /* Cancel initialization if the object is destroyed */
+     984                 :           3 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     985                 :             :                                              cancellable);
+     986                 :             : 
+     987                 :           3 :   self->network_available = g_network_monitor_get_network_available (self->monitor);
+     988                 :           3 :   g_signal_connect_object (self->monitor,
+     989                 :             :                            "network-changed",
+     990                 :             :                            G_CALLBACK (on_network_changed),
+     991                 :             :                            self, 0);
+     992                 :             : 
+     993                 :           3 :   task = g_task_new (initable, destroy, callback, user_data);
+     994                 :           3 :   g_task_set_priority (task, io_priority);
+     995         [ +  - ]:           3 :   g_task_set_source_tag (task, valent_lan_channel_service_init_async);
+     996         [ +  - ]:           3 :   g_task_run_in_thread (task, valent_lan_channel_service_init_task);
+     997                 :           3 : }
+     998                 :             : 
+     999                 :             : static void
+    1000                 :           1 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+    1001                 :             : {
+    1002                 :           1 :   iface->init_async = valent_lan_channel_service_init_async;
+    1003                 :           1 : }
+    1004                 :             : 
+    1005                 :             : /*
+    1006                 :             :  * ValentObject
+    1007                 :             :  */
+    1008                 :             : static void
+    1009                 :           6 : valent_lan_channel_service_destroy (ValentObject *object)
+    1010                 :             : {
+    1011                 :           6 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (object);
+    1012                 :             : 
+    1013                 :           6 :   g_signal_handlers_disconnect_by_data (self->monitor, self);
+    1014                 :             : 
+    1015         [ +  + ]:           6 :   if (self->udp_context != NULL)
+    1016                 :             :     {
+    1017         [ +  - ]:           3 :       if (self->dnssd != NULL)
+    1018                 :             :         {
+    1019                 :           3 :           g_signal_handlers_disconnect_by_data (self->dnssd, self);
+    1020         [ +  - ]:           3 :           g_clear_object (&self->dnssd);
+    1021                 :             :         }
+    1022                 :             : 
+    1023         [ -  + ]:           3 :       g_clear_object (&self->udp_socket4);
+    1024         [ +  - ]:           3 :       g_clear_object (&self->udp_socket6);
+    1025                 :           3 :       g_main_loop_quit (self->udp_context);
+    1026         [ +  - ]:           3 :       g_clear_pointer (&self->udp_context, g_main_loop_unref);
+    1027                 :             :     }
+    1028                 :             : 
+    1029         [ +  + ]:           6 :   if (self->listener != NULL)
+    1030                 :             :     {
+    1031                 :           3 :       g_socket_service_stop (G_SOCKET_SERVICE (self->listener));
+    1032                 :           3 :       g_socket_listener_close (G_SOCKET_LISTENER (self->listener));
+    1033         [ +  - ]:           3 :       g_clear_object (&self->listener);
+    1034                 :             :     }
+    1035                 :             : 
+    1036                 :           6 :   VALENT_OBJECT_CLASS (valent_lan_channel_service_parent_class)->destroy (object);
+    1037                 :           6 : }
+    1038                 :             : 
+    1039                 :             : /*
+    1040                 :             :  * GObject
+    1041                 :             :  */
+    1042                 :             : static void
+    1043                 :           3 : valent_lan_channel_service_finalize (GObject *object)
+    1044                 :             : {
+    1045                 :           3 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (object);
+    1046                 :             : 
+    1047         [ +  - ]:           3 :   g_clear_pointer (&self->broadcast_address, g_free);
+    1048         [ +  - ]:           3 :   g_clear_pointer (&self->channels, g_hash_table_unref);
+    1049                 :             : 
+    1050                 :           3 :   G_OBJECT_CLASS (valent_lan_channel_service_parent_class)->finalize (object);
+    1051                 :           3 : }
+    1052                 :             : 
+    1053                 :             : static void
+    1054                 :           0 : valent_lan_channel_service_get_property (GObject    *object,
+    1055                 :             :                                          guint       prop_id,
+    1056                 :             :                                          GValue     *value,
+    1057                 :             :                                          GParamSpec *pspec)
+    1058                 :             : {
+    1059                 :           0 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (object);
+    1060                 :             : 
+    1061      [ #  #  # ]:           0 :   switch (prop_id)
+    1062                 :             :     {
+    1063                 :           0 :     case PROP_BROADCAST_ADDRESS:
+    1064                 :           0 :       g_value_set_string (value, self->broadcast_address);
+    1065                 :           0 :       break;
+    1066                 :             : 
+    1067                 :           0 :     case PROP_PORT:
+    1068                 :           0 :       g_value_set_uint (value, self->port);
+    1069                 :           0 :       break;
+    1070                 :             : 
+    1071                 :           0 :     default:
+    1072                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    1073                 :             :     }
+    1074                 :           0 : }
+    1075                 :             : 
+    1076                 :             : static void
+    1077                 :           6 : valent_lan_channel_service_set_property (GObject      *object,
+    1078                 :             :                                          guint         prop_id,
+    1079                 :             :                                          const GValue *value,
+    1080                 :             :                                          GParamSpec   *pspec)
+    1081                 :             : {
+    1082                 :           6 :   ValentLanChannelService *self = VALENT_LAN_CHANNEL_SERVICE (object);
+    1083                 :             : 
+    1084      [ +  +  - ]:           6 :   switch (prop_id)
+    1085                 :             :     {
+    1086                 :           3 :     case PROP_BROADCAST_ADDRESS:
+    1087                 :           3 :       self->broadcast_address = g_value_dup_string (value);
+    1088                 :           3 :       break;
+    1089                 :             : 
+    1090                 :           3 :     case PROP_PORT:
+    1091                 :           3 :       self->port = g_value_get_uint (value);
+    1092                 :           3 :       break;
+    1093                 :             : 
+    1094                 :           0 :     default:
+    1095                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    1096                 :             :     }
+    1097                 :           6 : }
+    1098                 :             : 
+    1099                 :             : static void
+    1100                 :           1 : valent_lan_channel_service_class_init (ValentLanChannelServiceClass *klass)
+    1101                 :             : {
+    1102                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    1103                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+    1104                 :           1 :   ValentChannelServiceClass *service_class = VALENT_CHANNEL_SERVICE_CLASS (klass);
+    1105                 :             : 
+    1106                 :           1 :   object_class->finalize = valent_lan_channel_service_finalize;
+    1107                 :           1 :   object_class->get_property = valent_lan_channel_service_get_property;
+    1108                 :           1 :   object_class->set_property = valent_lan_channel_service_set_property;
+    1109                 :             : 
+    1110                 :           1 :   vobject_class->destroy = valent_lan_channel_service_destroy;
+    1111                 :             : 
+    1112                 :           1 :   service_class->build_identity = valent_lan_channel_service_build_identity;
+    1113                 :           1 :   service_class->channel = valent_lan_channel_service_channel;
+    1114                 :           1 :   service_class->identify = valent_lan_channel_service_identify;
+    1115                 :             : 
+    1116                 :             :   /**
+    1117                 :             :    * ValentLanChannelService:broadcast-address:
+    1118                 :             :    *
+    1119                 :             :    * The UDP broadcast address for the service.
+    1120                 :             :    *
+    1121                 :             :    * This available as a construct property primarily for use in unit tests.
+    1122                 :             :    */
+    1123                 :           2 :   properties [PROP_BROADCAST_ADDRESS] =
+    1124                 :           1 :     g_param_spec_string ("broadcast-address", NULL, NULL,
+    1125                 :             :                          VALENT_LAN_PROTOCOL_ADDR,
+    1126                 :             :                          (G_PARAM_READWRITE |
+    1127                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+    1128                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+    1129                 :             :                           G_PARAM_STATIC_STRINGS));
+    1130                 :             : 
+    1131                 :             :   /**
+    1132                 :             :    * ValentLanChannelService:port:
+    1133                 :             :    *
+    1134                 :             :    * The TCP/IP port for the service.
+    1135                 :             :    *
+    1136                 :             :    * The current KDE Connect protocol (v7) defines port 1716 as the default.
+    1137                 :             :    *
+    1138                 :             :    * This available as a construct property primarily for use in unit tests.
+    1139                 :             :    */
+    1140                 :           2 :   properties [PROP_PORT] =
+    1141                 :           1 :     g_param_spec_uint ("port", NULL, NULL,
+    1142                 :             :                        VALENT_LAN_PROTOCOL_PORT_MIN, VALENT_LAN_PROTOCOL_PORT_MAX,
+    1143                 :             :                        VALENT_LAN_PROTOCOL_PORT,
+    1144                 :             :                        (G_PARAM_READWRITE |
+    1145                 :             :                         G_PARAM_CONSTRUCT_ONLY |
+    1146                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+    1147                 :             :                         G_PARAM_STATIC_STRINGS));
+    1148                 :             : 
+    1149                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+    1150                 :           1 : }
+    1151                 :             : 
+    1152                 :             : static void
+    1153                 :           3 : valent_lan_channel_service_init (ValentLanChannelService *self)
+    1154                 :             : {
+    1155                 :           3 :   self->channels = g_hash_table_new_full (g_str_hash,
+    1156                 :             :                                           g_str_equal,
+    1157                 :             :                                           g_free,
+    1158                 :             :                                           NULL);
+    1159                 :           3 :   self->monitor = g_network_monitor_get_default ();
+    1160                 :           3 : }
+    1161                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel-service.h.func-c.html b/coverage/src/plugins/lan/valent-lan-channel-service.h.func-c.html new file mode 100644 index 00000000000..d7da9a47400 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel-service.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel-service.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel-service.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LAN_CHANNEL_SERVICE40
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel-service.h.func.html b/coverage/src/plugins/lan/valent-lan-channel-service.h.func.html new file mode 100644 index 00000000000..4cc8c38ffc1 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel-service.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel-service.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel-service.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LAN_CHANNEL_SERVICE40
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel-service.h.gcov.html b/coverage/src/plugins/lan/valent-lan-channel-service.h.gcov.html new file mode 100644 index 00000000000..56b7d165cfe --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel-service.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel-service.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel-service.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_LAN_CHANNEL_SERVICE (valent_lan_channel_service_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          40 : G_DECLARE_FINAL_TYPE (ValentLanChannelService, valent_lan_channel_service, VALENT, LAN_CHANNEL_SERVICE, ValentChannelService)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel.c.func-c.html b/coverage/src/plugins/lan/valent-lan-channel.c.func-c.html new file mode 100644 index 00000000000..2711bd360fe --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.9 %192161
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.5 %12857
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lan_channel_store_data0
valent_lan_channel_class_init1
valent_lan_channel_download1
valent_lan_channel_get_port1
valent_lan_channel_upload1
valent_lan_channel_dup_host2
valent_lan_channel_get_verification_key2
valent_lan_channel_get_property4
valent_lan_channel_finalize6
valent_lan_channel_init6
valent_lan_channel_ref_certificate7
valent_lan_channel_ref_peer_certificate10
valent_lan_channel_set_property12
valent_lan_channel_get_type30
valent_lan_channel_class_intern_init1
valent_lan_channel_get_type_once1
valent_lan_channel_get_type28
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel.c.func.html b/coverage/src/plugins/lan/valent-lan-channel.c.func.html new file mode 100644 index 00000000000..4401f08b9c0 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.9 %192161
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.5 %12857
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lan_channel_class_init1
valent_lan_channel_download1
valent_lan_channel_dup_host2
valent_lan_channel_finalize6
valent_lan_channel_get_port1
valent_lan_channel_get_property4
valent_lan_channel_get_type30
valent_lan_channel_class_intern_init1
valent_lan_channel_get_type28
valent_lan_channel_get_type_once1
valent_lan_channel_get_verification_key2
valent_lan_channel_init6
valent_lan_channel_ref_certificate7
valent_lan_channel_ref_peer_certificate10
valent_lan_channel_set_property12
valent_lan_channel_store_data0
valent_lan_channel_upload1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel.c.gcov.html b/coverage/src/plugins/lan/valent-lan-channel.c.gcov.html new file mode 100644 index 00000000000..083e3fecbbe --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel.c.gcov.html @@ -0,0 +1,587 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:83.9 %192161
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.5 %12857
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-lan-channel"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gio/gnetworking.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-lan-channel.h"
+      14                 :             : #include "valent-lan-utils.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentLanChannel
+      18                 :             : {
+      19                 :             :   ValentChannel    parent_instance;
+      20                 :             : 
+      21                 :             :   char            *verification_key;
+      22                 :             :   char            *host;
+      23                 :             :   uint16_t         port;
+      24                 :             : };
+      25                 :             : 
+      26   [ +  +  +  - ]:          30 : G_DEFINE_FINAL_TYPE (ValentLanChannel, valent_lan_channel, VALENT_TYPE_CHANNEL)
+      27                 :             : 
+      28                 :             : enum {
+      29                 :             :   PROP_0,
+      30                 :             :   PROP_CERTIFICATE,
+      31                 :             :   PROP_HOST,
+      32                 :             :   PROP_PEER_CERTIFICATE,
+      33                 :             :   PROP_PORT,
+      34                 :             :   N_PROPERTIES
+      35                 :             : };
+      36                 :             : 
+      37                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      38                 :             : 
+      39                 :             : 
+      40                 :             : /*
+      41                 :             :  * ValentChannel
+      42                 :             :  */
+      43                 :             : static const char *
+      44                 :           2 : valent_lan_channel_get_verification_key (ValentChannel *channel)
+      45                 :             : {
+      46                 :           2 :   ValentLanChannel *self = VALENT_LAN_CHANNEL (channel);
+      47                 :           4 :   g_autoptr (GChecksum) checksum = NULL;
+      48         [ +  - ]:           2 :   g_autoptr (GTlsCertificate) cert = NULL;
+      49         [ +  - ]:           2 :   g_autoptr (GTlsCertificate) peer_cert = NULL;
+      50                 :           2 :   GByteArray *pubkey;
+      51                 :           2 :   GByteArray *peer_pubkey;
+      52                 :           2 :   size_t cmplen;
+      53                 :             : 
+      54         [ +  - ]:           2 :   if (self->verification_key == NULL)
+      55                 :             :     {
+      56         [ +  - ]:           2 :       if ((cert = valent_lan_channel_ref_certificate (self)) == NULL ||
+      57         [ -  + ]:           2 :           (peer_cert = valent_lan_channel_ref_peer_certificate (self)) == NULL)
+      58                 :           0 :         g_return_val_if_reached (NULL);
+      59                 :             : 
+      60         [ +  - ]:           2 :       if ((pubkey = valent_certificate_get_public_key (cert)) == NULL ||
+      61         [ -  + ]:           2 :           (peer_pubkey = valent_certificate_get_public_key (peer_cert)) == NULL)
+      62                 :           0 :         g_return_val_if_reached (NULL);
+      63                 :             : 
+      64                 :           2 :       checksum = g_checksum_new (G_CHECKSUM_SHA256);
+      65                 :           2 :       cmplen = MIN (pubkey->len, peer_pubkey->len);
+      66                 :             : 
+      67         [ +  + ]:           2 :       if (memcmp (pubkey->data, peer_pubkey->data, cmplen) > 0)
+      68                 :             :         {
+      69                 :           1 :           g_checksum_update (checksum, pubkey->data, pubkey->len);
+      70                 :           1 :           g_checksum_update (checksum, peer_pubkey->data, peer_pubkey->len);
+      71                 :             :         }
+      72                 :             :       else
+      73                 :             :         {
+      74                 :           1 :           g_checksum_update (checksum, peer_pubkey->data, peer_pubkey->len);
+      75                 :           1 :           g_checksum_update (checksum, pubkey->data, pubkey->len);
+      76                 :             :         }
+      77                 :             : 
+      78         [ -  + ]:           2 :       self->verification_key = g_strdup (g_checksum_get_string (checksum));
+      79                 :             :     }
+      80                 :             : 
+      81                 :           2 :   return self->verification_key;
+      82                 :             : }
+      83                 :             : 
+      84                 :             : static GIOStream *
+      85                 :           1 : valent_lan_channel_download (ValentChannel  *channel,
+      86                 :             :                              JsonNode       *packet,
+      87                 :             :                              GCancellable   *cancellable,
+      88                 :             :                              GError        **error)
+      89                 :             : {
+      90                 :           1 :   ValentLanChannel *self = VALENT_LAN_CHANNEL (channel);
+      91                 :           1 :   JsonObject *info;
+      92                 :           1 :   int64_t port;
+      93                 :           1 :   goffset size;
+      94                 :           2 :   g_autoptr (GSocketClient) client = NULL;
+      95         [ +  - ]:           1 :   g_autoptr (GSocketConnection) connection = NULL;
+      96         [ +  - ]:           1 :   g_autoptr (GTlsCertificate) certificate = NULL;
+      97         [ +  - ]:           1 :   g_autoptr (GTlsCertificate) peer_certificate = NULL;
+      98         [ +  - ]:           1 :   g_autofree char *host = NULL;
+      99                 :           1 :   g_autoptr (GIOStream) tls_stream = NULL;
+     100                 :             : 
+     101         [ +  - ]:           1 :   g_assert (VALENT_IS_CHANNEL (channel));
+     102         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+     103   [ -  +  -  -  :           1 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     104   [ +  -  -  + ]:           1 :   g_assert (error == NULL || *error == NULL);
+     105                 :             : 
+     106                 :             :   /* Get the payload information */
+     107         [ +  - ]:           1 :   if ((info = valent_packet_get_payload_full (packet, &size, error)) == NULL)
+     108                 :             :     return NULL;
+     109                 :             : 
+     110         [ +  - ]:           1 :   if ((port = json_object_get_int_member (info, "port")) == 0 ||
+     111         [ -  + ]:           1 :       (port < VALENT_LAN_TRANSFER_PORT_MIN || port > VALENT_LAN_TRANSFER_PORT_MAX))
+     112                 :             :     {
+     113                 :           0 :       g_set_error (error,
+     114                 :             :                    VALENT_PACKET_ERROR,
+     115                 :             :                    VALENT_PACKET_ERROR_INVALID_FIELD,
+     116                 :             :                    "expected \"port\" field holding a uint16 between %u-%u",
+     117                 :             :                    VALENT_LAN_TRANSFER_PORT_MIN,
+     118                 :             :                    VALENT_LAN_TRANSFER_PORT_MAX);
+     119                 :           0 :       return NULL;
+     120                 :             :     }
+     121                 :             : 
+     122                 :             :   /* Open the outgoing connection */
+     123                 :           1 :   host = valent_lan_channel_dup_host (self);
+     124                 :           1 :   client = g_object_new (G_TYPE_SOCKET_CLIENT,
+     125                 :             :                          "enable-proxy", FALSE,
+     126                 :             :                          NULL);
+     127                 :           1 :   connection = g_socket_client_connect_to_host (client,
+     128                 :             :                                                 host,
+     129                 :             :                                                 (uint16_t)port,
+     130                 :             :                                                 cancellable,
+     131                 :             :                                                 error);
+     132                 :             : 
+     133         [ +  - ]:           1 :   if (connection == NULL)
+     134                 :             :     return NULL;
+     135                 :             : 
+     136                 :             :   /* We're the TLS client when downloading */
+     137                 :           1 :   certificate = valent_lan_channel_ref_certificate (self);
+     138                 :           1 :   peer_certificate = valent_lan_channel_ref_peer_certificate (self);
+     139                 :           1 :   tls_stream = valent_lan_encrypt_client (connection,
+     140                 :             :                                           certificate,
+     141                 :             :                                           peer_certificate,
+     142                 :             :                                           cancellable,
+     143                 :             :                                           error);
+     144                 :             : 
+     145         [ -  + ]:           1 :   if (tls_stream == NULL)
+     146                 :             :     {
+     147                 :           0 :       g_io_stream_close (G_IO_STREAM (connection), NULL, NULL);
+     148                 :           0 :       return NULL;
+     149                 :             :     }
+     150                 :             : 
+     151                 :             :   return g_steal_pointer (&tls_stream);
+     152                 :             : }
+     153                 :             : 
+     154                 :             : static GIOStream *
+     155                 :           1 : valent_lan_channel_upload (ValentChannel  *channel,
+     156                 :             :                            JsonNode       *packet,
+     157                 :             :                            GCancellable   *cancellable,
+     158                 :             :                            GError        **error)
+     159                 :             : {
+     160                 :           1 :   ValentLanChannel *self = VALENT_LAN_CHANNEL (channel);
+     161                 :           1 :   JsonObject *info;
+     162                 :           2 :   g_autoptr (GSocketListener) listener = NULL;
+     163         [ +  - ]:           1 :   g_autoptr (GSocketConnection) connection = NULL;
+     164                 :           1 :   uint16_t port = VALENT_LAN_TRANSFER_PORT_MIN;
+     165         [ +  - ]:           1 :   g_autoptr (GTlsCertificate) certificate = NULL;
+     166         [ +  - ]:           1 :   g_autoptr (GTlsCertificate) peer_certificate = NULL;
+     167         [ +  - ]:           1 :   g_autoptr (GIOStream) tls_stream = NULL;
+     168                 :             : 
+     169         [ +  - ]:           1 :   g_assert (VALENT_IS_CHANNEL (channel));
+     170         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+     171   [ -  +  -  -  :           1 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     172   [ +  -  -  + ]:           1 :   g_assert (error == NULL || *error == NULL);
+     173                 :             : 
+     174                 :             :   /* Find an open port */
+     175                 :           1 :   listener = g_socket_listener_new ();
+     176                 :             : 
+     177         [ -  + ]:           1 :   while (!g_socket_listener_add_inet_port (listener, port, NULL, error))
+     178                 :             :     {
+     179         [ #  # ]:           0 :       if (port >= VALENT_LAN_TRANSFER_PORT_MAX)
+     180                 :             :         return NULL;
+     181                 :             : 
+     182                 :           0 :       port++;
+     183                 :           0 :       g_clear_error (error);
+     184                 :             :     }
+     185                 :             : 
+     186                 :             :   /* Set the payload information */
+     187                 :           1 :   info = json_object_new();
+     188                 :           1 :   json_object_set_int_member (info, "port", (int64_t)port);
+     189                 :           1 :   valent_packet_set_payload_info (packet, info);
+     190                 :             : 
+     191                 :             :   /* Notify the device and accept the incoming connection */
+     192                 :           1 :   valent_channel_write_packet (channel, packet, cancellable, NULL, NULL);
+     193                 :             : 
+     194                 :           1 :   connection = g_socket_listener_accept (listener, NULL, cancellable, error);
+     195                 :           1 :   g_socket_listener_close (listener);
+     196                 :             : 
+     197         [ -  + ]:           1 :   if (connection == NULL)
+     198                 :             :     return NULL;
+     199                 :             : 
+     200                 :             :   /* We're the TLS server when uploading */
+     201                 :           1 :   certificate = valent_lan_channel_ref_certificate (self);
+     202                 :           1 :   peer_certificate = valent_lan_channel_ref_peer_certificate (self);
+     203                 :           1 :   tls_stream = valent_lan_encrypt_server (connection,
+     204                 :             :                                           certificate,
+     205                 :             :                                           peer_certificate,
+     206                 :             :                                           cancellable,
+     207                 :             :                                           error);
+     208                 :             : 
+     209         [ -  + ]:           1 :   if (tls_stream == NULL)
+     210                 :             :     {
+     211                 :           0 :       g_io_stream_close (G_IO_STREAM (connection), NULL, NULL);
+     212                 :           0 :       return NULL;
+     213                 :             :     }
+     214                 :             : 
+     215                 :             :   return g_steal_pointer (&tls_stream);
+     216                 :             : }
+     217                 :             : 
+     218                 :             : static void
+     219                 :           0 : valent_lan_channel_store_data (ValentChannel *channel,
+     220                 :             :                                ValentContext *context)
+     221                 :             : {
+     222                 :           0 :   g_autoptr (GTlsCertificate) certificate = NULL;
+     223         [ #  # ]:           0 :   g_autofree char *certificate_pem = NULL;
+     224                 :           0 :   g_autoptr (GFile) certificate_file = NULL;
+     225         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     226                 :             : 
+     227         [ #  # ]:           0 :   g_assert (VALENT_IS_LAN_CHANNEL (channel));
+     228         [ #  # ]:           0 :   g_assert (VALENT_IS_CONTEXT (context));
+     229                 :             : 
+     230                 :             :   /* Chain-up first */
+     231                 :           0 :   VALENT_CHANNEL_CLASS (valent_lan_channel_parent_class)->store_data (channel,
+     232                 :             :                                                                       context);
+     233                 :             : 
+     234                 :             :   /* Save the peer certificate */
+     235                 :           0 :   g_object_get (channel, "peer-certificate", &certificate, NULL);
+     236                 :           0 :   g_object_get (certificate, "certificate-pem", &certificate_pem, NULL);
+     237                 :             : 
+     238                 :           0 :   certificate_file = valent_context_get_config_file (context, "certificate.pem");
+     239                 :           0 :   g_file_set_contents_full (g_file_peek_path (certificate_file),
+     240                 :             :                             certificate_pem,
+     241                 :           0 :                             strlen (certificate_pem),
+     242                 :             :                             G_FILE_SET_CONTENTS_DURABLE,
+     243                 :             :                             0600,
+     244                 :             :                             &error);
+     245                 :             : 
+     246         [ #  # ]:           0 :   if (error != NULL)
+     247                 :             :     {
+     248                 :           0 :       g_warning ("%s(): failed to write \"%s\": %s",
+     249                 :             :                  G_STRFUNC,
+     250                 :             :                  g_file_peek_path (certificate_file),
+     251                 :             :                  error->message);
+     252                 :             :     }
+     253                 :           0 : }
+     254                 :             : 
+     255                 :             : /*
+     256                 :             :  * GObject
+     257                 :             :  */
+     258                 :             : static void
+     259                 :           6 : valent_lan_channel_finalize (GObject *object)
+     260                 :             : {
+     261                 :           6 :   ValentLanChannel *self = VALENT_LAN_CHANNEL (object);
+     262                 :             : 
+     263         [ +  - ]:           6 :   g_clear_pointer (&self->host, g_free);
+     264         [ +  + ]:           6 :   g_clear_pointer (&self->verification_key, g_free);
+     265                 :             : 
+     266                 :           6 :   G_OBJECT_CLASS (valent_lan_channel_parent_class)->finalize (object);
+     267                 :           6 : }
+     268                 :             : 
+     269                 :             : static void
+     270                 :           4 : valent_lan_channel_get_property (GObject    *object,
+     271                 :             :                                  guint       prop_id,
+     272                 :             :                                  GValue     *value,
+     273                 :             :                                  GParamSpec *pspec)
+     274                 :             : {
+     275                 :           4 :   ValentLanChannel *self = VALENT_LAN_CHANNEL (object);
+     276                 :             : 
+     277   [ +  +  +  +  :           4 :   switch (prop_id)
+                      - ]
+     278                 :             :     {
+     279                 :           1 :     case PROP_CERTIFICATE:
+     280                 :           1 :       g_value_take_object (value, valent_lan_channel_ref_certificate (self));
+     281                 :           1 :       break;
+     282                 :             : 
+     283                 :           1 :     case PROP_HOST:
+     284                 :           1 :       g_value_take_string (value, valent_lan_channel_dup_host (self));
+     285                 :           1 :       break;
+     286                 :             : 
+     287                 :           1 :     case PROP_PEER_CERTIFICATE:
+     288                 :           1 :       g_value_take_object (value, valent_lan_channel_ref_peer_certificate (self));
+     289                 :           1 :       break;
+     290                 :             : 
+     291                 :           1 :     case PROP_PORT:
+     292                 :           1 :       g_value_set_uint (value, valent_lan_channel_get_port (self));
+     293                 :           1 :       break;
+     294                 :             : 
+     295                 :           0 :     default:
+     296                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     297                 :             :     }
+     298                 :           4 : }
+     299                 :             : 
+     300                 :             : static void
+     301                 :          12 : valent_lan_channel_set_property (GObject      *object,
+     302                 :             :                                  guint         prop_id,
+     303                 :             :                                  const GValue *value,
+     304                 :             :                                  GParamSpec   *pspec)
+     305                 :             : {
+     306                 :          12 :   ValentLanChannel *self = VALENT_LAN_CHANNEL (object);
+     307                 :             : 
+     308      [ +  +  - ]:          12 :   switch (prop_id)
+     309                 :             :     {
+     310                 :             :     case PROP_HOST:
+     311                 :           6 :       valent_object_lock (VALENT_OBJECT (self));
+     312                 :           6 :       self->host = g_value_dup_string (value);
+     313                 :           6 :       valent_object_unlock (VALENT_OBJECT (self));
+     314                 :           6 :       break;
+     315                 :             : 
+     316                 :             :     case PROP_PORT:
+     317                 :           6 :       valent_object_lock (VALENT_OBJECT (self));
+     318                 :           6 :       self->port = g_value_get_uint (value);
+     319                 :           6 :       valent_object_unlock (VALENT_OBJECT (self));
+     320                 :           6 :       break;
+     321                 :             : 
+     322                 :           0 :     default:
+     323                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     324                 :             :     }
+     325                 :          12 : }
+     326                 :             : 
+     327                 :             : static void
+     328                 :           1 : valent_lan_channel_class_init (ValentLanChannelClass *klass)
+     329                 :             : {
+     330                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     331                 :           1 :   ValentChannelClass *channel_class = VALENT_CHANNEL_CLASS (klass);
+     332                 :             : 
+     333                 :           1 :   object_class->finalize = valent_lan_channel_finalize;
+     334                 :           1 :   object_class->get_property = valent_lan_channel_get_property;
+     335                 :           1 :   object_class->set_property = valent_lan_channel_set_property;
+     336                 :             : 
+     337                 :           1 :   channel_class->get_verification_key = valent_lan_channel_get_verification_key;
+     338                 :           1 :   channel_class->download = valent_lan_channel_download;
+     339                 :           1 :   channel_class->upload = valent_lan_channel_upload;
+     340                 :           1 :   channel_class->store_data = valent_lan_channel_store_data;
+     341                 :             : 
+     342                 :             :   /**
+     343                 :             :    * ValentLanChannel:certificate:
+     344                 :             :    *
+     345                 :             :    * The TLS certificate.
+     346                 :             :    */
+     347                 :           2 :   properties [PROP_CERTIFICATE] =
+     348                 :           1 :     g_param_spec_object ("certificate", NULL, NULL,
+     349                 :             :                          G_TYPE_TLS_CERTIFICATE,
+     350                 :             :                          (G_PARAM_READABLE |
+     351                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     352                 :             :                           G_PARAM_STATIC_STRINGS));
+     353                 :             : 
+     354                 :             :   /**
+     355                 :             :    * ValentLanChannel:host:
+     356                 :             :    *
+     357                 :             :    * The remote TCP/IP address for the channel.
+     358                 :             :    */
+     359                 :           2 :   properties [PROP_HOST] =
+     360                 :           1 :     g_param_spec_string ("host", NULL, NULL,
+     361                 :             :                          NULL,
+     362                 :             :                          (G_PARAM_READWRITE |
+     363                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     364                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     365                 :             :                           G_PARAM_STATIC_STRINGS));
+     366                 :             : 
+     367                 :             :   /**
+     368                 :             :    * ValentLanChannel:peer-certificate:
+     369                 :             :    *
+     370                 :             :    * The peer TLS certificate.
+     371                 :             :    */
+     372                 :           2 :   properties [PROP_PEER_CERTIFICATE] =
+     373                 :           1 :     g_param_spec_object ("peer-certificate", NULL, NULL,
+     374                 :             :                          G_TYPE_TLS_CERTIFICATE,
+     375                 :             :                          (G_PARAM_READABLE |
+     376                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     377                 :             :                           G_PARAM_STATIC_STRINGS));
+     378                 :             : 
+     379                 :             :   /**
+     380                 :             :    * ValentLanChannel:port:
+     381                 :             :    *
+     382                 :             :    * The remote TCP/IP port for the channel.
+     383                 :             :    */
+     384                 :           2 :   properties [PROP_PORT] =
+     385                 :           1 :     g_param_spec_uint ("port", NULL, NULL,
+     386                 :             :                        0, G_MAXUINT16,
+     387                 :             :                        VALENT_LAN_PROTOCOL_PORT,
+     388                 :             :                        (G_PARAM_READWRITE |
+     389                 :             :                         G_PARAM_CONSTRUCT_ONLY |
+     390                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     391                 :             :                         G_PARAM_STATIC_STRINGS));
+     392                 :             : 
+     393                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     394                 :           1 : }
+     395                 :             : 
+     396                 :             : static void
+     397                 :           6 : valent_lan_channel_init (ValentLanChannel *self)
+     398                 :             : {
+     399                 :           6 : }
+     400                 :             : 
+     401                 :             : /**
+     402                 :             :  * valent_lan_channel_ref_certificate:
+     403                 :             :  * @self: a `ValentLanChannel`
+     404                 :             :  *
+     405                 :             :  * Get the TLS certificate.
+     406                 :             :  *
+     407                 :             :  * Returns: (transfer full) (nullable): a `GTlsCertificate`
+     408                 :             :  */
+     409                 :             : GTlsCertificate *
+     410                 :           7 : valent_lan_channel_ref_certificate (ValentLanChannel *self)
+     411                 :             : {
+     412                 :          14 :   g_autoptr (GIOStream) base_stream = NULL;
+     413                 :           7 :   GTlsCertificate *ret = NULL;
+     414                 :             : 
+     415         [ +  - ]:           7 :   g_return_val_if_fail (VALENT_IS_LAN_CHANNEL (self), NULL);
+     416                 :             : 
+     417                 :           7 :   base_stream = valent_channel_ref_base_stream (VALENT_CHANNEL (self));
+     418                 :             : 
+     419         [ +  - ]:           7 :   if (base_stream != NULL)
+     420                 :           7 :     g_object_get (base_stream, "certificate", &ret, NULL);
+     421                 :             : 
+     422         [ -  + ]:           7 :   return g_steal_pointer (&ret);
+     423                 :             : }
+     424                 :             : 
+     425                 :             : /**
+     426                 :             :  * valent_lan_channel_ref_peer_certificate:
+     427                 :             :  * @self: a `ValentLanChannel`
+     428                 :             :  *
+     429                 :             :  * Get the peer TLS certificate.
+     430                 :             :  *
+     431                 :             :  * Returns: (transfer full) (nullable): a `GTlsCertificate`
+     432                 :             :  */
+     433                 :             : GTlsCertificate *
+     434                 :          10 : valent_lan_channel_ref_peer_certificate (ValentLanChannel *self)
+     435                 :             : {
+     436                 :          20 :   g_autoptr (GIOStream) base_stream = NULL;
+     437                 :          10 :   GTlsCertificate *ret = NULL;
+     438                 :             : 
+     439         [ +  - ]:          10 :   g_return_val_if_fail (VALENT_IS_LAN_CHANNEL (self), NULL);
+     440                 :             : 
+     441                 :          10 :   base_stream = valent_channel_ref_base_stream (VALENT_CHANNEL (self));
+     442                 :             : 
+     443         [ +  - ]:          10 :   if (base_stream != NULL)
+     444                 :          10 :     g_object_get (base_stream, "peer-certificate", &ret, NULL);
+     445                 :             : 
+     446         [ -  + ]:          10 :   return g_steal_pointer (&ret);
+     447                 :             : }
+     448                 :             : 
+     449                 :             : /**
+     450                 :             :  * valent_lan_channel_dup_host:
+     451                 :             :  * @self: a `ValentLanChannel`
+     452                 :             :  *
+     453                 :             :  * Get the host address.
+     454                 :             :  *
+     455                 :             :  * Returns: (transfer full) (nullable): the remote host address
+     456                 :             :  */
+     457                 :             : char *
+     458                 :           2 : valent_lan_channel_dup_host (ValentLanChannel *self)
+     459                 :             : {
+     460                 :           2 :   char *ret = NULL;
+     461                 :             : 
+     462         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_LAN_CHANNEL (self), NULL);
+     463                 :             : 
+     464                 :           2 :   valent_object_lock (VALENT_OBJECT (self));
+     465         [ -  + ]:           2 :   ret = g_strdup (self->host);
+     466                 :           2 :   valent_object_unlock (VALENT_OBJECT (self));
+     467                 :             : 
+     468                 :           2 :   return g_steal_pointer (&ret);
+     469                 :             : }
+     470                 :             : 
+     471                 :             : /**
+     472                 :             :  * valent_lan_channel_get_port:
+     473                 :             :  * @self: a `ValentLanChannel`
+     474                 :             :  *
+     475                 :             :  * Get the host port.
+     476                 :             :  *
+     477                 :             :  * Returns: the remote host port
+     478                 :             :  */
+     479                 :             : uint16_t
+     480                 :           1 : valent_lan_channel_get_port (ValentLanChannel *self)
+     481                 :             : {
+     482                 :           1 :   uint16_t ret;
+     483                 :             : 
+     484         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_LAN_CHANNEL (self), 0);
+     485                 :             : 
+     486                 :           1 :   valent_object_lock (VALENT_OBJECT (self));
+     487                 :           1 :   ret = self->port;
+     488                 :           1 :   valent_object_unlock (VALENT_OBJECT (self));
+     489                 :             : 
+     490                 :           1 :   return ret;
+     491                 :             : }
+     492                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel.h.func-c.html b/coverage/src/plugins/lan/valent-lan-channel.h.func-c.html new file mode 100644 index 00000000000..8f08b50b13f --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LAN_CHANNEL21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel.h.func.html b/coverage/src/plugins/lan/valent-lan-channel.h.func.html new file mode 100644 index 00000000000..c25ed2ceaf6 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LAN_CHANNEL21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-channel.h.gcov.html b/coverage/src/plugins/lan/valent-lan-channel.h.gcov.html new file mode 100644 index 00000000000..a039dad8335 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-channel.h.gcov.html @@ -0,0 +1,113 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-channel.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-channel.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_LAN_CHANNEL (valent_lan_channel_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          21 : G_DECLARE_FINAL_TYPE (ValentLanChannel, valent_lan_channel, VALENT, LAN_CHANNEL, ValentChannel)
+                   -  + ]
+      13                 :             : 
+      14                 :             : GTlsCertificate * valent_lan_channel_ref_certificate      (ValentLanChannel *self);
+      15                 :             : GTlsCertificate * valent_lan_channel_ref_peer_certificate (ValentLanChannel *self);
+      16                 :             : char            * valent_lan_channel_dup_host             (ValentLanChannel *self);
+      17                 :             : uint16_t          valent_lan_channel_get_port             (ValentLanChannel *self);
+      18                 :             : 
+      19                 :             : G_END_DECLS
+      20                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-dnssd.c.func-c.html b/coverage/src/plugins/lan/valent-lan-dnssd.c.func-c.html new file mode 100644 index 00000000000..19436365ed6 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-dnssd.c.func-c.html @@ -0,0 +1,350 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-dnssd.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-dnssd.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:81.5 %443361
Test Date:2024-03-31 18:46:36Functions:91.7 %3633
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.7 %282126
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_avahi_server_state_changed0
valent_lan_dnssd_get_item_type0
valent_lan_dnssd_get_n_items0
_avahi_entry_group_reset1
g_list_model_iface_init2
valent_lan_dnssd_class_init2
valent_lan_dnssd_get_property2
valent_lan_dnssd_new3
_avahi_client_connect4
_avahi_client_disconnect4
_avahi_entry_group_add_service_cb4
_avahi_entry_group_new4
_avahi_service_browser_prepare4
_avahi_service_browser_start_cb4
on_name_appeared4
on_name_vanished4
valent_lan_dnssd_attach4
valent_lan_dnssd_destroy4
valent_lan_dnssd_finalize4
valent_lan_dnssd_init4
valent_lan_dnssd_set_service_type4
_avahi_entry_group_add_service5
txt_new_uint5
_avahi_entry_group_commit8
_avahi_resolve_service_cb9
valent_lan_dnssd_get_item9
valent_lan_dnssd_set_identity9
weak_ref_free9
weak_ref_new12
valent_lan_dnssd_set_property13
txt_new_str15
_avahi_service_browser_event18
_avahi_entry_group_state_changed20
valent_lan_dnssd_get_type89
valent_lan_dnssd_class_intern_init2
valent_lan_dnssd_get_type_once2
valent_lan_dnssd_get_type85
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-dnssd.c.func.html b/coverage/src/plugins/lan/valent-lan-dnssd.c.func.html new file mode 100644 index 00000000000..a769732fb2c --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-dnssd.c.func.html @@ -0,0 +1,350 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-dnssd.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-dnssd.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:81.5 %443361
Test Date:2024-03-31 18:46:36Functions:91.7 %3633
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.7 %282126
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_avahi_client_connect4
_avahi_client_disconnect4
_avahi_entry_group_add_service5
_avahi_entry_group_add_service_cb4
_avahi_entry_group_commit8
_avahi_entry_group_new4
_avahi_entry_group_reset1
_avahi_entry_group_state_changed20
_avahi_resolve_service_cb9
_avahi_server_state_changed0
_avahi_service_browser_event18
_avahi_service_browser_prepare4
_avahi_service_browser_start_cb4
g_list_model_iface_init2
on_name_appeared4
on_name_vanished4
txt_new_str15
txt_new_uint5
valent_lan_dnssd_attach4
valent_lan_dnssd_class_init2
valent_lan_dnssd_destroy4
valent_lan_dnssd_finalize4
valent_lan_dnssd_get_item9
valent_lan_dnssd_get_item_type0
valent_lan_dnssd_get_n_items0
valent_lan_dnssd_get_property2
valent_lan_dnssd_get_type89
valent_lan_dnssd_class_intern_init2
valent_lan_dnssd_get_type85
valent_lan_dnssd_get_type_once2
valent_lan_dnssd_init4
valent_lan_dnssd_new3
valent_lan_dnssd_set_identity9
valent_lan_dnssd_set_property13
valent_lan_dnssd_set_service_type4
weak_ref_free9
weak_ref_new12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-dnssd.c.gcov.html b/coverage/src/plugins/lan/valent-lan-dnssd.c.gcov.html new file mode 100644 index 00000000000..c2674599ec8 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-dnssd.c.gcov.html @@ -0,0 +1,1350 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-dnssd.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-dnssd.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:81.5 %443361
Test Date:2024-03-31 18:46:36Functions:91.7 %3633
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.7 %282126
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-lan-dnssd"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-lan-dnssd.h"
+      12                 :             : #include "valent-lan-utils.h"
+      13                 :             : 
+      14                 :             : #define AVAHI_DBUS_NAME             "org.freedesktop.Avahi"
+      15                 :             : #define AVAHI_SERVER2_PATH          "/"
+      16                 :             : #define AVAHI_SERVER2_IFACE         "org.freedesktop.Avahi.Server2"
+      17                 :             : #define AVAHI_ENTRY_GROUP_IFACE     "org.freedesktop.Avahi.EntryGroup"
+      18                 :             : #define AVAHI_SERVICE_BROWSER_IFACE "org.freedesktop.Avahi.ServiceBrowser"
+      19                 :             : 
+      20                 :             : #define KDECONNECT_UDP_SERVICE_TYPE "_kdeconnect._udp"
+      21                 :             : 
+      22                 :             : 
+      23                 :             : /**
+      24                 :             :  * ValentLanDNSSD:
+      25                 :             :  *
+      26                 :             :  * A simple DNS-SD manager.
+      27                 :             :  *
+      28                 :             :  * `ValentLanDNSSD` implements [iface@Gio.ListModel], representing discovered
+      29                 :             :  * services as [class@Gio.SocketAddress] objects. The [type@GLib.MainContext]
+      30                 :             :  * passed to [method@Valent.LanDNSSD.attach] is the thread and context where
+      31                 :             :  * [signal@Gio.ListModel::items-changed] is emitted.
+      32                 :             :  *
+      33                 :             :  * If the [property@ValentLanDNSSD:identity] property is set to a KDE Connect
+      34                 :             :  * identity packet (`kdeconnect.identity`), it will export a service with the
+      35                 :             :  * type `_kdeconnect._udp`.
+      36                 :             :  */
+      37                 :             : 
+      38                 :             : struct _ValentLanDNSSD
+      39                 :             : {
+      40                 :             :   ValentObject      parent_instance;
+      41                 :             : 
+      42                 :             :   GPtrArray        *items;
+      43                 :             :   JsonNode         *identity;
+      44                 :             : 
+      45                 :             :   char             *name;
+      46                 :             :   char             *type;
+      47                 :             :   uint16_t          port;
+      48                 :             :   GVariant         *txt;
+      49                 :             : 
+      50                 :             :   GMainContext     *context;
+      51                 :             :   GDBusConnection  *connection;
+      52                 :             :   GCancellable     *cancellable;
+      53                 :             :   unsigned int      watcher_id;
+      54                 :             : 
+      55                 :             :   unsigned int      server_state;
+      56                 :             :   unsigned int      server_state_id;
+      57                 :             :   char             *entry_group_path;
+      58                 :             :   unsigned int      entry_group_state;
+      59                 :             :   unsigned int      entry_group_state_id;
+      60                 :             :   char             *service_browser_path;
+      61                 :             :   unsigned int      service_browser_event_id;
+      62                 :             : };
+      63                 :             : 
+      64                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      65                 :             : 
+      66   [ +  +  +  - ]:          89 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentLanDNSSD, valent_lan_dnssd, VALENT_TYPE_OBJECT,
+      67                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      68                 :             : 
+      69                 :             : enum {
+      70                 :             :   PROP_0,
+      71                 :             :   PROP_IDENTITY,
+      72                 :             :   PROP_SERVICE_TYPE,
+      73                 :             :   N_PROPERTIES
+      74                 :             : };
+      75                 :             : 
+      76                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      77                 :             : 
+      78                 :             : 
+      79                 :             : static inline GVariant *
+      80                 :          15 : txt_new_str (const char *name,
+      81                 :             :              const char *value)
+      82                 :             : {
+      83                 :          15 :   char *key = g_strdup_printf ("%s=%s", name, value);
+      84                 :          15 :   g_autoptr (GBytes) bytes = g_bytes_new_take (key, strlen (key));
+      85                 :             : 
+      86         [ +  - ]:          15 :   return g_variant_new_from_bytes (G_VARIANT_TYPE_BYTESTRING, bytes, TRUE);
+      87                 :             : }
+      88                 :             : 
+      89                 :             : static inline GVariant *
+      90                 :           5 : txt_new_uint (const char *name,
+      91                 :             :               uint32_t    value)
+      92                 :             : {
+      93                 :           5 :   char *key = g_strdup_printf ("%s=%u", name, value);
+      94                 :           5 :   g_autoptr (GBytes) bytes = g_bytes_new_take (key, strlen (key));
+      95                 :             : 
+      96         [ +  - ]:           5 :   return g_variant_new_from_bytes (G_VARIANT_TYPE_BYTESTRING, bytes, TRUE);
+      97                 :             : }
+      98                 :             : 
+      99                 :             : static inline GWeakRef *
+     100                 :          12 : weak_ref_new (gpointer object)
+     101                 :             : {
+     102                 :          12 :   GWeakRef *weak_ref;
+     103                 :             : 
+     104   [ +  -  -  + ]:          12 :   g_assert (object == NULL || G_IS_OBJECT (object));
+     105                 :             : 
+     106                 :          12 :   weak_ref = g_new0 (GWeakRef, 1);
+     107                 :          12 :   g_weak_ref_init (weak_ref, object);
+     108                 :             : 
+     109                 :          12 :   return g_steal_pointer (&weak_ref);
+     110                 :             : }
+     111                 :             : 
+     112                 :             : static inline void
+     113                 :           9 : weak_ref_free (gpointer data)
+     114                 :             : {
+     115                 :           9 :   GWeakRef *weak_ref = data;
+     116                 :             : 
+     117                 :           9 :   g_weak_ref_clear (weak_ref);
+     118                 :           9 :   g_free (weak_ref);
+     119                 :           9 : }
+     120                 :             : 
+     121                 :             : /*
+     122                 :             :  * GListModel
+     123                 :             :  */
+     124                 :             : static gpointer
+     125                 :           9 : valent_lan_dnssd_get_item (GListModel   *list,
+     126                 :             :                            unsigned int  position)
+     127                 :             : {
+     128                 :           9 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (list);
+     129                 :           9 :   gpointer ret = NULL;
+     130                 :             : 
+     131         [ +  - ]:           9 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     132                 :             : 
+     133                 :           9 :   valent_object_lock (VALENT_OBJECT (self));
+     134         [ +  - ]:           9 :   if G_LIKELY (position < self->items->len)
+     135                 :           9 :     ret = g_object_ref (g_ptr_array_index (self->items, position));
+     136                 :           9 :   valent_object_unlock (VALENT_OBJECT (self));
+     137                 :             : 
+     138                 :           9 :   return g_steal_pointer (&ret);
+     139                 :             : }
+     140                 :             : 
+     141                 :             : static GType
+     142                 :           0 : valent_lan_dnssd_get_item_type (GListModel *list)
+     143                 :             : {
+     144                 :           0 :   return G_TYPE_SOCKET_ADDRESS;
+     145                 :             : }
+     146                 :             : 
+     147                 :             : static unsigned int
+     148                 :           0 : valent_lan_dnssd_get_n_items (GListModel *list)
+     149                 :             : {
+     150                 :           0 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (list);
+     151                 :           0 :   unsigned int ret = 0;
+     152                 :             : 
+     153         [ #  # ]:           0 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     154                 :             : 
+     155                 :           0 :   valent_object_lock (VALENT_OBJECT (self));
+     156                 :           0 :   ret = self->items->len;
+     157                 :           0 :   valent_object_unlock (VALENT_OBJECT (self));
+     158                 :             : 
+     159                 :           0 :   return ret;
+     160                 :             : }
+     161                 :             : 
+     162                 :             : static void
+     163                 :           2 : g_list_model_iface_init (GListModelInterface *iface)
+     164                 :             : {
+     165                 :           2 :   iface->get_item = valent_lan_dnssd_get_item;
+     166                 :           2 :   iface->get_item_type = valent_lan_dnssd_get_item_type;
+     167                 :           2 :   iface->get_n_items = valent_lan_dnssd_get_n_items;
+     168                 :           2 : }
+     169                 :             : 
+     170                 :             : /*
+     171                 :             :  * Avahi D-Bus Service
+     172                 :             :  *
+     173                 :             :  * See Also:
+     174                 :             :  *   - https://github.com/lathiat/avahi/blob/master/avahi-daemon/org.freedesktop.Avahi.Server.xml
+     175                 :             :  *   - https://github.com/lathiat/avahi/blob/master/avahi-daemon/org.freedesktop.Avahi.ServiceBrowser.xml
+     176                 :             :  *   - https://github.com/lathiat/avahi/blob/master/avahi-daemon/org.freedesktop.Avahi.EntryGroup.xml
+     177                 :             :  */
+     178                 :             : enum {
+     179                 :             :   _AVAHI_SERVER_INVALID,
+     180                 :             :   _AVAHI_SERVER_REGISTERING,
+     181                 :             :   _AVAHI_SERVER_RUNNING,
+     182                 :             :   _AVAHI_SERVER_COLLISION,
+     183                 :             :   _AVAHI_SERVER_FAILURE,
+     184                 :             : };
+     185                 :             : 
+     186                 :             : enum {
+     187                 :             :   _AVAHI_ENTRY_GROUP_UNCOMMITTED,
+     188                 :             :   _AVAHI_ENTRY_GROUP_REGISTERING,
+     189                 :             :   _AVAHI_ENTRY_GROUP_ESTABLISHED,
+     190                 :             :   _AVAHI_ENTRY_GROUP_COLLISION,
+     191                 :             :   _AVAHI_ENTRY_GROUP_FAILURE,
+     192                 :             : };
+     193                 :             : 
+     194                 :             : static gboolean   _avahi_client_connect          (ValentLanDNSSD *self);
+     195                 :             : static gboolean   _avahi_client_disconnect       (ValentLanDNSSD *self);
+     196                 :             : static gboolean   _avahi_entry_group_new         (ValentLanDNSSD *self);
+     197                 :             : static gboolean   _avahi_entry_group_add_service (ValentLanDNSSD *self);
+     198                 :             : static gboolean   _avahi_entry_group_commit      (ValentLanDNSSD *self);
+     199                 :             : static gboolean   _avahi_entry_group_reset       (ValentLanDNSSD *self);
+     200                 :             : static gboolean   _avahi_service_browser_prepare (ValentLanDNSSD *self);
+     201                 :             : 
+     202                 :             : 
+     203                 :             : static void
+     204                 :          20 : _avahi_entry_group_state_changed (GDBusConnection *connection,
+     205                 :             :                                   const char      *sender_name,
+     206                 :             :                                   const char      *object_path,
+     207                 :             :                                   const char      *interface_name,
+     208                 :             :                                   const char      *signal_name,
+     209                 :             :                                   GVariant        *parameters,
+     210                 :             :                                   gpointer         user_data)
+     211                 :             : {
+     212                 :          40 :   g_autoptr (ValentLanDNSSD) self = g_weak_ref_get ((GWeakRef *)user_data);
+     213                 :          20 :   const char *error = NULL;
+     214                 :             : 
+     215   [ +  -  +  - ]:          20 :   g_assert (self == NULL || VALENT_IS_LAN_DNSSD (self));
+     216         [ -  + ]:          20 :   g_assert (g_str_equal (signal_name, "StateChanged"));
+     217                 :             : 
+     218   [ +  -  -  + ]:          20 :   if (self == NULL || valent_object_in_destruction (VALENT_OBJECT (self)))
+     219                 :           0 :     return;
+     220                 :             : 
+     221                 :          20 :   valent_object_lock (VALENT_OBJECT (self));
+     222                 :          20 :   g_variant_get (parameters, "(i&s)", &self->entry_group_state, &error);
+     223                 :             : 
+     224                 :          20 :   VALENT_NOTE ("[%i] %s", self->entry_group_state, error);
+     225                 :             : 
+     226   [ +  -  -  + ]:          20 :   switch (self->entry_group_state)
+     227                 :             :     {
+     228                 :           4 :     case _AVAHI_ENTRY_GROUP_UNCOMMITTED:
+     229                 :           4 :       _avahi_entry_group_commit (self);
+     230                 :           4 :       break;
+     231                 :             : 
+     232                 :             :     case _AVAHI_ENTRY_GROUP_REGISTERING:
+     233                 :             :     case _AVAHI_ENTRY_GROUP_ESTABLISHED:
+     234                 :             :       break;
+     235                 :             : 
+     236                 :           0 :     case _AVAHI_ENTRY_GROUP_COLLISION:
+     237                 :           0 :       g_warning ("%s(): DNS-SD service name \"%s\" already registered",
+     238                 :             :                  G_STRFUNC, self->name);
+     239                 :           0 :       break;
+     240                 :             : 
+     241                 :           0 :     case _AVAHI_ENTRY_GROUP_FAILURE:
+     242                 :           0 :       g_warning ("%s(): DNS-SD failure: %s", G_STRFUNC, error);
+     243                 :           0 :       break;
+     244                 :             :     }
+     245                 :          20 :   valent_object_unlock (VALENT_OBJECT (self));
+     246                 :             : }
+     247                 :             : 
+     248                 :             : static gboolean
+     249                 :           4 : _avahi_entry_group_new (ValentLanDNSSD *self)
+     250                 :             : {
+     251         [ +  - ]:           4 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     252                 :             : 
+     253                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     254         [ -  + ]:           4 :   if (self->entry_group_path == NULL)
+     255                 :             :     {
+     256                 :           4 :       g_autoptr (GVariant) reply = NULL;
+     257                 :           4 :       g_autoptr (GError) error = NULL;
+     258                 :             : 
+     259                 :           4 :       reply = g_dbus_connection_call_sync (self->connection,
+     260                 :             :                                            AVAHI_DBUS_NAME,
+     261                 :             :                                            AVAHI_SERVER2_PATH,
+     262                 :             :                                            AVAHI_SERVER2_IFACE,
+     263                 :             :                                            "EntryGroupNew",
+     264                 :             :                                            NULL,
+     265                 :             :                                            G_VARIANT_TYPE ("(o)"),
+     266                 :             :                                            G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     267                 :             :                                            -1,
+     268                 :             :                                            self->cancellable,
+     269                 :             :                                            &error);
+     270                 :             : 
+     271         [ -  + ]:           4 :       if (reply == NULL)
+     272                 :             :         {
+     273         [ #  # ]:           0 :           if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     274                 :           0 :             g_warning ("%s(): %s", G_STRFUNC, error->message);
+     275                 :             : 
+     276                 :           0 :           goto unlock_exit;
+     277                 :             :         }
+     278                 :             : 
+     279                 :           4 :       g_variant_get (reply, "(o)", &self->entry_group_path);
+     280                 :           4 :       g_clear_pointer (&reply, g_variant_unref);
+     281                 :             : 
+     282                 :           8 :       reply = g_dbus_connection_call_sync (self->connection,
+     283                 :             :                                            AVAHI_DBUS_NAME,
+     284                 :           4 :                                            self->entry_group_path,
+     285                 :             :                                            AVAHI_ENTRY_GROUP_IFACE,
+     286                 :             :                                            "GetState",
+     287                 :             :                                            NULL,
+     288                 :             :                                            NULL,
+     289                 :             :                                            G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     290                 :             :                                            -1,
+     291                 :             :                                            self->cancellable,
+     292                 :             :                                            &error);
+     293                 :             : 
+     294         [ -  + ]:           4 :       if (reply == NULL)
+     295                 :             :         {
+     296         [ #  # ]:           0 :           if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     297                 :           0 :             g_warning ("%s(): %s", G_STRFUNC, error->message);
+     298                 :             : 
+     299                 :           0 :           goto unlock_exit;
+     300                 :             :         }
+     301                 :             : 
+     302                 :           4 :       g_variant_get (reply, "(i)", &self->entry_group_state);
+     303                 :           8 :       self->entry_group_state_id =
+     304                 :           4 :         g_dbus_connection_signal_subscribe (self->connection,
+     305                 :             :                                             AVAHI_DBUS_NAME,
+     306                 :             :                                             AVAHI_ENTRY_GROUP_IFACE,
+     307                 :             :                                             "StateChanged",
+     308                 :           4 :                                             self->entry_group_path,
+     309                 :             :                                             NULL,
+     310                 :             :                                             G_DBUS_SIGNAL_FLAGS_NONE,
+     311                 :             :                                             _avahi_entry_group_state_changed,
+     312                 :           4 :                                             weak_ref_new (self),
+     313                 :             :                                             weak_ref_free);
+     314                 :             : 
+     315                 :             :       /* If the initial state is "uncommitted" call `AddService()` then
+     316                 :             :        * `Commit()`, since `StateChanged` won't be emitted in that case.
+     317                 :             :        */
+     318         [ +  - ]:           4 :       if (self->entry_group_state == _AVAHI_ENTRY_GROUP_UNCOMMITTED)
+     319                 :             :         {
+     320                 :           4 :           g_main_context_invoke_full (self->context,
+     321                 :             :                                       G_PRIORITY_DEFAULT,
+     322                 :             :                                       G_SOURCE_FUNC (_avahi_entry_group_add_service),
+     323                 :             :                                       g_object_ref (self),
+     324                 :             :                                       g_object_unref);
+     325                 :             :         }
+     326                 :             :     }
+     327                 :             : 
+     328                 :           0 : unlock_exit:
+     329                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     330                 :             : 
+     331                 :           4 :   return G_SOURCE_REMOVE;
+     332                 :             : }
+     333                 :             : 
+     334                 :             : static void
+     335                 :           4 : _avahi_entry_group_add_service_cb (GDBusConnection *connection,
+     336                 :             :                                    GAsyncResult    *result,
+     337                 :             :                                    ValentLanDNSSD  *self)
+     338                 :             : {
+     339                 :           4 :   g_autoptr (GVariant) reply = NULL;
+     340                 :           4 :   g_autoptr (GError) error = NULL;
+     341                 :             : 
+     342                 :           4 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     343                 :             : 
+     344         [ -  + ]:           4 :   if (reply == NULL)
+     345                 :             :     {
+     346         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     347                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     348                 :             : 
+     349         [ #  # ]:           0 :       return;
+     350                 :             :     }
+     351                 :             : 
+     352         [ -  + ]:           4 :   _avahi_entry_group_commit (self);
+     353                 :             : }
+     354                 :             : 
+     355                 :             : static gboolean
+     356                 :           5 : _avahi_entry_group_add_service (ValentLanDNSSD *self)
+     357                 :             : {
+     358                 :           5 :   valent_object_lock (VALENT_OBJECT (self));
+     359   [ +  -  -  + ]:           5 :   if (self->identity == NULL || self->entry_group_path == NULL)
+     360                 :           0 :     goto unlock_exit;
+     361                 :             : 
+     362         [ +  + ]:           5 :   if (self->entry_group_state == _AVAHI_ENTRY_GROUP_UNCOMMITTED)
+     363                 :             :     {
+     364                 :           8 :       g_dbus_connection_call (self->connection,
+     365                 :             :                               AVAHI_DBUS_NAME,
+     366                 :           4 :                               self->entry_group_path,
+     367                 :             :                               AVAHI_ENTRY_GROUP_IFACE,
+     368                 :             :                               "AddService",
+     369                 :             :                               g_variant_new ("(iiussssq@aay)",
+     370                 :             :                                              -1, // interface: AVAHI_IF_UNSPEC
+     371                 :             :                                              -1, // protocol:  AVAHI_PROTO_UNSPEC
+     372                 :             :                                              64, // flags:     AVAHI_PUBLISH_UPDATE
+     373                 :             :                                              self->name,
+     374                 :             :                                              self->type,
+     375                 :             :                                              "", // domain
+     376                 :             :                                              "", // host
+     377                 :           4 :                                              self->port,
+     378                 :             :                                              self->txt),
+     379                 :             :                               NULL,
+     380                 :             :                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     381                 :             :                               -1,
+     382                 :             :                               self->cancellable,
+     383                 :             :                               (GAsyncReadyCallback)_avahi_entry_group_add_service_cb,
+     384                 :             :                               self);
+     385                 :             :     }
+     386         [ -  + ]:           1 :   else if (self->entry_group_state == _AVAHI_ENTRY_GROUP_REGISTERING ||
+     387                 :             :            self->entry_group_state == _AVAHI_ENTRY_GROUP_ESTABLISHED)
+     388                 :             :     {
+     389                 :           1 :       g_dbus_connection_call (self->connection,
+     390                 :             :                               AVAHI_DBUS_NAME,
+     391                 :           1 :                               self->entry_group_path,
+     392                 :             :                               AVAHI_ENTRY_GROUP_IFACE,
+     393                 :             :                               "UpdateServiceTxt",
+     394                 :             :                               g_variant_new ("(iiusss@aay)",
+     395                 :             :                                              -1, // interface: AVAHI_IF_UNSPEC
+     396                 :             :                                              -1, // protocol:  AVAHI_PROTO_UNSPEC
+     397                 :             :                                               0, // flags:     AvahiPublishFlags
+     398                 :             :                                              self->name,
+     399                 :             :                                              self->type,
+     400                 :             :                                              "", // domain
+     401                 :             :                                              self->txt),
+     402                 :             :                               NULL,
+     403                 :             :                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     404                 :             :                               -1,
+     405                 :             :                               self->cancellable,
+     406                 :             :                               NULL,
+     407                 :             :                               NULL);
+     408                 :             :     }
+     409                 :             : 
+     410                 :           0 : unlock_exit:
+     411                 :           5 :   valent_object_unlock (VALENT_OBJECT (self));
+     412                 :             : 
+     413                 :           5 :   return G_SOURCE_REMOVE;
+     414                 :             : }
+     415                 :             : 
+     416                 :             : static gboolean
+     417                 :           8 : _avahi_entry_group_commit (ValentLanDNSSD *self)
+     418                 :             : {
+     419                 :           8 :   valent_object_lock (VALENT_OBJECT (self));
+     420         [ +  - ]:           8 :   if (self->entry_group_path != NULL &&
+     421         [ +  - ]:           8 :       self->entry_group_state == _AVAHI_ENTRY_GROUP_UNCOMMITTED)
+     422                 :             :     {
+     423                 :           8 :       g_dbus_connection_call (self->connection,
+     424                 :             :                               AVAHI_DBUS_NAME,
+     425                 :             :                               self->entry_group_path,
+     426                 :             :                               AVAHI_ENTRY_GROUP_IFACE,
+     427                 :             :                               "Commit",
+     428                 :             :                               NULL,
+     429                 :             :                               NULL,
+     430                 :             :                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     431                 :             :                               -1,
+     432                 :             :                               self->cancellable,
+     433                 :             :                               NULL,
+     434                 :             :                               NULL);
+     435                 :             :     }
+     436                 :           8 :   valent_object_unlock (VALENT_OBJECT (self));
+     437                 :             : 
+     438                 :           8 :   return G_SOURCE_REMOVE;
+     439                 :             : }
+     440                 :             : 
+     441                 :             : static gboolean
+     442                 :           1 : _avahi_entry_group_reset (ValentLanDNSSD *self)
+     443                 :             : {
+     444                 :           1 :   valent_object_lock (VALENT_OBJECT (self));
+     445         [ +  - ]:           1 :   if (self->entry_group_path != NULL &&
+     446         [ +  - ]:           1 :       (self->entry_group_state == _AVAHI_ENTRY_GROUP_REGISTERING ||
+     447                 :             :        self->entry_group_state == _AVAHI_ENTRY_GROUP_ESTABLISHED))
+     448                 :             :     {
+     449                 :           1 :       g_dbus_connection_call (self->connection,
+     450                 :             :                               AVAHI_DBUS_NAME,
+     451                 :             :                               self->entry_group_path,
+     452                 :             :                               AVAHI_ENTRY_GROUP_IFACE,
+     453                 :             :                               "Reset",
+     454                 :             :                               NULL,
+     455                 :             :                               NULL,
+     456                 :             :                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     457                 :             :                               -1,
+     458                 :             :                               self->cancellable,
+     459                 :             :                               NULL,
+     460                 :             :                               NULL);
+     461                 :             :     }
+     462                 :           1 :   valent_object_unlock (VALENT_OBJECT (self));
+     463                 :             : 
+     464                 :           1 :   return G_SOURCE_REMOVE;
+     465                 :             : }
+     466                 :             : 
+     467                 :             : static void
+     468                 :           9 : _avahi_resolve_service_cb (GDBusConnection *connection,
+     469                 :             :                            GAsyncResult    *result,
+     470                 :             :                            gpointer         user_data)
+     471                 :             : {
+     472                 :           9 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (user_data);
+     473                 :           9 :   g_autoptr (GVariant) reply = NULL;
+     474         [ -  - ]:           9 :   g_autoptr (GError) error = NULL;
+     475                 :             : 
+     476                 :           9 :   int interface = 0;
+     477                 :           9 :   int protocol = 0;
+     478                 :           9 :   const char *name = NULL;
+     479                 :           9 :   const char *type = NULL;
+     480                 :           9 :   const char *domain = NULL;
+     481                 :           9 :   const char *host = NULL;
+     482                 :           9 :   int aprotocol = 0;
+     483                 :           9 :   const char *address = NULL;
+     484                 :           9 :   uint16_t port = 0;
+     485   [ -  +  -  - ]:           9 :   g_autoptr (GVariant) txt = NULL;
+     486                 :           9 :   uint32_t flags = 0;
+     487                 :             : 
+     488   [ +  -  -  - ]:           9 :   g_autoptr (GSocketAddress) saddress = NULL;
+     489                 :           9 :   unsigned int position = 0;
+     490                 :             : 
+     491                 :           9 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     492                 :             : 
+     493         [ -  + ]:           9 :   if (reply == NULL)
+     494                 :             :     {
+     495         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     496                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     497                 :             : 
+     498                 :           0 :       return;
+     499                 :             :     }
+     500                 :             : 
+     501                 :           9 :   g_variant_get (reply,
+     502                 :             :                  "(ii&s&s&s&si&sq@aayu)",
+     503                 :             :                  &interface,
+     504                 :             :                  &protocol,
+     505                 :             :                  &name,
+     506                 :             :                  &type,
+     507                 :             :                  &domain,
+     508                 :             :                  &host,
+     509                 :             :                  &aprotocol,
+     510                 :             :                  &address,
+     511                 :             :                  &port,
+     512                 :             :                  &txt,
+     513                 :             :                  &flags);
+     514                 :             : 
+     515                 :           9 :   saddress = g_inet_socket_address_new_from_string (address, port);
+     516   [ +  -  +  -  :           9 :   g_return_if_fail (G_IS_SOCKET_ADDRESS (saddress));
+          +  -  -  +  -  
+                      - ]
+     517         [ -  + ]:          18 :   _g_socket_address_set_dnssd_name (saddress, name);
+     518                 :             : 
+     519                 :           9 :   valent_object_lock (VALENT_OBJECT (self));
+     520                 :           9 :   position = self->items->len;
+     521                 :           9 :   g_ptr_array_add (self->items, g_steal_pointer (&saddress));
+     522                 :           9 :   valent_object_unlock (VALENT_OBJECT (self));
+     523                 :             : 
+     524                 :             :   /* NOTE: `items-changed` is emitted in Avahi's thread-context */
+     525         [ +  - ]:           9 :   g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
+     526                 :             : }
+     527                 :             : 
+     528                 :             : static void
+     529                 :          18 : _avahi_service_browser_event (GDBusConnection *connection,
+     530                 :             :                               const char      *sender_name,
+     531                 :             :                               const char      *object_path,
+     532                 :             :                               const char      *interface_name,
+     533                 :             :                               const char      *signal_name,
+     534                 :             :                               GVariant        *parameters,
+     535                 :             :                               gpointer         user_data)
+     536                 :             : {
+     537                 :          36 :   g_autoptr (ValentLanDNSSD) self = g_weak_ref_get ((GWeakRef *)user_data);
+     538                 :          18 :   int interface = 0;
+     539                 :          18 :   int protocol = 0;
+     540                 :          18 :   const char *name = 0;
+     541                 :          18 :   const char *type = 0;
+     542                 :          18 :   const char *domain = 0;
+     543                 :          18 :   uint32_t flags = 0;
+     544                 :             : 
+     545   [ +  -  +  - ]:          18 :   g_assert (self == NULL || VALENT_IS_LAN_DNSSD (self));
+     546         [ -  + ]:          18 :   g_assert (signal_name != NULL && parameters != NULL);
+     547                 :             : 
+     548   [ +  -  -  + ]:          18 :   if (self == NULL || valent_object_in_destruction (VALENT_OBJECT (self)))
+     549                 :           0 :     return;
+     550                 :             : 
+     551                 :             :   /* Ignoring "CacheExhausted", "AllForNow" */
+     552                 :          18 :   VALENT_NOTE ("%s", signal_name);
+     553                 :             : 
+     554         [ +  + ]:          18 :   if (g_str_equal (signal_name, "ItemNew"))
+     555                 :             :     {
+     556                 :           9 :       g_variant_get (parameters,
+     557                 :             :                      "(ii&s&s&su)",
+     558                 :             :                      &interface,
+     559                 :             :                      &protocol,
+     560                 :             :                      &name,
+     561                 :             :                      &type,
+     562                 :             :                      &domain,
+     563                 :             :                      &flags);
+     564                 :             : 
+     565                 :           9 :       g_dbus_connection_call (connection,
+     566                 :             :                               AVAHI_DBUS_NAME,
+     567                 :             :                               AVAHI_SERVER2_PATH,
+     568                 :             :                               AVAHI_SERVER2_IFACE,
+     569                 :             :                               "ResolveService",
+     570                 :             :                               g_variant_new ("(iisssiu)",
+     571                 :             :                                              interface,
+     572                 :             :                                              protocol,
+     573                 :             :                                              name,
+     574                 :             :                                              type,
+     575                 :             :                                              domain,
+     576                 :             :                                              -1, // aprotocol: AVAHI_PROTO_UNSPEC
+     577                 :             :                                              0), // flags: AvahiLookupFlags
+     578                 :             :                               G_VARIANT_TYPE ("(iissssisqaayu)"),
+     579                 :             :                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     580                 :             :                               -1,
+     581                 :             :                               NULL,
+     582                 :             :                               (GAsyncReadyCallback)_avahi_resolve_service_cb,
+     583                 :             :                               self);
+     584                 :             :     }
+     585         [ +  + ]:           9 :   else if (g_str_equal (signal_name, "ItemRemove"))
+     586                 :             :     {
+     587                 :           1 :       g_variant_get (parameters,
+     588                 :             :                      "(ii&s&s&su)",
+     589                 :             :                      &interface,
+     590                 :             :                      &protocol,
+     591                 :             :                      &name,
+     592                 :             :                      &type,
+     593                 :             :                      &domain,
+     594                 :             :                      &flags);
+     595                 :             : 
+     596         [ +  + ]:           2 :       for (unsigned int i = 0; i < self->items->len; i++)
+     597                 :             :         {
+     598                 :           1 :           GSocketAddress *saddress = NULL;
+     599                 :           1 :           GSocketFamily sprotocol = G_SOCKET_FAMILY_INVALID;
+     600                 :           1 :           const char *device_id = NULL;
+     601                 :             : 
+     602                 :           1 :           saddress = g_ptr_array_index (self->items, i);
+     603                 :           1 :           sprotocol = g_socket_address_get_family (saddress);
+     604                 :             : 
+     605                 :             :           /* NOTE: IPv4 = 0, IPv6 = 1, Any = -1 */
+     606         [ -  + ]:           1 :           if (protocol != -1)
+     607                 :             :             {
+     608   [ #  #  #  #  :           0 :               if ((protocol == 1 && sprotocol != G_SOCKET_FAMILY_IPV6) ||
+                   #  # ]
+     609         [ #  # ]:           0 :                   (protocol == 0 && sprotocol != G_SOCKET_FAMILY_IPV4))
+     610                 :           0 :                 continue;
+     611                 :             :             }
+     612                 :             : 
+     613                 :           1 :           device_id = _g_socket_address_get_dnssd_name (saddress);
+     614                 :             : 
+     615         [ -  + ]:           1 :           if (!g_str_equal (device_id, name))
+     616                 :           0 :             continue;
+     617                 :             : 
+     618                 :           1 :           valent_object_lock (VALENT_OBJECT (self));
+     619                 :           1 :           g_ptr_array_remove_index (self->items, i);
+     620                 :           1 :           valent_object_unlock (VALENT_OBJECT (self));
+     621                 :             : 
+     622                 :           1 :           g_list_model_items_changed (G_LIST_MODEL (self), i, 1, 0);
+     623                 :             :         }
+     624                 :             :     }
+     625         [ -  + ]:           8 :   else if (g_str_equal (signal_name, "Failure"))
+     626                 :             :     {
+     627                 :           0 :       const char *error = NULL;
+     628                 :             : 
+     629                 :           0 :       g_variant_get (parameters, "&s", &error);
+     630                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error);
+     631                 :             :     }
+     632                 :             : }
+     633                 :             : 
+     634                 :             : static void
+     635                 :           4 : _avahi_service_browser_start_cb (GDBusConnection *connection,
+     636                 :             :                                  GAsyncResult    *result,
+     637                 :             :                                  ValentLanDNSSD  *self)
+     638                 :             : {
+     639                 :           8 :   g_autoptr (GVariant) reply = NULL;
+     640         [ +  - ]:           4 :   g_autoptr (GError) error = NULL;
+     641                 :             : 
+     642                 :           4 :   reply = g_dbus_connection_call_finish (connection, result, &error);
+     643                 :             : 
+     644         [ -  + ]:           4 :   if (reply == NULL)
+     645                 :             :     {
+     646         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     647                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     648                 :             : 
+     649                 :           0 :       valent_object_lock (VALENT_OBJECT (self));
+     650         [ #  # ]:           0 :       if (self->service_browser_event_id != 0)
+     651                 :             :         {
+     652                 :           0 :           g_dbus_connection_signal_unsubscribe (connection,
+     653                 :             :                                                 self->service_browser_event_id);
+     654                 :           0 :           self->service_browser_event_id = 0;
+     655                 :             :         }
+     656                 :             : 
+     657         [ #  # ]:           0 :       g_clear_pointer (&self->service_browser_path, g_free);
+     658                 :           0 :       valent_object_unlock (VALENT_OBJECT (self));
+     659                 :             :     }
+     660                 :           4 : }
+     661                 :             : 
+     662                 :             : static gboolean
+     663                 :           4 : _avahi_service_browser_prepare (ValentLanDNSSD *self)
+     664                 :             : {
+     665         [ +  - ]:           4 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     666                 :             : 
+     667                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     668         [ -  + ]:           4 :   if (self->service_browser_path == NULL)
+     669                 :             :     {
+     670                 :           4 :       g_autoptr (GVariant) reply = NULL;
+     671                 :           4 :       g_autoptr (GError) error = NULL;
+     672                 :             : 
+     673                 :           4 :       reply = g_dbus_connection_call_sync (self->connection,
+     674                 :             :                                            AVAHI_DBUS_NAME,
+     675                 :             :                                            AVAHI_SERVER2_PATH,
+     676                 :             :                                            AVAHI_SERVER2_IFACE,
+     677                 :             :                                            "ServiceBrowserPrepare",
+     678                 :             :                                            g_variant_new ("(iissu)",
+     679                 :             :                                                           -1, // interface: AVAHI_IF_UNSPEC
+     680                 :             :                                                           -1, // protocol: AVAHI_PROTO_UNSPEC
+     681                 :             :                                                           self->type,
+     682                 :             :                                                           "", // domain
+     683                 :             :                                                           0), // flags: AvahiLookupFlags
+     684                 :             :                                            G_VARIANT_TYPE ("(o)"),
+     685                 :             :                                            G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     686                 :             :                                            -1,
+     687                 :             :                                            self->cancellable,
+     688                 :             :                                            &error);
+     689                 :             : 
+     690         [ -  + ]:           4 :       if (reply == NULL)
+     691                 :             :         {
+     692         [ #  # ]:           0 :           if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     693                 :           0 :             g_warning ("%s(): %s", G_STRFUNC, error->message);
+     694                 :             : 
+     695         [ #  # ]:           0 :           goto unlock_exit;
+     696                 :             :         }
+     697                 :             : 
+     698                 :           4 :       g_variant_get (reply, "(o)", &self->service_browser_path);
+     699                 :             : 
+     700                 :           8 :       self->service_browser_event_id =
+     701                 :           4 :         g_dbus_connection_signal_subscribe (self->connection,
+     702                 :             :                                             AVAHI_DBUS_NAME,
+     703                 :             :                                             AVAHI_SERVICE_BROWSER_IFACE,
+     704                 :             :                                             NULL, // all signals
+     705                 :           4 :                                             self->service_browser_path,
+     706                 :             :                                             NULL,
+     707                 :             :                                             G_DBUS_SIGNAL_FLAGS_NONE,
+     708                 :             :                                             _avahi_service_browser_event,
+     709                 :           4 :                                             weak_ref_new (self),
+     710                 :             :                                             weak_ref_free);
+     711                 :             : 
+     712         [ -  + ]:           4 :       g_dbus_connection_call (self->connection,
+     713                 :             :                               AVAHI_DBUS_NAME,
+     714                 :           4 :                               self->service_browser_path,
+     715                 :             :                               AVAHI_SERVICE_BROWSER_IFACE,
+     716                 :             :                               "Start",
+     717                 :             :                               NULL,
+     718                 :             :                               NULL,
+     719                 :             :                               G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     720                 :             :                               -1,
+     721                 :             :                               self->cancellable,
+     722                 :             :                               (GAsyncReadyCallback)_avahi_service_browser_start_cb,
+     723                 :             :                               self);
+     724                 :             :     }
+     725                 :             : 
+     726                 :           0 : unlock_exit:
+     727                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     728                 :             : 
+     729                 :           4 :   return G_SOURCE_REMOVE;
+     730                 :             : }
+     731                 :             : 
+     732                 :             : static void
+     733                 :           0 : _avahi_server_state_changed (GDBusConnection *connection,
+     734                 :             :                              const char      *sender_name,
+     735                 :             :                              const char      *object_path,
+     736                 :             :                              const char      *interface_name,
+     737                 :             :                              const char      *signal_name,
+     738                 :             :                              GVariant        *parameters,
+     739                 :             :                              gpointer         user_data)
+     740                 :             : {
+     741                 :           0 :   g_autoptr (ValentLanDNSSD) self = g_weak_ref_get ((GWeakRef *)user_data);
+     742                 :           0 :   const char *error = NULL;
+     743                 :             : 
+     744   [ #  #  #  # ]:           0 :   g_assert (self == NULL || VALENT_IS_LAN_DNSSD (self));
+     745         [ #  # ]:           0 :   g_assert (g_str_equal (signal_name, "StateChanged"));
+     746                 :             : 
+     747   [ #  #  #  # ]:           0 :   if (self == NULL || valent_object_in_destruction (VALENT_OBJECT (self)))
+     748                 :           0 :     return;
+     749                 :             : 
+     750                 :           0 :   valent_object_lock (VALENT_OBJECT (self));
+     751                 :           0 :   g_variant_get (parameters, "(i&s)", &self->server_state, &error);
+     752                 :             : 
+     753                 :           0 :   VALENT_NOTE ("[%i] %s", self->server_state, error);
+     754                 :             : 
+     755   [ #  #  #  # ]:           0 :   switch (self->server_state)
+     756                 :             :     {
+     757                 :             :     case _AVAHI_SERVER_INVALID:
+     758                 :             :     case _AVAHI_SERVER_REGISTERING:
+     759                 :             :       break;
+     760                 :             : 
+     761                 :           0 :     case _AVAHI_SERVER_RUNNING:
+     762                 :           0 :       g_main_context_invoke_full (self->context,
+     763                 :             :                                   G_PRIORITY_DEFAULT,
+     764                 :             :                                   G_SOURCE_FUNC (_avahi_entry_group_new),
+     765                 :             :                                   g_object_ref (self),
+     766                 :             :                                   g_object_unref);
+     767                 :           0 :       g_main_context_invoke_full (self->context,
+     768                 :             :                                   G_PRIORITY_DEFAULT,
+     769                 :             :                                   G_SOURCE_FUNC (_avahi_service_browser_prepare),
+     770                 :             :                                   g_object_ref (self),
+     771                 :             :                                   g_object_unref);
+     772                 :           0 :       break;
+     773                 :             : 
+     774                 :           0 :     case _AVAHI_SERVER_COLLISION:
+     775                 :           0 :       g_warning ("%s(): DNS-SD server collision: %s", G_STRFUNC, error);
+     776                 :           0 :       break;
+     777                 :             : 
+     778                 :           0 :     case _AVAHI_SERVER_FAILURE:
+     779                 :           0 :       g_warning ("%s(): DNS-SD server failure: %s", G_STRFUNC, error);
+     780                 :           0 :       break;
+     781                 :             :     }
+     782                 :           0 :   valent_object_unlock (VALENT_OBJECT (self));
+     783                 :             : }
+     784                 :             : 
+     785                 :             : static void
+     786                 :           4 : on_name_appeared (GDBusConnection *connection,
+     787                 :             :                   const char      *name,
+     788                 :             :                   const char      *name_owner,
+     789                 :             :                   ValentLanDNSSD  *self)
+     790                 :             : {
+     791                 :           4 :   g_autoptr (GCancellable) destroy = NULL;
+     792   [ -  -  +  - ]:           4 :   g_autoptr (GVariant) reply = NULL;
+     793         [ -  - ]:           4 :   g_autoptr (GError) error = NULL;
+     794                 :             : 
+     795         [ +  - ]:           4 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     796                 :             : 
+     797                 :           4 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     798                 :           4 :   reply = g_dbus_connection_call_sync (connection,
+     799                 :             :                                        AVAHI_DBUS_NAME,
+     800                 :             :                                        AVAHI_SERVER2_PATH,
+     801                 :             :                                        AVAHI_SERVER2_IFACE,
+     802                 :             :                                        "GetState",
+     803                 :             :                                        NULL,
+     804                 :             :                                        NULL,
+     805                 :             :                                        G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     806                 :             :                                        -1,
+     807                 :             :                                        destroy,
+     808                 :             :                                        &error);
+     809                 :             : 
+     810         [ -  + ]:           4 :   if (reply == NULL)
+     811                 :             :     {
+     812         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     813                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     814                 :             : 
+     815         [ #  # ]:           0 :       return;
+     816                 :             :     }
+     817                 :             : 
+     818                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     819                 :             :   /* Create a new cancellable, chained to the object's cancellable, so that
+     820                 :             :    * any operations will be cancelled if the object is destroyed.
+     821                 :             :    */
+     822                 :           4 :   self->connection = g_object_ref (connection);
+     823                 :           4 :   self->cancellable = g_cancellable_new ();
+     824                 :           4 :   g_signal_connect_object (destroy,
+     825                 :             :                            "cancelled",
+     826                 :             :                            G_CALLBACK (g_cancellable_cancel),
+     827                 :             :                            self->cancellable,
+     828                 :             :                            G_CONNECT_SWAPPED);
+     829                 :             : 
+     830                 :           4 :   g_variant_get (reply, "(i)", &self->server_state);
+     831                 :           8 :   self->server_state_id =
+     832                 :           4 :     g_dbus_connection_signal_subscribe (self->connection,
+     833                 :             :                                         AVAHI_DBUS_NAME,
+     834                 :             :                                         AVAHI_SERVER2_IFACE,
+     835                 :             :                                         "StateChanged",
+     836                 :             :                                         AVAHI_SERVER2_PATH,
+     837                 :             :                                         NULL,
+     838                 :             :                                         G_DBUS_SIGNAL_FLAGS_NONE,
+     839                 :             :                                         _avahi_server_state_changed,
+     840                 :           4 :                                         weak_ref_new (self),
+     841                 :             :                                         weak_ref_free);
+     842                 :             : 
+     843                 :             : 
+     844                 :             :   /* If the initial state is "running" call `EntryGroupNew()` and
+     845                 :             :    * `ServiceBrowserPrepare()`, otherwise wait for a `StateChanged` emission.
+     846                 :             :    */
+     847         [ +  - ]:           4 :   if (self->server_state == _AVAHI_SERVER_RUNNING)
+     848                 :             :     {
+     849                 :           4 :       g_main_context_invoke_full (self->context,
+     850                 :             :                                   G_PRIORITY_DEFAULT,
+     851                 :             :                                   G_SOURCE_FUNC (_avahi_entry_group_new),
+     852                 :             :                                   g_object_ref (self),
+     853                 :             :                                   g_object_unref);
+     854                 :           4 :       g_main_context_invoke_full (self->context,
+     855                 :             :                                   G_PRIORITY_DEFAULT,
+     856                 :             :                                   G_SOURCE_FUNC (_avahi_service_browser_prepare),
+     857                 :             :                                   g_object_ref (self),
+     858                 :             :                                   g_object_unref);
+     859                 :             :     }
+     860         [ -  + ]:           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     861                 :             : }
+     862                 :             : 
+     863                 :             : static void
+     864                 :           4 : on_name_vanished (GDBusConnection *connection,
+     865                 :             :                   const char      *name,
+     866                 :             :                   ValentLanDNSSD  *self)
+     867                 :             : {
+     868         [ +  - ]:           4 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     869                 :             : 
+     870                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     871                 :           4 :   g_cancellable_cancel (self->cancellable);
+     872                 :             : 
+     873         [ +  - ]:           4 :   if (self->connection != NULL)
+     874                 :             :     {
+     875         [ +  - ]:           4 :       if (self->server_state_id != 0)
+     876                 :             :         {
+     877                 :           4 :           g_dbus_connection_signal_unsubscribe (self->connection,
+     878                 :             :                                                 self->server_state_id);
+     879                 :           4 :           self->server_state_id = 0;
+     880                 :             :         }
+     881                 :             : 
+     882         [ +  - ]:           4 :       if (self->entry_group_state_id != 0)
+     883                 :             :         {
+     884                 :           4 :           g_dbus_connection_signal_unsubscribe (self->connection,
+     885                 :             :                                                 self->entry_group_state_id);
+     886                 :           4 :           self->entry_group_state_id = 0;
+     887                 :             :         }
+     888                 :             : 
+     889         [ +  - ]:           4 :       if (self->service_browser_event_id != 0)
+     890                 :             :         {
+     891                 :           4 :           g_dbus_connection_signal_unsubscribe (self->connection,
+     892                 :             :                                                 self->service_browser_event_id);
+     893                 :           4 :           self->service_browser_event_id = 0;
+     894                 :             :         }
+     895                 :             : 
+     896                 :           4 :       self->entry_group_state = _AVAHI_ENTRY_GROUP_UNCOMMITTED;
+     897                 :           4 :       self->server_state = _AVAHI_SERVER_INVALID;
+     898                 :             : 
+     899         [ +  - ]:           4 :       g_clear_pointer (&self->service_browser_path, g_free);
+     900         [ +  - ]:           4 :       g_clear_pointer (&self->entry_group_path, g_free);
+     901         [ +  - ]:           4 :       g_clear_object (&self->connection);
+     902         [ +  - ]:           4 :       g_clear_object (&self->cancellable);
+     903                 :             :     }
+     904                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     905                 :           4 : }
+     906                 :             : 
+     907                 :             : static gboolean
+     908                 :           4 : _avahi_client_connect (ValentLanDNSSD *self)
+     909                 :             : {
+     910                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     911         [ +  - ]:           4 :   if (self->watcher_id == 0)
+     912                 :             :     {
+     913                 :           4 :       self->watcher_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM,
+     914                 :             :                                            AVAHI_DBUS_NAME,
+     915                 :             :                                            G_BUS_NAME_WATCHER_FLAGS_NONE,
+     916                 :             :                                            (GBusNameAppearedCallback)on_name_appeared,
+     917                 :             :                                            (GBusNameVanishedCallback)on_name_vanished,
+     918                 :             :                                            self, NULL);
+     919                 :             :     }
+     920                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     921                 :             : 
+     922                 :           4 :   return G_SOURCE_REMOVE;
+     923                 :             : }
+     924                 :             : 
+     925                 :             : static gboolean
+     926                 :           4 : _avahi_client_disconnect (ValentLanDNSSD *self)
+     927                 :             : {
+     928                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     929                 :           4 :   g_cancellable_cancel (self->cancellable);
+     930                 :             : 
+     931         [ +  - ]:           4 :   if (self->connection != NULL)
+     932                 :             :     {
+     933         [ +  - ]:           4 :       if (self->entry_group_path != NULL)
+     934                 :             :         {
+     935                 :           4 :           g_dbus_connection_call (self->connection,
+     936                 :             :                                   AVAHI_DBUS_NAME,
+     937                 :             :                                   self->entry_group_path,
+     938                 :             :                                   AVAHI_ENTRY_GROUP_IFACE,
+     939                 :             :                                   "Free",
+     940                 :             :                                   NULL,
+     941                 :             :                                   NULL,
+     942                 :             :                                   G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     943                 :             :                                   -1,
+     944                 :             :                                   NULL,
+     945                 :             :                                   NULL,
+     946                 :             :                                   NULL);
+     947                 :             :         }
+     948                 :             : 
+     949         [ +  - ]:           4 :       if (self->service_browser_path != NULL)
+     950                 :             :         {
+     951                 :           4 :           g_dbus_connection_call (self->connection,
+     952                 :             :                                   AVAHI_DBUS_NAME,
+     953                 :             :                                   self->service_browser_path,
+     954                 :             :                                   AVAHI_SERVICE_BROWSER_IFACE,
+     955                 :             :                                   "Free",
+     956                 :             :                                   NULL,
+     957                 :             :                                   NULL,
+     958                 :             :                                   G_DBUS_CALL_FLAGS_NO_AUTO_START,
+     959                 :             :                                   -1,
+     960                 :             :                                   NULL,
+     961                 :             :                                   NULL,
+     962                 :             :                                   NULL);
+     963                 :             :         }
+     964                 :             : 
+     965         [ +  - ]:           4 :       g_clear_handle_id (&self->watcher_id, g_bus_unwatch_name);
+     966                 :           4 :       on_name_vanished (self->connection, AVAHI_DBUS_NAME, self);
+     967                 :             :     }
+     968                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     969                 :             : 
+     970                 :           4 :   return G_SOURCE_REMOVE;
+     971                 :             : }
+     972                 :             : 
+     973                 :             : /*
+     974                 :             :  * ValentLanDNSSD
+     975                 :             :  */
+     976                 :             : static void
+     977                 :           9 : valent_lan_dnssd_set_identity (ValentLanDNSSD *self,
+     978                 :             :                                JsonNode       *identity)
+     979                 :             : {
+     980                 :           9 :   g_autoptr (GPtrArray) txt = NULL;
+     981                 :           9 :   const char *id = NULL;
+     982                 :           9 :   const char *name = NULL;
+     983                 :           9 :   const char *type = NULL;
+     984                 :           9 :   gint64 protocol = 0;
+     985                 :           9 :   gint64 port = VALENT_LAN_PROTOCOL_PORT;
+     986                 :             : 
+     987         [ +  - ]:           9 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+     988   [ +  +  -  + ]:           9 :   g_assert (identity == NULL || VALENT_IS_PACKET (identity));
+     989                 :             : 
+     990         [ +  + ]:           9 :   if (identity == NULL)
+     991                 :             :     {
+     992         [ +  + ]:           4 :       g_clear_pointer (&self->identity, json_node_unref);
+     993                 :             : 
+     994         [ +  + ]:           4 :       if (self->entry_group_path != NULL)
+     995                 :             :         {
+     996                 :           1 :           g_main_context_invoke_full (self->context,
+     997                 :             :                                       G_PRIORITY_DEFAULT,
+     998                 :             :                                       G_SOURCE_FUNC (_avahi_entry_group_reset),
+     999                 :             :                                       g_object_ref (self),
+    1000                 :             :                                       g_object_unref);
+    1001                 :             :         }
+    1002                 :           4 :       return;
+    1003                 :             :     }
+    1004                 :             : 
+    1005                 :             :   /* Even if the pointers match, assume the contents have changed */
+    1006         [ +  + ]:           5 :   if (self->identity != identity)
+    1007                 :             :     {
+    1008         [ -  + ]:           4 :       g_clear_pointer (&self->identity, json_node_unref);
+    1009                 :           4 :       self->identity = json_node_ref (identity);
+    1010                 :             :     }
+    1011                 :             : 
+    1012                 :             :   /* Service TXT Record */
+    1013                 :           5 :   txt = g_ptr_array_new ();
+    1014                 :             : 
+    1015         [ +  - ]:           5 :   if (valent_packet_get_string (identity, "deviceId", &id))
+    1016                 :           5 :     g_ptr_array_add (txt, txt_new_str ("id", id));
+    1017                 :             : 
+    1018         [ +  - ]:           5 :   if (valent_packet_get_string (identity, "deviceName", &name))
+    1019                 :           5 :     g_ptr_array_add (txt, txt_new_str ("name", name));
+    1020                 :             : 
+    1021         [ +  - ]:           5 :   if (valent_packet_get_string (identity, "deviceType", &type))
+    1022                 :           5 :     g_ptr_array_add (txt, txt_new_str ("type", type));
+    1023                 :             : 
+    1024         [ +  - ]:           5 :   if (valent_packet_get_int (identity, "protocolVersion", &protocol))
+    1025                 :           5 :     g_ptr_array_add (txt, txt_new_uint ("protocol", (uint32_t)protocol));
+    1026                 :             : 
+    1027         [ +  + ]:           5 :   g_clear_pointer (&self->txt, g_variant_unref);
+    1028                 :          10 :   self->txt = g_variant_new_array (G_VARIANT_TYPE_BYTESTRING,
+    1029                 :           5 :                                    (GVariant * const *)txt->pdata,
+    1030                 :           5 :                                    txt->len);
+    1031                 :           5 :   g_variant_ref_sink (self->txt);
+    1032                 :             : 
+    1033                 :             :   /* Service Name and Port */
+    1034                 :           5 :   g_set_str (&self->name, id);
+    1035                 :             : 
+    1036         [ +  - ]:           5 :   if (valent_packet_get_int (identity, "tcpPort", &port))
+    1037                 :           5 :     self->port = (uint16_t)port;
+    1038                 :             : 
+    1039         [ +  + ]:           5 :   if (self->entry_group_path != NULL)
+    1040                 :             :     {
+    1041                 :           1 :       g_main_context_invoke_full (self->context,
+    1042                 :             :                                   G_PRIORITY_DEFAULT,
+    1043                 :             :                                   G_SOURCE_FUNC (_avahi_entry_group_add_service),
+    1044                 :             :                                   g_object_ref (self),
+    1045                 :             :                                   g_object_unref);
+    1046                 :             :     }
+    1047                 :             : }
+    1048                 :             : 
+    1049                 :             : static void
+    1050                 :           4 : valent_lan_dnssd_set_service_type (ValentLanDNSSD *self,
+    1051                 :             :                                    const char     *type)
+    1052                 :             : {
+    1053         [ +  - ]:           4 :   g_assert (VALENT_IS_LAN_DNSSD (self));
+    1054   [ +  -  -  + ]:           4 :   g_assert (type == NULL || *type != '\0');
+    1055                 :             : 
+    1056         [ -  + ]:           4 :   if (type == NULL)
+    1057                 :           0 :     type = KDECONNECT_UDP_SERVICE_TYPE;
+    1058                 :             : 
+    1059         [ +  + ]:           4 :   if (g_set_str (&self->type, type))
+    1060                 :             :     {
+    1061                 :           1 :       valent_object_notify_by_pspec (VALENT_OBJECT (self),
+    1062                 :             :                                      properties [PROP_SERVICE_TYPE]);
+    1063                 :             :     }
+    1064                 :           4 : }
+    1065                 :             : 
+    1066                 :             : /*
+    1067                 :             :  * ValentObject
+    1068                 :             :  */
+    1069                 :             : static void
+    1070                 :           4 : valent_lan_dnssd_destroy (ValentObject *object)
+    1071                 :             : {
+    1072                 :           4 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (object);
+    1073                 :             : 
+    1074                 :           4 :   _avahi_client_disconnect (self);
+    1075                 :             : 
+    1076         [ +  - ]:           4 :   g_clear_pointer (&self->context, g_main_context_unref);
+    1077         [ +  - ]:           4 :   g_clear_pointer (&self->name, g_free);
+    1078         [ +  - ]:           4 :   g_clear_pointer (&self->type, g_free);
+    1079         [ +  - ]:           4 :   g_clear_pointer (&self->txt, g_variant_unref);
+    1080                 :             : 
+    1081                 :           4 :   VALENT_OBJECT_CLASS (valent_lan_dnssd_parent_class)->destroy (object);
+    1082                 :           4 : }
+    1083                 :             : 
+    1084                 :             : /*
+    1085                 :             :  * GObject
+    1086                 :             :  */
+    1087                 :             : static void
+    1088                 :           4 : valent_lan_dnssd_finalize (GObject *object)
+    1089                 :             : {
+    1090                 :           4 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (object);
+    1091                 :             : 
+    1092                 :           4 :   valent_object_lock (VALENT_OBJECT (object));
+    1093         [ +  - ]:           4 :   g_clear_pointer (&self->items, g_ptr_array_unref);
+    1094         [ +  + ]:           4 :   g_clear_pointer (&self->identity, json_node_unref);
+    1095                 :           4 :   valent_object_unlock (VALENT_OBJECT (object));
+    1096                 :             : 
+    1097                 :           4 :   G_OBJECT_CLASS (valent_lan_dnssd_parent_class)->finalize (object);
+    1098                 :           4 : }
+    1099                 :             : 
+    1100                 :             : static void
+    1101                 :           2 : valent_lan_dnssd_get_property (GObject    *object,
+    1102                 :             :                                guint       prop_id,
+    1103                 :             :                                GValue     *value,
+    1104                 :             :                                GParamSpec *pspec)
+    1105                 :             : {
+    1106                 :           2 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (object);
+    1107                 :             : 
+    1108      [ +  +  - ]:           2 :   switch (prop_id)
+    1109                 :             :     {
+    1110                 :             :     case PROP_IDENTITY:
+    1111                 :           1 :       valent_object_lock (VALENT_OBJECT (self));
+    1112                 :           1 :       g_value_set_boxed (value, self->identity);
+    1113                 :           1 :       valent_object_unlock (VALENT_OBJECT (self));
+    1114                 :           1 :       break;
+    1115                 :             : 
+    1116                 :             :     case PROP_SERVICE_TYPE:
+    1117                 :           1 :       valent_object_lock (VALENT_OBJECT (self));
+    1118                 :           1 :       g_value_set_string (value, self->type);
+    1119                 :           1 :       valent_object_unlock (VALENT_OBJECT (self));
+    1120                 :           1 :       break;
+    1121                 :             : 
+    1122                 :           0 :     default:
+    1123                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    1124                 :             :     }
+    1125                 :           2 : }
+    1126                 :             : 
+    1127                 :             : static void
+    1128                 :          13 : valent_lan_dnssd_set_property (GObject      *object,
+    1129                 :             :                                guint         prop_id,
+    1130                 :             :                                const GValue *value,
+    1131                 :             :                                GParamSpec   *pspec)
+    1132                 :             : {
+    1133                 :          13 :   ValentLanDNSSD *self = VALENT_LAN_DNSSD (object);
+    1134                 :             : 
+    1135      [ +  +  - ]:          13 :   switch (prop_id)
+    1136                 :             :     {
+    1137                 :             :     case PROP_IDENTITY:
+    1138                 :           9 :       valent_object_lock (VALENT_OBJECT (self));
+    1139                 :           9 :       valent_lan_dnssd_set_identity (self, g_value_get_boxed (value));
+    1140                 :           9 :       valent_object_unlock (VALENT_OBJECT (self));
+    1141                 :           9 :       break;
+    1142                 :             : 
+    1143                 :             :     case PROP_SERVICE_TYPE:
+    1144                 :           4 :       valent_object_lock (VALENT_OBJECT (self));
+    1145                 :           4 :       valent_lan_dnssd_set_service_type (self, g_value_get_string (value));
+    1146                 :           4 :       valent_object_unlock (VALENT_OBJECT (self));
+    1147                 :           4 :       break;
+    1148                 :             : 
+    1149                 :           0 :     default:
+    1150                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    1151                 :             :     }
+    1152                 :          13 : }
+    1153                 :             : 
+    1154                 :             : static void
+    1155                 :           2 : valent_lan_dnssd_class_init (ValentLanDNSSDClass *klass)
+    1156                 :             : {
+    1157                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    1158                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+    1159                 :             : 
+    1160                 :           2 :   object_class->finalize = valent_lan_dnssd_finalize;
+    1161                 :           2 :   object_class->get_property = valent_lan_dnssd_get_property;
+    1162                 :           2 :   object_class->set_property = valent_lan_dnssd_set_property;
+    1163                 :             : 
+    1164                 :           2 :   vobject_class->destroy = valent_lan_dnssd_destroy;
+    1165                 :             : 
+    1166                 :             :   /**
+    1167                 :             :    * ValentLanDNSSD:identity:
+    1168                 :             :    *
+    1169                 :             :    * The KDE Connect packet holding the local identity.
+    1170                 :             :    */
+    1171                 :           4 :   properties [PROP_IDENTITY] =
+    1172                 :           2 :     g_param_spec_boxed ("identity", NULL, NULL,
+    1173                 :             :                         JSON_TYPE_NODE,
+    1174                 :             :                         (G_PARAM_READWRITE |
+    1175                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+    1176                 :             :                          G_PARAM_STATIC_STRINGS));
+    1177                 :             : 
+    1178                 :             :   /**
+    1179                 :             :    * ValentLanDNSSD:service-type:
+    1180                 :             :    *
+    1181                 :             :    * The DNS-SD service type to register and observe.
+    1182                 :             :    */
+    1183                 :           4 :   properties [PROP_SERVICE_TYPE] =
+    1184                 :           2 :     g_param_spec_string ("service-type", NULL, NULL,
+    1185                 :             :                          KDECONNECT_UDP_SERVICE_TYPE,
+    1186                 :             :                          (G_PARAM_READWRITE |
+    1187                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+    1188                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+    1189                 :             :                           G_PARAM_STATIC_STRINGS));
+    1190                 :             : 
+    1191                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+    1192                 :           2 : }
+    1193                 :             : 
+    1194                 :             : static void
+    1195                 :           4 : valent_lan_dnssd_init (ValentLanDNSSD *self)
+    1196                 :             : {
+    1197                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+    1198                 :           4 :   self->items = g_ptr_array_new_with_free_func (g_object_unref);
+    1199                 :           4 :   self->type = g_strdup (KDECONNECT_UDP_SERVICE_TYPE);
+    1200                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+    1201                 :           4 : }
+    1202                 :             : 
+    1203                 :             : /**
+    1204                 :             :  * valent_lan_dnssd_new:
+    1205                 :             :  * @identity: (nullable): a KDE Connect identity packet
+    1206                 :             :  *
+    1207                 :             :  * Create a DNS-SD adapter for @identity.
+    1208                 :             :  *
+    1209                 :             :  * Returns: (transfer full): a `GListModel`
+    1210                 :             :  */
+    1211                 :             : GListModel *
+    1212                 :           3 : valent_lan_dnssd_new (JsonNode *identity)
+    1213                 :             : {
+    1214   [ -  +  -  - ]:           3 :   g_return_val_if_fail (identity == NULL || VALENT_IS_PACKET (identity), NULL);
+    1215                 :             : 
+    1216                 :           3 :   return g_object_new (VALENT_TYPE_LAN_DNSSD,
+    1217                 :             :                        "identity", identity,
+    1218                 :             :                        NULL);
+    1219                 :             : }
+    1220                 :             : 
+    1221                 :             : /**
+    1222                 :             :  * valent_lan_dnssd_attach:
+    1223                 :             :  * @self: an `ValentLanDNSSD`
+    1224                 :             :  * @context: (nullable): a `GMainContext`
+    1225                 :             :  *
+    1226                 :             :  * Start the DNS-SD adapter in @context.
+    1227                 :             :  *
+    1228                 :             :  * If @context is %NULL, the service will run in the thread-default main
+    1229                 :             :  * context, as returned by [type@GLib.MainContext.ref_thread_default].
+    1230                 :             :  */
+    1231                 :             : void
+    1232                 :           4 : valent_lan_dnssd_attach (ValentLanDNSSD  *self,
+    1233                 :             :                          GMainContext    *context)
+    1234                 :             : {
+    1235         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_LAN_DNSSD (self));
+    1236                 :             : 
+    1237                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+    1238         [ +  + ]:           4 :   if (context == NULL)
+    1239                 :             :     {
+    1240         [ -  + ]:           1 :       g_clear_pointer (&self->context, g_main_context_unref);
+    1241                 :           1 :       self->context = g_main_context_ref_thread_default ();
+    1242                 :             :     }
+    1243         [ +  - ]:           3 :   else if (self->context != context)
+    1244                 :             :     {
+    1245         [ -  + ]:           3 :       g_clear_pointer (&self->context, g_main_context_unref);
+    1246                 :           3 :       self->context = g_main_context_ref (context);
+    1247                 :             :     }
+    1248                 :             : 
+    1249                 :           4 :   g_main_context_invoke_full (self->context,
+    1250                 :             :                               G_PRIORITY_DEFAULT,
+    1251                 :             :                               G_SOURCE_FUNC (_avahi_client_connect),
+    1252                 :             :                               g_object_ref (self),
+    1253                 :             :                               g_object_unref);
+    1254                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+    1255                 :             : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-dnssd.h.func-c.html b/coverage/src/plugins/lan/valent-lan-dnssd.h.func-c.html new file mode 100644 index 00000000000..bcada4b4751 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-dnssd.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-dnssd.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-dnssd.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LAN_DNSSD80
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-dnssd.h.func.html b/coverage/src/plugins/lan/valent-lan-dnssd.h.func.html new file mode 100644 index 00000000000..5198e687986 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-dnssd.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-dnssd.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-dnssd.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LAN_DNSSD80
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-dnssd.h.gcov.html b/coverage/src/plugins/lan/valent-lan-dnssd.h.gcov.html new file mode 100644 index 00000000000..e64129c75f2 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-dnssd.h.gcov.html @@ -0,0 +1,121 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-dnssd.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-dnssd.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_LAN_DNSSD (valent_lan_dnssd_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :         118 : G_DECLARE_FINAL_TYPE (ValentLanDNSSD, valent_lan_dnssd, VALENT, LAN_DNSSD, ValentObject)
+                   -  + ]
+      13                 :             : 
+      14                 :             : GListModel * valent_lan_dnssd_new    (JsonNode       *identity);
+      15                 :             : void         valent_lan_dnssd_attach (ValentLanDNSSD *self,
+      16                 :             :                                       GMainContext   *context);
+      17                 :             : 
+      18                 :             : /*
+      19                 :             :  * GSocketAddress Helpers
+      20                 :             :  */
+      21                 :             : #define _g_socket_address_get_dnssd_name(a)                   \
+      22                 :             :   g_object_get_data (G_OBJECT (a), "dnssd-service-name")
+      23                 :             : 
+      24                 :             : #define _g_socket_address_set_dnssd_name(a, n)                \
+      25                 :             :   g_object_set_data_full (G_OBJECT (a), "dnssd-service-name", \
+      26                 :             :                           g_strdup (n), g_free)
+      27                 :             : 
+      28                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-utils.c.func-c.html b/coverage/src/plugins/lan/valent-lan-utils.c.func-c.html new file mode 100644 index 00000000000..24bcbc47e60 --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-utils.c.func-c.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.9 %10986
Test Date:2024-03-31 18:46:36Functions:100.0 %99
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:45.1 %18282
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lan_encrypt_client1
valent_lan_encrypt_server1
valent_lan_handshake_certificate2
valent_lan_encrypt_client_connection3
valent_lan_encrypt_server_connection3
valent_lan_handshake_peer6
valent_lan_accept_certificate8
valent_lan_accept_certificate_cb8
valent_lan_configure_socket8
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-utils.c.func.html b/coverage/src/plugins/lan/valent-lan-utils.c.func.html new file mode 100644 index 00000000000..3bbc4b395ad --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-utils.c.func.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.9 %10986
Test Date:2024-03-31 18:46:36Functions:100.0 %99
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:45.1 %18282
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lan_accept_certificate8
valent_lan_accept_certificate_cb8
valent_lan_configure_socket8
valent_lan_encrypt_client1
valent_lan_encrypt_client_connection3
valent_lan_encrypt_server1
valent_lan_encrypt_server_connection3
valent_lan_handshake_certificate2
valent_lan_handshake_peer6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lan/valent-lan-utils.c.gcov.html b/coverage/src/plugins/lan/valent-lan-utils.c.gcov.html new file mode 100644 index 00000000000..9c5a2c8db6a --- /dev/null +++ b/coverage/src/plugins/lan/valent-lan-utils.c.gcov.html @@ -0,0 +1,550 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lan/valent-lan-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lan - valent-lan-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.9 %10986
Test Date:2024-03-31 18:46:36Functions:100.0 %99
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:45.1 %18282
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-lan-utils"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gio/gnetworking.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-lan-utils.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /* < private >
+      16                 :             :  * valent_lan_configure_socket:
+      17                 :             :  * @connection: a `GSocketConnection`
+      18                 :             :  *
+      19                 :             :  * Configure TCP socket options as they are set in kdeconnect-kde.
+      20                 :             :  *
+      21                 :             :  * Unlike kdeconnect-kde keepalive is not enabled if the required socket options
+      22                 :             :  * are not defined, otherwise connections may hang indefinitely.
+      23                 :             :  *
+      24                 :             :  * See: https://invent.kde.org/network/kdeconnect-kde/blob/master/core/backends/lan/lanlinkprovider.cpp
+      25                 :             :  */
+      26                 :             : static inline void
+      27                 :           8 : valent_lan_configure_socket (GSocketConnection *connection)
+      28                 :             : {
+      29                 :             : #if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL) && defined(TCP_KEEPCNT)
+      30                 :           8 :   GSocket *socket;
+      31                 :           8 :   GError *error = NULL;
+      32                 :             : 
+      33   [ +  -  +  -  :           8 :   g_assert (G_IS_TCP_CONNECTION (connection));
+             -  +  -  - ]
+      34                 :             : 
+      35                 :           8 :   socket = g_socket_connection_get_socket (connection);
+      36                 :           8 :   g_socket_set_keepalive (socket, TRUE);
+      37                 :             : 
+      38         [ -  + ]:           8 :   if (!g_socket_set_option (socket, IPPROTO_TCP, TCP_KEEPIDLE, 10, &error))
+      39                 :             :     {
+      40                 :           0 :       g_warning ("%s(): TCP_KEEPIDLE: %s", G_STRFUNC, error->message);
+      41                 :           0 :       g_clear_error (&error);
+      42                 :             :     }
+      43                 :             : 
+      44         [ -  + ]:           8 :   if (!g_socket_set_option (socket, IPPROTO_TCP, TCP_KEEPINTVL, 5, &error))
+      45                 :             :     {
+      46                 :           0 :       g_warning ("%s(): TCP_KEEPINTVL: %s", G_STRFUNC, error->message);
+      47                 :           0 :       g_clear_error (&error);
+      48                 :             :     }
+      49                 :             : 
+      50         [ -  + ]:           8 :   if (!g_socket_set_option (socket, IPPROTO_TCP, TCP_KEEPCNT, 3, &error))
+      51                 :             :     {
+      52                 :           0 :       g_warning ("%s(): TCP_KEEPCNT: %s", G_STRFUNC, error->message);
+      53                 :           0 :       g_clear_error (&error);
+      54                 :             :     }
+      55                 :             : #endif /* TCP_KEEPIDLE && TCP_KEEPINTVL && TCP_KEEPCNT */
+      56                 :           8 : }
+      57                 :             : 
+      58                 :             : 
+      59                 :             : /*
+      60                 :             :  * The KDE Connect protocol follows a trust-on-first-use approach to TLS, so we
+      61                 :             :  * use a dummy callback for `GTlsConnection`::accept-certificate that always
+      62                 :             :  * returns %TRUE.
+      63                 :             :  */
+      64                 :             : static gboolean
+      65                 :           8 : valent_lan_accept_certificate_cb (GTlsConnection       *connection,
+      66                 :             :                                   GTlsCertificate      *peer_cert,
+      67                 :             :                                   GTlsCertificateFlags  errors,
+      68                 :             :                                   gpointer              user_data)
+      69                 :             : {
+      70                 :           8 :   return TRUE;
+      71                 :             : }
+      72                 :             : 
+      73                 :             : static gboolean
+      74                 :           8 : valent_lan_accept_certificate (GTlsConnection  *connection,
+      75                 :             :                                GCancellable    *cancellable,
+      76                 :             :                                GError         **error)
+      77                 :             : {
+      78                 :           8 :   unsigned long accept_id;
+      79                 :           8 :   gboolean ret;
+      80                 :             : 
+      81                 :           8 :   accept_id = g_signal_connect (G_OBJECT (connection),
+      82                 :             :                                 "accept-certificate",
+      83                 :             :                                 G_CALLBACK (valent_lan_accept_certificate_cb),
+      84                 :             :                                 NULL);
+      85                 :             : 
+      86                 :           8 :   ret = g_tls_connection_handshake (connection, cancellable, error);
+      87         [ +  - ]:           8 :   g_clear_signal_handler (&accept_id, connection);
+      88                 :             : 
+      89                 :           8 :   return ret;
+      90                 :             : }
+      91                 :             : 
+      92                 :             : /* < private >
+      93                 :             :  * valent_lan_handshake_certificate:
+      94                 :             :  * @connection: a `GTlsConnection`
+      95                 :             :  * @trusted: a `GTlsCertificate`
+      96                 :             :  * @cancellable: (nullable): a `GCancellable`
+      97                 :             :  * @error: (nullable): a `GError`
+      98                 :             :  *
+      99                 :             :  * Authenticate a connection for a known peer.
+     100                 :             :  *
+     101                 :             :  * This function is used to authenticate a TLS connection against a known and
+     102                 :             :  * trusted TLS certificate. This should be used to authenticate auxiliary
+     103                 :             :  * connections for authenticated channels.
+     104                 :             :  *
+     105                 :             :  * Returns: %TRUE, or %FALSE with @error set
+     106                 :             :  */
+     107                 :             : static gboolean
+     108                 :           2 : valent_lan_handshake_certificate (GTlsConnection   *connection,
+     109                 :             :                                   GTlsCertificate  *trusted,
+     110                 :             :                                   GCancellable     *cancellable,
+     111                 :             :                                   GError          **error)
+     112                 :             : {
+     113                 :           2 :   GTlsCertificate *peer_cert;
+     114                 :             : 
+     115         [ -  + ]:           2 :   if (!valent_lan_accept_certificate (connection, cancellable, error))
+     116                 :             :     return FALSE;
+     117                 :             : 
+     118                 :           2 :   peer_cert = g_tls_connection_get_peer_certificate (connection);
+     119                 :             : 
+     120         [ -  + ]:           2 :   if (!g_tls_certificate_is_same (trusted, peer_cert))
+     121                 :             :     {
+     122                 :           0 :       g_set_error (error,
+     123                 :             :                    G_TLS_ERROR,
+     124                 :             :                    G_TLS_ERROR_HANDSHAKE,
+     125                 :             :                    "Invalid certificate");
+     126                 :           0 :       return FALSE;
+     127                 :             :     }
+     128                 :             : 
+     129                 :             :   return TRUE;
+     130                 :             : }
+     131                 :             : 
+     132                 :             : /* < private >
+     133                 :             :  * valent_lan_handshake_peer:
+     134                 :             :  * @connection: a `GTlsConnection`
+     135                 :             :  * @cancellable: (nullable): a `GCancellable`
+     136                 :             :  * @error: (nullable): a `GError`
+     137                 :             :  *
+     138                 :             :  * Authenticate a connection for an unknown peer.
+     139                 :             :  *
+     140                 :             :  * This function is used to authenticate a TLS connection whether the remote
+     141                 :             :  * device is paired or not. This should be used to authenticate new connections
+     142                 :             :  * when negotiating a [class@Valent.LanChannel].
+     143                 :             :  *
+     144                 :             :  * If the TLS certificate is not known (i.e. previously authenticated), the
+     145                 :             :  * device is assumed to be unpaired and %TRUE will be returned to
+     146                 :             :  * trust-on-first-use. The certificate will become "known" when if and when the
+     147                 :             :  * device is successfully paired.
+     148                 :             :  *
+     149                 :             :  * Returns: %TRUE, or %FALSE with @error set
+     150                 :             :  */
+     151                 :             : static gboolean
+     152                 :           6 : valent_lan_handshake_peer (GTlsConnection  *connection,
+     153                 :             :                            GCancellable    *cancellable,
+     154                 :             :                            GError         **error)
+     155                 :             : {
+     156                 :          12 :   g_autoptr (GFile) file = NULL;
+     157         [ +  - ]:           6 :   g_autoptr (GTlsCertificate) peer_trusted = NULL;
+     158                 :           6 :   GTlsCertificate *peer_certificate;
+     159                 :           6 :   const char *peer_id;
+     160                 :             : 
+     161         [ +  - ]:           6 :   if (!valent_lan_accept_certificate (connection, cancellable, error))
+     162                 :             :     return FALSE;
+     163                 :             : 
+     164                 :           6 :   peer_certificate = g_tls_connection_get_peer_certificate (connection);
+     165                 :           6 :   peer_id = valent_certificate_get_common_name (peer_certificate);
+     166                 :             : 
+     167                 :             :   /* If the certificate can not be found, assume that's because the device is
+     168                 :             :    * unpaired and the certificate will be verified with user interaction
+     169                 :             :    *
+     170                 :             :    * TODO: this should be handled by centralized manager object
+     171                 :             :    */
+     172                 :           6 :   file = g_file_new_build_filename (g_get_user_config_dir(), PACKAGE_NAME,
+     173                 :             :                                     "device", peer_id,
+     174                 :             :                                     "certificate.pem",
+     175                 :             :                                     NULL);
+     176                 :             : 
+     177         [ -  + ]:           6 :   if (!g_file_query_exists (file, NULL))
+     178                 :             :     return TRUE;
+     179                 :             : 
+     180                 :           0 :   peer_trusted = g_tls_certificate_new_from_file (g_file_peek_path (file),
+     181                 :             :                                                   error);
+     182                 :             : 
+     183                 :             :   // TODO: handle the case of a corrupted certificate
+     184         [ #  # ]:           0 :   if (peer_trusted == NULL)
+     185                 :             :     return FALSE;
+     186                 :             : 
+     187         [ #  # ]:           0 :   if (!g_tls_certificate_is_same (peer_trusted, peer_certificate))
+     188                 :             :     {
+     189                 :           0 :       g_set_error (error,
+     190                 :             :                    G_TLS_ERROR,
+     191                 :             :                    G_TLS_ERROR_HANDSHAKE,
+     192                 :             :                    "Invalid certificate for \"%s\"",
+     193                 :             :                    peer_id);
+     194                 :           0 :       return FALSE;
+     195                 :             :     }
+     196                 :             : 
+     197                 :             :   return TRUE;
+     198                 :             : }
+     199                 :             : 
+     200                 :             : /**
+     201                 :             :  * valent_lan_encrypt_client_connection:
+     202                 :             :  * @connection: a `GSocketConnection`
+     203                 :             :  * @certificate: a `GTlsCertificate`
+     204                 :             :  * @cancellable: (nullable): a `GCancellable`
+     205                 :             :  * @error: (nullable): a `GError`
+     206                 :             :  *
+     207                 :             :  * Authenticate and encrypt a client connection.
+     208                 :             :  *
+     209                 :             :  * This function sets the standard KDE Connect socket options on @connection,
+     210                 :             :  * wraps it in a [class@Gio.TlsConnection] and returns the result.
+     211                 :             :  *
+     212                 :             :  * The common name is extracted from the peer's TLS certificate and used as the
+     213                 :             :  * device ID to check for a trusted certificate. For auxiliary connections
+     214                 :             :  * created from an existing channel, use [func@Valent.lan_encrypt_client].
+     215                 :             :  *
+     216                 :             :  * Returns: (transfer full) (nullable): a TLS encrypted `GIOStream`
+     217                 :             :  */
+     218                 :             : GIOStream *
+     219                 :           3 : valent_lan_encrypt_client_connection (GSocketConnection  *connection,
+     220                 :             :                                       GTlsCertificate    *certificate,
+     221                 :             :                                       GCancellable       *cancellable,
+     222                 :             :                                       GError            **error)
+     223                 :             : {
+     224                 :           6 :   g_autoptr (GSocketAddress) address = NULL;
+     225         [ +  - ]:           3 :   g_autoptr (GIOStream) tls_stream = NULL;
+     226                 :             : 
+     227   [ +  -  +  -  :           3 :   g_assert (G_IS_SOCKET_CONNECTION (connection));
+             +  -  -  + ]
+     228   [ +  -  +  -  :           3 :   g_assert (G_IS_TLS_CERTIFICATE (certificate));
+             +  -  -  + ]
+     229   [ +  +  +  -  :           3 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     230   [ +  -  -  + ]:           3 :   g_assert (error == NULL || *error == NULL);
+     231                 :             : 
+     232                 :           3 :   valent_lan_configure_socket (connection);
+     233                 :             : 
+     234                 :             :   /* We're the client when accepting incoming connections */
+     235                 :           3 :   address = g_socket_connection_get_remote_address (connection, error);
+     236                 :             : 
+     237         [ -  + ]:           3 :   if (address == NULL)
+     238                 :             :     return NULL;
+     239                 :             : 
+     240                 :           3 :   tls_stream = g_tls_client_connection_new (G_IO_STREAM (connection),
+     241                 :             :                                             G_SOCKET_CONNECTABLE (address),
+     242                 :             :                                             error);
+     243                 :             : 
+     244         [ -  + ]:           3 :   if (tls_stream == NULL)
+     245                 :             :     return NULL;
+     246                 :             : 
+     247                 :           3 :   g_tls_connection_set_certificate (G_TLS_CONNECTION (tls_stream), certificate);
+     248                 :             : 
+     249         [ -  + ]:           3 :   if (!valent_lan_handshake_peer (G_TLS_CONNECTION (tls_stream),
+     250                 :             :                                   cancellable,
+     251                 :             :                                   error))
+     252                 :             :     {
+     253                 :           0 :       g_io_stream_close (tls_stream, NULL, NULL);
+     254                 :           0 :       return NULL;
+     255                 :             :     }
+     256                 :             : 
+     257                 :             :   return g_steal_pointer (&tls_stream);
+     258                 :             : }
+     259                 :             : 
+     260                 :             : /**
+     261                 :             :  * valent_lan_encrypt_client:
+     262                 :             :  * @connection: a `GSocketConnection`
+     263                 :             :  * @certificate: a `GTlsCertificate`
+     264                 :             :  * @peer_certificate: a `GTlsCertificate`
+     265                 :             :  * @cancellable: (nullable): a `GCancellable`
+     266                 :             :  * @error: (nullable): a `GError`
+     267                 :             :  *
+     268                 :             :  * Authenticate and encrypt an auxiliary client connection.
+     269                 :             :  *
+     270                 :             :  * This function sets the standard KDE Connect socket options on @connection,
+     271                 :             :  * wraps it in a [class@Gio.TlsConnection] and returns the result.
+     272                 :             :  *
+     273                 :             :  * Returns: (transfer full) (nullable): a TLS encrypted `GIOStream`
+     274                 :             :  */
+     275                 :             : GIOStream *
+     276                 :           1 : valent_lan_encrypt_client (GSocketConnection  *connection,
+     277                 :             :                            GTlsCertificate    *certificate,
+     278                 :             :                            GTlsCertificate    *peer_certificate,
+     279                 :             :                            GCancellable       *cancellable,
+     280                 :             :                            GError            **error)
+     281                 :             : {
+     282                 :           2 :   g_autoptr (GSocketAddress) address = NULL;
+     283         [ +  - ]:           1 :   g_autoptr (GIOStream) tls_stream = NULL;
+     284                 :             : 
+     285   [ +  -  +  -  :           1 :   g_assert (G_IS_SOCKET_CONNECTION (connection));
+             +  -  -  + ]
+     286   [ +  -  +  -  :           1 :   g_assert (G_IS_TLS_CERTIFICATE (certificate));
+             +  -  -  + ]
+     287                 :             :   //g_assert (G_IS_TLS_CERTIFICATE (peer_certificate));
+     288   [ -  +  -  -  :           1 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     289   [ +  -  -  + ]:           1 :   g_assert (error == NULL || *error == NULL);
+     290                 :             : 
+     291                 :             :   /* TODO: Occasionally we are not passed a certificate. This could mean the
+     292                 :             :    * parent connection is unauthorized, but more likely there is a logic error
+     293                 :             :    * elsewhere where we're making a false assumption. */
+     294   [ +  -  +  -  :           1 :   if G_UNLIKELY (!G_IS_TLS_CERTIFICATE (peer_certificate))
+             +  -  +  - ]
+     295                 :             :     {
+     296                 :           0 :       g_set_error (error,
+     297                 :             :                    G_TLS_ERROR,
+     298                 :             :                    G_TLS_ERROR_CERTIFICATE_REQUIRED,
+     299                 :             :                    "No peer certificate");
+     300                 :           0 :       return NULL;
+     301                 :             :     }
+     302                 :             : 
+     303                 :           1 :   valent_lan_configure_socket (connection);
+     304                 :             : 
+     305                 :           1 :   address = g_socket_connection_get_remote_address (connection, error);
+     306                 :             : 
+     307         [ +  - ]:           1 :   if (address == NULL)
+     308                 :             :     return NULL;
+     309                 :             : 
+     310                 :             :   /* We're the client when opening auxiliary connections */
+     311                 :           1 :   tls_stream = g_tls_client_connection_new (G_IO_STREAM (connection),
+     312                 :             :                                             G_SOCKET_CONNECTABLE (address),
+     313                 :             :                                             error);
+     314                 :             : 
+     315         [ +  - ]:           1 :   if (tls_stream == NULL)
+     316                 :             :     return NULL;
+     317                 :             : 
+     318                 :           1 :   g_tls_connection_set_certificate (G_TLS_CONNECTION (tls_stream), certificate);
+     319                 :             : 
+     320         [ -  + ]:           1 :   if (!valent_lan_handshake_certificate (G_TLS_CONNECTION (tls_stream),
+     321                 :             :                                          peer_certificate,
+     322                 :             :                                          cancellable,
+     323                 :             :                                          error))
+     324                 :             :     {
+     325                 :           0 :       g_io_stream_close (tls_stream, NULL, NULL);
+     326                 :           0 :       return NULL;
+     327                 :             :     }
+     328                 :             : 
+     329                 :             :   return g_steal_pointer (&tls_stream);
+     330                 :             : }
+     331                 :             : 
+     332                 :             : /**
+     333                 :             :  * valent_lan_encrypt_server_connection:
+     334                 :             :  * @connection: a `GSocketConnection`
+     335                 :             :  * @certificate: a `GTlsConnection`
+     336                 :             :  * @cancellable: (nullable): a `GCancellable`
+     337                 :             :  * @error: (nullable): a `GError`
+     338                 :             :  *
+     339                 :             :  * Authenticate and encrypt a server connection.
+     340                 :             :  *
+     341                 :             :  * This function sets the standard KDE Connect socket options on @connection,
+     342                 :             :  * wraps it in a [class@Gio.TlsConnection] and returns the result.
+     343                 :             :  *
+     344                 :             :  * The common name is extracted from the peer's TLS certificate and used as the
+     345                 :             :  * device ID to check for a trusted certificate. For auxiliary connections
+     346                 :             :  * created from an existing channel, use [func@Valent.lan_encrypt_server].
+     347                 :             :  *
+     348                 :             :  * Returns: (transfer full) (nullable): a TLS encrypted `GIOStream`
+     349                 :             :  */
+     350                 :             : GIOStream *
+     351                 :           3 : valent_lan_encrypt_server_connection (GSocketConnection  *connection,
+     352                 :             :                                       GTlsCertificate    *certificate,
+     353                 :             :                                       GCancellable       *cancellable,
+     354                 :             :                                       GError            **error)
+     355                 :             : {
+     356                 :           6 :   g_autoptr (GIOStream) tls_stream = NULL;
+     357                 :             : 
+     358   [ +  -  +  -  :           3 :   g_assert (G_IS_SOCKET_CONNECTION (connection));
+             +  -  -  + ]
+     359   [ +  -  +  -  :           3 :   g_assert (G_IS_TLS_CERTIFICATE (certificate));
+             +  -  -  + ]
+     360   [ +  +  +  -  :           3 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     361   [ +  -  -  + ]:           3 :   g_assert (error == NULL || *error == NULL);
+     362                 :             : 
+     363                 :           3 :   valent_lan_configure_socket (connection);
+     364                 :             : 
+     365                 :             :   /* We're the server when opening outgoing connections */
+     366                 :           3 :   tls_stream = g_tls_server_connection_new (G_IO_STREAM (connection),
+     367                 :             :                                             certificate,
+     368                 :             :                                             error);
+     369                 :             : 
+     370         [ -  + ]:           3 :   if (tls_stream == NULL)
+     371                 :             :     return NULL;
+     372                 :             : 
+     373                 :           3 :   g_object_set (G_TLS_SERVER_CONNECTION (tls_stream),
+     374                 :             :                 "authentication-mode", G_TLS_AUTHENTICATION_REQUIRED,
+     375                 :             :                 NULL);
+     376                 :             : 
+     377         [ -  + ]:           3 :   if (!valent_lan_handshake_peer (G_TLS_CONNECTION (tls_stream),
+     378                 :             :                                   cancellable,
+     379                 :             :                                   error))
+     380                 :             :     {
+     381                 :           0 :       g_io_stream_close (tls_stream, NULL, NULL);
+     382                 :           0 :       return NULL;
+     383                 :             :     }
+     384                 :             : 
+     385                 :             :   return g_steal_pointer (&tls_stream);
+     386                 :             : }
+     387                 :             : 
+     388                 :             : /**
+     389                 :             :  * valent_lan_encrypt_server:
+     390                 :             :  * @connection: a `GSocketConnection`
+     391                 :             :  * @certificate: a `GTlsCertificate`
+     392                 :             :  * @peer_certificate: a `GTlsCertificate`
+     393                 :             :  * @cancellable: (nullable): a `GCancellable`
+     394                 :             :  * @error: (nullable): a `GError`
+     395                 :             :  *
+     396                 :             :  * Authenticate and encrypt an auxiliary server connection.
+     397                 :             :  *
+     398                 :             :  * This function sets the standard KDE Connect socket options on @connection,
+     399                 :             :  * wraps it in a [class@Gio.TlsConnection] and returns the result.
+     400                 :             :  *
+     401                 :             :  * Returns: (transfer full) (nullable): a TLS encrypted `GIOStream`
+     402                 :             :  */
+     403                 :             : GIOStream *
+     404                 :           1 : valent_lan_encrypt_server (GSocketConnection  *connection,
+     405                 :             :                            GTlsCertificate    *certificate,
+     406                 :             :                            GTlsCertificate    *peer_certificate,
+     407                 :             :                            GCancellable       *cancellable,
+     408                 :             :                            GError            **error)
+     409                 :             : {
+     410                 :           2 :   g_autoptr (GIOStream) tls_stream = NULL;
+     411                 :             : 
+     412   [ +  -  +  -  :           1 :   g_assert (G_IS_SOCKET_CONNECTION (connection));
+             +  -  -  + ]
+     413   [ +  -  +  -  :           1 :   g_assert (G_IS_TLS_CERTIFICATE (certificate));
+             +  -  -  + ]
+     414   [ +  -  +  -  :           1 :   g_assert (G_IS_TLS_CERTIFICATE (peer_certificate));
+             +  -  -  + ]
+     415   [ -  +  -  -  :           1 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     416   [ +  -  -  + ]:           1 :   g_assert (error == NULL || *error == NULL);
+     417                 :             : 
+     418                 :           1 :   valent_lan_configure_socket (connection);
+     419                 :             : 
+     420                 :             :   /* We're the server when accepting auxiliary connections */
+     421                 :           1 :   tls_stream = g_tls_server_connection_new (G_IO_STREAM (connection),
+     422                 :             :                                             certificate,
+     423                 :             :                                             error);
+     424                 :             : 
+     425         [ -  + ]:           1 :   if (tls_stream == NULL)
+     426                 :             :     return NULL;
+     427                 :             : 
+     428                 :           1 :   g_object_set (G_TLS_SERVER_CONNECTION (tls_stream),
+     429                 :             :                 "authentication-mode", G_TLS_AUTHENTICATION_REQUIRED,
+     430                 :             :                 NULL);
+     431                 :             : 
+     432         [ -  + ]:           1 :   if (!valent_lan_handshake_certificate (G_TLS_CONNECTION (tls_stream),
+     433                 :             :                                          peer_certificate,
+     434                 :             :                                          cancellable,
+     435                 :             :                                          error))
+     436                 :             :     {
+     437                 :           0 :       g_io_stream_close (tls_stream, NULL, NULL);
+     438                 :           0 :       return NULL;
+     439                 :             :     }
+     440                 :             : 
+     441                 :             :   return g_steal_pointer (&tls_stream);
+     442                 :             : }
+     443                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-detail-sort-b.html b/coverage/src/plugins/lock/index-detail-sort-b.html new file mode 100644 index 00000000000..b7693b0dde5 --- /dev/null +++ b/coverage/src/plugins/lock/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-detail-sort-f.html b/coverage/src/plugins/lock/index-detail-sort-f.html new file mode 100644 index 00000000000..bb8c1d931c9 --- /dev/null +++ b/coverage/src/plugins/lock/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-detail-sort-l.html b/coverage/src/plugins/lock/index-detail-sort-l.html new file mode 100644 index 00000000000..d0b56d102a4 --- /dev/null +++ b/coverage/src/plugins/lock/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-detail.html b/coverage/src/plugins/lock/index-detail.html new file mode 100644 index 00000000000..b4ed39e3f38 --- /dev/null +++ b/coverage/src/plugins/lock/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-sort-b.html b/coverage/src/plugins/lock/index-sort-b.html new file mode 100644 index 00000000000..b7693b0dde5 --- /dev/null +++ b/coverage/src/plugins/lock/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-sort-f.html b/coverage/src/plugins/lock/index-sort-f.html new file mode 100644 index 00000000000..bb8c1d931c9 --- /dev/null +++ b/coverage/src/plugins/lock/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index-sort-l.html b/coverage/src/plugins/lock/index-sort-l.html new file mode 100644 index 00000000000..d0b56d102a4 --- /dev/null +++ b/coverage/src/plugins/lock/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/index.html b/coverage/src/plugins/lock/index.html new file mode 100644 index 00000000000..b4ed39e3f38 --- /dev/null +++ b/coverage/src/plugins/lock/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lockCoverageTotalHit
Test:Code CoverageLines:99.2 %128127
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:60.3 %6841
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
lock-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-lock-gadget.c +
100.0%
+
100.0 %161666.7 %64100.0 %55
valent-lock-plugin.c +
99.1%99.1%
+
99.1 %10710660.7 %5634100.0 %1515
valent-lock-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/lock-plugin.c.func-c.html b/coverage/src/plugins/lock/lock-plugin.c.func-c.html new file mode 100644 index 00000000000..f50388731e2 --- /dev/null +++ b/coverage/src/plugins/lock/lock-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/lock-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - lock-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lock_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/lock-plugin.c.func.html b/coverage/src/plugins/lock/lock-plugin.c.func.html new file mode 100644 index 00000000000..c51d6e5a14e --- /dev/null +++ b/coverage/src/plugins/lock/lock-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/lock-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - lock-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lock_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/lock-plugin.c.gcov.html b/coverage/src/plugins/lock/lock-plugin.c.gcov.html new file mode 100644 index 00000000000..fe67c289b3d --- /dev/null +++ b/coverage/src/plugins/lock/lock-plugin.c.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/lock-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - lock-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-lock-gadget.h"
+      10                 :             : #include "valent-lock-plugin.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_lock_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_LOCK_PLUGIN);
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_DEVICE_GADGET,
+      21                 :             :                                               VALENT_TYPE_LOCK_GADGET);
+      22                 :           2 : }
+      23                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-gadget.c.func-c.html b/coverage/src/plugins/lock/valent-lock-gadget.c.func-c.html new file mode 100644 index 00000000000..ea842cbbb17 --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-gadget.c.func-c.html @@ -0,0 +1,133 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1616
Test Date:2024-03-31 18:46:36Functions:100.0 %55
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lock_gadget_dispose1
valent_lock_gadget_init1
valent_lock_gadget_get_type6
valent_lock_gadget_class_intern_init2
valent_lock_gadget_get_type2
valent_lock_gadget_get_type_once2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-gadget.c.func.html b/coverage/src/plugins/lock/valent-lock-gadget.c.func.html new file mode 100644 index 00000000000..28805bb52fa --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-gadget.c.func.html @@ -0,0 +1,133 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-gadget.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1616
Test Date:2024-03-31 18:46:36Functions:100.0 %55
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_lock_gadget_dispose1
valent_lock_gadget_get_type6
valent_lock_gadget_class_intern_init2
valent_lock_gadget_get_type2
valent_lock_gadget_get_type_once2
valent_lock_gadget_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-gadget.c.gcov.html b/coverage/src/plugins/lock/valent-lock-gadget.c.gcov.html new file mode 100644 index 00000000000..2776ab1c1d2 --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-gadget.c.gcov.html @@ -0,0 +1,157 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-gadget.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-gadget.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %1616
Test Date:2024-03-31 18:46:36Functions:100.0 %55
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:66.7 %64
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-lock-gadget"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-lock-gadget.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentLockGadget
+      16                 :             : {
+      17                 :             :   ValentDeviceGadget  parent_instance;
+      18                 :             : 
+      19                 :             :   /* widgets */
+      20                 :             :   GtkWidget          *button;
+      21                 :             : };
+      22                 :             : 
+      23   [ +  +  +  - ]:           6 : G_DEFINE_FINAL_TYPE (ValentLockGadget, valent_lock_gadget, VALENT_TYPE_DEVICE_GADGET)
+      24                 :             : 
+      25                 :             : 
+      26                 :             : /*
+      27                 :             :  * GObject
+      28                 :             :  */
+      29                 :             : static void
+      30                 :           1 : valent_lock_gadget_dispose (GObject *object)
+      31                 :             : {
+      32                 :           1 :   ValentLockGadget *self = VALENT_LOCK_GADGET (object);
+      33                 :             : 
+      34         [ +  - ]:           1 :   g_clear_pointer (&self->button, gtk_widget_unparent);
+      35                 :             : 
+      36                 :           1 :   G_OBJECT_CLASS (valent_lock_gadget_parent_class)->dispose (object);
+      37                 :           1 : }
+      38                 :             : 
+      39                 :             : static void
+      40                 :           2 : valent_lock_gadget_class_init (ValentLockGadgetClass *klass)
+      41                 :             : {
+      42                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      43                 :             : 
+      44                 :           2 :   object_class->dispose = valent_lock_gadget_dispose;
+      45                 :             : }
+      46                 :             : 
+      47                 :             : static void
+      48                 :           1 : valent_lock_gadget_init (ValentLockGadget *self)
+      49                 :             : {
+      50                 :             :   /* Button */
+      51                 :           1 :   self->button = g_object_new (GTK_TYPE_TOGGLE_BUTTON,
+      52                 :             :                                "action-name", "device.lock.state",
+      53                 :             :                                "icon-name",   "channel-secure-symbolic",
+      54                 :             :                                "has-frame",   FALSE,
+      55                 :             :                                NULL);
+      56                 :           1 :   gtk_accessible_update_property (GTK_ACCESSIBLE (self->button),
+      57                 :             :                                   GTK_ACCESSIBLE_PROPERTY_LABEL, _("Lock"),
+      58                 :             :                                   -1);
+      59                 :           1 :   g_object_bind_property (self->button, "sensitive",
+      60                 :           1 :                           self->button, "visible",
+      61                 :             :                           G_BINDING_SYNC_CREATE);
+      62                 :             : 
+      63                 :           1 :   gtk_widget_set_parent (self->button, GTK_WIDGET (self));
+      64                 :           1 : }
+      65                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-plugin.c.func-c.html b/coverage/src/plugins/lock/valent-lock-plugin.c.func-c.html new file mode 100644 index 00000000000..f55a40609ea --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-plugin.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:99.1 %107106
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
state_action2
valent_lock_plugin_set_state2
valent_lock_plugin_handle_lock_request3
valent_lock_plugin_send_state3
valent_lock_plugin_request_state4
valent_lock_plugin_constructed5
valent_lock_plugin_handle_lock5
valent_lock_plugin_init5
valent_lock_plugin_handle_packet8
valent_lock_plugin_update_actions9
valent_lock_plugin_destroy10
valent_lock_plugin_update_state15
valent_lock_plugin_get_type42
valent_lock_plugin_class_intern_init2
valent_lock_plugin_get_type_once2
valent_lock_plugin_get_type38
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-plugin.c.func.html b/coverage/src/plugins/lock/valent-lock-plugin.c.func.html new file mode 100644 index 00000000000..86ff0a4ef45 --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-plugin.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:99.1 %107106
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
state_action2
valent_lock_plugin_constructed5
valent_lock_plugin_destroy10
valent_lock_plugin_get_type42
valent_lock_plugin_class_intern_init2
valent_lock_plugin_get_type38
valent_lock_plugin_get_type_once2
valent_lock_plugin_handle_lock5
valent_lock_plugin_handle_lock_request3
valent_lock_plugin_handle_packet8
valent_lock_plugin_init5
valent_lock_plugin_request_state4
valent_lock_plugin_send_state3
valent_lock_plugin_set_state2
valent_lock_plugin_update_actions9
valent_lock_plugin_update_state15
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-plugin.c.gcov.html b/coverage/src/plugins/lock/valent-lock-plugin.c.gcov.html new file mode 100644 index 00000000000..3485e9924c3 --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-plugin.c.gcov.html @@ -0,0 +1,346 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:99.1 %107106
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.7 %5634
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-lock-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-lock-plugin.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentLockPlugin
+      17                 :             : {
+      18                 :             :   ValentDevicePlugin  parent_instance;
+      19                 :             : 
+      20                 :             :   ValentSession      *session;
+      21                 :             :   unsigned long       session_changed_id;
+      22                 :             : 
+      23                 :             :   gboolean            remote_locked;
+      24                 :             : };
+      25                 :             : 
+      26   [ +  +  +  - ]:          42 : G_DEFINE_FINAL_TYPE (ValentLockPlugin, valent_lock_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      27                 :             : 
+      28                 :             : static void   valent_lock_plugin_request_state (ValentLockPlugin *self);
+      29                 :             : static void   valent_lock_plugin_send_state    (ValentLockPlugin *self);
+      30                 :             : 
+      31                 :             : 
+      32                 :             : /*
+      33                 :             :  * Local Lock
+      34                 :             :  */
+      35                 :             : static void
+      36                 :           3 : valent_lock_plugin_send_state (ValentLockPlugin *self)
+      37                 :             : {
+      38                 :           6 :   g_autoptr (JsonBuilder) builder = NULL;
+      39         [ -  + ]:           3 :   g_autoptr (JsonNode) packet = NULL;
+      40                 :           3 :   gboolean state;
+      41                 :             : 
+      42         [ +  - ]:           3 :   g_assert (VALENT_IS_LOCK_PLUGIN (self));
+      43                 :             : 
+      44                 :           3 :   state = valent_session_get_locked (self->session);
+      45                 :             : 
+      46                 :           3 :   valent_packet_init (&builder, "kdeconnect.lock");
+      47                 :           3 :   json_builder_set_member_name (builder, "isLocked");
+      48                 :           3 :   json_builder_add_boolean_value (builder, state);
+      49                 :           3 :   packet = valent_packet_end (&builder);
+      50                 :             : 
+      51         [ +  - ]:           3 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      52                 :           3 : }
+      53                 :             : 
+      54                 :             : static void
+      55                 :           3 : valent_lock_plugin_handle_lock_request (ValentLockPlugin *self,
+      56                 :             :                                         JsonNode         *packet)
+      57                 :             : {
+      58                 :           3 :   gboolean state;
+      59                 :             : 
+      60         [ +  - ]:           3 :   g_assert (VALENT_IS_LOCK_PLUGIN (self));
+      61         [ -  + ]:           3 :   g_assert (VALENT_IS_PACKET (packet));
+      62                 :             : 
+      63         [ +  + ]:           3 :   if (valent_packet_check_field (packet, "requestLocked"))
+      64                 :           1 :     valent_lock_plugin_send_state (self);
+      65                 :             : 
+      66         [ +  + ]:           3 :   if (valent_packet_get_boolean (packet, "setLocked", &state))
+      67                 :           2 :     valent_session_set_locked (self->session, state);
+      68                 :           3 : }
+      69                 :             : 
+      70                 :             : /*
+      71                 :             :  * Remote Lock
+      72                 :             :  */
+      73                 :             : static void
+      74                 :           9 : valent_lock_plugin_update_actions (ValentLockPlugin *self)
+      75                 :             : {
+      76                 :           9 :   GAction *action;
+      77                 :             : 
+      78                 :           9 :   action = g_action_map_lookup_action (G_ACTION_MAP (self), "state");
+      79                 :           9 :   g_simple_action_set_state (G_SIMPLE_ACTION (action),
+      80                 :             :                              g_variant_new_boolean (self->remote_locked));
+      81                 :           9 : }
+      82                 :             : 
+      83                 :             : static void
+      84                 :           5 : valent_lock_plugin_handle_lock (ValentLockPlugin *self,
+      85                 :             :                                 JsonNode         *packet)
+      86                 :             : {
+      87         [ +  - ]:           5 :   g_assert (VALENT_IS_LOCK_PLUGIN (self));
+      88         [ -  + ]:           5 :   g_assert (VALENT_IS_PACKET (packet));
+      89                 :             : 
+      90         [ +  - ]:           5 :   if (valent_packet_get_boolean (packet, "isLocked", &self->remote_locked))
+      91                 :           5 :     valent_lock_plugin_update_actions (self);
+      92                 :           5 : }
+      93                 :             : 
+      94                 :             : static void
+      95                 :           4 : valent_lock_plugin_request_state (ValentLockPlugin *self)
+      96                 :             : {
+      97                 :           8 :   g_autoptr (JsonBuilder) builder = NULL;
+      98         [ -  + ]:           4 :   g_autoptr (JsonNode) packet = NULL;
+      99                 :             : 
+     100                 :           4 :   valent_packet_init (&builder, "kdeconnect.lock.request");
+     101                 :           4 :   json_builder_set_member_name (builder, "requestLocked");
+     102                 :           4 :   json_builder_add_boolean_value (builder, TRUE);
+     103                 :           4 :   packet = valent_packet_end (&builder);
+     104                 :             : 
+     105         [ +  - ]:           4 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     106                 :           4 : }
+     107                 :             : 
+     108                 :             : static void
+     109                 :           2 : valent_lock_plugin_set_state (ValentLockPlugin *self,
+     110                 :             :                               gboolean          state)
+     111                 :             : {
+     112                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+     113         [ -  + ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+     114                 :             : 
+     115                 :           2 :   valent_packet_init (&builder, "kdeconnect.lock.request");
+     116                 :           2 :   json_builder_set_member_name (builder, "setLocked");
+     117                 :           2 :   json_builder_add_boolean_value (builder, state);
+     118                 :           2 :   packet = valent_packet_end (&builder);
+     119                 :             : 
+     120         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     121                 :           2 : }
+     122                 :             : 
+     123                 :             : /*
+     124                 :             :  * GActions
+     125                 :             :  */
+     126                 :             : static void
+     127                 :           2 : state_action (GSimpleAction *action,
+     128                 :             :               GVariant      *parameter,
+     129                 :             :               gpointer       user_data)
+     130                 :             : {
+     131                 :           2 :   ValentLockPlugin *self = VALENT_LOCK_PLUGIN (user_data);
+     132                 :           2 :   gboolean lock = FALSE;
+     133                 :             : 
+     134         [ +  - ]:           2 :   g_assert (VALENT_IS_LOCK_PLUGIN (self));
+     135                 :             : 
+     136                 :           2 :   lock = g_variant_get_boolean (parameter);
+     137                 :             : 
+     138         [ +  - ]:           2 :   if (self->remote_locked != lock)
+     139                 :           2 :     valent_lock_plugin_set_state (self, lock);
+     140                 :           2 : }
+     141                 :             : 
+     142                 :             : static const GActionEntry actions[] = {
+     143                 :             :     {"state", NULL, NULL, "false", state_action},
+     144                 :             : };
+     145                 :             : 
+     146                 :             : /*
+     147                 :             :  * ValentDevicePlugin
+     148                 :             :  */
+     149                 :             : static void
+     150                 :          15 : valent_lock_plugin_update_state (ValentDevicePlugin *plugin,
+     151                 :             :                                  ValentDeviceState   state)
+     152                 :             : {
+     153                 :          15 :   ValentLockPlugin *self = VALENT_LOCK_PLUGIN (plugin);
+     154                 :          15 :   gboolean available;
+     155                 :             : 
+     156         [ +  - ]:          15 :   g_assert (VALENT_IS_LOCK_PLUGIN (self));
+     157                 :             : 
+     158                 :          15 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     159                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     160                 :             : 
+     161         [ +  + ]:          15 :   if (available)
+     162                 :             :     {
+     163         [ +  - ]:           4 :       if (self->session_changed_id == 0)
+     164                 :             :         {
+     165                 :           4 :           self->session_changed_id =
+     166                 :           4 :             g_signal_connect_object (self->session,
+     167                 :             :                                      "notify::locked",
+     168                 :             :                                      G_CALLBACK (valent_lock_plugin_send_state),
+     169                 :             :                                      self,
+     170                 :             :                                      G_CONNECT_SWAPPED);
+     171                 :             :         }
+     172                 :             : 
+     173                 :           4 :       valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     174                 :           4 :       valent_lock_plugin_update_actions (self);
+     175                 :           4 :       valent_lock_plugin_request_state (self);
+     176                 :             :     }
+     177                 :             :   else
+     178                 :             :     {
+     179         [ +  + ]:          11 :       g_clear_signal_handler (&self->session_changed_id, self->session);
+     180                 :          11 :       valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     181                 :             :     }
+     182                 :          15 : }
+     183                 :             : 
+     184                 :             : static void
+     185                 :           8 : valent_lock_plugin_handle_packet (ValentDevicePlugin *plugin,
+     186                 :             :                                   const char         *type,
+     187                 :             :                                   JsonNode           *packet)
+     188                 :             : {
+     189                 :           8 :   ValentLockPlugin *self = VALENT_LOCK_PLUGIN (plugin);
+     190                 :             : 
+     191         [ +  - ]:           8 :   g_assert (VALENT_IS_LOCK_PLUGIN (self));
+     192         [ -  + ]:           8 :   g_assert (type != NULL);
+     193         [ -  + ]:           8 :   g_assert (VALENT_IS_PACKET (packet));
+     194                 :             : 
+     195         [ +  + ]:           8 :   if (g_str_equal (type, "kdeconnect.lock"))
+     196                 :           5 :     valent_lock_plugin_handle_lock (self, packet);
+     197         [ +  - ]:           3 :   else if (g_str_equal (type, "kdeconnect.lock.request"))
+     198                 :           3 :     valent_lock_plugin_handle_lock_request (self, packet);
+     199                 :             :   else
+     200                 :           0 :     g_assert_not_reached ();
+     201                 :           8 : }
+     202                 :             : 
+     203                 :             : /*
+     204                 :             :  * ValentObject
+     205                 :             :  */
+     206                 :             : static void
+     207                 :          10 : valent_lock_plugin_destroy (ValentObject *object)
+     208                 :             : {
+     209                 :          10 :   ValentLockPlugin *self = VALENT_LOCK_PLUGIN (object);
+     210                 :             : 
+     211         [ -  + ]:          10 :   g_clear_signal_handler (&self->session_changed_id, self->session);
+     212                 :             : 
+     213                 :          10 :   VALENT_OBJECT_CLASS (valent_lock_plugin_parent_class)->destroy (object);
+     214                 :          10 : }
+     215                 :             : 
+     216                 :             : /*
+     217                 :             :  * GObject
+     218                 :             :  */
+     219                 :             : static void
+     220                 :           5 : valent_lock_plugin_constructed (GObject *object)
+     221                 :             : {
+     222                 :           5 :   ValentLockPlugin *self = VALENT_LOCK_PLUGIN (object);
+     223                 :           5 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     224                 :             : 
+     225                 :           5 :   self->session = valent_session_get_default ();
+     226                 :             : 
+     227                 :           5 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     228                 :             :                                    actions,
+     229                 :             :                                    G_N_ELEMENTS (actions),
+     230                 :             :                                    plugin);
+     231                 :             : 
+     232                 :           5 :   G_OBJECT_CLASS (valent_lock_plugin_parent_class)->constructed (object);
+     233                 :           5 : }
+     234                 :             : 
+     235                 :             : static void
+     236                 :           2 : valent_lock_plugin_class_init (ValentLockPluginClass *klass)
+     237                 :             : {
+     238                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     239                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     240                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     241                 :             : 
+     242                 :           2 :   object_class->constructed = valent_lock_plugin_constructed;
+     243                 :             : 
+     244                 :           2 :   vobject_class->destroy = valent_lock_plugin_destroy;
+     245                 :             : 
+     246                 :           2 :   plugin_class->handle_packet = valent_lock_plugin_handle_packet;
+     247                 :           2 :   plugin_class->update_state = valent_lock_plugin_update_state;
+     248                 :             : }
+     249                 :             : 
+     250                 :             : static void
+     251                 :           5 : valent_lock_plugin_init (ValentLockPlugin *self)
+     252                 :             : {
+     253                 :           5 : }
+     254                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-plugin.h.func-c.html b/coverage/src/plugins/lock/valent-lock-plugin.h.func-c.html new file mode 100644 index 00000000000..5c794cab892 --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LOCK_PLUGIN36
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-plugin.h.func.html b/coverage/src/plugins/lock/valent-lock-plugin.h.func.html new file mode 100644 index 00000000000..ec454c032dd --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_LOCK_PLUGIN36
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/lock/valent-lock-plugin.h.gcov.html b/coverage/src/plugins/lock/valent-lock-plugin.h.gcov.html new file mode 100644 index 00000000000..cc33dfdcc74 --- /dev/null +++ b/coverage/src/plugins/lock/valent-lock-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/lock/valent-lock-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/lock - valent-lock-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_LOCK_PLUGIN (valent_lock_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          36 : G_DECLARE_FINAL_TYPE (ValentLockPlugin, valent_lock_plugin, VALENT, LOCK_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-detail-sort-b.html b/coverage/src/plugins/mousepad/index-detail-sort-b.html new file mode 100644 index 00000000000..c2bba1e49ca --- /dev/null +++ b/coverage/src/plugins/mousepad/index-detail-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-detail-sort-f.html b/coverage/src/plugins/mousepad/index-detail-sort-f.html new file mode 100644 index 00000000000..23123ed5eba --- /dev/null +++ b/coverage/src/plugins/mousepad/index-detail-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-detail-sort-l.html b/coverage/src/plugins/mousepad/index-detail-sort-l.html new file mode 100644 index 00000000000..ab42f9694ca --- /dev/null +++ b/coverage/src/plugins/mousepad/index-detail-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-detail.html b/coverage/src/plugins/mousepad/index-detail.html new file mode 100644 index 00000000000..49b4f4bff3f --- /dev/null +++ b/coverage/src/plugins/mousepad/index-detail.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-sort-b.html b/coverage/src/plugins/mousepad/index-sort-b.html new file mode 100644 index 00000000000..c2bba1e49ca --- /dev/null +++ b/coverage/src/plugins/mousepad/index-sort-b.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-sort-f.html b/coverage/src/plugins/mousepad/index-sort-f.html new file mode 100644 index 00000000000..23123ed5eba --- /dev/null +++ b/coverage/src/plugins/mousepad/index-sort-f.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index-sort-l.html b/coverage/src/plugins/mousepad/index-sort-l.html new file mode 100644 index 00000000000..ab42f9694ca --- /dev/null +++ b/coverage/src/plugins/mousepad/index-sort-l.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/index.html b/coverage/src/plugins/mousepad/index.html new file mode 100644 index 00000000000..49b4f4bff3f --- /dev/null +++ b/coverage/src/plugins/mousepad/index.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepadCoverageTotalHit
Test:Code CoverageLines:50.7 %588298
Test Date:2024-03-31 18:46:36Functions:71.1 %4532
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:35.9 %357128
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
mousepad-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-mousepad-device.c +
21.4%21.4%
+
21.4 %257559.2 %1301245.5 %2210
valent-mousepad-device.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mousepad-keydef.h +
16.1%16.1%
+
16.1 %621012.1 %334100.0 %11
valent-mousepad-plugin.c +
86.4%86.4%
+
86.4 %26422858.2 %18210694.7 %1918
valent-mousepad-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/mousepad-plugin.c.func-c.html b/coverage/src/plugins/mousepad/mousepad-plugin.c.func-c.html new file mode 100644 index 00000000000..0e85b02f909 --- /dev/null +++ b/coverage/src/plugins/mousepad/mousepad-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/mousepad-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - mousepad-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mousepad_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/mousepad-plugin.c.func.html b/coverage/src/plugins/mousepad/mousepad-plugin.c.func.html new file mode 100644 index 00000000000..d307bc28371 --- /dev/null +++ b/coverage/src/plugins/mousepad/mousepad-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/mousepad-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - mousepad-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mousepad_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/mousepad-plugin.c.gcov.html b/coverage/src/plugins/mousepad/mousepad-plugin.c.gcov.html new file mode 100644 index 00000000000..c38e110f9d3 --- /dev/null +++ b/coverage/src/plugins/mousepad/mousepad-plugin.c.gcov.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/mousepad-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - mousepad-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-mousepad-plugin.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           1 : valent_mousepad_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           1 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_MOUSEPAD_PLUGIN);
+      18                 :           1 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-device.c.func-c.html b/coverage/src/plugins/mousepad/valent-mousepad-device.c.func-c.html new file mode 100644 index 00000000000..9cb4959c361 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-device.c.func-c.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:21.4 %25755
Test Date:2024-03-31 18:46:36Functions:45.5 %2210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:9.2 %13012
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_pointer_settings_changed0
valent_mousepad_device_get_property0
valent_mousepad_device_handle_packet0
valent_mousepad_device_keyboard_flush0
valent_mousepad_device_keyboard_keysym0
valent_mousepad_device_new0
valent_mousepad_device_pointer_axis0
valent_mousepad_device_pointer_button0
valent_mousepad_device_pointer_flush0
valent_mousepad_device_pointer_longpress0
valent_mousepad_device_pointer_motion0
valent_mousepad_device_update_modifiers0
valent_mousepad_device_class_init1
valent_mousepad_device_destroy2
valent_mousepad_device_finalize2
valent_mousepad_device_init2
valent_mousepad_device_keyboard_reset2
valent_mousepad_device_pointer_reset2
valent_mousepad_device_set_property2
valent_mousepad_device_get_type6
valent_mousepad_device_class_intern_init1
valent_mousepad_device_get_type_once1
valent_mousepad_device_get_type4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-device.c.func.html b/coverage/src/plugins/mousepad/valent-mousepad-device.c.func.html new file mode 100644 index 00000000000..2a55a18268e --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-device.c.func.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:21.4 %25755
Test Date:2024-03-31 18:46:36Functions:45.5 %2210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:9.2 %13012
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_pointer_settings_changed0
valent_mousepad_device_class_init1
valent_mousepad_device_destroy2
valent_mousepad_device_finalize2
valent_mousepad_device_get_property0
valent_mousepad_device_get_type6
valent_mousepad_device_class_intern_init1
valent_mousepad_device_get_type4
valent_mousepad_device_get_type_once1
valent_mousepad_device_handle_packet0
valent_mousepad_device_init2
valent_mousepad_device_keyboard_flush0
valent_mousepad_device_keyboard_keysym0
valent_mousepad_device_keyboard_reset2
valent_mousepad_device_new0
valent_mousepad_device_pointer_axis0
valent_mousepad_device_pointer_button0
valent_mousepad_device_pointer_flush0
valent_mousepad_device_pointer_longpress0
valent_mousepad_device_pointer_motion0
valent_mousepad_device_pointer_reset2
valent_mousepad_device_set_property2
valent_mousepad_device_update_modifiers0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-device.c.gcov.html b/coverage/src/plugins/mousepad/valent-mousepad-device.c.gcov.html new file mode 100644 index 00000000000..615ce9bd8f6 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-device.c.gcov.html @@ -0,0 +1,742 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-device.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:21.4 %25755
Test Date:2024-03-31 18:46:36Functions:45.5 %2210
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:9.2 %13012
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mousepad-device"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gdk/gdk.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-mousepad-device.h"
+      14                 :             : #include "valent-mousepad-keydef.h"
+      15                 :             : 
+      16                 :             : #define DEFAULT_DOUBLE_CLICK_TIME (400)
+      17                 :             : #define DEFAULT_LONG_PRESS_TIME   (500)
+      18                 :             : 
+      19                 :             : 
+      20                 :             : struct _ValentMousepadDevice
+      21                 :             : {
+      22                 :             :   ValentInputAdapter  parent_instance;
+      23                 :             : 
+      24                 :             :   ValentDevice       *device;
+      25                 :             :   GtkSettings        *settings;
+      26                 :             : 
+      27                 :             :   /* keyboard */
+      28                 :             :   GArray             *keyboard_keys;
+      29                 :             :   GdkModifierType     keyboard_modifiers;
+      30                 :             :   unsigned int        keyboard_flush_id;
+      31                 :             : 
+      32                 :             :   /* pointer */
+      33                 :             :   unsigned int        pointer_button;
+      34                 :             :   unsigned int        pointer_presses;
+      35                 :             :   unsigned int        pointer_releases;
+      36                 :             :   unsigned int        pointer_doubleclick_id;
+      37                 :             :   unsigned int        pointer_longpress_id;
+      38                 :             : 
+      39                 :             :   int                 double_click_time;
+      40                 :             :   int                 long_press_time;
+      41                 :             : };
+      42                 :             : 
+      43   [ +  +  +  - ]:           6 : G_DEFINE_FINAL_TYPE (ValentMousepadDevice, valent_mousepad_device, VALENT_TYPE_INPUT_ADAPTER)
+      44                 :             : 
+      45                 :             : 
+      46                 :             : enum {
+      47                 :             :   PROP_0,
+      48                 :             :   PROP_DEVICE,
+      49                 :             :   N_PROPERTIES
+      50                 :             : };
+      51                 :             : 
+      52                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      53                 :             : 
+      54                 :             : 
+      55                 :             : /*
+      56                 :             :  * Keyboard
+      57                 :             :  */
+      58                 :             : static inline gboolean
+      59                 :           0 : valent_mousepad_device_update_modifiers (ValentMousepadDevice *self,
+      60                 :             :                                          uint32_t              keysym,
+      61                 :             :                                          gboolean              state)
+      62                 :             : {
+      63   [ #  #  #  #  :           0 :   switch (keysym)
+                   #  # ]
+      64                 :             :     {
+      65                 :           0 :     case GDK_KEY_Alt_L:
+      66                 :             :     case GDK_KEY_Alt_R:
+      67                 :           0 :       self->keyboard_modifiers = state
+      68                 :           0 :         ? self->keyboard_modifiers | GDK_ALT_MASK
+      69         [ #  # ]:           0 :         : self->keyboard_modifiers & ~GDK_ALT_MASK;
+      70                 :           0 :       return TRUE;
+      71                 :             : 
+      72                 :           0 :     case GDK_KEY_Control_L:
+      73                 :             :     case GDK_KEY_Control_R:
+      74                 :           0 :       self->keyboard_modifiers = state
+      75                 :           0 :         ? self->keyboard_modifiers | GDK_CONTROL_MASK
+      76         [ #  # ]:           0 :         : self->keyboard_modifiers & ~GDK_CONTROL_MASK;
+      77                 :           0 :       return TRUE;
+      78                 :             : 
+      79                 :           0 :     case GDK_KEY_Shift_L:
+      80                 :             :     case GDK_KEY_Shift_R:
+      81                 :           0 :       self->keyboard_modifiers = state
+      82                 :           0 :         ? self->keyboard_modifiers | GDK_SHIFT_MASK
+      83         [ #  # ]:           0 :         : self->keyboard_modifiers & ~GDK_SHIFT_MASK;
+      84                 :           0 :       return TRUE;
+      85                 :             : 
+      86                 :           0 :     case GDK_KEY_Super_L:
+      87                 :             :     case GDK_KEY_Super_R:
+      88                 :           0 :       self->keyboard_modifiers = state
+      89                 :           0 :         ? self->keyboard_modifiers | GDK_SUPER_MASK
+      90         [ #  # ]:           0 :         : self->keyboard_modifiers & ~GDK_SUPER_MASK;
+      91                 :           0 :       return TRUE;
+      92                 :             : 
+      93                 :             :     /* Return TRUE for known modifiers, even if unsupported */
+      94                 :             :     case GDK_KEY_Overlay1_Enable:
+      95                 :             :     case GDK_KEY_Overlay2_Enable:
+      96                 :             :     case GDK_KEY_Caps_Lock:
+      97                 :             :     case GDK_KEY_Shift_Lock:
+      98                 :             :     case GDK_KEY_Meta_L:
+      99                 :             :     case GDK_KEY_Meta_R:
+     100                 :             :     case GDK_KEY_Hyper_L:
+     101                 :             :     case GDK_KEY_Hyper_R:
+     102                 :             :     case GDK_KEY_Mode_switch:
+     103                 :             :     case GDK_KEY_ISO_Level3_Shift:
+     104                 :             :     case GDK_KEY_ISO_Level3_Latch:
+     105                 :             :     case GDK_KEY_ISO_Level5_Shift:
+     106                 :             :     case GDK_KEY_ISO_Level5_Latch:
+     107                 :             :       VALENT_NOTE ("skipping %s", gdk_keyval_name (keysym));
+     108                 :             :       return TRUE;
+     109                 :             : 
+     110                 :             :     default:
+     111                 :             :       return FALSE;
+     112                 :             :     }
+     113                 :             : }
+     114                 :             : 
+     115                 :             : static gboolean
+     116                 :           0 : valent_mousepad_device_keyboard_flush (gpointer data)
+     117                 :             : {
+     118                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (data);
+     119                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     120         [ #  # ]:           0 :   g_autoptr (JsonNode) packet = NULL;
+     121         [ #  # ]:           0 :   g_autoptr (GString) key = NULL;
+     122                 :           0 :   uint32_t special_key = 0;
+     123                 :           0 :   unsigned int n_handled = 0;
+     124                 :             : 
+     125         [ #  # ]:           0 :   if (self->keyboard_keys->len == 0)
+     126                 :             :     {
+     127                 :           0 :       self->keyboard_flush_id = 0;
+     128                 :           0 :       return G_SOURCE_REMOVE;
+     129                 :             :     }
+     130                 :             : 
+     131         [ #  # ]:           0 :   for (unsigned int len = self->keyboard_keys->len; n_handled < len; n_handled++)
+     132                 :             :     {
+     133                 :           0 :       uint32_t *keysym = &g_array_index (self->keyboard_keys, uint32_t, n_handled);
+     134                 :             : 
+     135         [ #  # ]:           0 :       if ((special_key = valent_mousepad_keyval_to_keycode (*keysym)) != 0)
+     136                 :             :         {
+     137                 :             :           /* If there are keys to be sent, they need to be sent first */
+     138         [ #  # ]:           0 :           if (key != NULL)
+     139                 :           0 :             special_key = 0;
+     140                 :             : 
+     141                 :             :           /* Otherwise, we need to send the current key and modifiers */
+     142                 :           0 :           n_handled++;
+     143                 :           0 :           break;
+     144                 :             :         }
+     145                 :             :       else
+     146                 :             :         {
+     147                 :           0 :           gunichar wc = gdk_keyval_to_unicode (*keysym);
+     148                 :             : 
+     149         [ #  # ]:           0 :           if (wc == 0)
+     150                 :             :             {
+     151                 :           0 :               g_debug ("%s(): failed to convert keysym \"%u\" to unicode",
+     152                 :             :                        G_STRFUNC, *keysym);
+     153                 :           0 :               continue;
+     154                 :             :             }
+     155                 :             : 
+     156         [ #  # ]:           0 :           if (key == NULL)
+     157                 :           0 :             key = g_string_new (NULL);
+     158                 :             : 
+     159                 :           0 :           g_string_append_unichar (key, wc);
+     160                 :             :         }
+     161                 :             :     }
+     162                 :           0 :   g_array_remove_range (self->keyboard_keys, 0, n_handled);
+     163                 :             : 
+     164                 :             :   /* Build the packet */
+     165                 :           0 :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     166                 :             : 
+     167         [ #  # ]:           0 :   if (key != NULL)
+     168                 :             :     {
+     169                 :           0 :       json_builder_set_member_name (builder, "key");
+     170                 :           0 :       json_builder_add_string_value (builder, key->str);
+     171                 :             :     }
+     172         [ #  # ]:           0 :   else if (special_key != 0)
+     173                 :             :     {
+     174                 :           0 :       json_builder_set_member_name (builder, "specialKey");
+     175                 :           0 :       json_builder_add_int_value (builder, special_key);
+     176                 :             :     }
+     177                 :             : 
+     178                 :             :   /* Check our supported modifiers */
+     179         [ #  # ]:           0 :   if ((self->keyboard_modifiers & GDK_ALT_MASK) != 0)
+     180                 :             :     {
+     181                 :           0 :       json_builder_set_member_name (builder, "alt");
+     182                 :           0 :       json_builder_add_boolean_value (builder, TRUE);
+     183                 :             :     }
+     184                 :             : 
+     185         [ #  # ]:           0 :   if ((self->keyboard_modifiers & GDK_CONTROL_MASK) != 0)
+     186                 :             :     {
+     187                 :           0 :       json_builder_set_member_name (builder, "ctrl");
+     188                 :           0 :       json_builder_add_boolean_value (builder, TRUE);
+     189                 :             :     }
+     190                 :             : 
+     191         [ #  # ]:           0 :   if ((self->keyboard_modifiers & GDK_SHIFT_MASK) != 0)
+     192                 :             :     {
+     193                 :           0 :       json_builder_set_member_name (builder, "shift");
+     194                 :           0 :       json_builder_add_boolean_value (builder, TRUE);
+     195                 :             :     }
+     196                 :             : 
+     197         [ #  # ]:           0 :   if ((self->keyboard_modifiers & GDK_SUPER_MASK) != 0)
+     198                 :             :     {
+     199                 :           0 :       json_builder_set_member_name (builder, "super");
+     200                 :           0 :       json_builder_add_boolean_value (builder, TRUE);
+     201                 :             :     }
+     202                 :             : 
+     203                 :             :   /* Request acknowledgment of the event (disabled until it can be received) */
+     204                 :             : #if 0
+     205                 :             :   json_builder_set_member_name (builder, "sendAck");
+     206                 :             :   json_builder_add_boolean_value (builder, TRUE);
+     207                 :             : #endif
+     208                 :             : 
+     209                 :           0 :   packet = valent_packet_end (&builder);
+     210                 :           0 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     211                 :             : 
+     212                 :             :   /* Clear the source if there's nothing left queued */
+     213         [ #  # ]:           0 :   if (self->keyboard_keys->len == 0)
+     214                 :             :     {
+     215                 :           0 :       self->keyboard_flush_id = 0;
+     216                 :           0 :       return G_SOURCE_REMOVE;
+     217                 :             :     }
+     218                 :             : 
+     219                 :             :   return G_SOURCE_CONTINUE;
+     220                 :             : }
+     221                 :             : 
+     222                 :             : static inline void
+     223                 :           2 : valent_mousepad_device_keyboard_reset (ValentMousepadDevice *self)
+     224                 :             : {
+     225         [ +  - ]:           2 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     226                 :             : 
+     227                 :           2 :   g_array_remove_range (self->keyboard_keys, 0, self->keyboard_keys->len);
+     228         [ -  + ]:           2 :   g_clear_handle_id (&self->keyboard_flush_id, g_source_remove);
+     229                 :           2 : }
+     230                 :             : 
+     231                 :             : /*
+     232                 :             :  * Pointer
+     233                 :             :  */
+     234                 :             : static inline gboolean
+     235                 :           2 : valent_mousepad_device_pointer_reset (ValentMousepadDevice *self)
+     236                 :             : {
+     237                 :           2 :   self->pointer_button = 0;
+     238                 :           2 :   self->pointer_presses = 0;
+     239                 :           2 :   self->pointer_releases = 0;
+     240         [ -  + ]:           2 :   g_clear_handle_id (&self->pointer_doubleclick_id, g_source_remove);
+     241         [ -  + ]:           2 :   g_clear_handle_id (&self->pointer_longpress_id, g_source_remove);
+     242                 :             : 
+     243                 :           2 :   return G_SOURCE_REMOVE;
+     244                 :             : }
+     245                 :             : 
+     246                 :             : static inline gboolean
+     247                 :           0 : valent_mousepad_device_pointer_flush (gpointer data)
+     248                 :             : {
+     249                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (data);
+     250                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     251         [ #  # ]:           0 :   g_autoptr (JsonNode) packet = NULL;
+     252                 :             : 
+     253         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     254                 :             : 
+     255                 :             :   /* Ignore unpaired releases */
+     256         [ #  # ]:           0 :   if (self->pointer_presses < self->pointer_releases)
+     257                 :           0 :     return valent_mousepad_device_pointer_reset (self);
+     258                 :             : 
+     259   [ #  #  #  # ]:           0 :   if (self->pointer_presses == 1 && self->pointer_releases == 1)
+     260                 :             :     {
+     261                 :           0 :       valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     262                 :             : 
+     263   [ #  #  #  # ]:           0 :       switch (self->pointer_button)
+     264                 :             :         {
+     265                 :           0 :         case VALENT_POINTER_PRIMARY:
+     266                 :           0 :           json_builder_set_member_name (builder, "singleclick");
+     267                 :           0 :           json_builder_add_boolean_value (builder, TRUE);
+     268                 :           0 :           break;
+     269                 :             : 
+     270                 :           0 :         case VALENT_POINTER_MIDDLE:
+     271                 :           0 :           json_builder_set_member_name (builder, "middleclick");
+     272                 :           0 :           json_builder_add_boolean_value (builder, TRUE);
+     273                 :           0 :           break;
+     274                 :             : 
+     275                 :           0 :         case VALENT_POINTER_SECONDARY:
+     276                 :           0 :           json_builder_set_member_name (builder, "rightclick");
+     277                 :           0 :           json_builder_add_boolean_value (builder, TRUE);
+     278                 :           0 :           break;
+     279                 :             : 
+     280                 :           0 :         default:
+     281                 :           0 :           g_debug ("%s: unknown pointer button %u",
+     282                 :             :                    G_STRFUNC,
+     283                 :             :                    self->pointer_button);
+     284                 :             :         }
+     285                 :             : 
+     286                 :           0 :       packet = valent_packet_end (&builder);
+     287                 :             :     }
+     288         [ #  # ]:           0 :   else if (self->pointer_button == VALENT_POINTER_PRIMARY && self->pointer_presses == 2)
+     289                 :             :     {
+     290                 :           0 :       valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     291                 :           0 :       json_builder_set_member_name (builder, "doubleclick");
+     292                 :           0 :       json_builder_add_boolean_value (builder, TRUE);
+     293                 :           0 :       packet = valent_packet_end (&builder);
+     294                 :             :     }
+     295                 :             : 
+     296         [ #  # ]:           0 :   if (packet != NULL)
+     297                 :             :     {
+     298                 :           0 :       valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     299                 :           0 :       valent_mousepad_device_pointer_reset (self);
+     300                 :             :     }
+     301                 :             : 
+     302                 :           0 :   return G_SOURCE_REMOVE;
+     303                 :             : }
+     304                 :             : 
+     305                 :             : static inline gboolean
+     306                 :           0 : valent_mousepad_device_pointer_longpress (gpointer data)
+     307                 :             : {
+     308                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (data);
+     309                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     310         [ #  # ]:           0 :   g_autoptr (JsonNode) packet = NULL;
+     311                 :             : 
+     312         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     313                 :             : 
+     314                 :           0 :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     315                 :           0 :   json_builder_set_member_name (builder, "singlehold");
+     316                 :           0 :   json_builder_add_boolean_value (builder, TRUE);
+     317                 :           0 :   packet = valent_packet_end (&builder);
+     318                 :             : 
+     319                 :           0 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     320                 :             : 
+     321         [ #  # ]:           0 :   return valent_mousepad_device_pointer_reset (self);
+     322                 :             : }
+     323                 :             : 
+     324                 :             : static void
+     325                 :           0 : on_pointer_settings_changed (GtkSettings          *settings,
+     326                 :             :                              GParamSpec           *pspec,
+     327                 :             :                              ValentMousepadDevice *self)
+     328                 :             : {
+     329         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     330                 :             : 
+     331                 :           0 :   g_object_get (settings,
+     332                 :             :                 "gtk-double-click-time", &self->double_click_time,
+     333                 :             :                 "gtk-long-press-time",   &self->long_press_time,
+     334                 :             :                 NULL);
+     335                 :           0 : }
+     336                 :             : 
+     337                 :             : /*
+     338                 :             :  * ValentInputAdapter
+     339                 :             :  */
+     340                 :             : static void
+     341                 :           0 : valent_mousepad_device_keyboard_keysym (ValentInputAdapter *adapter,
+     342                 :             :                                         uint32_t            keysym,
+     343                 :             :                                         gboolean            state)
+     344                 :             : {
+     345                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (adapter);
+     346                 :             : 
+     347         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     348         [ #  # ]:           0 :   g_return_if_fail (keysym != 0);
+     349                 :             : 
+     350                 :             :   /* Track modifiers, but don't send anything */
+     351         [ #  # ]:           0 :   if (valent_mousepad_device_update_modifiers (self, keysym, state))
+     352                 :             :     return;
+     353                 :             : 
+     354                 :             :   // TODO: the KDE Connect protocol doesn't support press and release states
+     355                 :             :   //       for keyboard input, so only key presses are sent. A solution might
+     356                 :             :   //       involve matching presses and releases, or an extant convention.
+     357         [ #  # ]:           0 :   if (!state)
+     358                 :             :     return;
+     359                 :             : 
+     360                 :           0 :   g_array_append_val (self->keyboard_keys, keysym);
+     361                 :             : 
+     362                 :             :   /* If there are modifiers set, the key should be sent immediately */
+     363         [ #  # ]:           0 :   if ((self->keyboard_modifiers & GDK_MODIFIER_MASK) != 0)
+     364                 :             :     {
+     365                 :           0 :       valent_mousepad_device_keyboard_flush (self);
+     366                 :           0 :       return;
+     367                 :             :     }
+     368                 :             : 
+     369                 :             :   /* Flush in an idle callback, in case key presses can be sent as a string */
+     370         [ #  # ]:           0 :   if (self->keyboard_flush_id == 0)
+     371                 :           0 :     self->keyboard_flush_id = g_idle_add (valent_mousepad_device_keyboard_flush,
+     372                 :             :                                           self);
+     373                 :             : }
+     374                 :             : 
+     375                 :             : static void
+     376                 :           0 : valent_mousepad_device_pointer_axis (ValentInputAdapter *adapter,
+     377                 :             :                                      double              dx,
+     378                 :             :                                      double              dy)
+     379                 :             : {
+     380                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (adapter);
+     381                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     382         [ #  # ]:           0 :   g_autoptr (JsonNode) packet = NULL;
+     383                 :             : 
+     384         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     385                 :             : 
+     386                 :           0 :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     387                 :           0 :   json_builder_set_member_name (builder, "dx");
+     388                 :           0 :   json_builder_add_double_value (builder, dx);
+     389                 :           0 :   json_builder_set_member_name (builder, "dy");
+     390                 :           0 :   json_builder_add_double_value (builder, dy);
+     391                 :           0 :   json_builder_set_member_name (builder, "scroll");
+     392                 :           0 :   json_builder_add_boolean_value (builder, TRUE);
+     393                 :           0 :   packet = valent_packet_end (&builder);
+     394                 :             : 
+     395         [ #  # ]:           0 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     396                 :           0 : }
+     397                 :             : 
+     398                 :             : static void
+     399                 :           0 : valent_mousepad_device_pointer_button (ValentInputAdapter *adapter,
+     400                 :             :                                        unsigned int        button,
+     401                 :             :                                        gboolean            state)
+     402                 :             : {
+     403                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (adapter);
+     404                 :             : 
+     405         [ #  # ]:           0 :   if (self->pointer_button != button)
+     406                 :             :     {
+     407                 :           0 :       self->pointer_button = button;
+     408                 :           0 :       self->pointer_presses = 0;
+     409                 :           0 :       self->pointer_releases = 0;
+     410                 :             :     }
+     411                 :             : 
+     412         [ #  # ]:           0 :   if (state)
+     413                 :             :     {
+     414                 :           0 :       self->pointer_presses += 1;
+     415                 :             : 
+     416                 :             :       /* Any button press removes the double click timer; the event will either
+     417                 :             :        * be accepted or rejected based on the current button state. */
+     418         [ #  # ]:           0 :       g_clear_handle_id (&self->pointer_doubleclick_id, g_source_remove);
+     419                 :             :     }
+     420                 :             :   else
+     421                 :             :     {
+     422                 :           0 :       self->pointer_releases += 1;
+     423                 :             :     }
+     424                 :             : 
+     425                 :             :   /* Any button event removes the long press timer; the event is accepted if the
+     426                 :             :    * timeout elapses with the primary button being the only button pressed. */
+     427         [ #  # ]:           0 :   g_clear_handle_id (&self->pointer_longpress_id, g_source_remove);
+     428                 :             : 
+     429                 :             :   /* Handle the first press and release for the primary button, to prevent
+     430                 :             :    * flushing the double click state on the first release. */
+     431         [ #  # ]:           0 :   if (self->pointer_button == VALENT_POINTER_PRIMARY && self->pointer_presses == 1)
+     432                 :             :     {
+     433                 :             :       /* Double click and long press events both start with the press event */
+     434         [ #  # ]:           0 :       if (self->pointer_releases == 0)
+     435                 :             :         {
+     436                 :             :           // TODO: what if double-click time < long-press time?
+     437                 :             :           /* If the timeout elapses, a "singleclick" packet will be sent */
+     438                 :           0 :           self->pointer_doubleclick_id =
+     439                 :           0 :             g_timeout_add (self->double_click_time,
+     440                 :             :                            valent_mousepad_device_pointer_flush,
+     441                 :             :                            self);
+     442                 :           0 :           g_source_set_name_by_id (self->pointer_doubleclick_id,
+     443                 :             :                                    "valent_mousepad_device_pointer_flush");
+     444                 :             : 
+     445                 :             :           /* If the timeout elapses, a "singlehold" packet will be sent */
+     446                 :           0 :           self->pointer_longpress_id =
+     447                 :           0 :             g_timeout_add (self->long_press_time,
+     448                 :             :                            valent_mousepad_device_pointer_longpress,
+     449                 :             :                            self);
+     450                 :           0 :             g_source_set_name_by_id (self->pointer_longpress_id,
+     451                 :             :                                      "valent_mousepad_device_pointer_longpress");
+     452                 :             :         }
+     453                 :             :     }
+     454                 :             :   else
+     455                 :             :     {
+     456                 :           0 :       valent_mousepad_device_pointer_flush (self);
+     457                 :             :     }
+     458                 :           0 : }
+     459                 :             : 
+     460                 :             : static void
+     461                 :           0 : valent_mousepad_device_pointer_motion (ValentInputAdapter *adapter,
+     462                 :             :                                        double              dx,
+     463                 :             :                                        double              dy)
+     464                 :             : {
+     465                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (adapter);
+     466                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     467         [ #  # ]:           0 :   g_autoptr (JsonNode) packet = NULL;
+     468                 :             : 
+     469         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_DEVICE (self));
+     470                 :             : 
+     471                 :           0 :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     472                 :           0 :   json_builder_set_member_name (builder, "dx");
+     473                 :           0 :   json_builder_add_double_value (builder, dx);
+     474                 :           0 :   json_builder_set_member_name (builder, "dy");
+     475                 :           0 :   json_builder_add_double_value (builder, dy);
+     476                 :           0 :   packet = valent_packet_end (&builder);
+     477                 :             : 
+     478                 :           0 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     479         [ #  # ]:           0 :   valent_mousepad_device_pointer_reset (self);
+     480                 :           0 : }
+     481                 :             : 
+     482                 :             : #if 0
+     483                 :             : static void
+     484                 :             : valent_mousepad_device_pointer_release (ValentInputRemote *self)
+     485                 :             : {
+     486                 :             :   g_autoptr (JsonBuilder) builder = NULL;
+     487                 :             :   g_autoptr (JsonNode) packet = NULL;
+     488                 :             : 
+     489                 :             :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     490                 :             :   json_builder_set_member_name (builder, "singlerelease");
+     491                 :             :   json_builder_add_boolean_value (builder, TRUE);
+     492                 :             :   packet = valent_packet_end (&builder);
+     493                 :             : 
+     494                 :             :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     495                 :             : }
+     496                 :             : #endif
+     497                 :             : 
+     498                 :             : /*
+     499                 :             :  * ValentObject
+     500                 :             :  */
+     501                 :             : static void
+     502                 :           2 : valent_mousepad_device_destroy (ValentObject *object)
+     503                 :             : {
+     504                 :           2 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (object);
+     505                 :             : 
+     506         [ -  + ]:           2 :   if (self->settings != NULL)
+     507                 :             :     {
+     508                 :           0 :       g_signal_handlers_disconnect_by_data (self->settings, self);
+     509                 :           0 :       self->settings = NULL;
+     510                 :             :     }
+     511                 :             : 
+     512                 :           2 :   valent_mousepad_device_keyboard_reset (self);
+     513                 :           2 :   valent_mousepad_device_pointer_reset (self);
+     514                 :             : 
+     515                 :           2 :   VALENT_OBJECT_CLASS (valent_mousepad_device_parent_class)->destroy (object);
+     516                 :           2 : }
+     517                 :             : 
+     518                 :             : /*
+     519                 :             :  * GObject
+     520                 :             :  */
+     521                 :             : static void
+     522                 :           2 : valent_mousepad_device_finalize (GObject *object)
+     523                 :             : {
+     524                 :           2 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (object);
+     525                 :             : 
+     526         [ +  - ]:           2 :   g_clear_object (&self->device);
+     527         [ +  - ]:           2 :   g_clear_pointer (&self->keyboard_keys, g_array_unref);
+     528                 :             : 
+     529                 :           2 :   G_OBJECT_CLASS (valent_mousepad_device_parent_class)->finalize (object);
+     530                 :           2 : }
+     531                 :             : 
+     532                 :             : static void
+     533                 :           0 : valent_mousepad_device_get_property (GObject    *object,
+     534                 :             :                                      guint       prop_id,
+     535                 :             :                                      GValue     *value,
+     536                 :             :                                      GParamSpec *pspec)
+     537                 :             : {
+     538                 :           0 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (object);
+     539                 :             : 
+     540         [ #  # ]:           0 :   switch (prop_id)
+     541                 :             :     {
+     542                 :           0 :     case PROP_DEVICE:
+     543                 :           0 :       g_value_set_object (value, self->device);
+     544                 :           0 :       break;
+     545                 :             : 
+     546                 :           0 :     default:
+     547                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     548                 :             :     }
+     549                 :           0 : }
+     550                 :             : 
+     551                 :             : static void
+     552                 :           2 : valent_mousepad_device_set_property (GObject      *object,
+     553                 :             :                                      guint         prop_id,
+     554                 :             :                                      const GValue *value,
+     555                 :             :                                      GParamSpec   *pspec)
+     556                 :             : {
+     557                 :           2 :   ValentMousepadDevice *self = VALENT_MOUSEPAD_DEVICE (object);
+     558                 :             : 
+     559         [ +  - ]:           2 :   switch (prop_id)
+     560                 :             :     {
+     561                 :           2 :     case PROP_DEVICE:
+     562                 :           2 :       self->device = g_value_dup_object (value);
+     563                 :           2 :       break;
+     564                 :             : 
+     565                 :           0 :     default:
+     566                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     567                 :             :     }
+     568                 :           2 : }
+     569                 :             : 
+     570                 :             : static void
+     571                 :           1 : valent_mousepad_device_class_init (ValentMousepadDeviceClass *klass)
+     572                 :             : {
+     573                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     574                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     575                 :           1 :   ValentInputAdapterClass *input_class = VALENT_INPUT_ADAPTER_CLASS (klass);
+     576                 :           1 :   object_class->finalize = valent_mousepad_device_finalize;
+     577                 :           1 :   object_class->get_property = valent_mousepad_device_get_property;
+     578                 :           1 :   object_class->set_property = valent_mousepad_device_set_property;
+     579                 :             : 
+     580                 :           1 :   vobject_class->destroy = valent_mousepad_device_destroy;
+     581                 :             : 
+     582                 :           1 :   input_class->keyboard_keysym = valent_mousepad_device_keyboard_keysym;
+     583                 :           1 :   input_class->pointer_axis = valent_mousepad_device_pointer_axis;
+     584                 :           1 :   input_class->pointer_button = valent_mousepad_device_pointer_button;
+     585                 :           1 :   input_class->pointer_motion = valent_mousepad_device_pointer_motion;
+     586                 :             : 
+     587                 :             :   /**
+     588                 :             :    * ValentMousepadDevice:device:
+     589                 :             :    *
+     590                 :             :    * The [class@Valent.Device] this controller is for.
+     591                 :             :    */
+     592                 :           2 :   properties [PROP_DEVICE] =
+     593                 :           1 :     g_param_spec_object ("device", NULL, NULL,
+     594                 :             :                          VALENT_TYPE_DEVICE,
+     595                 :             :                          (G_PARAM_READWRITE |
+     596                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     597                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     598                 :             :                           G_PARAM_STATIC_STRINGS));
+     599                 :             : 
+     600                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     601                 :           1 : }
+     602                 :             : 
+     603                 :             : static void
+     604                 :           2 : valent_mousepad_device_init (ValentMousepadDevice *self)
+     605                 :             : {
+     606                 :           2 :   self->keyboard_keys = g_array_new (FALSE, FALSE, sizeof (uint32_t));
+     607                 :           2 :   self->double_click_time = DEFAULT_DOUBLE_CLICK_TIME;
+     608                 :           2 :   self->long_press_time = DEFAULT_LONG_PRESS_TIME;
+     609                 :             : 
+     610         [ -  + ]:           2 :   if (gtk_is_initialized ())
+     611                 :             :     {
+     612                 :           0 :       self->settings = gtk_settings_get_default ();
+     613                 :           0 :       g_signal_connect_object (self->settings,
+     614                 :             :                                "notify::gtk-double-click-time",
+     615                 :             :                                G_CALLBACK (on_pointer_settings_changed),
+     616                 :             :                                self, 0);
+     617                 :           0 :       on_pointer_settings_changed (self->settings, NULL, self);
+     618                 :             :     }
+     619                 :           2 : }
+     620                 :             : 
+     621                 :             : /**
+     622                 :             :  * valent_mousepad_device_new:
+     623                 :             :  * @device: a `ValentDevice`
+     624                 :             :  *
+     625                 :             :  * Get the `ValentMousepadDevice` instance.
+     626                 :             :  *
+     627                 :             :  * Returns: (transfer full) (nullable): a `ValentMousepadDevice`
+     628                 :             :  */
+     629                 :             : ValentMousepadDevice *
+     630                 :           0 : valent_mousepad_device_new (ValentDevice *device)
+     631                 :             : {
+     632                 :           0 :   return g_object_new (VALENT_TYPE_MOUSEPAD_DEVICE,
+     633                 :             :                        "device", device,
+     634                 :             :                        NULL);
+     635                 :             : }
+     636                 :             : 
+     637                 :             : /**
+     638                 :             :  * valent_media_player_update_packet:
+     639                 :             :  * @player: a `ValentMousepadDevice`
+     640                 :             :  * @packet: a KDE Connect packet
+     641                 :             :  *
+     642                 :             :  * A convenience method for updating the internal state of the player from a
+     643                 :             :  * `kdeconnect.mousepad` packet.
+     644                 :             :  */
+     645                 :             : void
+     646                 :           0 : valent_mousepad_device_handle_packet (ValentMousepadDevice *player,
+     647                 :             :                                       JsonNode             *packet)
+     648                 :             : {
+     649                 :           0 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-device.h.func-c.html b/coverage/src/plugins/mousepad/valent-mousepad-device.h.func-c.html new file mode 100644 index 00000000000..63590492575 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-device.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-device.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MOUSEPAD_DEVICE2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-device.h.func.html b/coverage/src/plugins/mousepad/valent-mousepad-device.h.func.html new file mode 100644 index 00000000000..d834e7185a3 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-device.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-device.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MOUSEPAD_DEVICE2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-device.h.gcov.html b/coverage/src/plugins/mousepad/valent-mousepad-device.h.gcov.html new file mode 100644 index 00000000000..8308fdf224a --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-device.h.gcov.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-device.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MOUSEPAD_DEVICE (valent_mousepad_device_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           2 : G_DECLARE_FINAL_TYPE (ValentMousepadDevice, valent_mousepad_device, VALENT, MOUSEPAD_DEVICE, ValentMediaPlayer)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentMousepadDevice * valent_mousepad_device_new           (ValentDevice         *device);
+      15                 :             : void                   valent_mousepad_device_handle_packet (ValentMousepadDevice *player,
+      16                 :             :                                                              JsonNode             *packet);
+      17                 :             : 
+      18                 :             : G_END_DECLS
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.func-c.html b/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.func-c.html new file mode 100644 index 00000000000..e80c5e0ef88 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-keydef.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-keydef.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:16.1 %6210
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.1 %334
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mousepad_keyval_to_keycode3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.func.html b/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.func.html new file mode 100644 index 00000000000..d889a665643 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-keydef.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-keydef.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:16.1 %6210
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.1 %334
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mousepad_keyval_to_keycode3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.gcov.html b/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.gcov.html new file mode 100644 index 00000000000..b82a8ca80cd --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-keydef.h.gcov.html @@ -0,0 +1,319 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-keydef.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-keydef.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:16.1 %6210
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.1 %334
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gdk/gdk.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : /**
+      11                 :             :  * valent_mousepad_keysym_is_modifier:
+      12                 :             :  * @keysym: a keysym
+      13                 :             :  *
+      14                 :             :  * Check if @keysym is a known keyboard modifier (e.g. Shift).
+      15                 :             :  *
+      16                 :             :  * Returns: %TRUE, or %FALSE if not a modifier
+      17                 :             :  */
+      18                 :             : static inline gboolean
+      19                 :             : valent_mousepad_keysym_is_modifier (uint32_t keysym)
+      20                 :             : {
+      21                 :             :   switch (keysym)
+      22                 :             :     {
+      23                 :             :     /* Supported */
+      24                 :             :     case GDK_KEY_Control_L:
+      25                 :             :     case GDK_KEY_Control_R:
+      26                 :             :     case GDK_KEY_Alt_L:
+      27                 :             :     case GDK_KEY_Alt_R:
+      28                 :             :     case GDK_KEY_Shift_L:
+      29                 :             :     case GDK_KEY_Shift_R:
+      30                 :             :     case GDK_KEY_Super_L:
+      31                 :             :     case GDK_KEY_Super_R:
+      32                 :             : 
+      33                 :             :     /* Unsupported */
+      34                 :             :     case GDK_KEY_Overlay1_Enable:
+      35                 :             :     case GDK_KEY_Overlay2_Enable:
+      36                 :             :     case GDK_KEY_Caps_Lock:
+      37                 :             :     case GDK_KEY_Shift_Lock:
+      38                 :             :     case GDK_KEY_Meta_L:
+      39                 :             :     case GDK_KEY_Meta_R:
+      40                 :             :     case GDK_KEY_Hyper_L:
+      41                 :             :     case GDK_KEY_Hyper_R:
+      42                 :             :     case GDK_KEY_Mode_switch:
+      43                 :             :     case GDK_KEY_ISO_Level3_Shift:
+      44                 :             :     case GDK_KEY_ISO_Level3_Latch:
+      45                 :             :     case GDK_KEY_ISO_Level5_Shift:
+      46                 :             :     case GDK_KEY_ISO_Level5_Latch:
+      47                 :             :       return TRUE;
+      48                 :             :     default:
+      49                 :             :       return FALSE;
+      50                 :             :     }
+      51                 :             : }
+      52                 :             : 
+      53                 :             : /**
+      54                 :             :  * valent_mousepad_keycode_to_keyval:
+      55                 :             :  * @keycode: a special keycode
+      56                 :             :  *
+      57                 :             :  * Convert @keycode from a KDE Connect special key to a GDK keyval.
+      58                 :             :  *
+      59                 :             :  * Returns: a GDK keyval, or `0` if not found
+      60                 :             :  */
+      61                 :             : static inline uint32_t
+      62                 :           1 : valent_mousepad_keycode_to_keyval (uint32_t  keycode)
+      63                 :             : {
+      64                 :           1 :   static const uint32_t keymap[] = {
+      65                 :             :     0,                   // 0 (Invalid)
+      66                 :             :     GDK_KEY_BackSpace,   // 1
+      67                 :             :     GDK_KEY_Tab,         // 2
+      68                 :             :     GDK_KEY_Linefeed,    // 3
+      69                 :             :     GDK_KEY_Left,        // 4
+      70                 :             :     GDK_KEY_Up,          // 5
+      71                 :             :     GDK_KEY_Right,       // 6
+      72                 :             :     GDK_KEY_Down,        // 7
+      73                 :             :     GDK_KEY_Page_Up,     // 8
+      74                 :             :     GDK_KEY_Page_Down,   // 9
+      75                 :             :     GDK_KEY_Home,        // 10
+      76                 :             :     GDK_KEY_End,         // 11
+      77                 :             :     GDK_KEY_Return,      // 12
+      78                 :             :     GDK_KEY_Delete,      // 13
+      79                 :             :     GDK_KEY_Escape,      // 14
+      80                 :             :     GDK_KEY_Sys_Req,     // 15
+      81                 :             :     GDK_KEY_Scroll_Lock, // 16
+      82                 :             :     0,                   // 17 (Reserved)
+      83                 :             :     0,                   // 18 (Reserved)
+      84                 :             :     0,                   // 19 (Reserved)
+      85                 :             :     0,                   // 20 (Reserved)
+      86                 :             :     GDK_KEY_F1,          // 21
+      87                 :             :     GDK_KEY_F2,          // 22
+      88                 :             :     GDK_KEY_F3,          // 23
+      89                 :             :     GDK_KEY_F4,          // 24
+      90                 :             :     GDK_KEY_F5,          // 25
+      91                 :             :     GDK_KEY_F6,          // 26
+      92                 :             :     GDK_KEY_F7,          // 27
+      93                 :             :     GDK_KEY_F8,          // 28
+      94                 :             :     GDK_KEY_F9,          // 29
+      95                 :             :     GDK_KEY_F10,         // 30
+      96                 :             :     GDK_KEY_F11,         // 31
+      97                 :             :     GDK_KEY_F12,         // 32
+      98                 :             :   };
+      99                 :             : 
+     100         [ +  - ]:           1 :   if (keycode >= G_N_ELEMENTS (keymap))
+     101                 :             :     return 0;
+     102                 :             : 
+     103         [ -  + ]:           1 :   return keymap[keycode];
+     104                 :             : }
+     105                 :             : 
+     106                 :             : /**
+     107                 :             :  * valent_mousepad_keyval_to_keycode:
+     108                 :             :  * @keyval: a key value
+     109                 :             :  *
+     110                 :             :  * Convert @keyval from a GDK keyval to a special key for KDE Connect.
+     111                 :             :  *
+     112                 :             :  * Returns: a special key code, or `0` if not found
+     113                 :             :  */
+     114                 :             : static inline uint32_t
+     115                 :           3 : valent_mousepad_keyval_to_keycode (uint32_t keyval)
+     116                 :             : {
+     117   [ -  -  -  -  :           3 :   switch (keyval)
+          -  -  -  -  -  
+          -  -  -  -  -  
+          -  -  -  -  -  
+          -  -  -  -  -  
+             -  -  +  +  
+                      - ]
+     118                 :             :     {
+     119                 :             :     case GDK_KEY_BackSpace:
+     120                 :             :       return 1;
+     121                 :             : 
+     122                 :           0 :     case GDK_KEY_Tab:
+     123                 :             :     case GDK_KEY_KP_Tab:
+     124                 :           0 :       return 2;
+     125                 :             : 
+     126                 :           0 :     case GDK_KEY_Linefeed:
+     127                 :           0 :       return 3;
+     128                 :             : 
+     129                 :           0 :     case GDK_KEY_Left:
+     130                 :             :     case GDK_KEY_KP_Left:
+     131                 :           0 :       return 4;
+     132                 :             : 
+     133                 :           0 :     case GDK_KEY_Up:
+     134                 :             :     case GDK_KEY_KP_Up:
+     135                 :           0 :       return 5;
+     136                 :             : 
+     137                 :           0 :     case GDK_KEY_Right:
+     138                 :             :     case GDK_KEY_KP_Right:
+     139                 :           0 :       return 6;
+     140                 :             : 
+     141                 :           0 :     case GDK_KEY_Down:
+     142                 :             :     case GDK_KEY_KP_Down:
+     143                 :           0 :       return 7;
+     144                 :             : 
+     145                 :           0 :     case GDK_KEY_Page_Up:
+     146                 :             :     case GDK_KEY_KP_Page_Up:
+     147                 :           0 :       return 8;
+     148                 :             : 
+     149                 :           0 :     case GDK_KEY_Page_Down:
+     150                 :             :     case GDK_KEY_KP_Page_Down:
+     151                 :           0 :       return 9;
+     152                 :             : 
+     153                 :           0 :     case GDK_KEY_Home:
+     154                 :             :     case GDK_KEY_KP_Home:
+     155                 :           0 :       return 10;
+     156                 :             : 
+     157                 :           0 :     case GDK_KEY_End:
+     158                 :             :     case GDK_KEY_KP_End:
+     159                 :           0 :       return 11;
+     160                 :             : 
+     161                 :           0 :     case GDK_KEY_Return:
+     162                 :             :     case GDK_KEY_KP_Enter:
+     163                 :             :     case GDK_KEY_ISO_Enter:
+     164                 :           0 :       return 12;
+     165                 :             : 
+     166                 :           0 :     case GDK_KEY_Delete:
+     167                 :             :     case GDK_KEY_KP_Delete:
+     168                 :           0 :       return 13;
+     169                 :             : 
+     170                 :           0 :     case GDK_KEY_Escape:
+     171                 :           0 :       return 14;
+     172                 :             : 
+     173                 :           0 :     case GDK_KEY_Sys_Req:
+     174                 :           0 :       return 15;
+     175                 :             : 
+     176                 :           0 :     case GDK_KEY_Scroll_Lock:
+     177                 :           0 :       return 16;
+     178                 :             : 
+     179                 :           0 :     case GDK_KEY_F1:
+     180                 :           0 :       return 21;
+     181                 :             : 
+     182                 :           0 :     case GDK_KEY_F2:
+     183                 :           0 :       return 22;
+     184                 :             : 
+     185                 :           0 :     case GDK_KEY_F3:
+     186                 :           0 :       return 23;
+     187                 :             : 
+     188                 :           0 :     case GDK_KEY_F4:
+     189                 :           0 :       return 24;
+     190                 :             : 
+     191                 :           0 :     case GDK_KEY_F5:
+     192                 :           0 :       return 25;
+     193                 :             : 
+     194                 :           0 :     case GDK_KEY_F6:
+     195                 :           0 :       return 26;
+     196                 :             : 
+     197                 :           0 :     case GDK_KEY_F7:
+     198                 :           0 :       return 27;
+     199                 :             : 
+     200                 :           0 :     case GDK_KEY_F8:
+     201                 :           0 :       return 28;
+     202                 :             : 
+     203                 :           0 :     case GDK_KEY_F9:
+     204                 :           0 :       return 29;
+     205                 :             : 
+     206                 :           0 :     case GDK_KEY_F10:
+     207                 :           0 :       return 30;
+     208                 :             : 
+     209                 :           0 :     case GDK_KEY_F11:
+     210                 :           0 :       return 31;
+     211                 :             : 
+     212                 :           1 :     case GDK_KEY_F12:
+     213                 :           1 :       return 32;
+     214                 :             : 
+     215                 :           2 :     default:
+     216                 :           2 :       return 0;
+     217                 :             :     }
+     218                 :             : }
+     219                 :             : 
+     220                 :             : G_END_DECLS
+     221                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.func-c.html b/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.func-c.html new file mode 100644 index 00000000000..b4702b6c3f3 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.4 %264228
Test Date:2024-03-31 18:46:36Functions:94.7 %1918
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.2 %182106
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mousepad_plugin_send_echo0
valent_mousepad_plugin_handle_mousepad_echo1
keyboard_mask2
valent_mousepad_plugin_handle_mousepad_keyboardstate2
valent_mousepad_plugin_mousepad_request_pointer2
valent_mousepad_plugin_mousepad_request_keyboard3
event_to_mask4
mousepad_event_action5
valent_mousepad_plugin_constructed5
valent_mousepad_plugin_init5
valent_mousepad_plugin_mousepad_keyboardstate5
valent_mousepad_plugin_destroy10
valent_mousepad_plugin_handle_mousepad_request12
valent_mousepad_plugin_handle_packet15
valent_mousepad_plugin_toggle_actions16
valent_mousepad_plugin_update_state16
valent_mousepad_plugin_get_type80
valent_mousepad_plugin_class_intern_init1
valent_mousepad_plugin_get_type_once1
valent_mousepad_plugin_get_type78
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.func.html b/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.func.html new file mode 100644 index 00000000000..c1a5cb67a3c --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.4 %264228
Test Date:2024-03-31 18:46:36Functions:94.7 %1918
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.2 %182106
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
event_to_mask4
keyboard_mask2
mousepad_event_action5
valent_mousepad_plugin_constructed5
valent_mousepad_plugin_destroy10
valent_mousepad_plugin_get_type80
valent_mousepad_plugin_class_intern_init1
valent_mousepad_plugin_get_type78
valent_mousepad_plugin_get_type_once1
valent_mousepad_plugin_handle_mousepad_echo1
valent_mousepad_plugin_handle_mousepad_keyboardstate2
valent_mousepad_plugin_handle_mousepad_request12
valent_mousepad_plugin_handle_packet15
valent_mousepad_plugin_init5
valent_mousepad_plugin_mousepad_keyboardstate5
valent_mousepad_plugin_mousepad_request_keyboard3
valent_mousepad_plugin_mousepad_request_pointer2
valent_mousepad_plugin_send_echo0
valent_mousepad_plugin_toggle_actions16
valent_mousepad_plugin_update_state16
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.gcov.html b/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.gcov.html new file mode 100644 index 00000000000..d75a1563976 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-plugin.c.gcov.html @@ -0,0 +1,674 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.4 %264228
Test Date:2024-03-31 18:46:36Functions:94.7 %1918
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.2 %182106
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mousepad-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gdk/gdk.h>
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <gtk/gtk.h>
+      12                 :             : #include <json-glib/json-glib.h>
+      13                 :             : #include <valent.h>
+      14                 :             : 
+      15                 :             : #include "valent-mousepad-device.h"
+      16                 :             : #include "valent-mousepad-keydef.h"
+      17                 :             : #include "valent-mousepad-plugin.h"
+      18                 :             : 
+      19                 :             : 
+      20                 :             : struct _ValentMousepadPlugin
+      21                 :             : {
+      22                 :             :   ValentDevicePlugin    parent_instance;
+      23                 :             : 
+      24                 :             :   ValentInput          *input;
+      25                 :             :   ValentMousepadDevice *controller;
+      26                 :             : 
+      27                 :             :   unsigned int          local_state : 1;
+      28                 :             :   unsigned int          remote_state : 1;
+      29                 :             : };
+      30                 :             : 
+      31                 :             : static void   valent_mousepad_plugin_send_echo (ValentMousepadPlugin *self,
+      32                 :             :                                                 JsonNode             *packet);
+      33                 :             : 
+      34   [ +  +  +  - ]:          80 : G_DEFINE_FINAL_TYPE (ValentMousepadPlugin, valent_mousepad_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      35                 :             : 
+      36                 :             : 
+      37                 :             : static GdkModifierType
+      38                 :           4 : event_to_mask (JsonObject *body)
+      39                 :             : {
+      40                 :           4 :   GdkModifierType mask = 0;
+      41                 :             : 
+      42         [ +  + ]:           4 :   if (json_object_get_boolean_member_with_default (body, "alt", FALSE))
+      43                 :           1 :     mask |= GDK_ALT_MASK;
+      44                 :             : 
+      45         [ +  + ]:           4 :   if (json_object_get_boolean_member_with_default (body, "ctrl", FALSE))
+      46                 :           1 :     mask |= GDK_CONTROL_MASK;
+      47                 :             : 
+      48         [ +  + ]:           4 :   if (json_object_get_boolean_member_with_default (body, "shift", FALSE))
+      49                 :           1 :     mask |= GDK_SHIFT_MASK;
+      50                 :             : 
+      51         [ +  + ]:           4 :   if (json_object_get_boolean_member_with_default (body, "super", FALSE))
+      52                 :           1 :     mask |= GDK_SUPER_MASK;
+      53                 :             : 
+      54                 :           4 :   return mask;
+      55                 :             : }
+      56                 :             : 
+      57                 :             : static inline void
+      58                 :           2 : keyboard_mask (ValentInput  *input,
+      59                 :             :                unsigned int  mask,
+      60                 :             :                gboolean      lock)
+      61                 :             : {
+      62         [ +  - ]:           2 :   if (mask & GDK_ALT_MASK)
+      63                 :           2 :     valent_input_keyboard_keysym (input, GDK_KEY_Alt_L, lock);
+      64                 :             : 
+      65         [ +  - ]:           2 :   if (mask & GDK_CONTROL_MASK)
+      66                 :           2 :     valent_input_keyboard_keysym (input, GDK_KEY_Control_L, lock);
+      67                 :             : 
+      68         [ +  - ]:           2 :   if (mask & GDK_SHIFT_MASK)
+      69                 :           2 :     valent_input_keyboard_keysym (input, GDK_KEY_Shift_L, lock);
+      70                 :             : 
+      71         [ +  - ]:           2 :   if (mask & GDK_SUPER_MASK)
+      72                 :           2 :     valent_input_keyboard_keysym (input, GDK_KEY_Super_L, lock);
+      73                 :           2 : }
+      74                 :             : 
+      75                 :             : /*
+      76                 :             :  * Packet Handlers
+      77                 :             :  */
+      78                 :             : static void
+      79                 :          12 : valent_mousepad_plugin_handle_mousepad_request (ValentMousepadPlugin *self,
+      80                 :             :                                                 JsonNode             *packet)
+      81                 :             : {
+      82                 :          12 :   JsonObject *body;
+      83                 :          12 :   const char *key;
+      84                 :          12 :   int64_t keycode;
+      85                 :             : 
+      86         [ +  - ]:          12 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+      87         [ -  + ]:          12 :   g_assert (VALENT_IS_PACKET (packet));
+      88                 :             : 
+      89                 :          12 :   body = valent_packet_get_body (packet);
+      90                 :             : 
+      91                 :             :   /* Pointer movement */
+      92   [ +  +  -  + ]:          12 :   if (json_object_has_member (body, "dx") || json_object_has_member (body, "dy"))
+      93                 :             :     {
+      94                 :           2 :       double dx, dy;
+      95                 :             : 
+      96                 :           2 :       dx = json_object_get_double_member_with_default (body, "dx", 0.0);
+      97                 :           2 :       dy = json_object_get_double_member_with_default (body, "dy", 0.0);
+      98                 :             : 
+      99         [ +  + ]:           2 :       if (valent_packet_check_field (packet, "scroll"))
+     100                 :           1 :         valent_input_pointer_axis (self->input, dx, dy);
+     101                 :             :       else
+     102                 :           1 :         valent_input_pointer_motion (self->input, dx, dy);
+     103                 :             :     }
+     104                 :             : 
+     105                 :             :   /* Keyboard Event */
+     106         [ +  + ]:          10 :   else if (valent_packet_get_string (packet, "key", &key))
+     107                 :             :     {
+     108                 :           3 :       GdkModifierType mask;
+     109                 :           3 :       const char *next;
+     110                 :           3 :       gunichar codepoint;
+     111                 :             : 
+     112                 :             :       /* Lock modifiers */
+     113         [ +  + ]:           3 :       if ((mask = event_to_mask (body)) != 0)
+     114                 :           1 :         keyboard_mask (self->input, mask, TRUE);
+     115                 :             : 
+     116                 :             :       /* Input each keysym */
+     117                 :           3 :       next = key;
+     118                 :             : 
+     119         [ +  + ]:           9 :       while ((codepoint = g_utf8_get_char (next)) != 0)
+     120                 :             :         {
+     121                 :           6 :           uint32_t keysym;
+     122                 :             : 
+     123                 :           6 :           keysym = gdk_unicode_to_keyval (codepoint);
+     124                 :           6 :           valent_input_keyboard_keysym (self->input, keysym, TRUE);
+     125                 :           6 :           valent_input_keyboard_keysym (self->input, keysym, FALSE);
+     126                 :             : 
+     127                 :           6 :           next = g_utf8_next_char (next);
+     128                 :             :         }
+     129                 :             : 
+     130                 :             :       /* Unlock modifiers */
+     131         [ +  + ]:           3 :       if (mask != 0)
+     132                 :           1 :         keyboard_mask (self->input, mask, FALSE);
+     133                 :             : 
+     134                 :             :       /* Send ack, if requested */
+     135         [ -  + ]:           3 :       if (valent_packet_check_field (packet, "sendAck"))
+     136                 :           0 :         valent_mousepad_plugin_send_echo (self, packet);
+     137                 :             :     }
+     138         [ +  + ]:           7 :   else if (valent_packet_get_int (packet, "specialKey", &keycode))
+     139                 :             :     {
+     140                 :           1 :       GdkModifierType mask;
+     141                 :           1 :       uint32_t keyval;
+     142                 :             : 
+     143   [ +  -  -  + ]:           1 :       if ((keyval = valent_mousepad_keycode_to_keyval (keycode)) == 0)
+     144                 :             :         {
+     145                 :           0 :           g_debug ("%s(): expected \"specialKey\" field holding a keycode",
+     146                 :             :                    G_STRFUNC);
+     147                 :           0 :           return;
+     148                 :             :         }
+     149                 :             : 
+     150                 :             :       /* Lock modifiers */
+     151         [ -  + ]:           1 :       if ((mask = event_to_mask (body)) != 0)
+     152                 :           0 :         keyboard_mask (self->input, mask, TRUE);
+     153                 :             : 
+     154                 :             :       /* Input each keysym */
+     155                 :           1 :       valent_input_keyboard_keysym (self->input, keyval, TRUE);
+     156                 :           1 :       valent_input_keyboard_keysym (self->input, keyval, FALSE);
+     157                 :             : 
+     158                 :             :       /* Unlock modifiers */
+     159         [ -  + ]:           1 :       if (mask != 0)
+     160                 :           0 :         keyboard_mask (self->input, mask, FALSE);
+     161                 :             : 
+     162                 :             :       /* Send ack, if requested */
+     163         [ -  + ]:           1 :       if (valent_packet_check_field (packet, "sendAck"))
+     164                 :           0 :         valent_mousepad_plugin_send_echo (self, packet);
+     165                 :             :     }
+     166                 :             : 
+     167         [ +  + ]:           6 :   else if (valent_packet_check_field (packet, "singleclick"))
+     168                 :             :     {
+     169                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, TRUE);
+     170                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, FALSE);
+     171                 :             :     }
+     172                 :             : 
+     173         [ +  + ]:           5 :   else if (valent_packet_check_field (packet, "doubleclick"))
+     174                 :             :     {
+     175                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, TRUE);
+     176                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, FALSE);
+     177                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, TRUE);
+     178                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, FALSE);
+     179                 :             :     }
+     180                 :             : 
+     181         [ +  + ]:           4 :   else if (valent_packet_check_field (packet, "middleclick"))
+     182                 :             :     {
+     183                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_MIDDLE, TRUE);
+     184                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_MIDDLE, FALSE);
+     185                 :             :     }
+     186                 :             : 
+     187         [ +  + ]:           3 :   else if (valent_packet_check_field (packet, "rightclick"))
+     188                 :             :     {
+     189                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_SECONDARY, TRUE);
+     190                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_SECONDARY, FALSE);
+     191                 :             :     }
+     192                 :             : 
+     193         [ +  + ]:           2 :   else if (valent_packet_check_field (packet, "singlehold"))
+     194                 :             :     {
+     195                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, TRUE);
+     196                 :             :     }
+     197                 :             : 
+     198                 :             :   /* Not used by kdeconnect-android, hold is released with a regular click */
+     199         [ +  - ]:           1 :   else if (valent_packet_check_field (packet, "singlerelease"))
+     200                 :             :     {
+     201                 :           1 :       valent_input_pointer_button (self->input, VALENT_POINTER_PRIMARY, FALSE);
+     202                 :             :     }
+     203                 :             : 
+     204                 :             :   else
+     205                 :             :     {
+     206                 :           0 :       g_debug ("%s: unknown input", G_STRFUNC);
+     207                 :             :     }
+     208                 :             : }
+     209                 :             : 
+     210                 :             : static void
+     211                 :           1 : valent_mousepad_plugin_handle_mousepad_echo (ValentMousepadPlugin *self,
+     212                 :             :                                              JsonNode             *packet)
+     213                 :             : {
+     214         [ +  - ]:           1 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     215         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+     216                 :             : 
+     217                 :           1 :   VALENT_NOTE ("Not implemented");
+     218                 :           1 : }
+     219                 :             : 
+     220                 :             : static void
+     221                 :           2 : valent_mousepad_plugin_handle_mousepad_keyboardstate (ValentMousepadPlugin *self,
+     222                 :             :                                                       JsonNode             *packet)
+     223                 :             : {
+     224                 :           2 :   gboolean state;
+     225                 :             : 
+     226         [ +  - ]:           2 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     227         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     228                 :             : 
+     229                 :             :   /* Update the remote keyboard state */
+     230         [ -  + ]:           2 :   if (!valent_packet_get_boolean (packet, "state", &state))
+     231                 :             :     {
+     232                 :           0 :       g_debug ("%s(): expected \"state\" field holding a boolean",
+     233                 :             :                G_STRFUNC);
+     234                 :           0 :       return;
+     235                 :             :     }
+     236                 :             : 
+     237         [ +  - ]:           2 :   if (self->remote_state != state)
+     238                 :             :     {
+     239                 :           2 :       GAction *action;
+     240                 :             : 
+     241                 :           2 :       self->remote_state = state;
+     242                 :           2 :       action = g_action_map_lookup_action (G_ACTION_MAP (self), "event");
+     243                 :           2 :       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), self->remote_state);
+     244                 :             : 
+     245   [ +  -  +  - ]:           2 :       if (self->remote_state && self->controller == NULL)
+     246                 :           2 :         {
+     247                 :           2 :           ValentDevice *device = NULL;
+     248                 :             : 
+     249                 :           2 :           device = valent_extension_get_object (VALENT_EXTENSION (self));
+     250                 :           2 :           self->controller = g_object_new (VALENT_TYPE_MOUSEPAD_DEVICE,
+     251                 :             :                                            "device", device,
+     252                 :             :                                            "object", device,
+     253                 :             :                                            NULL);
+     254                 :           2 :           valent_input_export_adapter (self->input,
+     255                 :             :                                        VALENT_INPUT_ADAPTER (self->controller));
+     256                 :             :         }
+     257   [ #  #  #  # ]:           0 :       else if (!self->remote_state && self->controller != NULL)
+     258                 :             :         {
+     259                 :           0 :           valent_input_unexport_adapter (self->input,
+     260                 :             :                                          VALENT_INPUT_ADAPTER (self->controller));
+     261         [ -  - ]:           2 :           g_clear_object (&self->controller);
+     262                 :             :         }
+     263                 :             :     }
+     264                 :             : }
+     265                 :             : 
+     266                 :             : /*
+     267                 :             :  * Packet Providers
+     268                 :             :  */
+     269                 :             : static void
+     270                 :           3 : valent_mousepad_plugin_mousepad_request_keyboard (ValentMousepadPlugin *self,
+     271                 :             :                                                   uint32_t              keyval,
+     272                 :             :                                                   GdkModifierType       mask)
+     273                 :             : {
+     274                 :           3 :   g_autoptr (JsonBuilder) builder = NULL;
+     275   [ -  -  -  + ]:           3 :   g_autoptr (JsonNode) packet = NULL;
+     276                 :           3 :   uint32_t special_key = 0;
+     277                 :             : 
+     278         [ +  - ]:           3 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     279                 :             : 
+     280                 :           3 :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     281                 :             : 
+     282         [ +  + ]:           3 :   if ((special_key = valent_mousepad_keyval_to_keycode (keyval)) != 0)
+     283                 :             :     {
+     284                 :           1 :       json_builder_set_member_name (builder, "specialKey");
+     285                 :           1 :       json_builder_add_int_value (builder, special_key);
+     286                 :             :     }
+     287                 :             :   else
+     288                 :             :     {
+     289         [ -  - ]:           2 :       g_autoptr (GError) error = NULL;
+     290   [ -  -  -  + ]:           2 :       g_autofree char *key = NULL;
+     291                 :           2 :       gunichar wc;
+     292                 :             : 
+     293                 :           2 :       wc = gdk_keyval_to_unicode (keyval);
+     294                 :           2 :       key = g_ucs4_to_utf8 (&wc, 1, NULL, NULL, &error);
+     295                 :             : 
+     296         [ -  + ]:           2 :       if (key == NULL)
+     297                 :             :         {
+     298                 :           0 :           g_warning ("Converting %s to string: %s",
+     299                 :             :                      gdk_keyval_name (keyval),
+     300                 :             :                      error->message);
+     301                 :           0 :           return;
+     302                 :             :         }
+     303                 :             : 
+     304                 :           2 :       json_builder_set_member_name (builder, "key");
+     305                 :           2 :       json_builder_add_string_value (builder, key);
+     306                 :             :     }
+     307                 :             : 
+     308         [ +  + ]:           3 :   if (mask & GDK_ALT_MASK)
+     309                 :             :     {
+     310                 :           1 :       json_builder_set_member_name (builder, "alt");
+     311                 :           1 :       json_builder_add_boolean_value (builder, TRUE);
+     312                 :             :     }
+     313                 :             : 
+     314         [ +  + ]:           3 :   if (mask & GDK_CONTROL_MASK)
+     315                 :             :     {
+     316                 :           1 :       json_builder_set_member_name (builder, "ctrl");
+     317                 :           1 :       json_builder_add_boolean_value (builder, TRUE);
+     318                 :             :     }
+     319                 :             : 
+     320         [ +  + ]:           3 :   if (mask & GDK_SHIFT_MASK)
+     321                 :             :     {
+     322                 :           1 :       json_builder_set_member_name (builder, "shift");
+     323                 :           1 :       json_builder_add_boolean_value (builder, TRUE);
+     324                 :             :     }
+     325                 :             : 
+     326         [ +  + ]:           3 :   if (mask & GDK_SUPER_MASK)
+     327                 :             :     {
+     328                 :           1 :       json_builder_set_member_name (builder, "super");
+     329                 :           1 :       json_builder_add_boolean_value (builder, TRUE);
+     330                 :             :     }
+     331                 :             : 
+     332                 :           3 :   packet = valent_packet_end (&builder);
+     333                 :             : 
+     334         [ +  - ]:           3 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     335                 :             : }
+     336                 :             : 
+     337                 :             : static void
+     338                 :           2 : valent_mousepad_plugin_mousepad_request_pointer (ValentMousepadPlugin *self,
+     339                 :             :                                                  double                dx,
+     340                 :             :                                                  double                dy,
+     341                 :             :                                                  gboolean              axis)
+     342                 :             : {
+     343                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+     344         [ -  + ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+     345                 :             : 
+     346         [ +  - ]:           2 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     347                 :             : 
+     348                 :           2 :   valent_packet_init (&builder, "kdeconnect.mousepad.request");
+     349                 :             : 
+     350                 :           2 :   json_builder_set_member_name (builder, "dx");
+     351                 :           2 :   json_builder_add_double_value (builder, dx);
+     352                 :           2 :   json_builder_set_member_name (builder, "dy");
+     353                 :           2 :   json_builder_add_double_value (builder, dy);
+     354                 :             : 
+     355         [ +  + ]:           2 :   if (axis)
+     356                 :             :     {
+     357                 :           1 :       json_builder_set_member_name (builder, "scroll");
+     358                 :           1 :       json_builder_add_boolean_value (builder, TRUE);
+     359                 :             :     }
+     360                 :             : 
+     361                 :           2 :   packet = valent_packet_end (&builder);
+     362                 :             : 
+     363         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     364                 :           2 : }
+     365                 :             : 
+     366                 :             : static void
+     367                 :           0 : valent_mousepad_plugin_send_echo (ValentMousepadPlugin *self,
+     368                 :             :                                   JsonNode             *packet)
+     369                 :             : {
+     370                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     371         [ #  # ]:           0 :   g_autoptr (JsonNode) response = NULL;
+     372                 :           0 :   JsonObjectIter iter;
+     373                 :           0 :   const char *name;
+     374                 :           0 :   JsonNode *node;
+     375                 :             : 
+     376         [ #  # ]:           0 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     377                 :             : 
+     378                 :           0 :   valent_packet_init (&builder, "kdeconnect.mousepad.echo");
+     379                 :             : 
+     380                 :           0 :   json_object_iter_init (&iter, valent_packet_get_body (packet));
+     381                 :             : 
+     382         [ #  # ]:           0 :   while (json_object_iter_next (&iter, &name, &node))
+     383                 :             :     {
+     384         [ #  # ]:           0 :       if (g_strcmp0 (name, "sendAck") == 0)
+     385                 :           0 :         continue;
+     386                 :             : 
+     387                 :           0 :       json_builder_set_member_name (builder, name);
+     388                 :           0 :       json_builder_add_value (builder, json_node_ref (node));
+     389                 :             :     }
+     390                 :             : 
+     391                 :           0 :   json_builder_set_member_name (builder, "isAck");
+     392                 :           0 :   json_builder_add_boolean_value (builder, TRUE);
+     393                 :             : 
+     394                 :           0 :   response = valent_packet_end (&builder);
+     395                 :             : 
+     396         [ #  # ]:           0 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), response);
+     397                 :           0 : }
+     398                 :             : 
+     399                 :             : static void
+     400                 :           5 : valent_mousepad_plugin_mousepad_keyboardstate (ValentMousepadPlugin *self)
+     401                 :             : {
+     402                 :           5 :   g_autoptr (JsonBuilder) builder = NULL;
+     403   [ -  -  -  + ]:           5 :   g_autoptr (JsonNode) packet = NULL;
+     404                 :             : 
+     405   [ +  -  -  - ]:           5 :   g_return_if_fail (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     406                 :             : 
+     407                 :           5 :   valent_packet_init (&builder, "kdeconnect.mousepad.keyboardstate");
+     408                 :           5 :   json_builder_set_member_name (builder, "state");
+     409                 :           5 :   json_builder_add_boolean_value (builder, TRUE);
+     410                 :           5 :   packet = valent_packet_end (&builder);
+     411                 :             : 
+     412         [ +  - ]:           5 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     413                 :             : }
+     414                 :             : 
+     415                 :             : /*
+     416                 :             :  * GActions
+     417                 :             :  */
+     418                 :             : static void
+     419                 :          16 : valent_mousepad_plugin_toggle_actions (ValentMousepadPlugin *self,
+     420                 :             :                                        gboolean              available)
+     421                 :             : {
+     422                 :          16 :   GAction *action;
+     423                 :             : 
+     424         [ +  - ]:          16 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     425                 :             : 
+     426                 :          16 :   action = g_action_map_lookup_action (G_ACTION_MAP (self), "event");
+     427         [ +  + ]:          32 :   g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+     428         [ +  - ]:           5 :                                available && self->remote_state);
+     429                 :          16 : }
+     430                 :             : 
+     431                 :             : static void
+     432                 :           5 : mousepad_event_action (GSimpleAction *action,
+     433                 :             :                        GVariant      *parameter,
+     434                 :             :                        gpointer       user_data)
+     435                 :             : {
+     436                 :           5 :   ValentMousepadPlugin *self = VALENT_MOUSEPAD_PLUGIN (user_data);
+     437                 :           5 :   GVariantDict dict;
+     438                 :           5 :   double dx, dy;
+     439                 :           5 :   uint32_t keysym;
+     440                 :             : 
+     441         [ +  - ]:           5 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     442         [ -  + ]:           5 :   g_return_if_fail (self->remote_state);
+     443                 :             : 
+     444                 :           5 :   g_variant_dict_init (&dict, parameter);
+     445                 :             : 
+     446   [ +  +  +  - ]:           7 :   if (g_variant_dict_lookup (&dict, "dx", "d", &dx) &&
+     447                 :           2 :       g_variant_dict_lookup (&dict, "dy", "d", &dy))
+     448                 :           2 :     {
+     449                 :           2 :       gboolean scroll = FALSE;
+     450                 :             : 
+     451                 :           2 :       g_variant_dict_lookup (&dict, "scroll", "b", &scroll);
+     452                 :           2 :       valent_mousepad_plugin_mousepad_request_pointer (self, dx, dy, scroll);
+     453                 :             :     }
+     454         [ +  - ]:           3 :   else if (g_variant_dict_lookup (&dict, "keysym", "u", &keysym))
+     455                 :             :     {
+     456                 :           3 :       GdkModifierType mask = 0;
+     457                 :             : 
+     458                 :           3 :       g_variant_dict_lookup (&dict, "mask", "u", &mask);
+     459                 :           3 :       valent_mousepad_plugin_mousepad_request_keyboard (self, keysym, mask);
+     460                 :             :     }
+     461                 :             :   else
+     462                 :           0 :     g_warning ("%s(): unknown event type", G_STRFUNC);
+     463                 :             : 
+     464                 :           5 :   g_variant_dict_clear (&dict);
+     465                 :             : }
+     466                 :             : 
+     467                 :             : static const GActionEntry actions[] = {
+     468                 :             :   {"event",  mousepad_event_action,  "a{sv}", NULL, NULL}
+     469                 :             : };
+     470                 :             : 
+     471                 :             : /*
+     472                 :             :  * ValentDevicePlugin
+     473                 :             :  */
+     474                 :             : static void
+     475                 :          16 : valent_mousepad_plugin_update_state (ValentDevicePlugin *plugin,
+     476                 :             :                                      ValentDeviceState   state)
+     477                 :             : {
+     478                 :          16 :   ValentMousepadPlugin *self = VALENT_MOUSEPAD_PLUGIN (plugin);
+     479                 :          16 :   gboolean available;
+     480                 :             : 
+     481         [ +  - ]:          16 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     482                 :             : 
+     483                 :          16 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     484                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     485                 :             : 
+     486         [ +  + ]:          16 :   if (available)
+     487                 :           5 :     valent_mousepad_plugin_mousepad_keyboardstate (self);
+     488                 :             :   else
+     489                 :          11 :     self->remote_state = FALSE;
+     490                 :             : 
+     491   [ +  -  +  + ]:          16 :   if (!self->remote_state && self->controller != NULL)
+     492                 :             :     {
+     493                 :           2 :       valent_input_unexport_adapter (self->input,
+     494                 :             :                                      VALENT_INPUT_ADAPTER (self->controller));
+     495         [ +  - ]:           2 :       g_clear_object (&self->controller);
+     496                 :             :     }
+     497                 :             : 
+     498                 :          16 :   valent_mousepad_plugin_toggle_actions (self, available);
+     499                 :          16 : }
+     500                 :             : 
+     501                 :             : static void
+     502                 :          15 : valent_mousepad_plugin_handle_packet (ValentDevicePlugin *plugin,
+     503                 :             :                                       const char         *type,
+     504                 :             :                                       JsonNode           *packet)
+     505                 :             : {
+     506                 :          15 :   ValentMousepadPlugin *self = VALENT_MOUSEPAD_PLUGIN (plugin);
+     507                 :             : 
+     508         [ +  - ]:          15 :   g_assert (VALENT_IS_MOUSEPAD_PLUGIN (self));
+     509         [ -  + ]:          15 :   g_assert (type != NULL);
+     510         [ -  + ]:          15 :   g_assert (VALENT_IS_PACKET (packet));
+     511                 :             : 
+     512                 :             :   /* A request to simulate input */
+     513         [ +  + ]:          15 :   if (g_str_equal (type, "kdeconnect.mousepad.request"))
+     514                 :          12 :     valent_mousepad_plugin_handle_mousepad_request (self, packet);
+     515                 :             : 
+     516                 :             :   /* A confirmation of input we requested */
+     517         [ +  + ]:           3 :   else if (g_str_equal (type, "kdeconnect.mousepad.echo"))
+     518                 :           1 :     valent_mousepad_plugin_handle_mousepad_echo (self, packet);
+     519                 :             : 
+     520                 :             :   /* The remote keyboard is ready/not ready for input */
+     521         [ +  - ]:           2 :   else if (g_str_equal (type, "kdeconnect.mousepad.keyboardstate"))
+     522                 :           2 :     valent_mousepad_plugin_handle_mousepad_keyboardstate (self, packet);
+     523                 :             : 
+     524                 :             :   else
+     525                 :           0 :     g_assert_not_reached ();
+     526                 :          15 : }
+     527                 :             : 
+     528                 :             : /*
+     529                 :             :  * ValentObject
+     530                 :             :  */
+     531                 :             : static void
+     532                 :          10 : valent_mousepad_plugin_destroy (ValentObject *object)
+     533                 :             : {
+     534                 :          10 :   ValentMousepadPlugin *self = VALENT_MOUSEPAD_PLUGIN (object);
+     535                 :             : 
+     536         [ -  + ]:          10 :   if (self->controller != NULL)
+     537                 :             :     {
+     538                 :           0 :       valent_input_unexport_adapter (valent_input_get_default (),
+     539                 :             :                                      VALENT_INPUT_ADAPTER (self->controller));
+     540         [ #  # ]:           0 :       g_clear_object (&self->controller);
+     541                 :             :     }
+     542                 :             : 
+     543                 :          10 :   VALENT_OBJECT_CLASS (valent_mousepad_plugin_parent_class)->destroy (object);
+     544                 :          10 : }
+     545                 :             : 
+     546                 :             : /*
+     547                 :             :  * GObject
+     548                 :             :  */
+     549                 :             : static void
+     550                 :           5 : valent_mousepad_plugin_constructed (GObject *object)
+     551                 :             : {
+     552                 :           5 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     553                 :             : 
+     554                 :           5 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     555                 :             :                                    actions,
+     556                 :             :                                    G_N_ELEMENTS (actions),
+     557                 :             :                                    plugin);
+     558                 :             : 
+     559                 :           5 :   G_OBJECT_CLASS (valent_mousepad_plugin_parent_class)->constructed (object);
+     560                 :           5 : }
+     561                 :             : 
+     562                 :             : static void
+     563                 :           1 : valent_mousepad_plugin_class_init (ValentMousepadPluginClass *klass)
+     564                 :             : {
+     565                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     566                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     567                 :           1 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     568                 :             : 
+     569                 :           1 :   object_class->constructed = valent_mousepad_plugin_constructed;
+     570                 :             : 
+     571                 :           1 :   vobject_class->destroy = valent_mousepad_plugin_destroy;
+     572                 :             : 
+     573                 :           1 :   plugin_class->handle_packet = valent_mousepad_plugin_handle_packet;
+     574                 :           1 :   plugin_class->update_state = valent_mousepad_plugin_update_state;
+     575                 :             : }
+     576                 :             : 
+     577                 :             : static void
+     578                 :           5 : valent_mousepad_plugin_init (ValentMousepadPlugin *self)
+     579                 :             : {
+     580                 :           5 :   self->input = valent_input_get_default ();
+     581                 :           5 : }
+     582                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.func-c.html b/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.func-c.html new file mode 100644 index 00000000000..68128302c1f --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MOUSEPAD_PLUGIN77
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.func.html b/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.func.html new file mode 100644 index 00000000000..f634c4a3db5 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MOUSEPAD_PLUGIN77
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.gcov.html b/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.gcov.html new file mode 100644 index 00000000000..d8a08e421c7 --- /dev/null +++ b/coverage/src/plugins/mousepad/valent-mousepad-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mousepad/valent-mousepad-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mousepad - valent-mousepad-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MOUSEPAD_PLUGIN (valent_mousepad_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          77 : G_DECLARE_FINAL_TYPE (ValentMousepadPlugin, valent_mousepad_plugin, VALENT, MOUSEPAD_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-detail-sort-b.html b/coverage/src/plugins/mpris/index-detail-sort-b.html new file mode 100644 index 00000000000..3f376475421 --- /dev/null +++ b/coverage/src/plugins/mpris/index-detail-sort-b.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-detail-sort-f.html b/coverage/src/plugins/mpris/index-detail-sort-f.html new file mode 100644 index 00000000000..412c80c85c1 --- /dev/null +++ b/coverage/src/plugins/mpris/index-detail-sort-f.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-detail-sort-l.html b/coverage/src/plugins/mpris/index-detail-sort-l.html new file mode 100644 index 00000000000..02c9471ca9d --- /dev/null +++ b/coverage/src/plugins/mpris/index-detail-sort-l.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-detail.html b/coverage/src/plugins/mpris/index-detail.html new file mode 100644 index 00000000000..8f517c75ccf --- /dev/null +++ b/coverage/src/plugins/mpris/index-detail.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-sort-b.html b/coverage/src/plugins/mpris/index-sort-b.html new file mode 100644 index 00000000000..3f376475421 --- /dev/null +++ b/coverage/src/plugins/mpris/index-sort-b.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-sort-f.html b/coverage/src/plugins/mpris/index-sort-f.html new file mode 100644 index 00000000000..412c80c85c1 --- /dev/null +++ b/coverage/src/plugins/mpris/index-sort-f.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index-sort-l.html b/coverage/src/plugins/mpris/index-sort-l.html new file mode 100644 index 00000000000..02c9471ca9d --- /dev/null +++ b/coverage/src/plugins/mpris/index-sort-l.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/index.html b/coverage/src/plugins/mpris/index.html new file mode 100644 index 00000000000..8f517c75ccf --- /dev/null +++ b/coverage/src/plugins/mpris/index.html @@ -0,0 +1,293 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mprisCoverageTotalHit
Test:Code CoverageLines:89.4 %16761498
Test Date:2024-03-31 18:46:36Functions:97.5 %157153
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:55.2 %1080596
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
mpris-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-mpris-adapter.c +
68.6%68.6%
+
68.6 %18812933.3 %1505093.3 %1514
valent-mpris-adapter.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-device.c +
92.5%92.5%
+
92.5 %34832255.3 %1709497.4 %3837
valent-mpris-device.h +
100.0%
+
100.0 %1175.0 %86100.0 %11
valent-mpris-impl.c +
89.2%89.2%
+
89.2 %36232362.1 %26416496.0 %2524
valent-mpris-impl.h +
100.0%
+
100.0 %1158.3 %127100.0 %11
valent-mpris-player.c +
90.7%90.7%
+
90.7 %28125556.5 %1387897.1 %3534
valent-mpris-player.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-plugin.c +
93.8%93.8%
+
93.8 %44942156.6 %288163100.0 %3030
valent-mpris-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-mpris-utils.c +
100.0%
+
100.0 %393978.1 %3225100.0 %88
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/mpris-plugin.c.func-c.html b/coverage/src/plugins/mpris/mpris-plugin.c.func-c.html new file mode 100644 index 00000000000..2aef2751d86 --- /dev/null +++ b/coverage/src/plugins/mpris/mpris-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/mpris-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - mpris-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mpris_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/mpris-plugin.c.func.html b/coverage/src/plugins/mpris/mpris-plugin.c.func.html new file mode 100644 index 00000000000..c5ade1dee33 --- /dev/null +++ b/coverage/src/plugins/mpris/mpris-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/mpris-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - mpris-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mpris_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/mpris-plugin.c.gcov.html b/coverage/src/plugins/mpris/mpris-plugin.c.gcov.html new file mode 100644 index 00000000000..b693e529a65 --- /dev/null +++ b/coverage/src/plugins/mpris/mpris-plugin.c.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/mpris-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - mpris-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-mpris-adapter.h"
+      10                 :             : #include "valent-mpris-plugin.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_mpris_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_MPRIS_PLUGIN);
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_MEDIA_ADAPTER,
+      21                 :             :                                               VALENT_TYPE_MPRIS_ADAPTER);
+      22                 :           2 : }
+      23                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-adapter.c.func-c.html b/coverage/src/plugins/mpris/valent-mpris-adapter.c.func-c.html new file mode 100644 index 00000000000..e4ad16ba54f --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-adapter.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:68.6 %188129
Test Date:2024-03-31 18:46:36Functions:93.3 %1514
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:33.3 %15050
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_player_state_changed0
valent_mpris_adapter_export1
valent_mpris_adapter_unexport1
valent_mpris_impl_export_full_cb1
g_async_initable_iface_init2
g_async_initable_new_async_cb4
valent_mpris_adapter_destroy5
valent_mpris_adapter_finalize5
list_names_cb6
valent_mpris_adapter_init6
valent_mpris_adapter_init_async6
on_name_owner_changed10
valent_mpris_adapter_get_type17
valent_mpris_adapter_class_intern_init2
valent_mpris_adapter_get_type_once2
valent_mpris_adapter_get_type13
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-adapter.c.func.html b/coverage/src/plugins/mpris/valent-mpris-adapter.c.func.html new file mode 100644 index 00000000000..dde28c8e241 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-adapter.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-adapter.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:68.6 %188129
Test Date:2024-03-31 18:46:36Functions:93.3 %1514
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:33.3 %15050
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init2
g_async_initable_new_async_cb4
list_names_cb6
on_name_owner_changed10
on_player_state_changed0
valent_mpris_adapter_destroy5
valent_mpris_adapter_export1
valent_mpris_adapter_finalize5
valent_mpris_adapter_get_type17
valent_mpris_adapter_class_intern_init2
valent_mpris_adapter_get_type13
valent_mpris_adapter_get_type_once2
valent_mpris_adapter_init6
valent_mpris_adapter_init_async6
valent_mpris_adapter_unexport1
valent_mpris_impl_export_full_cb1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-adapter.c.gcov.html b/coverage/src/plugins/mpris/valent-mpris-adapter.c.gcov.html new file mode 100644 index 00000000000..0d09cf54dfc --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-adapter.c.gcov.html @@ -0,0 +1,585 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-adapter.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-adapter.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:68.6 %188129
Test Date:2024-03-31 18:46:36Functions:93.3 %1514
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:33.3 %15050
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mpris-adapter"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libportal/portal.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-mpris-adapter.h"
+      12                 :             : #include "valent-mpris-impl.h"
+      13                 :             : #include "valent-mpris-player.h"
+      14                 :             : #include "valent-mpris-utils.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentMPRISAdapter
+      18                 :             : {
+      19                 :             :   ValentMediaAdapter  parent_instance;
+      20                 :             : 
+      21                 :             :   GDBusConnection    *connection;
+      22                 :             :   unsigned int        name_owner_changed_id;
+      23                 :             :   GHashTable         *players;
+      24                 :             : 
+      25                 :             :   /* Exports */
+      26                 :             :   ValentMPRISImpl    *active_export;
+      27                 :             :   GHashTable         *exports;
+      28                 :             : };
+      29                 :             : 
+      30                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      31                 :             : 
+      32   [ +  +  +  - ]:          17 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentMPRISAdapter, valent_mpris_adapter, VALENT_TYPE_MEDIA_ADAPTER,
+      33                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      34                 :             : 
+      35                 :             : 
+      36                 :             : static unsigned int n_exports = 0;
+      37                 :             : 
+      38                 :             : static void
+      39                 :           0 : on_player_state_changed (ValentMPRISAdapter *self,
+      40                 :             :                          GParamSpec         *pspec,
+      41                 :             :                          ValentMediaPlayer  *player)
+      42                 :             : {
+      43                 :           0 :   ValentMPRISImpl *export = NULL;
+      44                 :             : 
+      45         [ #  # ]:           0 :   g_assert (VALENT_IS_MPRIS_ADAPTER (self));
+      46   [ #  #  #  # ]:           0 :   g_assert (player == NULL || VALENT_IS_MEDIA_PLAYER (player));
+      47                 :             : 
+      48         [ #  # ]:           0 :   if (g_hash_table_size (self->exports) == 0)
+      49                 :           0 :     return;
+      50                 :             : 
+      51                 :             :   /* There is at least one export, but @player may be %NULL */
+      52         [ #  # ]:           0 :   if (player == NULL)
+      53                 :             :     {
+      54                 :           0 :       GHashTableIter iter;
+      55                 :             : 
+      56                 :           0 :       g_hash_table_iter_init (&iter, self->exports);
+      57                 :           0 :       g_hash_table_iter_next (&iter, (void **)&player, (void **)&export);
+      58                 :             :     }
+      59                 :             :   else
+      60                 :             :     {
+      61                 :           0 :       export = g_hash_table_lookup (self->exports, player);
+      62                 :             : 
+      63                 :             :       /* Bail: it wasn't the exported player that stopped */
+      64   [ #  #  #  # ]:           0 :       if (self->active_export && self->active_export != export)
+      65                 :             :         return;
+      66                 :             :     }
+      67                 :             : 
+      68                 :             :   /* If the player has stopped, look for another one that is active */
+      69         [ #  # ]:           0 :   if (valent_media_player_get_state (player) != VALENT_MEDIA_STATE_PLAYING)
+      70                 :             :     {
+      71                 :           0 :       GHashTableIter iter;
+      72                 :           0 :       gpointer key, value;
+      73                 :             : 
+      74                 :           0 :       g_hash_table_iter_init (&iter, self->exports);
+      75                 :             : 
+      76         [ #  # ]:           0 :       while (g_hash_table_iter_next (&iter, &key, &value))
+      77                 :             :         {
+      78         [ #  # ]:           0 :           if (valent_media_player_get_state (key) != VALENT_MEDIA_STATE_PLAYING)
+      79                 :           0 :             continue;
+      80                 :             : 
+      81                 :           0 :           player = key;
+      82                 :           0 :           export = value;
+      83                 :           0 :           break;
+      84                 :             :         }
+      85                 :             :     }
+      86                 :             : 
+      87         [ #  # ]:           0 :   g_assert (VALENT_IS_MPRIS_IMPL (export));
+      88                 :             : 
+      89                 :             :   /* Unexport any current player and replace it with the active player */
+      90         [ #  # ]:           0 :   if (self->active_export != export)
+      91                 :             :     {
+      92                 :           0 :       g_autoptr (GError) error = NULL;
+      93                 :             : 
+      94         [ #  # ]:           0 :       g_clear_pointer (&self->active_export, valent_mpris_impl_unexport);
+      95                 :             : 
+      96         [ #  # ]:           0 :       if (valent_mpris_impl_export (export, self->connection, &error))
+      97                 :             :         {
+      98                 :           0 :           self->active_export = export;
+      99                 :             : 
+     100                 :           0 :           g_object_freeze_notify (G_OBJECT (player));
+     101                 :           0 :           g_object_notify (G_OBJECT (player), "flags");
+     102                 :           0 :           g_object_notify (G_OBJECT (player), "metadata");
+     103                 :           0 :           g_object_notify (G_OBJECT (player), "name");
+     104                 :           0 :           g_object_notify (G_OBJECT (player), "repeat");
+     105                 :           0 :           g_object_notify (G_OBJECT (player), "shuffle");
+     106                 :           0 :           g_object_notify (G_OBJECT (player), "state");
+     107                 :           0 :           g_object_notify (G_OBJECT (player), "volume");
+     108                 :           0 :           g_object_thaw_notify (G_OBJECT (player));
+     109                 :             :         }
+     110                 :             :       else
+     111                 :             :         {
+     112                 :           0 :           g_warning ("%s(): %s", G_STRFUNC, error->message);
+     113                 :             :         }
+     114                 :             :     }
+     115                 :             : }
+     116                 :             : 
+     117                 :             : static void
+     118                 :           4 : g_async_initable_new_async_cb (GObject      *object,
+     119                 :             :                                GAsyncResult *result,
+     120                 :             :                                gpointer      user_data)
+     121                 :             : {
+     122                 :           4 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (user_data);
+     123                 :           4 :   GAsyncInitable *initable = G_ASYNC_INITABLE (object);
+     124                 :           4 :   g_autoptr (GObject) player = NULL;
+     125         [ -  - ]:           4 :   g_autofree char *name = NULL;
+     126                 :           4 :   g_autoptr (GError) error = NULL;
+     127                 :             : 
+     128         [ +  - ]:           4 :   g_assert (VALENT_IS_MPRIS_ADAPTER (self));
+     129   [ +  -  +  -  :           4 :   g_assert (G_IS_ASYNC_INITABLE (initable));
+             +  -  -  + ]
+     130                 :             : 
+     131         [ -  + ]:           4 :   if ((player = g_async_initable_new_finish (initable, result, &error)) == NULL)
+     132                 :             :     {
+     133         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     134                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     135                 :             : 
+     136                 :           0 :       return;
+     137                 :             :     }
+     138                 :             : 
+     139                 :           4 :   g_object_get (player, "bus-name", &name, NULL);
+     140                 :             : 
+     141         [ +  - ]:           4 :   if (g_hash_table_contains (self->players, name))
+     142                 :             :     return;
+     143                 :             : 
+     144                 :           4 :   g_hash_table_replace (self->players,
+     145                 :             :                         g_steal_pointer (&name),
+     146                 :             :                         g_object_ref (player));
+     147                 :             : 
+     148         [ -  + ]:           4 :   valent_media_adapter_player_added (VALENT_MEDIA_ADAPTER (self),
+     149                 :             :                                      VALENT_MEDIA_PLAYER (player));
+     150                 :             : }
+     151                 :             : 
+     152                 :             : static void
+     153                 :          10 : on_name_owner_changed (GDBusConnection *connection,
+     154                 :             :                        const char      *sender_name,
+     155                 :             :                        const char      *object_path,
+     156                 :             :                        const char      *interface_name,
+     157                 :             :                        const char      *signal_name,
+     158                 :             :                        GVariant        *parameters,
+     159                 :             :                        gpointer         user_data)
+     160                 :             : {
+     161                 :          10 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (user_data);
+     162                 :          10 :   const char *name;
+     163                 :          10 :   const char *old_owner;
+     164                 :          10 :   const char *new_owner;
+     165                 :          10 :   gboolean known;
+     166                 :             : 
+     167                 :          10 :   g_variant_get (parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
+     168                 :             : 
+     169                 :             :   /* This is the D-Bus name we export on */
+     170   [ -  +  +  +  :          10 :   if G_UNLIKELY (g_str_has_prefix (name, VALENT_MPRIS_DBUS_NAME))
+                   -  + ]
+     171                 :           2 :     return;
+     172                 :             : 
+     173                 :           8 :   known = g_hash_table_contains (self->players, name);
+     174                 :             : 
+     175   [ +  +  +  - ]:           8 :   if (*new_owner != '\0' && !known)
+     176                 :             :     {
+     177                 :           8 :       g_autoptr (GCancellable) destroy = NULL;
+     178                 :             : 
+     179                 :             :       /* Cancel initialization if the adapter is destroyed */
+     180                 :           4 :       destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     181         [ +  - ]:           4 :       g_async_initable_new_async (VALENT_TYPE_MPRIS_PLAYER,
+     182                 :             :                                   G_PRIORITY_DEFAULT,
+     183                 :             :                                   destroy,
+     184                 :             :                                   g_async_initable_new_async_cb,
+     185                 :             :                                   self,
+     186                 :             :                                   "bus-name", name,
+     187                 :             :                                   NULL);
+     188                 :             :     }
+     189   [ +  -  +  - ]:           4 :   else if (*old_owner != '\0' && known)
+     190                 :             :     {
+     191                 :           4 :       ValentMediaAdapter *adapter = VALENT_MEDIA_ADAPTER (self);
+     192                 :           4 :       gpointer key, value;
+     193                 :             : 
+     194         [ +  - ]:           4 :       if (g_hash_table_steal_extended (self->players, name, &key, &value))
+     195                 :             :         {
+     196                 :           4 :           valent_media_adapter_player_removed (adapter, value);
+     197                 :           4 :           g_free (key);
+     198                 :           4 :           g_object_unref (value);
+     199                 :             :         }
+     200                 :             :     }
+     201                 :             : }
+     202                 :             : 
+     203                 :             : /*
+     204                 :             :  * GAsyncInitable
+     205                 :             :  */
+     206                 :             : static void
+     207                 :           6 : list_names_cb (GDBusConnection *connection,
+     208                 :             :                GAsyncResult    *result,
+     209                 :             :                gpointer         user_data)
+     210                 :             : {
+     211                 :           6 :   ValentMPRISAdapter *self;
+     212                 :          12 :   g_autoptr (GTask) task = G_TASK (user_data);
+     213   [ -  -  +  - ]:           6 :   g_autoptr (GVariant) reply = NULL;
+     214                 :             : 
+     215                 :           6 :   self = g_task_get_source_object (task);
+     216                 :             : 
+     217                 :             :   /* If successful, add any currently exported players */
+     218                 :           6 :   reply = g_dbus_connection_call_finish (connection, result, NULL);
+     219                 :             : 
+     220         [ +  - ]:           6 :   if (reply != NULL)
+     221                 :             :     {
+     222                 :           6 :       g_autoptr (GCancellable) destroy = NULL;
+     223         [ +  - ]:           6 :       g_autoptr (GVariant) names = NULL;
+     224                 :           6 :       GVariantIter iter;
+     225                 :           6 :       const char *name;
+     226                 :             : 
+     227                 :           6 :       destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     228                 :           6 :       names = g_variant_get_child_value (reply, 0);
+     229                 :           6 :       g_variant_iter_init (&iter, names);
+     230                 :             : 
+     231         [ +  + ]:          18 :       while (g_variant_iter_next (&iter, "&s", &name))
+     232                 :             :         {
+     233   [ -  +  -  +  :          12 :           if G_LIKELY (!g_str_has_prefix (name, "org.mpris.MediaPlayer2"))
+                   -  - ]
+     234                 :          12 :             continue;
+     235                 :             : 
+     236                 :             :           /* This is the D-Bus name we export on */
+     237   [ #  #  #  #  :           0 :           if G_UNLIKELY (g_str_has_prefix (name, VALENT_MPRIS_DBUS_NAME))
+                   #  # ]
+     238                 :           0 :             continue;
+     239                 :             : 
+     240                 :           0 :           g_async_initable_new_async (VALENT_TYPE_MPRIS_PLAYER,
+     241                 :             :                                       G_PRIORITY_DEFAULT,
+     242                 :             :                                       destroy,
+     243                 :             :                                       g_async_initable_new_async_cb,
+     244                 :             :                                       self,
+     245                 :             :                                       "bus-name", name,
+     246                 :             :                                       NULL);
+     247                 :             :         }
+     248                 :             :     }
+     249                 :             : 
+     250         [ -  + ]:           6 :   if (g_task_return_error_if_cancelled (task))
+     251         [ #  # ]:           0 :     return;
+     252                 :             : 
+     253                 :             :   /* Regardless of the result of `ListNames()`, the connection is valid */
+     254                 :          12 :   self->name_owner_changed_id =
+     255                 :           6 :     g_dbus_connection_signal_subscribe (connection,
+     256                 :             :                                         "org.freedesktop.DBus",
+     257                 :             :                                         "org.freedesktop.DBus",
+     258                 :             :                                         "NameOwnerChanged",
+     259                 :             :                                         "/org/freedesktop/DBus",
+     260                 :             :                                         "org.mpris.MediaPlayer2",
+     261                 :             :                                         G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE,
+     262                 :             :                                         on_name_owner_changed,
+     263                 :             :                                         self, NULL);
+     264                 :             : 
+     265                 :             : 
+     266                 :             :   /* Report the adapter as active */
+     267                 :           6 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     268                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     269                 :             :                                          NULL);
+     270         [ +  - ]:           6 :   g_task_return_boolean (task, TRUE);
+     271                 :             : }
+     272                 :             : 
+     273                 :             : static void
+     274                 :           6 : valent_mpris_adapter_init_async (GAsyncInitable      *initable,
+     275                 :             :                                  int                  io_priority,
+     276                 :             :                                  GCancellable        *cancellable,
+     277                 :             :                                  GAsyncReadyCallback  callback,
+     278                 :             :                                  gpointer             user_data)
+     279                 :             : {
+     280                 :           6 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (initable);
+     281                 :           6 :   g_autoptr (GTask) task = NULL;
+     282         [ -  - ]:           6 :   g_autoptr (GCancellable) destroy = NULL;
+     283   [ -  -  +  - ]:           6 :   g_autoptr (GError) error = NULL;
+     284                 :             : 
+     285         [ +  - ]:           6 :   g_assert (VALENT_IS_MPRIS_ADAPTER (self));
+     286                 :             : 
+     287                 :             :   /* Cede the primary position until complete */
+     288                 :           6 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     289                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     290                 :             :                                          NULL);
+     291                 :             : 
+     292                 :             :   /* Cancel initialization if the object is destroyed */
+     293                 :           6 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     294                 :             :                                              cancellable);
+     295                 :             : 
+     296                 :           6 :   task = g_task_new (initable, destroy, callback, user_data);
+     297                 :           6 :   g_task_set_priority (task, io_priority);
+     298         [ +  - ]:           6 :   g_task_set_source_tag (task, valent_mpris_adapter_init_async);
+     299                 :             : 
+     300                 :           6 :   self->connection = g_bus_get_sync (G_BUS_TYPE_SESSION,
+     301                 :             :                                      destroy,
+     302                 :             :                                      &error);
+     303                 :             : 
+     304         [ -  + ]:           6 :   if (self->connection == NULL)
+     305                 :             :     {
+     306                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     307                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     308                 :             :                                              error);
+     309         [ #  # ]:           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+     310                 :             :     }
+     311                 :             : 
+     312         [ -  + ]:           6 :   g_dbus_connection_call (self->connection,
+     313                 :             :                           "org.freedesktop.DBus",
+     314                 :             :                           "/org/freedesktop/DBus",
+     315                 :             :                           "org.freedesktop.DBus",
+     316                 :             :                           "ListNames",
+     317                 :             :                           NULL,
+     318                 :             :                           NULL,
+     319                 :             :                           G_DBUS_CALL_FLAGS_NONE,
+     320                 :             :                           -1,
+     321                 :             :                           destroy,
+     322                 :             :                           (GAsyncReadyCallback)list_names_cb,
+     323                 :             :                           g_steal_pointer (&task));
+     324                 :             : }
+     325                 :             : 
+     326                 :             : static void
+     327                 :           2 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     328                 :             : {
+     329                 :           2 :   iface->init_async = valent_mpris_adapter_init_async;
+     330                 :           2 : }
+     331                 :             : 
+     332                 :             : /*
+     333                 :             :  * ValentMediaAdapter
+     334                 :             :  */
+     335                 :             : static void
+     336                 :           1 : valent_mpris_impl_export_full_cb (ValentMPRISImpl    *impl,
+     337                 :             :                                   GAsyncResult       *result,
+     338                 :             :                                   ValentMPRISAdapter *self)
+     339                 :             : {
+     340                 :           2 :   g_autoptr (GError) error = NULL;
+     341                 :             : 
+     342   [ -  +  -  - ]:           1 :   if (!valent_mpris_impl_export_finish (impl, result, &error) &&
+     343                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     344                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     345                 :           1 : }
+     346                 :             : 
+     347                 :             : static void
+     348                 :           1 : valent_mpris_adapter_export (ValentMediaAdapter *adapter,
+     349                 :             :                              ValentMediaPlayer  *player)
+     350                 :             : {
+     351                 :           1 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (adapter);
+     352                 :           2 :   g_autoptr (ValentMPRISImpl) impl = NULL;
+     353                 :             : 
+     354         [ +  - ]:           1 :   if (g_hash_table_contains (self->exports, player))
+     355                 :             :     return;
+     356                 :             : 
+     357                 :           1 :   impl = valent_mpris_impl_new (player);
+     358                 :           1 :   g_hash_table_replace (self->exports, player, g_object_ref (impl));
+     359                 :             : 
+     360                 :             :   /* If running in a sandbox, assume only one D-Bus name may be owned and watch
+     361                 :             :    * the player to see if it should be prioritized for export */
+     362         [ -  + ]:           1 :   if (xdp_portal_running_under_sandbox ())
+     363                 :             :     {
+     364                 :           0 :       g_signal_connect_object (player,
+     365                 :             :                                "notify::state",
+     366                 :             :                                G_CALLBACK (on_player_state_changed),
+     367                 :             :                                self,
+     368                 :             :                                G_CONNECT_SWAPPED);
+     369                 :           0 :       on_player_state_changed (self, NULL, player);
+     370                 :             :     }
+     371                 :             :   else
+     372                 :             :     {
+     373         [ +  - ]:           1 :       g_autoptr (GCancellable) destroy = NULL;
+     374         [ +  - ]:           1 :       g_autofree char *bus_name = NULL;
+     375                 :             : 
+     376                 :             :       /* Cancel export if the object is destroyed */
+     377                 :           1 :       destroy = valent_object_ref_cancellable (VALENT_OBJECT (adapter));
+     378                 :             : 
+     379                 :           1 :       bus_name = g_strdup_printf ("%s.Player%u",
+     380                 :             :                                   VALENT_MPRIS_DBUS_NAME,
+     381                 :             :                                   n_exports++);
+     382                 :           1 :       valent_mpris_impl_export_full (impl,
+     383                 :             :                                      bus_name,
+     384                 :             :                                      destroy,
+     385                 :             :                                      (GAsyncReadyCallback)valent_mpris_impl_export_full_cb,
+     386                 :             :                                      self);
+     387                 :             :     }
+     388                 :             : }
+     389                 :             : 
+     390                 :             : static void
+     391                 :           1 : valent_mpris_adapter_unexport (ValentMediaAdapter *adapter,
+     392                 :             :                                ValentMediaPlayer  *player)
+     393                 :             : {
+     394                 :           1 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (adapter);
+     395                 :           1 :   g_autoptr (ValentMPRISImpl) impl = NULL;
+     396                 :             : 
+     397         [ +  - ]:           1 :   g_assert (VALENT_IS_MPRIS_ADAPTER (self));
+     398         [ -  + ]:           1 :   g_assert (VALENT_IS_MEDIA_PLAYER (player));
+     399                 :             : 
+     400         [ -  + ]:           1 :   if (!g_hash_table_steal_extended (self->exports, player, NULL, (void **)&impl))
+     401         [ #  # ]:           0 :     return;
+     402                 :             : 
+     403                 :             :   /* If running in a sandbox, stop watching the player and ensure export
+     404                 :             :    * priority is relinquished */
+     405         [ -  + ]:           1 :   if (xdp_portal_running_under_sandbox ())
+     406                 :             :     {
+     407                 :           0 :       g_signal_handlers_disconnect_by_data (impl, self);
+     408                 :             : 
+     409         [ #  # ]:           0 :       if (self->active_export == impl)
+     410                 :             :         {
+     411         [ #  # ]:           0 :           g_clear_pointer (&self->active_export, valent_mpris_impl_unexport);
+     412                 :           0 :           on_player_state_changed (self, NULL, NULL);
+     413                 :             :         }
+     414                 :             :     }
+     415                 :             :   else
+     416                 :             :     {
+     417                 :           1 :       g_signal_handlers_disconnect_by_data (impl, self);
+     418                 :           1 :       valent_mpris_impl_unexport (impl);
+     419                 :             :     }
+     420                 :             : }
+     421                 :             : 
+     422                 :             : /*
+     423                 :             :  * ValentObject
+     424                 :             :  */
+     425                 :             : static void
+     426                 :           5 : valent_mpris_adapter_destroy (ValentObject *object)
+     427                 :             : {
+     428                 :           5 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (object);
+     429                 :           5 :   GHashTableIter iter;
+     430                 :           5 :   ValentMPRISImpl *impl;
+     431                 :             : 
+     432         [ +  - ]:           5 :   if (self->name_owner_changed_id > 0)
+     433                 :             :     {
+     434                 :           5 :       g_dbus_connection_signal_unsubscribe (self->connection,
+     435                 :             :                                             self->name_owner_changed_id);
+     436                 :           5 :       self->name_owner_changed_id = 0;
+     437                 :             :     }
+     438                 :             : 
+     439                 :           5 :   g_hash_table_iter_init (&iter, self->exports);
+     440                 :             : 
+     441         [ -  + ]:           5 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&impl))
+     442                 :             :     {
+     443                 :           0 :       g_signal_handlers_disconnect_by_data (impl, self);
+     444                 :           0 :       valent_mpris_impl_unexport (impl);
+     445                 :           0 :       g_hash_table_iter_remove (&iter);
+     446                 :             :     }
+     447                 :             : 
+     448                 :           5 :   VALENT_OBJECT_CLASS (valent_mpris_adapter_parent_class)->destroy (object);
+     449                 :           5 : }
+     450                 :             : 
+     451                 :             : /*
+     452                 :             :  * GObject
+     453                 :             :  */
+     454                 :             : static void
+     455                 :           5 : valent_mpris_adapter_finalize (GObject *object)
+     456                 :             : {
+     457                 :           5 :   ValentMPRISAdapter *self = VALENT_MPRIS_ADAPTER (object);
+     458                 :             : 
+     459         [ +  - ]:           5 :   g_clear_object (&self->connection);
+     460         [ +  - ]:           5 :   g_clear_pointer (&self->players, g_hash_table_unref);
+     461         [ +  - ]:           5 :   g_clear_pointer (&self->exports, g_hash_table_unref);
+     462                 :             : 
+     463                 :           5 :   G_OBJECT_CLASS (valent_mpris_adapter_parent_class)->finalize (object);
+     464                 :           5 : }
+     465                 :             : 
+     466                 :             : static void
+     467                 :           2 : valent_mpris_adapter_class_init (ValentMPRISAdapterClass *klass)
+     468                 :             : {
+     469                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     470                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     471                 :           2 :   ValentMediaAdapterClass *adapter_class = VALENT_MEDIA_ADAPTER_CLASS (klass);
+     472                 :             : 
+     473                 :           2 :   object_class->finalize = valent_mpris_adapter_finalize;
+     474                 :             : 
+     475                 :           2 :   vobject_class->destroy = valent_mpris_adapter_destroy;
+     476                 :             : 
+     477                 :           2 :   adapter_class->export_player = valent_mpris_adapter_export;
+     478                 :           2 :   adapter_class->unexport_player = valent_mpris_adapter_unexport;
+     479                 :             : }
+     480                 :             : 
+     481                 :             : static void
+     482                 :           6 : valent_mpris_adapter_init (ValentMPRISAdapter *self)
+     483                 :             : {
+     484                 :           6 :   self->exports = g_hash_table_new_full (NULL, NULL,
+     485                 :             :                                          NULL, g_object_unref);
+     486                 :           6 :   self->players = g_hash_table_new_full (g_str_hash, g_str_equal,
+     487                 :             :                                          g_free, g_object_unref);
+     488                 :           6 : }
+     489                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-adapter.h.func-c.html b/coverage/src/plugins/mpris/valent-mpris-adapter.h.func-c.html new file mode 100644 index 00000000000..9f267506a4a --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-adapter.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_ADAPTER11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-adapter.h.func.html b/coverage/src/plugins/mpris/valent-mpris-adapter.h.func.html new file mode 100644 index 00000000000..b8c0c83a879 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-adapter.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-adapter.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_ADAPTER11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-adapter.h.gcov.html b/coverage/src/plugins/mpris/valent-mpris-adapter.h.gcov.html new file mode 100644 index 00000000000..dcc9dc3b1b2 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-adapter.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-adapter.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-adapter.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MPRIS_ADAPTER (valent_mpris_adapter_get_type ())
+      11                 :             : 
+      12   [ +  -  +  -  :          11 : G_DECLARE_FINAL_TYPE (ValentMPRISAdapter, valent_mpris_adapter, VALENT, MPRIS_ADAPTER, ValentMediaAdapter)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-device.c.func-c.html b/coverage/src/plugins/mpris/valent-mpris-device.c.func-c.html new file mode 100644 index 00000000000..620eb3654c4 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-device.c.func-c.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.5 %348322
Test Date:2024-03-31 18:46:36Functions:97.4 %3837
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:55.3 %17094
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mpris_device_get_property0
valent_mpris_device_class_init1
valent_mpris_device_finalize1
valent_mpris_device_get_repeat1
valent_mpris_device_get_shuffle1
valent_mpris_device_get_volume1
valent_mpris_device_init1
valent_mpris_device_new1
valent_mpris_device_next1
valent_mpris_device_pause1
valent_mpris_device_play1
valent_mpris_device_previous1
valent_mpris_device_request_album_art1
valent_mpris_device_seek1
valent_mpris_device_set_position1
valent_mpris_device_set_property1
valent_mpris_device_set_repeat1
valent_mpris_device_set_shuffle1
valent_mpris_device_set_volume1
valent_mpris_device_stop1
valent_mpris_device_update_art1
valent_mpris_device_update_name1
valent_mpris_device_handle_packet2
valent_mpris_device_update_flags2
valent_mpris_device_update_position2
valent_mpris_device_update_repeat2
valent_mpris_device_update_shuffle2
valent_mpris_device_update_state2
valent_mpris_device_update_volume2
valent_mpris_device_get_position3
valent_mpris_device_get_state3
valent_mpris_device_update_metadata3
valent_mpris_device_get_metadata4
valent_mpris_device_get_name6
valent_mpris_device_get_flags7
valent_mpris_device_get_type23
valent_mpris_device_class_intern_init1
valent_mpris_device_get_type_once1
valent_mpris_device_get_type21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-device.c.func.html b/coverage/src/plugins/mpris/valent-mpris-device.c.func.html new file mode 100644 index 00000000000..bdbca08d2f6 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-device.c.func.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-device.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.5 %348322
Test Date:2024-03-31 18:46:36Functions:97.4 %3837
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:55.3 %17094
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mpris_device_class_init1
valent_mpris_device_finalize1
valent_mpris_device_get_flags7
valent_mpris_device_get_metadata4
valent_mpris_device_get_name6
valent_mpris_device_get_position3
valent_mpris_device_get_property0
valent_mpris_device_get_repeat1
valent_mpris_device_get_shuffle1
valent_mpris_device_get_state3
valent_mpris_device_get_type23
valent_mpris_device_class_intern_init1
valent_mpris_device_get_type21
valent_mpris_device_get_type_once1
valent_mpris_device_get_volume1
valent_mpris_device_handle_packet2
valent_mpris_device_init1
valent_mpris_device_new1
valent_mpris_device_next1
valent_mpris_device_pause1
valent_mpris_device_play1
valent_mpris_device_previous1
valent_mpris_device_request_album_art1
valent_mpris_device_seek1
valent_mpris_device_set_position1
valent_mpris_device_set_property1
valent_mpris_device_set_repeat1
valent_mpris_device_set_shuffle1
valent_mpris_device_set_volume1
valent_mpris_device_stop1
valent_mpris_device_update_art1
valent_mpris_device_update_flags2
valent_mpris_device_update_metadata3
valent_mpris_device_update_name1
valent_mpris_device_update_position2
valent_mpris_device_update_repeat2
valent_mpris_device_update_shuffle2
valent_mpris_device_update_state2
valent_mpris_device_update_volume2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-device.c.gcov.html b/coverage/src/plugins/mpris/valent-mpris-device.c.gcov.html new file mode 100644 index 00000000000..36e6507bce3 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-device.c.gcov.html @@ -0,0 +1,818 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-device.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-device.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.5 %348322
Test Date:2024-03-31 18:46:36Functions:97.4 %3837
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:55.3 %17094
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mpris-device"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-mpris-device.h"
+      14                 :             : #include "valent-mpris-utils.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentMprisDevice
+      18                 :             : {
+      19                 :             :   ValentMediaPlayer   parent_instance;
+      20                 :             : 
+      21                 :             :   ValentDevice       *device;
+      22                 :             : 
+      23                 :             :   ValentMediaActions  flags;
+      24                 :             :   char               *name;
+      25                 :             :   GVariant           *metadata;
+      26                 :             :   double              position;
+      27                 :             :   double              position_time;
+      28                 :             :   ValentMediaRepeat   repeat;
+      29                 :             :   unsigned int        shuffle : 1;
+      30                 :             :   ValentMediaState    state;
+      31                 :             :   double              volume;
+      32                 :             : };
+      33                 :             : 
+      34   [ +  +  +  - ]:          23 : G_DEFINE_FINAL_TYPE (ValentMprisDevice, valent_mpris_device, VALENT_TYPE_MEDIA_PLAYER)
+      35                 :             : 
+      36                 :             : 
+      37                 :             : enum {
+      38                 :             :   PROP_0,
+      39                 :             :   PROP_DEVICE,
+      40                 :             :   N_PROPERTIES
+      41                 :             : };
+      42                 :             : 
+      43                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      44                 :             : 
+      45                 :             : 
+      46                 :             : /*
+      47                 :             :  * ValentMediaPlayer
+      48                 :             :  */
+      49                 :             : static ValentMediaActions
+      50                 :           7 : valent_mpris_device_get_flags (ValentMediaPlayer *player)
+      51                 :             : {
+      52                 :           7 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+      53                 :             : 
+      54                 :           7 :   return self->flags;
+      55                 :             : }
+      56                 :             : 
+      57                 :             : static GVariant *
+      58                 :           4 : valent_mpris_device_get_metadata (ValentMediaPlayer *player)
+      59                 :             : {
+      60                 :           4 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+      61                 :             : 
+      62         [ +  + ]:           4 :   if (self->metadata)
+      63                 :           3 :     return g_variant_ref (self->metadata);
+      64                 :             : 
+      65                 :             :   return NULL;
+      66                 :             : }
+      67                 :             : 
+      68                 :             : static const char *
+      69                 :           6 : valent_mpris_device_get_name (ValentMediaPlayer *player)
+      70                 :             : {
+      71                 :           6 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+      72                 :             : 
+      73                 :           6 :   return self->name;
+      74                 :             : }
+      75                 :             : 
+      76                 :             : static double
+      77                 :           3 : valent_mpris_device_get_position (ValentMediaPlayer *player)
+      78                 :             : {
+      79                 :           3 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+      80                 :             : 
+      81         [ -  + ]:           3 :   if (self->state == VALENT_MEDIA_STATE_PLAYING)
+      82                 :           0 :     return self->position + (valent_mpris_get_time () - self->position_time);
+      83                 :             : 
+      84                 :           3 :   return self->position;
+      85                 :             : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           1 : valent_mpris_device_set_position (ValentMediaPlayer *player,
+      89                 :             :                                   double             position)
+      90                 :             : {
+      91                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+      92                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+      93         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+      94                 :             : 
+      95                 :             :   /* Convert seconds to milliseconds */
+      96                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+      97                 :           1 :   json_builder_set_member_name (builder, "player");
+      98                 :           1 :   json_builder_add_string_value (builder, self->name);
+      99                 :           1 :   json_builder_set_member_name (builder, "SetPosition");
+     100                 :           1 :   json_builder_add_int_value (builder, position * 1000L);
+     101                 :           1 :   packet = valent_packet_end (&builder);
+     102                 :             : 
+     103         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     104                 :           1 : }
+     105                 :             : 
+     106                 :             : static ValentMediaRepeat
+     107                 :           1 : valent_mpris_device_get_repeat (ValentMediaPlayer *player)
+     108                 :             : {
+     109                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     110                 :             : 
+     111                 :           1 :   return self->repeat;
+     112                 :             : }
+     113                 :             : 
+     114                 :             : static void
+     115                 :           1 : valent_mpris_device_set_repeat (ValentMediaPlayer *player,
+     116                 :             :                                 ValentMediaRepeat  repeat)
+     117                 :             : {
+     118                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     119                 :           1 :   const char *loop_status = NULL;
+     120                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     121         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     122                 :             : 
+     123                 :           1 :   loop_status = valent_mpris_repeat_to_string (repeat);
+     124                 :             : 
+     125                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     126                 :           1 :   json_builder_set_member_name (builder, "player");
+     127                 :           1 :   json_builder_add_string_value (builder, self->name);
+     128                 :           1 :   json_builder_set_member_name (builder, "setLoopStatus");
+     129                 :           1 :   json_builder_add_string_value (builder, loop_status);
+     130                 :           1 :   packet = valent_packet_end (&builder);
+     131                 :             : 
+     132         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     133                 :           1 : }
+     134                 :             : 
+     135                 :             : static gboolean
+     136                 :           1 : valent_mpris_device_get_shuffle (ValentMediaPlayer *player)
+     137                 :             : {
+     138                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     139                 :             : 
+     140                 :           1 :   return self->shuffle;
+     141                 :             : }
+     142                 :             : 
+     143                 :             : static void
+     144                 :           1 : valent_mpris_device_set_shuffle (ValentMediaPlayer *player,
+     145                 :             :                                  gboolean           shuffle)
+     146                 :             : {
+     147                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     148                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     149         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     150                 :             : 
+     151                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     152                 :           1 :   json_builder_set_member_name (builder, "player");
+     153                 :           1 :   json_builder_add_string_value (builder, self->name);
+     154                 :           1 :   json_builder_set_member_name (builder, "setShuffle");
+     155                 :           1 :   json_builder_add_boolean_value (builder, shuffle);
+     156                 :           1 :   packet = valent_packet_end (&builder);
+     157                 :             : 
+     158         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     159                 :           1 : }
+     160                 :             : 
+     161                 :             : static ValentMediaState
+     162                 :           3 : valent_mpris_device_get_state (ValentMediaPlayer *player)
+     163                 :             : {
+     164                 :           3 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     165                 :             : 
+     166                 :           3 :   return self->state;
+     167                 :             : }
+     168                 :             : 
+     169                 :             : static double
+     170                 :           1 : valent_mpris_device_get_volume (ValentMediaPlayer *player)
+     171                 :             : {
+     172                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     173                 :             : 
+     174                 :           1 :   return self->volume;
+     175                 :             : }
+     176                 :             : 
+     177                 :             : static void
+     178                 :           1 : valent_mpris_device_set_volume (ValentMediaPlayer *player,
+     179                 :             :                                 double             volume)
+     180                 :             : {
+     181                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     182                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     183         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     184                 :             : 
+     185                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     186                 :           1 :   json_builder_set_member_name (builder, "player");
+     187                 :           1 :   json_builder_add_string_value (builder, self->name);
+     188                 :           1 :   json_builder_set_member_name (builder, "setVolume");
+     189                 :           1 :   json_builder_add_int_value (builder, floor (volume * 100));
+     190                 :           1 :   packet = valent_packet_end (&builder);
+     191                 :             : 
+     192         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     193                 :           1 : }
+     194                 :             : 
+     195                 :             : static void
+     196                 :           1 : valent_mpris_device_next (ValentMediaPlayer *player)
+     197                 :             : {
+     198                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     199                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     200         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     201                 :             : 
+     202                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     203                 :           1 :   json_builder_set_member_name (builder, "player");
+     204                 :           1 :   json_builder_add_string_value (builder, self->name);
+     205                 :           1 :   json_builder_set_member_name (builder, "action");
+     206                 :           1 :   json_builder_add_string_value (builder, "Next");
+     207                 :           1 :   packet = valent_packet_end (&builder);
+     208                 :             : 
+     209         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     210                 :           1 : }
+     211                 :             : 
+     212                 :             : static void
+     213                 :           1 : valent_mpris_device_pause (ValentMediaPlayer *player)
+     214                 :             : {
+     215                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     216                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     217         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     218                 :             : 
+     219                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     220                 :           1 :   json_builder_set_member_name (builder, "player");
+     221                 :           1 :   json_builder_add_string_value (builder, self->name);
+     222                 :           1 :   json_builder_set_member_name (builder, "action");
+     223                 :           1 :   json_builder_add_string_value (builder, "Pause");
+     224                 :           1 :   packet = valent_packet_end (&builder);
+     225                 :             : 
+     226         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     227                 :           1 : }
+     228                 :             : 
+     229                 :             : static void
+     230                 :           1 : valent_mpris_device_play (ValentMediaPlayer *player)
+     231                 :             : {
+     232                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     233                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     234         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     235                 :             : 
+     236                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     237                 :           1 :   json_builder_set_member_name (builder, "player");
+     238                 :           1 :   json_builder_add_string_value (builder, self->name);
+     239                 :           1 :   json_builder_set_member_name (builder, "action");
+     240                 :           1 :   json_builder_add_string_value (builder, "Play");
+     241                 :           1 :   packet = valent_packet_end (&builder);
+     242                 :             : 
+     243         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     244                 :           1 : }
+     245                 :             : 
+     246                 :             : #if 0
+     247                 :             : static void
+     248                 :             : valent_mpris_device_play_pause (ValentMediaPlayer *player)
+     249                 :             : {
+     250                 :             :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     251                 :             :   g_autoptr (JsonBuilder) builder = NULL;
+     252                 :             :   g_autoptr (JsonNode) packet = NULL;
+     253                 :             : 
+     254                 :             :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     255                 :             :   json_builder_set_member_name (builder, "player");
+     256                 :             :   json_builder_add_string_value (builder, self->name);
+     257                 :             :   json_builder_set_member_name (builder, "action");
+     258                 :             :   json_builder_add_string_value (builder, "PlayPause");
+     259                 :             :   packet = valent_packet_end (&builder);
+     260                 :             : 
+     261                 :             :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     262                 :             : }
+     263                 :             : #endif
+     264                 :             : 
+     265                 :             : static void
+     266                 :           1 : valent_mpris_device_previous (ValentMediaPlayer *player)
+     267                 :             : {
+     268                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     269                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     270         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     271                 :             : 
+     272                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     273                 :           1 :   json_builder_set_member_name (builder, "player");
+     274                 :           1 :   json_builder_add_string_value (builder, self->name);
+     275                 :           1 :   json_builder_set_member_name (builder, "action");
+     276                 :           1 :   json_builder_add_string_value (builder, "Previous");
+     277                 :           1 :   packet = valent_packet_end (&builder);
+     278                 :             : 
+     279         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     280                 :           1 : }
+     281                 :             : 
+     282                 :             : static void
+     283                 :           1 : valent_mpris_device_seek (ValentMediaPlayer *player,
+     284                 :             :                           double             offset)
+     285                 :             : {
+     286                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     287                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     288         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     289                 :             : 
+     290                 :             :   /* Convert seconds to microseconds */
+     291                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     292                 :           1 :   json_builder_set_member_name (builder, "player");
+     293                 :           1 :   json_builder_add_string_value (builder, self->name);
+     294                 :           1 :   json_builder_set_member_name (builder, "Seek");
+     295                 :           1 :   json_builder_add_int_value (builder, offset * G_TIME_SPAN_SECOND);
+     296                 :           1 :   packet = valent_packet_end (&builder);
+     297                 :             : 
+     298         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     299                 :           1 : }
+     300                 :             : 
+     301                 :             : static void
+     302                 :           1 : valent_mpris_device_stop (ValentMediaPlayer *player)
+     303                 :             : {
+     304                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (player);
+     305                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     306         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     307                 :             : 
+     308                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     309                 :           1 :   json_builder_set_member_name (builder, "player");
+     310                 :           1 :   json_builder_add_string_value (builder, self->name);
+     311                 :           1 :   json_builder_set_member_name (builder, "action");
+     312                 :           1 :   json_builder_add_string_value (builder, "Stop");
+     313                 :           1 :   packet = valent_packet_end (&builder);
+     314                 :             : 
+     315         [ +  - ]:           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     316                 :           1 : }
+     317                 :             : 
+     318                 :             : static void
+     319                 :           1 : valent_mpris_device_request_album_art (ValentMprisDevice *self,
+     320                 :             :                                        const char        *url,
+     321                 :             :                                        GVariantDict      *metadata)
+     322                 :             : {
+     323                 :           1 :   g_autoptr (JsonBuilder) builder = NULL;
+     324   [ -  -  -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     325                 :           1 :   ValentContext *context = NULL;
+     326   [ -  -  +  - ]:           1 :   g_autoptr (GFile) file = NULL;
+     327   [ -  -  +  - ]:           1 :   g_autofree char *filename = NULL;
+     328                 :             : 
+     329         [ +  - ]:           1 :   g_assert (VALENT_IS_MPRIS_DEVICE (self));
+     330   [ +  -  -  + ]:           1 :   g_assert (url != NULL && *url != '\0');
+     331         [ -  + ]:           1 :   g_assert (metadata != NULL);
+     332                 :             : 
+     333                 :           1 :   context = valent_device_get_context (self->device);
+     334                 :           1 :   filename = g_compute_checksum_for_string (G_CHECKSUM_MD5, url, -1);
+     335                 :           1 :   file = valent_context_get_cache_file (context, filename);
+     336                 :             : 
+     337                 :             :   /* If the album art has been cached, update the metadata dictionary */
+     338         [ -  + ]:           1 :   if (g_file_query_exists (file, NULL))
+     339                 :             :     {
+     340                 :           0 :       g_autofree char *art_url = NULL;
+     341                 :             : 
+     342                 :           0 :       art_url = g_file_get_uri (file);
+     343                 :           0 :       g_variant_dict_insert (metadata, "mpris:artUrl", "s", art_url);
+     344                 :             : 
+     345                 :           0 :       return;
+     346                 :             :     }
+     347                 :             : 
+     348                 :             :   /* Request the album art payload */
+     349                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     350                 :           1 :   json_builder_set_member_name (builder, "player");
+     351                 :           1 :   json_builder_add_string_value (builder, self->name);
+     352                 :           1 :   json_builder_set_member_name (builder, "albumArtUrl");
+     353                 :           1 :   json_builder_add_string_value (builder, url);
+     354                 :           1 :   packet = valent_packet_end (&builder);
+     355                 :             : 
+     356                 :           1 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+     357                 :             : }
+     358                 :             : 
+     359                 :             : /*
+     360                 :             :  * Private
+     361                 :             :  */
+     362                 :             : static void
+     363                 :           2 : valent_mpris_device_update_flags (ValentMprisDevice  *player,
+     364                 :             :                                   ValentMediaActions  flags)
+     365                 :             : {
+     366         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     367                 :             : 
+     368         [ +  + ]:           2 :   if ((player->flags ^ flags) == 0)
+     369                 :             :     return;
+     370                 :             : 
+     371                 :           1 :   player->flags = flags;
+     372                 :           1 :   g_object_notify (G_OBJECT (player), "flags");
+     373                 :             : }
+     374                 :             : 
+     375                 :             : static void
+     376                 :           3 : valent_mpris_device_update_metadata (ValentMprisDevice *player,
+     377                 :             :                                      GVariant          *value)
+     378                 :             : {
+     379                 :           6 :   g_autoptr (GVariant) metadata = NULL;
+     380                 :             : 
+     381         [ +  - ]:           3 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     382         [ -  + ]:           3 :   g_assert (value != NULL);
+     383                 :             : 
+     384         [ +  - ]:           3 :   if (player->metadata == value)
+     385                 :             :     return;
+     386                 :             : 
+     387                 :           3 :   metadata = g_steal_pointer (&player->metadata);
+     388                 :           3 :   player->metadata = g_variant_ref_sink (value);
+     389         [ +  + ]:           3 :   g_object_notify (G_OBJECT (player), "metadata");
+     390                 :             : }
+     391                 :             : 
+     392                 :             : static void
+     393                 :           2 : valent_mpris_device_update_position (ValentMprisDevice *player,
+     394                 :             :                                      int64_t            position)
+     395                 :             : {
+     396         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     397                 :             : 
+     398                 :             :   /* Convert milliseconds to seconds */
+     399                 :           2 :   player->position = position / 1000L;
+     400                 :           2 :   player->position_time = valent_mpris_get_time ();
+     401                 :           2 :   g_object_notify (G_OBJECT (player), "position");
+     402                 :           2 : }
+     403                 :             : 
+     404                 :             : static void
+     405                 :           2 : valent_mpris_device_update_repeat (ValentMprisDevice *player,
+     406                 :             :                                    const char        *loop_status)
+     407                 :             : {
+     408                 :           2 :   ValentMediaRepeat repeat = VALENT_MEDIA_REPEAT_NONE;
+     409                 :             : 
+     410         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     411         [ -  + ]:           2 :   g_assert (loop_status != NULL);
+     412                 :             : 
+     413                 :           2 :   repeat = valent_mpris_repeat_from_string (loop_status);
+     414                 :             : 
+     415         [ -  + ]:           2 :   if (player->repeat == repeat)
+     416                 :             :     return;
+     417                 :             : 
+     418                 :           0 :   player->repeat = repeat;
+     419                 :           0 :   g_object_notify (G_OBJECT (player), "repeat");
+     420                 :             : }
+     421                 :             : 
+     422                 :             : static void
+     423                 :           2 : valent_mpris_device_update_shuffle (ValentMprisDevice *player,
+     424                 :             :                                     gboolean           shuffle)
+     425                 :             : {
+     426         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     427                 :             : 
+     428         [ -  + ]:           2 :   if (player->shuffle == shuffle)
+     429                 :             :     return;
+     430                 :             : 
+     431                 :           0 :   player->shuffle = shuffle;
+     432                 :           0 :   g_object_notify (G_OBJECT (player), "shuffle");
+     433                 :             : }
+     434                 :             : 
+     435                 :             : static void
+     436                 :           2 : valent_mpris_device_update_state (ValentMprisDevice *player,
+     437                 :             :                                   const char        *playback_status)
+     438                 :             : {
+     439                 :           2 :   ValentMediaState state = VALENT_MEDIA_STATE_STOPPED;
+     440                 :             : 
+     441         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     442         [ -  + ]:           2 :   g_assert (playback_status != NULL);
+     443                 :             : 
+     444                 :           2 :   state = valent_mpris_state_from_string (playback_status);
+     445                 :             : 
+     446         [ +  - ]:           2 :   if (player->state == state)
+     447                 :             :     return;
+     448                 :             : 
+     449                 :           2 :   player->state = state;
+     450                 :             : 
+     451         [ -  + ]:           2 :   if (player->state == VALENT_MEDIA_STATE_STOPPED)
+     452                 :             :     {
+     453                 :           0 :       player->position = 0.0;
+     454                 :           0 :       player->position_time = 0;
+     455                 :           0 :       g_object_notify (G_OBJECT (player), "position");
+     456                 :             :     }
+     457                 :             : 
+     458                 :           2 :   g_object_notify (G_OBJECT (player), "state");
+     459                 :             : }
+     460                 :             : 
+     461                 :             : static void
+     462                 :           2 : valent_mpris_device_update_volume (ValentMprisDevice *player,
+     463                 :             :                                    int64_t            volume)
+     464                 :             : {
+     465         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     466                 :             : 
+     467   [ -  +  -  + ]:           2 :   if (G_APPROX_VALUE (player->volume, volume / 100.0, 0.01))
+     468                 :             :     return;
+     469                 :             : 
+     470         [ #  # ]:           0 :   player->volume = CLAMP ((volume / 100.0), 0.0, 1.0);
+     471                 :           0 :   g_object_notify (G_OBJECT (player), "volume");
+     472                 :             : }
+     473                 :             : 
+     474                 :             : /*
+     475                 :             :  * GObject
+     476                 :             :  */
+     477                 :             : static void
+     478                 :           1 : valent_mpris_device_finalize (GObject *object)
+     479                 :             : {
+     480                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (object);
+     481                 :             : 
+     482         [ +  - ]:           1 :   g_clear_object (&self->device);
+     483         [ +  - ]:           1 :   g_clear_pointer (&self->name, g_free);
+     484         [ +  - ]:           1 :   g_clear_pointer (&self->metadata, g_variant_unref);
+     485                 :             : 
+     486                 :           1 :   G_OBJECT_CLASS (valent_mpris_device_parent_class)->finalize (object);
+     487                 :           1 : }
+     488                 :             : 
+     489                 :             : static void
+     490                 :           0 : valent_mpris_device_get_property (GObject    *object,
+     491                 :             :                                   guint       prop_id,
+     492                 :             :                                   GValue     *value,
+     493                 :             :                                   GParamSpec *pspec)
+     494                 :             : {
+     495                 :           0 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (object);
+     496                 :             : 
+     497         [ #  # ]:           0 :   switch (prop_id)
+     498                 :             :     {
+     499                 :           0 :     case PROP_DEVICE:
+     500                 :           0 :       g_value_set_object (value, self->device);
+     501                 :           0 :       break;
+     502                 :             : 
+     503                 :           0 :     default:
+     504                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     505                 :             :     }
+     506                 :           0 : }
+     507                 :             : 
+     508                 :             : static void
+     509                 :           1 : valent_mpris_device_set_property (GObject      *object,
+     510                 :             :                                   guint         prop_id,
+     511                 :             :                                   const GValue *value,
+     512                 :             :                                   GParamSpec   *pspec)
+     513                 :             : {
+     514                 :           1 :   ValentMprisDevice *self = VALENT_MPRIS_DEVICE (object);
+     515                 :             : 
+     516         [ +  - ]:           1 :   switch (prop_id)
+     517                 :             :     {
+     518                 :           1 :     case PROP_DEVICE:
+     519                 :           1 :       self->device = g_value_dup_object (value);
+     520                 :           1 :       break;
+     521                 :             : 
+     522                 :           0 :     default:
+     523                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     524                 :             :     }
+     525                 :           1 : }
+     526                 :             : 
+     527                 :             : static void
+     528                 :           1 : valent_mpris_device_class_init (ValentMprisDeviceClass *klass)
+     529                 :             : {
+     530                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     531                 :           1 :   ValentMediaPlayerClass *player_class = VALENT_MEDIA_PLAYER_CLASS (klass);
+     532                 :             : 
+     533                 :           1 :   object_class->finalize = valent_mpris_device_finalize;
+     534                 :           1 :   object_class->get_property = valent_mpris_device_get_property;
+     535                 :           1 :   object_class->set_property = valent_mpris_device_set_property;
+     536                 :             : 
+     537                 :           1 :   player_class->get_flags = valent_mpris_device_get_flags;
+     538                 :           1 :   player_class->get_metadata = valent_mpris_device_get_metadata;
+     539                 :           1 :   player_class->get_name = valent_mpris_device_get_name;
+     540                 :           1 :   player_class->get_position = valent_mpris_device_get_position;
+     541                 :           1 :   player_class->set_position = valent_mpris_device_set_position;
+     542                 :           1 :   player_class->get_repeat = valent_mpris_device_get_repeat;
+     543                 :           1 :   player_class->set_repeat = valent_mpris_device_set_repeat;
+     544                 :           1 :   player_class->get_shuffle = valent_mpris_device_get_shuffle;
+     545                 :           1 :   player_class->set_shuffle = valent_mpris_device_set_shuffle;
+     546                 :           1 :   player_class->get_state = valent_mpris_device_get_state;
+     547                 :           1 :   player_class->get_volume = valent_mpris_device_get_volume;
+     548                 :           1 :   player_class->set_volume = valent_mpris_device_set_volume;
+     549                 :             : 
+     550                 :           1 :   player_class->next = valent_mpris_device_next;
+     551                 :           1 :   player_class->pause = valent_mpris_device_pause;
+     552                 :           1 :   player_class->play = valent_mpris_device_play;
+     553                 :           1 :   player_class->previous = valent_mpris_device_previous;
+     554                 :           1 :   player_class->seek = valent_mpris_device_seek;
+     555                 :           1 :   player_class->stop = valent_mpris_device_stop;
+     556                 :             : 
+     557                 :             :   /**
+     558                 :             :    * ValentMprisDevice:device:
+     559                 :             :    *
+     560                 :             :    * The [class@Valent.Device] this player is for.
+     561                 :             :    */
+     562                 :           2 :   properties [PROP_DEVICE] =
+     563                 :           1 :     g_param_spec_object ("device", NULL, NULL,
+     564                 :             :                          VALENT_TYPE_DEVICE,
+     565                 :             :                          (G_PARAM_READWRITE |
+     566                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     567                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     568                 :             :                           G_PARAM_STATIC_STRINGS));
+     569                 :             : 
+     570                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     571                 :           1 : }
+     572                 :             : 
+     573                 :             : static void
+     574                 :           1 : valent_mpris_device_init (ValentMprisDevice *self)
+     575                 :             : {
+     576                 :           1 :   self->name = g_strdup ("Media Player");
+     577                 :           1 :   self->volume = 1.0;
+     578                 :           1 :   self->state = VALENT_MEDIA_STATE_STOPPED;
+     579                 :           1 : }
+     580                 :             : 
+     581                 :             : /**
+     582                 :             :  * valent_mpris_device_new:
+     583                 :             :  * @device: a `ValentDevice`
+     584                 :             :  *
+     585                 :             :  * Get the `ValentMprisDevice` instance.
+     586                 :             :  *
+     587                 :             :  * Returns: (transfer full) (nullable): a `ValentMprisDevice`
+     588                 :             :  */
+     589                 :             : ValentMprisDevice *
+     590                 :           1 : valent_mpris_device_new (ValentDevice *device)
+     591                 :             : {
+     592                 :           1 :   return g_object_new (VALENT_TYPE_MPRIS_DEVICE,
+     593                 :             :                        "device", device,
+     594                 :             :                        NULL);
+     595                 :             : }
+     596                 :             : 
+     597                 :             : /**
+     598                 :             :  * valent_media_player_update_packet:
+     599                 :             :  * @player: a `ValentMprisDevice`
+     600                 :             :  * @packet: a KDE Connect packet
+     601                 :             :  *
+     602                 :             :  * A convenience method for updating the internal state of the player from a
+     603                 :             :  * `kdeconnect.mpris` packet.
+     604                 :             :  */
+     605                 :             : void
+     606                 :           2 : valent_mpris_device_handle_packet (ValentMprisDevice  *player,
+     607                 :             :                                    JsonNode           *packet)
+     608                 :             : {
+     609                 :           2 :   const char *url;
+     610                 :           2 :   ValentMediaActions flags = VALENT_MEDIA_ACTION_NONE;
+     611                 :           2 :   GVariantDict metadata;
+     612                 :           2 :   const char *artist, *title, *album;
+     613                 :           2 :   int64_t length, position;
+     614                 :           2 :   const char *loop_status = NULL;
+     615                 :           2 :   gboolean shuffle = FALSE;
+     616                 :           2 :   gboolean is_playing;
+     617                 :           2 :   int64_t volume;
+     618                 :             : 
+     619                 :             :   /* Flags (available actions) */
+     620         [ +  + ]:           2 :   if (valent_packet_check_field (packet, "canGoNext"))
+     621                 :           1 :     flags |= VALENT_MEDIA_ACTION_NEXT;
+     622                 :             : 
+     623         [ -  + ]:           2 :   if (valent_packet_check_field (packet, "canGoPrevious"))
+     624                 :           0 :     flags |= VALENT_MEDIA_ACTION_PREVIOUS;
+     625                 :             : 
+     626         [ +  + ]:           2 :   if (valent_packet_check_field (packet, "canPause"))
+     627                 :           1 :     flags |= VALENT_MEDIA_ACTION_PAUSE;
+     628                 :             : 
+     629         [ +  + ]:           2 :   if (valent_packet_check_field (packet, "canPlay"))
+     630                 :           1 :     flags |= VALENT_MEDIA_ACTION_PLAY;
+     631                 :             : 
+     632         [ +  + ]:           2 :   if (valent_packet_check_field (packet, "canSeek"))
+     633                 :           1 :     flags |= VALENT_MEDIA_ACTION_SEEK;
+     634                 :             : 
+     635                 :           2 :   valent_mpris_device_update_flags (player, flags);
+     636                 :             : 
+     637                 :             :   /* Metadata */
+     638                 :           2 :   g_variant_dict_init (&metadata, NULL);
+     639                 :             : 
+     640         [ +  + ]:           2 :   if (valent_packet_get_string (packet, "artist", &artist))
+     641                 :             :     {
+     642                 :           3 :       g_auto (GStrv) artists = NULL;
+     643                 :           1 :       GVariant *value;
+     644                 :             : 
+     645                 :           1 :       artists = g_strsplit (artist, ",", -1);
+     646                 :           1 :       value = g_variant_new_strv ((const char * const *)artists, -1);
+     647         [ +  - ]:           1 :       g_variant_dict_insert_value (&metadata, "xesam:artist", value);
+     648                 :             :     }
+     649                 :             : 
+     650         [ +  + ]:           2 :   if (valent_packet_get_string (packet, "title", &title))
+     651                 :           1 :     g_variant_dict_insert (&metadata, "xesam:title", "s", title);
+     652                 :             : 
+     653         [ +  + ]:           2 :   if (valent_packet_get_string (packet, "album", &album))
+     654                 :           1 :     g_variant_dict_insert (&metadata, "xesam:album", "s", album);
+     655                 :             : 
+     656                 :             :   /* Convert milliseconds to microseconds */
+     657         [ +  + ]:           2 :   if (valent_packet_get_int (packet, "length", &length))
+     658                 :           1 :     g_variant_dict_insert (&metadata, "mpris:length", "x", length * 1000L);
+     659                 :             : 
+     660         [ +  + ]:           2 :   if (valent_packet_get_string (packet, "albumArtUrl", &url))
+     661                 :           1 :     valent_mpris_device_request_album_art (player, url, &metadata);
+     662                 :             : 
+     663                 :           2 :   valent_mpris_device_update_metadata (player, g_variant_dict_end (&metadata));
+     664                 :             : 
+     665                 :             :   /* Playback Status */
+     666         [ +  - ]:           2 :   if (valent_packet_get_int (packet, "pos", &position))
+     667                 :           2 :     valent_mpris_device_update_position (player, position);
+     668                 :             : 
+     669         [ +  - ]:           2 :   if (valent_packet_get_string (packet, "loopStatus", &loop_status))
+     670                 :           2 :     valent_mpris_device_update_repeat (player, loop_status);
+     671                 :             : 
+     672         [ +  - ]:           2 :   if (valent_packet_get_boolean (packet, "isPlaying", &is_playing))
+     673         [ +  + ]:           3 :     valent_mpris_device_update_state (player, is_playing ? "Playing" : "Paused");
+     674                 :             : 
+     675         [ +  - ]:           2 :   if (valent_packet_get_boolean (packet, "shuffle", &shuffle))
+     676                 :           2 :     valent_mpris_device_update_shuffle (player, shuffle);
+     677                 :             : 
+     678         [ +  - ]:           2 :   if (valent_packet_get_int (packet, "volume", &volume))
+     679                 :           2 :     valent_mpris_device_update_volume (player, volume);
+     680                 :           2 : }
+     681                 :             : 
+     682                 :             : /**
+     683                 :             :  * valent_mpris_device_update_art:
+     684                 :             :  * @player: a `ValentMprisDevice`
+     685                 :             :  * @file: a `GFile`
+     686                 :             :  *
+     687                 :             :  * Update the `mpris:artUrl` metadata field from @file.
+     688                 :             :  */
+     689                 :             : void
+     690                 :           1 : valent_mpris_device_update_art (ValentMprisDevice *player,
+     691                 :             :                                 GFile             *file)
+     692                 :             : {
+     693                 :           1 :   GVariantDict dict;
+     694                 :           1 :   GVariant *metadata;
+     695                 :           2 :   g_autofree char *uri = NULL;
+     696                 :             : 
+     697         [ +  - ]:           1 :   g_assert (VALENT_IS_MPRIS_DEVICE (player));
+     698   [ +  -  +  -  :           1 :   g_assert (G_IS_FILE (file));
+             +  -  -  + ]
+     699                 :             : 
+     700                 :           1 :   uri = g_file_get_uri (file);
+     701                 :             : 
+     702                 :           1 :   g_variant_dict_init (&dict, player->metadata);
+     703                 :           1 :   g_variant_dict_insert (&dict, "mpris:artUrl", "s", uri);
+     704                 :           1 :   metadata = g_variant_dict_end (&dict);
+     705                 :             : 
+     706                 :           1 :   valent_mpris_device_update_metadata (player, metadata);
+     707                 :           1 : }
+     708                 :             : 
+     709                 :             : /**
+     710                 :             :  * valent_media_player_update_name:
+     711                 :             :  * @player: a `ValentMprisDevice`
+     712                 :             :  * @name: a name
+     713                 :             :  *
+     714                 :             :  * Set the user-visible name of the player to @identity.
+     715                 :             :  */
+     716                 :             : void
+     717                 :           1 : valent_mpris_device_update_name (ValentMprisDevice *player,
+     718                 :             :                                  const char        *name)
+     719                 :             : {
+     720         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_MPRIS_DEVICE (player));
+     721         [ -  + ]:           1 :   g_return_if_fail (name != NULL);
+     722                 :             : 
+     723         [ +  - ]:           1 :   if (g_set_str (&player->name, name))
+     724                 :           1 :     g_object_notify (G_OBJECT (player), "name");
+     725                 :             : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-device.h.func-c.html b/coverage/src/plugins/mpris/valent-mpris-device.h.func-c.html new file mode 100644 index 00000000000..5f160df7c06 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-device.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-device.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %86
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_DEVICE20
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-device.h.func.html b/coverage/src/plugins/mpris/valent-mpris-device.h.func.html new file mode 100644 index 00000000000..c733ba6efe4 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-device.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-device.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %86
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_DEVICE20
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-device.h.gcov.html b/coverage/src/plugins/mpris/valent-mpris-device.h.gcov.html new file mode 100644 index 00000000000..48e92c0ad51 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-device.h.gcov.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-device.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-device.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %86
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MPRIS_DEVICE (valent_mpris_device_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          22 : G_DECLARE_FINAL_TYPE (ValentMprisDevice, valent_mpris_device, VALENT, MPRIS_DEVICE, ValentMediaPlayer)
+             +  +  +  + ]
+      13                 :             : 
+      14                 :             : ValentMprisDevice * valent_mpris_device_new             (ValentDevice         *player);
+      15                 :             : void                valent_mpris_device_handle_packet   (ValentMprisDevice    *player,
+      16                 :             :                                                          JsonNode             *packet);
+      17                 :             : void                valent_mpris_device_update_art      (ValentMprisDevice    *player,
+      18                 :             :                                                          GFile                *file);
+      19                 :             : void                valent_mpris_device_update_name     (ValentMprisDevice    *player,
+      20                 :             :                                                          const char           *name);
+      21                 :             : 
+      22                 :             : G_END_DECLS
+      23                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-impl.c.func-c.html b/coverage/src/plugins/mpris/valent-mpris-impl.c.func-c.html new file mode 100644 index 00000000000..4851495efc5 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-impl.c.func-c.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-impl.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-impl.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.2 %362323
Test Date:2024-03-31 18:46:36Functions:96.0 %2524
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.1 %264164
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
application_method_call0
valent_mpris_impl_get_property1
valent_mpris_impl_class_init2
valent_mpris_impl_constructed5
valent_mpris_impl_dispose5
valent_mpris_impl_export5
valent_mpris_impl_export_finish5
valent_mpris_impl_export_full5
valent_mpris_impl_export_full_cb5
valent_mpris_impl_finalize5
valent_mpris_impl_init5
valent_mpris_impl_new5
valent_mpris_impl_set_property5
valent_mpris_impl_propagate_seeked7
player_set_property9
valent_mpris_impl_unexport14
player_method_call20
valent_mpris_impl_flush27
application_get_property45
valent_mpris_impl_propagate_notify77
player_get_property79
valent_mpris_impl_set_value150
valent_mpris_impl_get_type368
valent_mpris_impl_class_intern_init2
valent_mpris_impl_get_type_once2
valent_mpris_impl_get_type364
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-impl.c.func.html b/coverage/src/plugins/mpris/valent-mpris-impl.c.func.html new file mode 100644 index 00000000000..e7c4df32c8a --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-impl.c.func.html @@ -0,0 +1,273 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-impl.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-impl.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.2 %362323
Test Date:2024-03-31 18:46:36Functions:96.0 %2524
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.1 %264164
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
application_get_property45
application_method_call0
player_get_property79
player_method_call20
player_set_property9
valent_mpris_impl_class_init2
valent_mpris_impl_constructed5
valent_mpris_impl_dispose5
valent_mpris_impl_export5
valent_mpris_impl_export_finish5
valent_mpris_impl_export_full5
valent_mpris_impl_export_full_cb5
valent_mpris_impl_finalize5
valent_mpris_impl_flush27
valent_mpris_impl_get_property1
valent_mpris_impl_get_type368
valent_mpris_impl_class_intern_init2
valent_mpris_impl_get_type364
valent_mpris_impl_get_type_once2
valent_mpris_impl_init5
valent_mpris_impl_new5
valent_mpris_impl_propagate_notify77
valent_mpris_impl_propagate_seeked7
valent_mpris_impl_set_property5
valent_mpris_impl_set_value150
valent_mpris_impl_unexport14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-impl.c.gcov.html b/coverage/src/plugins/mpris/valent-mpris-impl.c.gcov.html new file mode 100644 index 00000000000..5c27aab9dfe --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-impl.c.gcov.html @@ -0,0 +1,996 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-impl.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-impl.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.2 %362323
Test Date:2024-03-31 18:46:36Functions:96.0 %2524
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.1 %264164
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mpris-impl"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-mpris-impl.h"
+      12                 :             : #include "valent-mpris-utils.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentMPRISImpl
+      16                 :             : {
+      17                 :             :   GObject               parent_instance;
+      18                 :             : 
+      19                 :             :   ValentMediaPlayer    *player;
+      20                 :             :   GDBusConnection      *connection;
+      21                 :             :   char                 *bus_name;
+      22                 :             :   unsigned int          bus_name_id;
+      23                 :             : 
+      24                 :             :   GHashTable           *cache;
+      25                 :             :   GHashTable           *pending;
+      26                 :             :   unsigned int          flush_id;
+      27                 :             : 
+      28                 :             :   /* org.mpris.MediaPlayer2 */
+      29                 :             :   unsigned int          application_id;
+      30                 :             :   GDBusInterfaceVTable  application_vtable;
+      31                 :             : 
+      32                 :             :   /* org.mpris.MediaPlayer2.Player */
+      33                 :             :   unsigned int          player_id;
+      34                 :             :   GDBusInterfaceVTable  player_vtable;
+      35                 :             : };
+      36                 :             : 
+      37   [ +  +  +  - ]:         368 : G_DEFINE_FINAL_TYPE (ValentMPRISImpl, valent_mpris_impl, G_TYPE_OBJECT)
+      38                 :             : 
+      39                 :             : 
+      40                 :             : enum {
+      41                 :             :   PROP_0,
+      42                 :             :   PROP_PLAYER,
+      43                 :             :   N_PROPERTIES
+      44                 :             : };
+      45                 :             : 
+      46                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      47                 :             : 
+      48                 :             : 
+      49                 :             : /*
+      50                 :             :  * org.mpris.MediaPlayer2
+      51                 :             :  */
+      52                 :             : static void
+      53                 :           0 : application_method_call (GDBusConnection       *connection,
+      54                 :             :                          const char            *sender,
+      55                 :             :                          const char            *object_path,
+      56                 :             :                          const char            *interface_name,
+      57                 :             :                          const char            *method_name,
+      58                 :             :                          GVariant              *parameters,
+      59                 :             :                          GDBusMethodInvocation *invocation,
+      60                 :             :                          gpointer               user_data)
+      61                 :             : {
+      62         [ #  # ]:           0 :   g_assert (VALENT_IS_MPRIS_IMPL (user_data));
+      63         [ #  # ]:           0 :   g_assert (method_name != NULL);
+      64                 :             : 
+      65         [ #  # ]:           0 :   if (g_str_equal (method_name, "Raise"))
+      66                 :             :     {
+      67                 :           0 :       GApplication *application = g_application_get_default ();
+      68                 :             : 
+      69         [ #  # ]:           0 :       if (application != NULL)
+      70                 :             :         {
+      71                 :           0 :           g_action_group_activate_action (G_ACTION_GROUP (application),
+      72                 :             :                                           "media-remote",
+      73                 :             :                                           NULL);
+      74                 :             :         }
+      75                 :             :     }
+      76                 :             : 
+      77                 :             :   /* Silently ignore method calls */
+      78                 :           0 :   g_dbus_method_invocation_return_value (invocation, NULL);
+      79                 :           0 : }
+      80                 :             : 
+      81                 :             : static GVariant *
+      82                 :          45 : application_get_property (GDBusConnection  *connection,
+      83                 :             :                           const char       *sender,
+      84                 :             :                           const char       *object_path,
+      85                 :             :                           const char       *interface_name,
+      86                 :             :                           const char       *property_name,
+      87                 :             :                           GError          **error,
+      88                 :             :                           gpointer          user_data)
+      89                 :             : {
+      90                 :          45 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (user_data);
+      91                 :          45 :   GVariant *value = NULL;
+      92                 :             : 
+      93         [ +  - ]:          45 :   g_assert (VALENT_IS_MPRIS_IMPL (self));
+      94         [ -  + ]:          45 :   g_assert (property_name != NULL);
+      95                 :             : 
+      96         [ -  + ]:          45 :   if ((value = g_hash_table_lookup (self->cache, property_name)) != NULL)
+      97                 :           0 :     return g_variant_ref_sink (value);
+      98                 :             : 
+      99         [ +  + ]:          45 :   if (g_str_equal (property_name, "Identity"))
+     100                 :           5 :     value = g_variant_new_string (valent_media_player_get_name (self->player));
+     101         [ +  + ]:          40 :   else if (g_str_equal (property_name, "CanQuit"))
+     102                 :           5 :     value = g_variant_new_boolean (FALSE);
+     103         [ +  + ]:          35 :   else if (g_str_equal (property_name, "CanRaise"))
+     104                 :           5 :     value = g_variant_new_boolean (TRUE);
+     105         [ +  + ]:          30 :   else if (g_str_equal (property_name, "CanSetFullscreen"))
+     106                 :           5 :     value = g_variant_new_boolean (FALSE);
+     107         [ +  + ]:          25 :   else if (g_str_equal (property_name, "DesktopEntry"))
+     108                 :           5 :     value = g_variant_new_string (APPLICATION_ID".desktop");
+     109         [ +  + ]:          20 :   else if (g_str_equal (property_name, "Fullscreen") ||
+     110         [ +  + ]:          15 :            g_str_equal (property_name, "HasTrackList"))
+     111                 :          10 :     value = g_variant_new_boolean (FALSE);
+     112         [ +  + ]:          10 :   else if (g_str_equal (property_name, "SupportedMimeTypes") ||
+     113         [ +  - ]:           5 :            g_str_equal (property_name, "SupportedUriSchemes"))
+     114                 :          10 :     value = g_variant_new_strv (NULL, 0);
+     115                 :             : 
+     116         [ +  - ]:          45 :   if (value != NULL)
+     117                 :             :     {
+     118                 :          90 :       g_hash_table_replace (self->cache,
+     119                 :          45 :                             g_strdup (property_name),
+     120         [ -  + ]:          45 :                             g_variant_ref_sink (value));
+     121                 :             : 
+     122                 :          45 :       return g_variant_ref_sink (value);
+     123                 :             :     }
+     124                 :             : 
+     125                 :           0 :   g_set_error (error,
+     126                 :             :                G_DBUS_ERROR,
+     127                 :             :                G_DBUS_ERROR_UNKNOWN_PROPERTY,
+     128                 :             :                "Unknown property \"%s\"", property_name);
+     129                 :             : 
+     130                 :           0 :   return NULL;
+     131                 :             : }
+     132                 :             : 
+     133                 :             : /* LCOV_EXCL_START */
+     134                 :             : static gboolean
+     135                 :             : application_set_property (GDBusConnection  *connection,
+     136                 :             :                           const char       *sender,
+     137                 :             :                           const char       *object_path,
+     138                 :             :                           const char       *interface_name,
+     139                 :             :                           const char       *property_name,
+     140                 :             :                           GVariant         *value,
+     141                 :             :                           GError          **error,
+     142                 :             :                           gpointer          user_data)
+     143                 :             : {
+     144                 :             :   /* Silently ignore property setters */
+     145                 :             :   return TRUE;
+     146                 :             : }
+     147                 :             : /* LCOV_EXCL_STOP */
+     148                 :             : 
+     149                 :             : /*
+     150                 :             :  * org.mpris.MediaPlayer2.Player
+     151                 :             :  */
+     152                 :             : static void
+     153                 :          20 : player_method_call (GDBusConnection       *connection,
+     154                 :             :                     const char            *sender,
+     155                 :             :                     const char            *object_path,
+     156                 :             :                     const char            *interface_name,
+     157                 :             :                     const char            *method_name,
+     158                 :             :                     GVariant              *parameters,
+     159                 :             :                     GDBusMethodInvocation *invocation,
+     160                 :             :                     gpointer               user_data)
+     161                 :             : {
+     162                 :          20 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (user_data);
+     163                 :             : 
+     164         [ +  - ]:          20 :   g_assert (VALENT_IS_MPRIS_IMPL (self));
+     165         [ -  + ]:          20 :   g_assert (method_name != NULL);
+     166                 :             : 
+     167         [ +  + ]:          20 :   if (g_str_equal (method_name, "Next"))
+     168                 :             :     {
+     169                 :           3 :       valent_media_player_next (self->player);
+     170                 :             :     }
+     171         [ +  + ]:          17 :   else if (g_str_equal (method_name, "Pause"))
+     172                 :             :     {
+     173                 :           3 :       valent_media_player_pause (self->player);
+     174                 :             :     }
+     175         [ +  + ]:          14 :   else if (g_str_equal (method_name, "Play"))
+     176                 :             :     {
+     177                 :           3 :       valent_media_player_play (self->player);
+     178                 :             :     }
+     179         [ -  + ]:          11 :   else if (g_str_equal (method_name, "PlayPause"))
+     180                 :             :     {
+     181   [ #  #  #  #  :           0 :       valent_mpris_play_pause (self->player);
+                   #  # ]
+     182                 :             :     }
+     183         [ +  + ]:          11 :   else if (g_str_equal (method_name, "Previous"))
+     184                 :             :     {
+     185                 :           3 :       valent_media_player_previous (self->player);
+     186                 :             :     }
+     187         [ +  + ]:           8 :   else if (g_str_equal (method_name, "Seek"))
+     188                 :             :     {
+     189                 :           3 :       int64_t offset_us;
+     190                 :             : 
+     191                 :             :       /* Convert microseconds to seconds */
+     192                 :           3 :       g_variant_get (parameters, "(x)", &offset_us);
+     193                 :           3 :       valent_media_player_seek (self->player, offset_us / G_TIME_SPAN_SECOND);
+     194                 :             :     }
+     195         [ +  + ]:           5 :   else if (g_str_equal (method_name, "SetPosition"))
+     196                 :             :     {
+     197                 :           2 :       int64_t position_us;
+     198                 :             : 
+     199                 :             :       /* Convert microseconds to seconds */
+     200                 :           2 :       g_variant_get (parameters, "(&ox)", NULL, &position_us);
+     201                 :           2 :       valent_media_player_set_position (self->player, position_us / G_TIME_SPAN_SECOND);
+     202                 :             :     }
+     203         [ +  - ]:           3 :   else if (g_str_equal (method_name, "Stop"))
+     204                 :             :     {
+     205                 :           3 :       valent_media_player_stop (self->player);
+     206                 :             :     }
+     207         [ #  # ]:           0 :   else if (g_str_equal (method_name, "OpenUri"))
+     208                 :             :     {
+     209                 :             :       /* Silently ignore method calls */
+     210                 :             :     }
+     211                 :             :   else
+     212                 :             :     {
+     213                 :           0 :       g_dbus_method_invocation_return_error (invocation,
+     214                 :             :                                              G_DBUS_ERROR,
+     215                 :             :                                              G_DBUS_ERROR_UNKNOWN_METHOD,
+     216                 :             :                                              "Unknown method \"%s\"",
+     217                 :             :                                              method_name);
+     218                 :           0 :       return;
+     219                 :             :     }
+     220                 :             : 
+     221                 :          20 :   g_dbus_method_invocation_return_value (invocation, NULL);
+     222                 :             : }
+     223                 :             : 
+     224                 :             : static GVariant *
+     225                 :          79 : player_get_property (GDBusConnection  *connection,
+     226                 :             :                      const char       *sender,
+     227                 :             :                      const char       *object_path,
+     228                 :             :                      const char       *interface_name,
+     229                 :             :                      const char       *property_name,
+     230                 :             :                      GError          **error,
+     231                 :             :                      gpointer          user_data)
+     232                 :             : {
+     233                 :          79 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (user_data);
+     234                 :          79 :   ValentMediaActions flags = VALENT_MEDIA_ACTION_NONE;
+     235                 :          79 :   GVariant *value;
+     236                 :             : 
+     237         [ +  - ]:          79 :   g_assert (VALENT_IS_MPRIS_IMPL (self));
+     238         [ -  + ]:          79 :   g_assert (property_name != NULL);
+     239                 :             : 
+     240                 :             :   /* Check cache */
+     241         [ -  + ]:          79 :   if ((value = g_hash_table_lookup (self->cache, property_name)) != NULL)
+     242                 :           0 :     return g_variant_ref (value);
+     243                 :             : 
+     244                 :             :   /* The `Position` is not cached, because `PropertiesChanged` is not emitted */
+     245         [ +  + ]:          79 :   if (g_str_equal (property_name, "Position"))
+     246                 :             :     {
+     247                 :           9 :       double position = valent_media_player_get_position (self->player);
+     248                 :             : 
+     249                 :             :       /* Convert seconds to microseconds */
+     250                 :           9 :       return g_variant_new_int64 (position * G_TIME_SPAN_SECOND);
+     251                 :             :     }
+     252                 :             : 
+     253                 :             :   /* Load properties */
+     254         [ +  + ]:          70 :   if (*property_name == 'C')
+     255                 :          30 :     flags = valent_media_player_get_flags (self->player);
+     256                 :             : 
+     257         [ +  + ]:          70 :   if (g_str_equal (property_name, "CanControl"))
+     258                 :             :     {
+     259                 :           5 :       value = g_variant_new_boolean (flags != 0);
+     260                 :             :     }
+     261         [ +  + ]:          65 :   else if (g_str_equal (property_name, "CanGoNext"))
+     262                 :             :     {
+     263                 :           5 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_NEXT) != 0);
+     264                 :             :     }
+     265         [ +  + ]:          60 :   else if (g_str_equal (property_name, "CanGoPrevious"))
+     266                 :             :     {
+     267                 :           5 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_PREVIOUS) != 0);
+     268                 :             :     }
+     269         [ +  + ]:          55 :   else if (g_str_equal (property_name, "CanPlay"))
+     270                 :             :     {
+     271                 :           5 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_PLAY) != 0);
+     272                 :             :     }
+     273         [ +  + ]:          50 :   else if (g_str_equal (property_name, "CanPause"))
+     274                 :             :     {
+     275                 :           5 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_PAUSE) != 0);
+     276                 :             :     }
+     277         [ +  + ]:          45 :   else if (g_str_equal (property_name, "CanSeek"))
+     278                 :             :     {
+     279                 :           5 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_SEEK) != 0);
+     280                 :             :     }
+     281         [ +  + ]:          40 :   else if (g_str_equal (property_name, "Metadata"))
+     282                 :             :     {
+     283                 :           5 :       value = valent_media_player_get_metadata (self->player);
+     284                 :             :     }
+     285         [ +  + ]:          35 :   else if (g_str_equal (property_name, "LoopStatus"))
+     286                 :             :     {
+     287                 :           5 :       ValentMediaRepeat repeat = valent_media_player_get_repeat (self->player);
+     288                 :             : 
+     289                 :           5 :       value = g_variant_new_string (valent_mpris_repeat_to_string (repeat));
+     290                 :             :     }
+     291         [ +  + ]:          30 :   else if (g_str_equal (property_name, "Shuffle"))
+     292                 :             :     {
+     293                 :           5 :       gboolean shuffle = valent_media_player_get_shuffle (self->player);
+     294                 :             : 
+     295                 :           5 :       value = g_variant_new_boolean (shuffle);
+     296                 :             :     }
+     297         [ +  + ]:          25 :   else if (g_str_equal (property_name, "PlaybackStatus"))
+     298                 :             :     {
+     299                 :           5 :       ValentMediaState state = valent_media_player_get_state (self->player);
+     300                 :             : 
+     301                 :           5 :       value = g_variant_new_string (valent_mpris_state_to_string (state));
+     302                 :             :     }
+     303         [ +  + ]:          20 :   else if (g_str_equal (property_name, "Volume"))
+     304                 :             :     {
+     305                 :           5 :       double volume = valent_media_player_get_volume (self->player);
+     306                 :             : 
+     307                 :           5 :       value = g_variant_new_double (volume);
+     308                 :             :     }
+     309         [ +  + ]:          15 :   else if (g_str_equal (property_name, "Rate") ||
+     310         [ +  + ]:          10 :            g_str_equal (property_name, "MaximumRate") ||
+     311         [ +  - ]:           5 :            g_str_equal (property_name, "MinimumRate"))
+     312                 :             :     {
+     313                 :          15 :       value = g_variant_new_double (1.0);
+     314                 :             :     }
+     315                 :             : 
+     316         [ +  - ]:          70 :   if (value != NULL)
+     317                 :             :     {
+     318                 :         140 :       g_hash_table_replace (self->cache,
+     319                 :          70 :                             g_strdup (property_name),
+     320         [ -  + ]:          70 :                             g_variant_take_ref (value));
+     321                 :             : 
+     322                 :          70 :       return g_variant_ref (value);
+     323                 :             :     }
+     324                 :             : 
+     325                 :           0 :   g_set_error (error,
+     326                 :             :                G_DBUS_ERROR,
+     327                 :             :                G_DBUS_ERROR_UNKNOWN_PROPERTY,
+     328                 :             :                "Unknown property \"%s\"",
+     329                 :             :                property_name);
+     330                 :             : 
+     331                 :           0 :   return NULL;
+     332                 :             : }
+     333                 :             : 
+     334                 :             : static gboolean
+     335                 :           9 : player_set_property (GDBusConnection  *connection,
+     336                 :             :                      const char       *sender,
+     337                 :             :                      const char       *object_path,
+     338                 :             :                      const char       *interface_name,
+     339                 :             :                      const char       *property_name,
+     340                 :             :                      GVariant         *value,
+     341                 :             :                      GError          **error,
+     342                 :             :                      gpointer          user_data)
+     343                 :             : {
+     344                 :           9 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (user_data);
+     345                 :             : 
+     346         [ +  - ]:           9 :   g_assert (VALENT_IS_MPRIS_IMPL (self));
+     347         [ -  + ]:           9 :   g_assert (property_name != NULL);
+     348                 :             : 
+     349         [ +  + ]:           9 :   if (g_str_equal (property_name, "LoopStatus"))
+     350                 :             :     {
+     351                 :           3 :       const char *loop_status = g_variant_get_string (value, NULL);
+     352                 :           3 :       ValentMediaRepeat repeat = valent_mpris_repeat_from_string (loop_status);
+     353                 :             : 
+     354                 :           3 :       valent_media_player_set_repeat (self->player, repeat);
+     355                 :           3 :       return TRUE;
+     356                 :             :     }
+     357                 :             : 
+     358         [ +  + ]:           6 :   if (g_str_equal (property_name, "Shuffle"))
+     359                 :             :     {
+     360                 :           3 :       gboolean shuffle = g_variant_get_boolean (value);
+     361                 :             : 
+     362                 :           3 :       valent_media_player_set_shuffle (self->player, shuffle);
+     363                 :           3 :       return TRUE;
+     364                 :             :     }
+     365                 :             : 
+     366         [ +  - ]:           3 :   if (g_str_equal (property_name, "Volume"))
+     367                 :             :     {
+     368                 :           3 :       double volume = g_variant_get_double (value);
+     369                 :             : 
+     370                 :           3 :       valent_media_player_set_volume (self->player, volume);
+     371                 :           3 :       return TRUE;
+     372                 :             :     }
+     373                 :             : 
+     374                 :             :   return TRUE;
+     375                 :             : }
+     376                 :             : 
+     377                 :             : static gboolean
+     378                 :          27 : valent_mpris_impl_flush (gpointer data)
+     379                 :             : {
+     380                 :          27 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (data);
+     381                 :          54 :   g_autoptr (GError) error = NULL;
+     382                 :          27 :   GVariant *parameters;
+     383                 :          27 :   GVariantBuilder changed_props;
+     384                 :          27 :   GVariantBuilder invalidated_props;
+     385                 :          27 :   GHashTableIter iter;
+     386                 :          27 :   GVariant *value;
+     387                 :          27 :   char *name;
+     388                 :             : 
+     389         [ +  - ]:          27 :   g_assert (VALENT_IS_MPRIS_IMPL (self));
+     390                 :             : 
+     391         [ +  - ]:          27 :   if (self->connection != NULL)
+     392                 :             :     {
+     393                 :          27 :       g_variant_builder_init (&changed_props, G_VARIANT_TYPE_VARDICT);
+     394                 :          27 :       g_variant_builder_init (&invalidated_props, G_VARIANT_TYPE_STRING_ARRAY);
+     395                 :             : 
+     396                 :          27 :       g_hash_table_iter_init (&iter, self->pending);
+     397                 :             : 
+     398         [ +  + ]:         166 :       while (g_hash_table_iter_next (&iter, (void**)&name, (void**)&value))
+     399                 :             :         {
+     400         [ +  - ]:         139 :           if (value)
+     401                 :         139 :             g_variant_builder_add (&changed_props, "{sv}", name, value);
+     402                 :             :           else
+     403                 :           0 :             g_variant_builder_add (&invalidated_props, "s", name);
+     404                 :             : 
+     405                 :         139 :           g_hash_table_iter_remove (&iter);
+     406                 :             :         }
+     407                 :             : 
+     408                 :          27 :       parameters = g_variant_new ("(s@a{sv}@as)",
+     409                 :             :                                   "org.mpris.MediaPlayer2.Player",
+     410                 :             :                                   g_variant_builder_end (&changed_props),
+     411                 :             :                                   g_variant_builder_end (&invalidated_props));
+     412                 :             : 
+     413                 :          27 :       g_dbus_connection_emit_signal (self->connection,
+     414                 :             :                                      NULL,
+     415                 :             :                                      "/org/mpris/MediaPlayer2",
+     416                 :             :                                      "org.freedesktop.DBus.Properties",
+     417                 :             :                                      "PropertiesChanged",
+     418                 :             :                                      parameters,
+     419                 :             :                                      &error);
+     420                 :             : 
+     421         [ -  + ]:          27 :       if (error != NULL)
+     422                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     423                 :             :     }
+     424                 :             : 
+     425         [ +  - ]:          27 :   g_clear_handle_id (&self->flush_id, g_source_remove);
+     426                 :             : 
+     427         [ -  + ]:          27 :   return G_SOURCE_REMOVE;
+     428                 :             : }
+     429                 :             : 
+     430                 :             : static void
+     431                 :         150 : valent_mpris_impl_set_value (ValentMPRISImpl *self,
+     432                 :             :                              const char      *name,
+     433                 :             :                              GVariant        *value)
+     434                 :             : {
+     435         [ +  - ]:         150 :   g_assert (VALENT_IS_MPRIS_IMPL (self));
+     436   [ +  -  -  + ]:         150 :   g_assert (name != NULL && *name != '\0');
+     437         [ -  + ]:         150 :   g_assert (value != NULL);
+     438                 :             : 
+     439                 :         300 :   g_hash_table_replace (self->cache,
+     440                 :         150 :                         g_strdup (name),
+     441         [ -  + ]:         150 :                         g_variant_ref_sink (value));
+     442                 :         300 :   g_hash_table_replace (self->pending,
+     443                 :         150 :                         g_strdup (name),
+     444         [ -  + ]:         150 :                         g_variant_ref_sink (value));
+     445                 :             : 
+     446         [ +  + ]:         150 :   if (self->flush_id == 0)
+     447                 :          27 :     self->flush_id = g_idle_add (valent_mpris_impl_flush, self);
+     448                 :         150 : }
+     449                 :             : 
+     450                 :             : static void
+     451                 :           7 : valent_mpris_impl_propagate_seeked (ValentMPRISImpl *self,
+     452                 :             :                                     int64_t          position)
+     453                 :             : {
+     454                 :           7 :   g_autoptr (GError) error = NULL;
+     455                 :           7 :   gboolean ret;
+     456                 :             : 
+     457         [ -  + ]:           7 :   if (self->connection == NULL)
+     458                 :           0 :     return;
+     459                 :             : 
+     460                 :           7 :   ret = g_dbus_connection_emit_signal (self->connection,
+     461                 :             :                                        NULL,
+     462                 :             :                                        "/org/mpris/MediaPlayer2",
+     463                 :             :                                        "org.mpris.MediaPlayer2.Player",
+     464                 :             :                                        "Seeked",
+     465                 :             :                                        g_variant_new ("(x)", position),
+     466                 :             :                                        &error);
+     467                 :             : 
+     468         [ -  + ]:           7 :   if (!ret)
+     469                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     470                 :             : }
+     471                 :             : 
+     472                 :             : static void
+     473                 :          77 : valent_mpris_impl_propagate_notify (ValentMediaPlayer *player,
+     474                 :             :                                     GParamSpec        *pspec,
+     475                 :             :                                     ValentMPRISImpl   *self)
+     476                 :             : {
+     477                 :          77 :   const char *name = g_param_spec_get_name (pspec);
+     478                 :          77 :   GVariant *value = NULL;
+     479                 :             : 
+     480         [ +  + ]:          77 :   if (g_str_equal (name, "flags"))
+     481                 :             :     {
+     482                 :          16 :       ValentMediaActions flags = valent_media_player_get_flags (self->player);
+     483                 :             : 
+     484                 :          16 :       value = g_variant_new_boolean (flags != 0);
+     485                 :          16 :       valent_mpris_impl_set_value (self, "CanControl", value);
+     486                 :          16 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_NEXT) != 0);
+     487                 :          16 :       valent_mpris_impl_set_value (self, "CanGoNext", value);
+     488                 :          16 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_PAUSE) != 0);
+     489                 :          16 :       valent_mpris_impl_set_value (self, "CanPause", value);
+     490                 :          16 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_PLAY) != 0);
+     491                 :          16 :       valent_mpris_impl_set_value (self, "CanPlay", value);
+     492                 :          16 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_PREVIOUS) != 0);
+     493                 :          16 :       valent_mpris_impl_set_value (self, "CanGoPrevious", value);
+     494                 :          16 :       value = g_variant_new_boolean ((flags & VALENT_MEDIA_ACTION_SEEK) != 0);
+     495                 :          16 :       valent_mpris_impl_set_value (self, "CanSeek", value);
+     496                 :             :     }
+     497         [ +  + ]:          61 :   else if (g_str_equal (name, "metadata"))
+     498                 :             :     {
+     499                 :          19 :       value = valent_media_player_get_metadata (self->player);
+     500                 :          19 :       valent_mpris_impl_set_value (self, "Metadata", value);
+     501                 :          19 :       g_variant_unref (value);
+     502                 :             :     }
+     503         [ -  + ]:          42 :   else if (g_str_equal (name, "name"))
+     504                 :             :     {
+     505                 :           0 :       const char *identity = valent_media_player_get_name (self->player);
+     506                 :             : 
+     507                 :           0 :       value = g_variant_new_string (identity);
+     508                 :           0 :       g_hash_table_replace (self->cache,
+     509                 :           0 :                             g_strdup ("Identity"),
+     510                 :           0 :                             g_variant_ref_sink (value));
+     511                 :             :     }
+     512         [ +  + ]:          42 :   else if (g_str_equal (name, "position"))
+     513                 :             :     {
+     514                 :           7 :       double position = valent_media_player_get_position (self->player);
+     515                 :             : 
+     516                 :             :       /* Convert seconds to microseconds */
+     517                 :           7 :       value = g_variant_new_int64 (position * G_TIME_SPAN_SECOND);
+     518                 :          14 :       g_hash_table_replace (self->cache,
+     519                 :           7 :                             g_strdup ("Position"),
+     520                 :           7 :                             g_variant_ref_sink (value));
+     521                 :             : 
+     522                 :             :       /* Convert seconds to microseconds */
+     523                 :           7 :       valent_mpris_impl_propagate_seeked (self, position * G_TIME_SPAN_SECOND);
+     524                 :             :     }
+     525         [ +  + ]:          35 :   else if (g_str_equal (name, "repeat"))
+     526                 :             :     {
+     527                 :           3 :       ValentMediaRepeat repeat = valent_media_player_get_repeat (self->player);
+     528                 :             : 
+     529                 :           3 :       value = g_variant_new_string (valent_mpris_repeat_to_string (repeat));
+     530                 :           3 :       valent_mpris_impl_set_value (self, "LoopStatus", value);
+     531                 :             :     }
+     532         [ +  + ]:          32 :   else if (g_str_equal (name, "shuffle"))
+     533                 :             :     {
+     534                 :           3 :       gboolean shuffle = valent_media_player_get_shuffle (self->player);
+     535                 :             : 
+     536                 :           3 :       value = g_variant_new_boolean (shuffle);
+     537                 :           3 :       valent_mpris_impl_set_value (self, "Shuffle", value);
+     538                 :             :     }
+     539         [ +  + ]:          29 :   else if (g_str_equal (name, "state"))
+     540                 :             :     {
+     541                 :          26 :       ValentMediaState state = valent_media_player_get_state (self->player);
+     542                 :             : 
+     543                 :          26 :       value = g_variant_new_string (valent_mpris_state_to_string (state));
+     544                 :          26 :       valent_mpris_impl_set_value (self, "PlaybackStatus", value);
+     545                 :             :     }
+     546         [ +  - ]:           3 :   else if (g_str_equal (name, "volume"))
+     547                 :             :     {
+     548                 :           3 :       double volume = valent_media_player_get_volume (self->player);
+     549                 :             : 
+     550                 :           3 :       value = g_variant_new_double (volume);
+     551                 :           3 :       valent_mpris_impl_set_value (self, "Volume", value);
+     552                 :             :     }
+     553                 :          77 : }
+     554                 :             : 
+     555                 :             : /*
+     556                 :             :  * GObject
+     557                 :             :  */
+     558                 :             : static void
+     559                 :           5 : valent_mpris_impl_constructed (GObject *object)
+     560                 :             : {
+     561                 :           5 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (object);
+     562                 :             : 
+     563         [ +  - ]:           5 :   g_assert (VALENT_IS_MEDIA_PLAYER (self->player));
+     564                 :             : 
+     565                 :           5 :   g_signal_connect_object (self->player,
+     566                 :             :                            "notify",
+     567                 :             :                            G_CALLBACK (valent_mpris_impl_propagate_notify),
+     568                 :             :                            self, 0);
+     569                 :             : 
+     570                 :           5 :   G_OBJECT_CLASS (valent_mpris_impl_parent_class)->constructed (object);
+     571                 :           5 : }
+     572                 :             : 
+     573                 :             : static void
+     574                 :           5 : valent_mpris_impl_dispose (GObject *object)
+     575                 :             : {
+     576                 :           5 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (object);
+     577                 :             : 
+     578                 :           5 :   g_signal_handlers_disconnect_by_data (self->player, self);
+     579                 :           5 :   valent_mpris_impl_unexport (self);
+     580                 :             : 
+     581                 :           5 :   G_OBJECT_CLASS (valent_mpris_impl_parent_class)->dispose (object);
+     582                 :           5 : }
+     583                 :             : 
+     584                 :             : static void
+     585                 :           5 : valent_mpris_impl_finalize (GObject *object)
+     586                 :             : {
+     587                 :           5 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (object);
+     588                 :             : 
+     589         [ +  - ]:           5 :   g_clear_pointer (&self->bus_name, g_free);
+     590         [ -  + ]:           5 :   g_clear_object (&self->connection);
+     591         [ +  - ]:           5 :   g_clear_object (&self->player);
+     592                 :             : 
+     593         [ +  - ]:           5 :   g_clear_pointer (&self->cache, g_hash_table_unref);
+     594         [ +  - ]:           5 :   g_clear_pointer (&self->pending, g_hash_table_unref);
+     595                 :             : 
+     596                 :           5 :   G_OBJECT_CLASS (valent_mpris_impl_parent_class)->finalize (object);
+     597                 :           5 : }
+     598                 :             : 
+     599                 :             : static void
+     600                 :           1 : valent_mpris_impl_get_property (GObject    *object,
+     601                 :             :                                 guint       prop_id,
+     602                 :             :                                 GValue     *value,
+     603                 :             :                                 GParamSpec *pspec)
+     604                 :             : {
+     605                 :           1 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (object);
+     606                 :             : 
+     607         [ +  - ]:           1 :   switch (prop_id)
+     608                 :             :     {
+     609                 :           1 :     case PROP_PLAYER:
+     610                 :           1 :       g_value_set_object (value, self->player);
+     611                 :           1 :       break;
+     612                 :             : 
+     613                 :           0 :     default:
+     614                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     615                 :             :     }
+     616                 :           1 : }
+     617                 :             : 
+     618                 :             : static void
+     619                 :           5 : valent_mpris_impl_set_property (GObject      *object,
+     620                 :             :                                 guint         prop_id,
+     621                 :             :                                 const GValue *value,
+     622                 :             :                                 GParamSpec   *pspec)
+     623                 :             : {
+     624                 :           5 :   ValentMPRISImpl *self = VALENT_MPRIS_IMPL (object);
+     625                 :             : 
+     626         [ +  - ]:           5 :   switch (prop_id)
+     627                 :             :     {
+     628                 :           5 :     case PROP_PLAYER:
+     629                 :           5 :       self->player = g_value_dup_object (value);
+     630                 :           5 :       break;
+     631                 :             : 
+     632                 :           0 :     default:
+     633                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     634                 :             :     }
+     635                 :           5 : }
+     636                 :             : 
+     637                 :             : static void
+     638                 :           2 : valent_mpris_impl_class_init (ValentMPRISImplClass *klass)
+     639                 :             : {
+     640                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     641                 :             : 
+     642                 :           2 :   object_class->constructed = valent_mpris_impl_constructed;
+     643                 :           2 :   object_class->dispose = valent_mpris_impl_dispose;
+     644                 :           2 :   object_class->finalize = valent_mpris_impl_finalize;
+     645                 :           2 :   object_class->get_property = valent_mpris_impl_get_property;
+     646                 :           2 :   object_class->set_property = valent_mpris_impl_set_property;
+     647                 :             : 
+     648                 :             :   /**
+     649                 :             :    * ValentMprisDevice:player:
+     650                 :             :    *
+     651                 :             :    * The [class@Valent.MediaPlayer] being exported.
+     652                 :             :    */
+     653                 :           4 :   properties [PROP_PLAYER] =
+     654                 :           2 :     g_param_spec_object ("player", NULL, NULL,
+     655                 :             :                          VALENT_TYPE_MEDIA_PLAYER,
+     656                 :             :                          (G_PARAM_READWRITE |
+     657                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     658                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     659                 :             :                           G_PARAM_STATIC_STRINGS));
+     660                 :             : 
+     661                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     662                 :           2 : }
+     663                 :             : 
+     664                 :             : static void
+     665                 :           5 : valent_mpris_impl_init (ValentMPRISImpl *self)
+     666                 :             : {
+     667                 :           5 :   self->application_vtable.method_call = application_method_call;
+     668                 :           5 :   self->application_vtable.get_property = application_get_property;
+     669                 :           5 :   self->application_vtable.set_property = application_set_property;
+     670                 :             : 
+     671                 :           5 :   self->player_vtable.method_call = player_method_call;
+     672                 :           5 :   self->player_vtable.get_property = player_get_property;
+     673                 :           5 :   self->player_vtable.set_property = player_set_property;
+     674                 :             : 
+     675                 :           5 :   self->bus_name = g_strdup (VALENT_MPRIS_DBUS_NAME);
+     676                 :           5 :   self->cache = g_hash_table_new_full (g_str_hash,
+     677                 :             :                                        g_str_equal,
+     678                 :             :                                        g_free,
+     679                 :             :                                        (GDestroyNotify)g_variant_unref);
+     680                 :           5 :   self->pending = g_hash_table_new_full (g_str_hash,
+     681                 :             :                                          g_str_equal,
+     682                 :             :                                          g_free,
+     683                 :             :                                          (GDestroyNotify)g_variant_unref);
+     684                 :           5 : }
+     685                 :             : 
+     686                 :             : /**
+     687                 :             :  * valent_mpris_impl_new:
+     688                 :             :  * @player: a `ValentMediaPlayer`
+     689                 :             :  *
+     690                 :             :  * Get the `ValentMPRISImpl` instance.
+     691                 :             :  *
+     692                 :             :  * Returns: (transfer full) (nullable): a `ValentMPRISImpl`
+     693                 :             :  */
+     694                 :             : ValentMPRISImpl *
+     695                 :           5 : valent_mpris_impl_new (ValentMediaPlayer *player)
+     696                 :             : {
+     697         [ +  - ]:           5 :   g_return_val_if_fail (VALENT_IS_MEDIA_PLAYER (player), NULL);
+     698                 :             : 
+     699                 :           5 :   return g_object_new (VALENT_TYPE_MPRIS_IMPL,
+     700                 :             :                        "player", player,
+     701                 :             :                        NULL);
+     702                 :             : }
+     703                 :             : 
+     704                 :             : /**
+     705                 :             :  * valent_media_player_impl_export:
+     706                 :             :  * @impl: a `ValentMPRISImpl`
+     707                 :             :  * @connection: a `GDBusConnection`
+     708                 :             :  * @error:
+     709                 :             :  *
+     710                 :             :  * Impl @impl on @connection.
+     711                 :             :  */
+     712                 :             : gboolean
+     713                 :           5 : valent_mpris_impl_export (ValentMPRISImpl  *impl,
+     714                 :             :                           GDBusConnection  *connection,
+     715                 :             :                           GError          **error)
+     716                 :             : {
+     717         [ +  - ]:           5 :   g_return_val_if_fail (VALENT_IS_MPRIS_IMPL (impl), FALSE);
+     718   [ +  -  +  -  :           5 :   g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE);
+             -  +  -  - ]
+     719   [ +  -  -  + ]:           5 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     720                 :             : 
+     721         [ -  + ]:           5 :   if (impl->connection == connection)
+     722                 :             :     return TRUE;
+     723                 :             : 
+     724                 :             :   /* Unexport from any existing connection */
+     725                 :           5 :   valent_mpris_impl_unexport (impl);
+     726                 :           5 :   impl->connection = g_object_ref (connection);
+     727                 :             : 
+     728                 :             :   /* Register org.mpris.MediaPlayer2 interface */
+     729         [ +  - ]:           5 :   if (impl->application_id == 0)
+     730                 :             :     {
+     731                 :          10 :       impl->application_id =
+     732                 :           5 :         g_dbus_connection_register_object (impl->connection,
+     733                 :             :                                            "/org/mpris/MediaPlayer2",
+     734                 :             :                                            VALENT_MPRIS_APPLICATION_INFO,
+     735                 :           5 :                                            &impl->application_vtable,
+     736                 :             :                                            impl, NULL,
+     737                 :             :                                            error);
+     738                 :             : 
+     739         [ -  + ]:           5 :       if (impl->application_id == 0)
+     740                 :             :         {
+     741                 :           0 :           valent_mpris_impl_unexport (impl);
+     742                 :           0 :           return FALSE;
+     743                 :             :         }
+     744                 :             :     }
+     745                 :             : 
+     746                 :             :   /* Register org.mpris.MediaPlayer2.Player interface */
+     747         [ +  - ]:           5 :   if (impl->player_id == 0)
+     748                 :             :     {
+     749                 :          10 :       impl->player_id =
+     750                 :           5 :         g_dbus_connection_register_object (impl->connection,
+     751                 :             :                                            "/org/mpris/MediaPlayer2",
+     752                 :             :                                            VALENT_MPRIS_PLAYER_INFO,
+     753                 :           5 :                                            &impl->player_vtable,
+     754                 :             :                                            impl, NULL,
+     755                 :             :                                            error);
+     756                 :             : 
+     757         [ -  + ]:           5 :       if (impl->player_id == 0)
+     758                 :             :         {
+     759                 :           0 :           valent_mpris_impl_unexport (impl);
+     760                 :           0 :           return FALSE;
+     761                 :             :         }
+     762                 :             :     }
+     763                 :             : 
+     764                 :             :   /* Own a well-known name on the connection */
+     765         [ -  + ]:           5 :   if (impl->bus_name_id == 0)
+     766                 :             :     {
+     767                 :           5 :       impl->bus_name_id =
+     768                 :           5 :         g_bus_own_name_on_connection (impl->connection,
+     769                 :           5 :                                       impl->bus_name,
+     770                 :             :                                       G_BUS_NAME_OWNER_FLAGS_NONE,
+     771                 :             :                                       NULL, // NameAcquired
+     772                 :             :                                       NULL, // NameLost
+     773                 :             :                                       NULL,
+     774                 :             :                                       NULL);
+     775                 :             :     }
+     776                 :             : 
+     777                 :             :   return TRUE;
+     778                 :             : }
+     779                 :             : 
+     780                 :             : static void
+     781                 :           5 : valent_mpris_impl_export_full_cb (GObject      *object,
+     782                 :             :                                   GAsyncResult *result,
+     783                 :             :                                   gpointer      user_data)
+     784                 :             : {
+     785                 :           5 :   g_autoptr (GTask) task = G_TASK (user_data);
+     786                 :           5 :   ValentMPRISImpl *self = g_task_get_source_object (task);
+     787   [ +  -  -  - ]:           5 :   g_autoptr (GDBusConnection) connection = NULL;
+     788         [ -  - ]:           5 :   g_autoptr (GError) error = NULL;
+     789                 :             : 
+     790                 :           5 :   connection = g_dbus_connection_new_for_address_finish (result, &error);
+     791                 :             : 
+     792         [ -  + ]:           5 :   if (connection == NULL)
+     793                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     794                 :             : 
+     795         [ -  + ]:           5 :   if (!valent_mpris_impl_export (self, connection, &error))
+     796                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     797                 :             : 
+     798         [ -  + ]:           5 :   g_task_return_boolean (task, TRUE);
+     799                 :             : }
+     800                 :             : 
+     801                 :             : /**
+     802                 :             :  * valent_mpris_impl_export_full:
+     803                 :             :  * @impl: a `ValentMPRISImpl`
+     804                 :             :  * @bus_name: the well-known name to own
+     805                 :             :  * @cancellable: (nullable): a `GCancellable`
+     806                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     807                 :             :  * @user_data: (closure): user supplied data
+     808                 :             :  *
+     809                 :             :  * Impl the test media player on the session bus.
+     810                 :             :  */
+     811                 :             : void
+     812                 :           5 : valent_mpris_impl_export_full (ValentMPRISImpl     *impl,
+     813                 :             :                                const char          *bus_name,
+     814                 :             :                                GCancellable        *cancellable,
+     815                 :             :                                GAsyncReadyCallback  callback,
+     816                 :             :                                gpointer             user_data)
+     817                 :             : {
+     818                 :           5 :   g_autoptr (GTask) task = NULL;
+     819         [ -  - ]:           5 :   g_autofree char *address = NULL;
+     820                 :           5 :   g_autoptr (GError) error = NULL;
+     821                 :             : 
+     822         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_MPRIS_IMPL (impl));
+     823         [ -  + ]:           5 :   g_return_if_fail (g_dbus_is_name (bus_name));
+     824   [ +  +  +  -  :           5 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     825                 :             : 
+     826                 :           5 :   task = g_task_new (impl, cancellable, callback, user_data);
+     827         [ +  - ]:           5 :   g_task_set_source_tag (task, valent_mpris_impl_export_full);
+     828                 :             : 
+     829                 :             :   /* Set the new bus name */
+     830                 :           5 :   g_set_str (&impl->bus_name, bus_name);
+     831                 :             : 
+     832                 :             :   /* Set up a dedicated connection */
+     833                 :           5 :   address = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION,
+     834                 :             :                                              cancellable,
+     835                 :             :                                              &error);
+     836                 :             : 
+     837         [ -  + ]:           5 :   if (address == NULL)
+     838                 :           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     839                 :             : 
+     840         [ -  + ]:           5 :   g_dbus_connection_new_for_address (address,
+     841                 :             :                                      G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
+     842                 :             :                                      G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
+     843                 :             :                                      NULL,
+     844                 :             :                                      cancellable,
+     845                 :             :                                      (GAsyncReadyCallback)valent_mpris_impl_export_full_cb,
+     846                 :             :                                      g_steal_pointer (&task));
+     847                 :             : }
+     848                 :             : 
+     849                 :             : /**
+     850                 :             :  * valent_mpris_impl_export_finish:
+     851                 :             :  * @impl: a `ValentMPRISImpl`
+     852                 :             :  * @cancellable: (nullable): a `GCancellable`
+     853                 :             :  * @error: (nullable): a `GError`
+     854                 :             :  *
+     855                 :             :  * Finish an operation started by valent_mpris_impl_export_full().
+     856                 :             :  *
+     857                 :             :  * Returns: %TRUE if successful, or %FALSE with @error set
+     858                 :             :  */
+     859                 :             : gboolean
+     860                 :           5 : valent_mpris_impl_export_finish (ValentMPRISImpl  *impl,
+     861                 :             :                                  GAsyncResult     *result,
+     862                 :             :                                  GError          **error)
+     863                 :             : {
+     864         [ +  - ]:           5 :   g_return_val_if_fail (VALENT_IS_MPRIS_IMPL (impl), FALSE);
+     865         [ -  + ]:           5 :   g_return_val_if_fail (g_task_is_valid (result, impl), FALSE);
+     866   [ +  -  -  + ]:           5 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+     867                 :             : 
+     868                 :           5 :   return g_task_propagate_boolean (G_TASK (result), error);
+     869                 :             : }
+     870                 :             : 
+     871                 :             : /**
+     872                 :             :  * valent_mpris_player_impl_unexport:
+     873                 :             :  * @impl: a `ValentMPRISImpl`
+     874                 :             :  *
+     875                 :             :  * Unexport the player.
+     876                 :             :  */
+     877                 :             : void
+     878                 :          14 : valent_mpris_impl_unexport (ValentMPRISImpl *impl)
+     879                 :             : {
+     880         [ +  - ]:          14 :   g_return_if_fail (VALENT_IS_MPRIS_IMPL (impl));
+     881                 :             : 
+     882         [ -  + ]:          14 :   g_clear_handle_id (&impl->flush_id, g_source_remove);
+     883         [ +  + ]:          14 :   g_clear_handle_id (&impl->bus_name_id, g_bus_unown_name);
+     884                 :             : 
+     885         [ +  + ]:          14 :   if (impl->player_id > 0)
+     886                 :             :     {
+     887                 :           5 :       g_dbus_connection_unregister_object (impl->connection,
+     888                 :             :                                            impl->player_id);
+     889                 :           5 :       impl->player_id = 0;
+     890                 :             :     }
+     891                 :             : 
+     892         [ +  + ]:          14 :   if (impl->application_id > 0)
+     893                 :             :     {
+     894                 :           5 :       g_dbus_connection_unregister_object (impl->connection,
+     895                 :             :                                            impl->application_id);
+     896                 :           5 :       impl->application_id = 0;
+     897                 :             :     }
+     898                 :             : 
+     899         [ +  + ]:          14 :   g_clear_object (&impl->connection);
+     900                 :             : }
+     901                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-impl.h.func-c.html b/coverage/src/plugins/mpris/valent-mpris-impl.h.func-c.html new file mode 100644 index 00000000000..fe85b99bda6 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-impl.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-impl.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-impl.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.3 %127
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_IMPL359
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-impl.h.func.html b/coverage/src/plugins/mpris/valent-mpris-impl.h.func.html new file mode 100644 index 00000000000..872ca85b836 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-impl.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-impl.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-impl.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.3 %127
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_IMPL359
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-impl.h.gcov.html b/coverage/src/plugins/mpris/valent-mpris-impl.h.gcov.html new file mode 100644 index 00000000000..38b823ab3e6 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-impl.h.gcov.html @@ -0,0 +1,123 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-impl.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-impl.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:58.3 %127
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MPRIS_IMPL (valent_mpris_impl_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :         365 : G_DECLARE_FINAL_TYPE (ValentMPRISImpl, valent_mpris_impl, VALENT, MPRIS_IMPL, GObject)
+          +  +  +  -  +  
+                -  +  - ]
+      13                 :             : 
+      14                 :             : ValentMPRISImpl * valent_mpris_impl_new           (ValentMediaPlayer    *player);
+      15                 :             : gboolean          valent_mpris_impl_export        (ValentMPRISImpl      *impl,
+      16                 :             :                                                    GDBusConnection      *connection,
+      17                 :             :                                                    GError              **error);
+      18                 :             : void              valent_mpris_impl_export_full   (ValentMPRISImpl      *impl,
+      19                 :             :                                                    const char           *bus_name,
+      20                 :             :                                                    GCancellable         *cancellable,
+      21                 :             :                                                    GAsyncReadyCallback   callback,
+      22                 :             :                                                    gpointer              user_data);
+      23                 :             : gboolean          valent_mpris_impl_export_finish (ValentMPRISImpl      *impl,
+      24                 :             :                                                    GAsyncResult         *result,
+      25                 :             :                                                    GError              **error);
+      26                 :             : void              valent_mpris_impl_unexport      (ValentMPRISImpl      *impl);
+      27                 :             : 
+      28                 :             : G_END_DECLS
+      29                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-player.c.func-c.html b/coverage/src/plugins/mpris/valent-mpris-player.c.func-c.html new file mode 100644 index 00000000000..703bf28a6df --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-player.c.func-c.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-player.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-player.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.7 %281255
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.5 %13878
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_application_properties_changed0
g_async_initable_iface_init2
valent_mpris_player_class_init2
valent_mpris_player_set_position2
valent_mpris_player_next3
valent_mpris_player_pause3
valent_mpris_player_play3
valent_mpris_player_previous3
valent_mpris_player_seek3
valent_mpris_player_set_repeat3
valent_mpris_player_set_shuffle3
valent_mpris_player_set_volume3
valent_mpris_player_stop3
valent_mpris_player_get_property4
valent_mpris_player_finalize5
valent_mpris_player_init5
valent_mpris_player_init_application_cb5
valent_mpris_player_init_async5
valent_mpris_player_init_player_cb5
valent_mpris_player_set_property5
on_player_signal7
valent_mpris_player_get_flags11
valent_mpris_player_get_repeat12
valent_mpris_player_get_shuffle12
valent_mpris_player_get_volume12
valent_mpris_player_get_metadata13
valent_mpris_player_get_position13
valent_mpris_player_sync_flags21
valent_mpris_player_get_name26
on_player_properties_changed27
valent_mpris_player_get_state40
valent_mpris_player_get_type58
valent_mpris_player_class_intern_init2
valent_mpris_player_get_type_once2
valent_mpris_player_get_type54
valent_mpris_player_notify73
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-player.c.func.html b/coverage/src/plugins/mpris/valent-mpris-player.c.func.html new file mode 100644 index 00000000000..87e8816b47e --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-player.c.func.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-player.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-player.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.7 %281255
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.5 %13878
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init2
on_application_properties_changed0
on_player_properties_changed27
on_player_signal7
valent_mpris_player_class_init2
valent_mpris_player_finalize5
valent_mpris_player_get_flags11
valent_mpris_player_get_metadata13
valent_mpris_player_get_name26
valent_mpris_player_get_position13
valent_mpris_player_get_property4
valent_mpris_player_get_repeat12
valent_mpris_player_get_shuffle12
valent_mpris_player_get_state40
valent_mpris_player_get_type58
valent_mpris_player_class_intern_init2
valent_mpris_player_get_type54
valent_mpris_player_get_type_once2
valent_mpris_player_get_volume12
valent_mpris_player_init5
valent_mpris_player_init_application_cb5
valent_mpris_player_init_async5
valent_mpris_player_init_player_cb5
valent_mpris_player_next3
valent_mpris_player_notify73
valent_mpris_player_pause3
valent_mpris_player_play3
valent_mpris_player_previous3
valent_mpris_player_seek3
valent_mpris_player_set_position2
valent_mpris_player_set_property5
valent_mpris_player_set_repeat3
valent_mpris_player_set_shuffle3
valent_mpris_player_set_volume3
valent_mpris_player_stop3
valent_mpris_player_sync_flags21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-player.c.gcov.html b/coverage/src/plugins/mpris/valent-mpris-player.c.gcov.html new file mode 100644 index 00000000000..e7a162a7271 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-player.c.gcov.html @@ -0,0 +1,862 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-player.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-player.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.7 %281255
Test Date:2024-03-31 18:46:36Functions:97.1 %3534
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.5 %13878
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mpris-player"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-mpris-player.h"
+      12                 :             : #include "valent-mpris-utils.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentMPRISPlayer
+      16                 :             : {
+      17                 :             :   ValentMediaPlayer   parent_instance;
+      18                 :             : 
+      19                 :             :   char               *bus_name;
+      20                 :             :   GDBusProxy         *application;
+      21                 :             :   GDBusProxy         *player;
+      22                 :             : 
+      23                 :             :   ValentMediaActions  flags;
+      24                 :             :   double              position;
+      25                 :             :   double              position_time;
+      26                 :             : };
+      27                 :             : 
+      28                 :             : static void   g_async_initable_iface_init    (GAsyncInitableIface *iface);
+      29                 :             : 
+      30   [ +  +  +  - ]:          58 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentMPRISPlayer, valent_mpris_player, VALENT_TYPE_MEDIA_PLAYER,
+      31                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      32                 :             : 
+      33                 :             : enum {
+      34                 :             :   PROP_0,
+      35                 :             :   PROP_BUS_NAME,
+      36                 :             :   N_PROPERTIES
+      37                 :             : };
+      38                 :             : 
+      39                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      40                 :             : 
+      41                 :             : 
+      42                 :             : /*
+      43                 :             :  * DBus Property Mapping
+      44                 :             :  */
+      45                 :             : typedef struct
+      46                 :             : {
+      47                 :             :   const char *dbus;
+      48                 :             :   const char *name;
+      49                 :             : } PropMapping;
+      50                 :             : 
+      51                 :             : static const PropMapping player_properties[] = {
+      52                 :             :   {"CanControl",     "flags"},
+      53                 :             :   {"CanGoNext",      "flags"},
+      54                 :             :   {"CanGoPrevious",  "flags"},
+      55                 :             :   {"CanPause",       "flags"},
+      56                 :             :   {"CanPlay",        "flags"},
+      57                 :             :   {"CanSeek",        "flags"},
+      58                 :             :   {"Metadata",       "metadata"},
+      59                 :             :   {"LoopStatus",     "repeat"},
+      60                 :             :   {"PlaybackStatus", "state"},
+      61                 :             :   {"Position",       "position"},
+      62                 :             :   {"Shuffle",        "shuffle"},
+      63                 :             :   {"Volume",         "volume"},
+      64                 :             : };
+      65                 :             : 
+      66                 :             : 
+      67                 :             : /* For convenience, we use our object's ::notify signal to forward each proxy's
+      68                 :             :  * GDBusProxy::g-properties-changed signal.
+      69                 :             :  */
+      70                 :             : static void
+      71                 :           0 : on_application_properties_changed (GDBusProxy        *application,
+      72                 :             :                                    GVariant          *changed_properties,
+      73                 :             :                                    GStrv              invalidated_properties,
+      74                 :             :                                    ValentMediaPlayer *player)
+      75                 :             : {
+      76                 :           0 :   GVariantDict dict;
+      77                 :             : 
+      78         [ #  # ]:           0 :   g_assert (VALENT_IS_MEDIA_PLAYER (player));
+      79                 :             : 
+      80                 :           0 :   g_variant_dict_init (&dict, changed_properties);
+      81                 :             : 
+      82         [ #  # ]:           0 :   if (g_variant_dict_contains (&dict, "Identity"))
+      83                 :           0 :     g_object_notify (G_OBJECT (player), "name");
+      84                 :             : 
+      85                 :           0 :   g_variant_dict_clear (&dict);
+      86                 :           0 : }
+      87                 :             : 
+      88                 :             : static void
+      89                 :          27 : on_player_properties_changed (GDBusProxy        *proxy,
+      90                 :             :                               GVariant          *changed_properties,
+      91                 :             :                               GStrv              invalidated_properties,
+      92                 :             :                               ValentMPRISPlayer *self)
+      93                 :             : {
+      94                 :          27 :   GVariantDict dict;
+      95                 :             : 
+      96         [ +  - ]:          27 :   g_assert (VALENT_IS_MPRIS_PLAYER (self));
+      97         [ -  + ]:          27 :   g_assert (changed_properties != NULL);
+      98                 :             : 
+      99                 :          27 :   g_object_freeze_notify (G_OBJECT (self));
+     100                 :          27 :   g_variant_dict_init (&dict, changed_properties);
+     101                 :             : 
+     102         [ +  + ]:         351 :   for (size_t i = 0; i < G_N_ELEMENTS (player_properties); i++)
+     103                 :             :     {
+     104         [ +  + ]:         324 :       if (g_variant_dict_contains (&dict, player_properties[i].dbus))
+     105                 :             :         {
+     106                 :             :           /* `PropertiesChanged` should not be emitted for `Position`, but if it
+     107                 :             :            * is, we might as well update the internal representation. */
+     108         [ -  + ]:         139 :           if (g_str_equal (player_properties[i].dbus, "Position"))
+     109                 :             :             {
+     110                 :           0 :               int64_t position_us = 0;
+     111                 :             : 
+     112                 :           0 :               g_variant_dict_lookup (&dict, "Position", "x", &position_us);
+     113                 :           0 :               self->position = position_us / G_TIME_SPAN_SECOND;
+     114                 :           0 :               self->position_time = valent_mpris_get_time ();
+     115                 :             :             }
+     116                 :             :           else
+     117                 :         139 :             g_object_notify (G_OBJECT (self), player_properties[i].name);
+     118                 :             :         }
+     119                 :             :     }
+     120                 :             : 
+     121                 :          27 :   g_variant_dict_clear (&dict);
+     122                 :          27 :   g_object_thaw_notify (G_OBJECT (self));
+     123                 :          27 : }
+     124                 :             : 
+     125                 :             : static void
+     126                 :           7 : on_player_signal (GDBusProxy        *proxy,
+     127                 :             :                   const char        *sender_name,
+     128                 :             :                   const char        *signal_name,
+     129                 :             :                   GVariant          *parameters,
+     130                 :             :                   ValentMediaPlayer *player)
+     131                 :             : {
+     132                 :           7 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     133                 :             : 
+     134         [ +  - ]:           7 :   g_assert (VALENT_IS_MPRIS_PLAYER (player));
+     135         [ -  + ]:           7 :   g_assert (signal_name != NULL);
+     136                 :             : 
+     137         [ +  - ]:           7 :   if (g_str_equal (signal_name, "Seeked"))
+     138                 :             :     {
+     139                 :           7 :       int64_t position_us = 0;
+     140                 :             : 
+     141                 :             :       /* Convert microseconds to seconds */
+     142                 :           7 :       g_variant_get (parameters, "(x)", &position_us);
+     143                 :           7 :       self->position = position_us / G_TIME_SPAN_SECOND;
+     144                 :           7 :       self->position_time = valent_mpris_get_time ();
+     145                 :           7 :       g_object_notify (G_OBJECT (player), "position");
+     146                 :             :     }
+     147                 :           7 : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :          21 : valent_mpris_player_sync_flags (ValentMPRISPlayer *self)
+     151                 :             : {
+     152                 :          42 :   g_autoptr (GVariant) value = NULL;
+     153                 :             : 
+     154                 :             :   // TODO: Controllable
+     155                 :          21 :   value = g_dbus_proxy_get_cached_property (self->player, "CanControl");
+     156                 :             : 
+     157   [ +  -  +  + ]:          21 :   if (value && !g_variant_get_boolean (value))
+     158                 :           5 :     self->flags = VALENT_MEDIA_ACTION_NONE;
+     159                 :             : 
+     160                 :          21 :   g_clear_pointer (&value, g_variant_unref);
+     161                 :             : 
+     162                 :             :   // Next
+     163                 :          21 :   value = g_dbus_proxy_get_cached_property (self->player, "CanGoNext");
+     164                 :             : 
+     165   [ +  -  +  + ]:          21 :   if (value && g_variant_get_boolean (value))
+     166                 :           9 :     self->flags |= VALENT_MEDIA_ACTION_NEXT;
+     167                 :             :   else
+     168                 :          12 :     self->flags &= ~VALENT_MEDIA_ACTION_NEXT;
+     169                 :             : 
+     170         [ +  - ]:          21 :   g_clear_pointer (&value, g_variant_unref);
+     171                 :             : 
+     172                 :             :   // Previous
+     173                 :          21 :   value = g_dbus_proxy_get_cached_property (self->player, "CanGoPrevious");
+     174                 :             : 
+     175   [ +  -  +  + ]:          21 :   if (value && g_variant_get_boolean (value))
+     176                 :           1 :     self->flags |= VALENT_MEDIA_ACTION_PREVIOUS;
+     177                 :             :   else
+     178                 :          20 :     self->flags &= ~VALENT_MEDIA_ACTION_PREVIOUS;
+     179                 :             : 
+     180         [ +  - ]:          21 :   g_clear_pointer (&value, g_variant_unref);
+     181                 :             : 
+     182                 :             :   // Pause
+     183                 :          21 :   value = g_dbus_proxy_get_cached_property (self->player, "CanPause");
+     184                 :             : 
+     185   [ +  -  +  + ]:          21 :   if (value && g_variant_get_boolean (value))
+     186                 :           6 :     self->flags |= VALENT_MEDIA_ACTION_PAUSE;
+     187                 :             :   else
+     188                 :          15 :     self->flags &= ~VALENT_MEDIA_ACTION_PAUSE;
+     189                 :             : 
+     190         [ +  - ]:          21 :   g_clear_pointer (&value, g_variant_unref);
+     191                 :             : 
+     192                 :             :   // Play
+     193                 :          21 :   value = g_dbus_proxy_get_cached_property (self->player, "CanPlay");
+     194                 :             : 
+     195   [ +  -  +  + ]:          21 :   if (value && g_variant_get_boolean (value))
+     196                 :          11 :     self->flags |= VALENT_MEDIA_ACTION_PLAY;
+     197                 :             :   else
+     198                 :          10 :     self->flags &= ~VALENT_MEDIA_ACTION_PLAY;
+     199                 :             : 
+     200         [ +  - ]:          21 :   g_clear_pointer (&value, g_variant_unref);
+     201                 :             : 
+     202                 :             :   // Seek
+     203                 :          21 :   value = g_dbus_proxy_get_cached_property (self->player, "CanSeek");
+     204                 :             : 
+     205   [ +  -  +  + ]:          21 :   if (value && g_variant_get_boolean (value))
+     206                 :           9 :     self->flags |= VALENT_MEDIA_ACTION_SEEK;
+     207                 :             :   else
+     208                 :          12 :     self->flags &= ~VALENT_MEDIA_ACTION_SEEK;
+     209                 :             : 
+     210         [ +  - ]:          21 :   g_clear_pointer (&value, g_variant_unref);
+     211                 :          21 : }
+     212                 :             : 
+     213                 :             : /*
+     214                 :             :  * ValentMediaPlayer
+     215                 :             :  */
+     216                 :             : static ValentMediaActions
+     217                 :          11 : valent_mpris_player_get_flags (ValentMediaPlayer *player)
+     218                 :             : {
+     219                 :          11 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     220                 :             : 
+     221                 :          11 :   return self->flags;
+     222                 :             : }
+     223                 :             : 
+     224                 :             : static GVariant *
+     225                 :          13 : valent_mpris_player_get_metadata (ValentMediaPlayer *player)
+     226                 :             : {
+     227                 :          13 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     228                 :             : 
+     229                 :          13 :   return g_dbus_proxy_get_cached_property (self->player, "Metadata");
+     230                 :             : }
+     231                 :             : 
+     232                 :             : static const char *
+     233                 :          26 : valent_mpris_player_get_name (ValentMediaPlayer *player)
+     234                 :             : {
+     235                 :          26 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     236                 :          52 :   g_autoptr (GVariant) value = NULL;
+     237                 :             : 
+     238                 :          26 :   value = g_dbus_proxy_get_cached_property (self->application, "Identity");
+     239                 :             : 
+     240         [ +  - ]:          26 :   if G_UNLIKELY (value == NULL)
+     241                 :             :     return "MPRIS Player";
+     242                 :             : 
+     243                 :          26 :   return g_variant_get_string (value, NULL);
+     244                 :             : }
+     245                 :             : 
+     246                 :             : static double
+     247                 :          13 : valent_mpris_player_get_position (ValentMediaPlayer *player)
+     248                 :             : {
+     249                 :          13 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     250                 :          26 :   g_autoptr (GError) error = NULL;
+     251         [ +  + ]:          13 :   g_autoptr (GVariant) result = NULL;
+     252         [ -  + ]:          13 :   g_autoptr (GVariant) value = NULL;
+     253                 :             : 
+     254         [ +  + ]:          13 :   if (valent_media_player_get_state (player) == VALENT_MEDIA_STATE_STOPPED)
+     255                 :             :     return 0.0;
+     256                 :             : 
+     257                 :             :   /* If the position is non-zero, assume it's been updated */
+     258         [ +  + ]:           5 :   if (self->position > 0.0)
+     259                 :           1 :     return self->position + (valent_mpris_get_time () - self->position_time);
+     260                 :             : 
+     261                 :           4 :   result = g_dbus_proxy_call_sync (self->player,
+     262                 :             :                                    "org.freedesktop.DBus.Properties.Get",
+     263                 :             :                                    g_variant_new ("(ss)",
+     264                 :             :                                                   "org.mpris.MediaPlayer2.Player",
+     265                 :             :                                                   "Position"),
+     266                 :             :                                    G_DBUS_CALL_FLAGS_NONE,
+     267                 :             :                                    1,
+     268                 :             :                                    NULL,
+     269                 :             :                                    &error);
+     270                 :             : 
+     271         [ +  - ]:           4 :   if (result == NULL)
+     272                 :             :     {
+     273         [ -  + ]:           4 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT))
+     274                 :           0 :         g_debug ("%s(): %s", G_STRFUNC, error->message);
+     275                 :             : 
+     276                 :           4 :       return self->position + (valent_mpris_get_time () - self->position_time);
+     277                 :             :     }
+     278                 :             : 
+     279                 :             :   /* Convert microseconds to seconds */
+     280                 :           0 :   g_variant_get (result, "(v)", &value);
+     281                 :           0 :   self->position = g_variant_get_int64 (value) / G_TIME_SPAN_SECOND;
+     282                 :           0 :   self->position_time = valent_mpris_get_time ();
+     283                 :             : 
+     284                 :           0 :   return self->position;
+     285                 :             : }
+     286                 :             : 
+     287                 :             : static void
+     288                 :           2 : valent_mpris_player_set_position (ValentMediaPlayer *player,
+     289                 :             :                                   double             position)
+     290                 :             : {
+     291                 :           2 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     292                 :           2 :   int64_t position_us = (int64_t)position * G_TIME_SPAN_SECOND;
+     293                 :             : 
+     294                 :             :   /* Convert seconds to microseconds */
+     295                 :           2 :   g_dbus_proxy_call (self->player,
+     296                 :             :                      "SetPosition",
+     297                 :             :                      g_variant_new ("(ox)", "/", position_us),
+     298                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     299                 :             :                      -1,
+     300                 :             :                      NULL,
+     301                 :             :                      NULL,
+     302                 :             :                      NULL);
+     303                 :           2 : }
+     304                 :             : 
+     305                 :             : static ValentMediaRepeat
+     306                 :          12 : valent_mpris_player_get_repeat (ValentMediaPlayer *player)
+     307                 :             : {
+     308                 :          12 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     309                 :          24 :   g_autoptr (GVariant) value = NULL;
+     310                 :          12 :   const char *loop_status = NULL;
+     311                 :             : 
+     312                 :          12 :   value = g_dbus_proxy_get_cached_property (self->player, "LoopStatus");
+     313                 :             : 
+     314         [ +  - ]:          12 :   if G_UNLIKELY (value == NULL)
+     315                 :             :     return VALENT_MEDIA_REPEAT_NONE;
+     316                 :             : 
+     317                 :          12 :   loop_status = g_variant_get_string (value, NULL);
+     318                 :             : 
+     319                 :          12 :   return valent_mpris_repeat_from_string (loop_status);
+     320                 :             : }
+     321                 :             : 
+     322                 :             : static void
+     323                 :           3 : valent_mpris_player_set_repeat (ValentMediaPlayer *player,
+     324                 :             :                                 ValentMediaRepeat  repeat)
+     325                 :             : {
+     326                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     327                 :           3 :   const char *loop_status = valent_mpris_repeat_to_string (repeat);
+     328                 :             : 
+     329                 :           3 :   g_dbus_proxy_call (self->player,
+     330                 :             :                      "org.freedesktop.DBus.Properties.Set",
+     331                 :             :                      g_variant_new ("(ssv)",
+     332                 :             :                                     "org.mpris.MediaPlayer2.Player",
+     333                 :             :                                     "LoopStatus",
+     334                 :             :                                     g_variant_new_string (loop_status)),
+     335                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     336                 :             :                      -1,
+     337                 :             :                      NULL,
+     338                 :             :                      NULL,
+     339                 :             :                      NULL);
+     340                 :           3 : }
+     341                 :             : 
+     342                 :             : static ValentMediaState
+     343                 :          40 : valent_mpris_player_get_state (ValentMediaPlayer *player)
+     344                 :             : {
+     345                 :          40 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     346                 :          80 :   g_autoptr (GVariant) value = NULL;
+     347                 :          40 :   const char *playback_status = NULL;
+     348                 :             : 
+     349                 :          40 :   value = g_dbus_proxy_get_cached_property (self->player, "PlaybackStatus");
+     350                 :             : 
+     351         [ +  - ]:          40 :   if G_UNLIKELY (value == NULL)
+     352                 :             :     return VALENT_MEDIA_STATE_STOPPED;
+     353                 :             : 
+     354                 :          40 :   playback_status = g_variant_get_string (value, NULL);
+     355                 :             : 
+     356                 :          40 :   return valent_mpris_state_from_string (playback_status);
+     357                 :             : }
+     358                 :             : 
+     359                 :             : static gboolean
+     360                 :          12 : valent_mpris_player_get_shuffle (ValentMediaPlayer *player)
+     361                 :             : {
+     362                 :          12 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     363                 :          24 :   g_autoptr (GVariant) value = NULL;
+     364                 :             : 
+     365                 :          12 :   value = g_dbus_proxy_get_cached_property (self->player, "Shuffle");
+     366                 :             : 
+     367         [ +  - ]:          12 :   if G_UNLIKELY (value == NULL)
+     368                 :             :     return FALSE;
+     369                 :             : 
+     370                 :          12 :   return g_variant_get_boolean (value);
+     371                 :             : }
+     372                 :             : 
+     373                 :             : static void
+     374                 :           3 : valent_mpris_player_set_shuffle (ValentMediaPlayer *player,
+     375                 :             :                                  gboolean           shuffle)
+     376                 :             : {
+     377                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     378                 :             : 
+     379                 :           3 :   g_dbus_proxy_call (self->player,
+     380                 :             :                      "org.freedesktop.DBus.Properties.Set",
+     381                 :             :                      g_variant_new ("(ssv)",
+     382                 :             :                                     "org.mpris.MediaPlayer2.Player",
+     383                 :             :                                     "Shuffle",
+     384                 :             :                                     g_variant_new_boolean (shuffle)),
+     385                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     386                 :             :                      -1,
+     387                 :             :                      NULL,
+     388                 :             :                      NULL,
+     389                 :             :                      NULL);
+     390                 :           3 : }
+     391                 :             : 
+     392                 :             : static double
+     393                 :          12 : valent_mpris_player_get_volume (ValentMediaPlayer *player)
+     394                 :             : {
+     395                 :          12 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     396                 :          24 :   g_autoptr (GVariant) value = NULL;
+     397                 :             : 
+     398                 :          12 :   value = g_dbus_proxy_get_cached_property (self->player, "Volume");
+     399                 :             : 
+     400         [ +  - ]:          12 :   if G_UNLIKELY (value == NULL)
+     401                 :             :     return 1.0;
+     402                 :             : 
+     403                 :          12 :   return g_variant_get_double (value);
+     404                 :             : }
+     405                 :             : 
+     406                 :             : static void
+     407                 :           3 : valent_mpris_player_set_volume (ValentMediaPlayer *player,
+     408                 :             :                                 double             volume)
+     409                 :             : {
+     410                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     411                 :             : 
+     412                 :           3 :   g_dbus_proxy_call (self->player,
+     413                 :             :                      "org.freedesktop.DBus.Properties.Set",
+     414                 :             :                      g_variant_new ("(ssv)",
+     415                 :             :                                     "org.mpris.MediaPlayer2.Player",
+     416                 :             :                                     "Volume",
+     417                 :             :                                     g_variant_new_double (volume)),
+     418                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     419                 :             :                      -1,
+     420                 :             :                      NULL,
+     421                 :             :                      NULL,
+     422                 :             :                      NULL);
+     423                 :           3 : }
+     424                 :             : 
+     425                 :             : static void
+     426                 :           3 : valent_mpris_player_next (ValentMediaPlayer *player)
+     427                 :             : {
+     428                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     429                 :             : 
+     430                 :           3 :   g_dbus_proxy_call (self->player,
+     431                 :             :                      "Next",
+     432                 :             :                      NULL,
+     433                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     434                 :             :                      -1,
+     435                 :             :                      NULL,
+     436                 :             :                      NULL,
+     437                 :             :                      NULL);
+     438                 :           3 : }
+     439                 :             : 
+     440                 :             : static void
+     441                 :           3 : valent_mpris_player_pause (ValentMediaPlayer *player)
+     442                 :             : {
+     443                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     444                 :             : 
+     445                 :           3 :   g_dbus_proxy_call (self->player,
+     446                 :             :                      "Pause",
+     447                 :             :                      NULL,
+     448                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     449                 :             :                      -1,
+     450                 :             :                      NULL,
+     451                 :             :                      NULL,
+     452                 :             :                      NULL);
+     453                 :           3 : }
+     454                 :             : 
+     455                 :             : static void
+     456                 :           3 : valent_mpris_player_play (ValentMediaPlayer *player)
+     457                 :             : {
+     458                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     459                 :             : 
+     460                 :           3 :   g_dbus_proxy_call (self->player,
+     461                 :             :                      "Play",
+     462                 :             :                      NULL,
+     463                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     464                 :             :                      -1,
+     465                 :             :                      NULL,
+     466                 :             :                      NULL,
+     467                 :             :                      NULL);
+     468                 :           3 : }
+     469                 :             : 
+     470                 :             : #if 0
+     471                 :             : static void
+     472                 :             : valent_mpris_player_play_pause (ValentMediaPlayer *player)
+     473                 :             : {
+     474                 :             :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     475                 :             : 
+     476                 :             :   g_dbus_proxy_call (self->player,
+     477                 :             :                      "PlayPause",
+     478                 :             :                      NULL,
+     479                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     480                 :             :                      -1,
+     481                 :             :                      NULL,
+     482                 :             :                      NULL,
+     483                 :             :                      NULL);
+     484                 :             : }
+     485                 :             : #endif
+     486                 :             : 
+     487                 :             : static void
+     488                 :           3 : valent_mpris_player_previous (ValentMediaPlayer *player)
+     489                 :             : {
+     490                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     491                 :             : 
+     492                 :           3 :   g_dbus_proxy_call (self->player,
+     493                 :             :                      "Previous",
+     494                 :             :                      NULL,
+     495                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     496                 :             :                      -1,
+     497                 :             :                      NULL,
+     498                 :             :                      NULL,
+     499                 :             :                      NULL);
+     500                 :           3 : }
+     501                 :             : 
+     502                 :             : static void
+     503                 :           3 : valent_mpris_player_seek (ValentMediaPlayer *player,
+     504                 :             :                           double             offset)
+     505                 :             : {
+     506                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     507                 :             : 
+     508                 :             :   /* Convert seconds to microseconds */
+     509                 :           3 :   g_dbus_proxy_call (self->player,
+     510                 :             :                      "Seek",
+     511                 :           3 :                      g_variant_new ("(x)", (int64_t)offset * G_TIME_SPAN_SECOND),
+     512                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     513                 :             :                      -1,
+     514                 :             :                      NULL,
+     515                 :             :                      NULL,
+     516                 :             :                      NULL);
+     517                 :           3 : }
+     518                 :             : 
+     519                 :             : static void
+     520                 :           3 : valent_mpris_player_stop (ValentMediaPlayer *player)
+     521                 :             : {
+     522                 :           3 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (player);
+     523                 :             : 
+     524                 :           3 :   g_dbus_proxy_call (self->player,
+     525                 :             :                      "Stop",
+     526                 :             :                      NULL,
+     527                 :             :                      G_DBUS_CALL_FLAGS_NONE,
+     528                 :             :                      -1,
+     529                 :             :                      NULL,
+     530                 :             :                      NULL,
+     531                 :             :                      NULL);
+     532                 :           3 : }
+     533                 :             : 
+     534                 :             : /*
+     535                 :             :  * GAsyncInitable
+     536                 :             :  */
+     537                 :             : static void
+     538                 :           5 : valent_mpris_player_init_player_cb (GObject      *object,
+     539                 :             :                                     GAsyncResult *result,
+     540                 :             :                                     gpointer      user_data)
+     541                 :             : {
+     542                 :           5 :   g_autoptr (GTask) task = G_TASK (user_data);
+     543                 :           5 :   ValentMPRISPlayer *self = g_task_get_source_object (task);
+     544   [ -  -  +  - ]:           5 :   g_autoptr (GError) error = NULL;
+     545                 :             : 
+     546         [ +  - ]:           5 :   g_assert (VALENT_IS_MPRIS_PLAYER (self));
+     547         [ -  + ]:           5 :   g_assert (self->bus_name != NULL);
+     548                 :             : 
+     549                 :           5 :   self->player = g_dbus_proxy_new_finish (result, &error);
+     550                 :             : 
+     551         [ -  + ]:           5 :   if (self->player == NULL)
+     552         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     553                 :             : 
+     554                 :           5 :   g_signal_connect_object (self->player,
+     555                 :             :                            "g-properties-changed",
+     556                 :             :                            G_CALLBACK (on_player_properties_changed),
+     557                 :             :                            self, 0);
+     558                 :             : 
+     559                 :           5 :   g_signal_connect_object (self->player,
+     560                 :             :                            "g-signal",
+     561                 :             :                            G_CALLBACK (on_player_signal),
+     562                 :             :                            self, 0);
+     563                 :             : 
+     564                 :           5 :   valent_mpris_player_sync_flags (self);
+     565                 :             : 
+     566         [ -  + ]:           5 :   g_task_return_boolean (task, TRUE);
+     567                 :             : }
+     568                 :             : 
+     569                 :             : static void
+     570                 :           5 : valent_mpris_player_init_application_cb (GObject      *object,
+     571                 :             :                                          GAsyncResult *result,
+     572                 :             :                                          gpointer      user_data)
+     573                 :             : {
+     574                 :           5 :   g_autoptr (GTask) task = G_TASK (user_data);
+     575                 :           5 :   ValentMPRISPlayer *self = g_task_get_source_object (task);
+     576                 :           5 :   GCancellable *cancellable = g_task_get_cancellable (task);
+     577                 :           5 :   g_autoptr (GError) error = NULL;
+     578                 :             : 
+     579         [ +  - ]:           5 :   g_assert (VALENT_IS_MPRIS_PLAYER (self));
+     580         [ -  + ]:           5 :   g_assert (self->bus_name != NULL);
+     581   [ +  -  +  -  :           5 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     582                 :             : 
+     583                 :           5 :   self->application = g_dbus_proxy_new_finish (result, &error);
+     584                 :             : 
+     585         [ -  + ]:           5 :   if (self->application == NULL)
+     586         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+     587                 :             : 
+     588                 :           5 :   g_signal_connect_object (self->application,
+     589                 :             :                            "g-properties-changed",
+     590                 :             :                            G_CALLBACK (on_application_properties_changed),
+     591                 :             :                            self, 0);
+     592                 :             : 
+     593         [ -  + ]:           5 :   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+     594                 :             :                             G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
+     595                 :             :                             VALENT_MPRIS_PLAYER_INFO,
+     596                 :           5 :                             self->bus_name,
+     597                 :             :                             "/org/mpris/MediaPlayer2",
+     598                 :             :                             "org.mpris.MediaPlayer2.Player",
+     599                 :             :                             cancellable,
+     600                 :             :                             valent_mpris_player_init_player_cb,
+     601                 :             :                             g_steal_pointer (&task));
+     602                 :             : }
+     603                 :             : 
+     604                 :             : static void
+     605                 :           5 : valent_mpris_player_init_async (GAsyncInitable      *initable,
+     606                 :             :                                 int                  io_priority,
+     607                 :             :                                 GCancellable        *cancellable,
+     608                 :             :                                 GAsyncReadyCallback  callback,
+     609                 :             :                                 gpointer             user_data)
+     610                 :             : {
+     611                 :           5 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (initable);
+     612                 :           0 :   g_autoptr (GTask) task = NULL;
+     613                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     614                 :             : 
+     615         [ +  - ]:           5 :   g_assert (VALENT_IS_MPRIS_PLAYER (self));
+     616         [ -  + ]:           5 :   g_return_if_fail (self->bus_name != NULL);
+     617                 :             : 
+     618                 :             :   /* Cancel initialization if the object is destroyed */
+     619                 :           5 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     620                 :             :                                              cancellable);
+     621                 :             : 
+     622                 :           5 :   task = g_task_new (initable, destroy, callback, user_data);
+     623                 :           5 :   g_task_set_priority (task, io_priority);
+     624         [ +  - ]:           5 :   g_task_set_source_tag (task, valent_mpris_player_init_async);
+     625                 :             : 
+     626         [ +  - ]:           5 :   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+     627                 :             :                             G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES,
+     628                 :             :                             VALENT_MPRIS_APPLICATION_INFO,
+     629                 :           5 :                             self->bus_name,
+     630                 :             :                             "/org/mpris/MediaPlayer2",
+     631                 :             :                             "org.mpris.MediaPlayer2",
+     632                 :             :                             destroy,
+     633                 :             :                             valent_mpris_player_init_application_cb,
+     634                 :             :                             g_steal_pointer (&task));
+     635                 :             : }
+     636                 :             : 
+     637                 :             : static void
+     638                 :           2 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     639                 :             : {
+     640                 :           2 :   iface->init_async = valent_mpris_player_init_async;
+     641                 :           2 : }
+     642                 :             : 
+     643                 :             : /*
+     644                 :             :  * GObject
+     645                 :             :  */
+     646                 :             : static void
+     647                 :           5 : valent_mpris_player_finalize (GObject *object)
+     648                 :             : {
+     649                 :           5 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (object);
+     650                 :             : 
+     651         [ +  - ]:           5 :   g_clear_pointer (&self->bus_name, g_free);
+     652         [ +  - ]:           5 :   g_clear_object (&self->player);
+     653         [ +  - ]:           5 :   g_clear_object (&self->application);
+     654                 :             : 
+     655                 :           5 :   G_OBJECT_CLASS (valent_mpris_player_parent_class)->finalize (object);
+     656                 :           5 : }
+     657                 :             : 
+     658                 :             : static void
+     659                 :           4 : valent_mpris_player_get_property (GObject    *object,
+     660                 :             :                                   guint       prop_id,
+     661                 :             :                                   GValue     *value,
+     662                 :             :                                   GParamSpec *pspec)
+     663                 :             : {
+     664                 :           4 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (object);
+     665                 :             : 
+     666         [ +  - ]:           4 :   switch (prop_id)
+     667                 :             :     {
+     668                 :           4 :     case PROP_BUS_NAME:
+     669                 :           4 :       g_value_set_string (value, self->bus_name);
+     670                 :           4 :       break;
+     671                 :             : 
+     672                 :           0 :     default:
+     673                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     674                 :             :     }
+     675                 :           4 : }
+     676                 :             : 
+     677                 :             : static void
+     678                 :           5 : valent_mpris_player_set_property (GObject      *object,
+     679                 :             :                                   guint         prop_id,
+     680                 :             :                                   const GValue *value,
+     681                 :             :                                   GParamSpec   *pspec)
+     682                 :             : {
+     683                 :           5 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (object);
+     684                 :             : 
+     685         [ +  - ]:           5 :   switch (prop_id)
+     686                 :             :     {
+     687                 :           5 :     case PROP_BUS_NAME:
+     688                 :           5 :       self->bus_name = g_value_dup_string (value);
+     689                 :           5 :       break;
+     690                 :             : 
+     691                 :           0 :     default:
+     692                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     693                 :             :     }
+     694                 :           5 : }
+     695                 :             : 
+     696                 :             : static void
+     697                 :          73 : valent_mpris_player_notify (GObject    *object,
+     698                 :             :                             GParamSpec *pspec)
+     699                 :             : {
+     700                 :          73 :   ValentMPRISPlayer *self = VALENT_MPRIS_PLAYER (object);
+     701                 :          73 :   ValentMediaPlayer *player = VALENT_MEDIA_PLAYER (object);
+     702                 :          73 :   const char *name = g_param_spec_get_name (pspec);
+     703                 :             : 
+     704         [ +  + ]:          73 :   if (g_str_equal (name, "flags"))
+     705                 :          16 :     valent_mpris_player_sync_flags (self);
+     706                 :             : 
+     707   [ +  +  +  + ]:          89 :   if (g_str_equal (name, "state") &&
+     708                 :          16 :       valent_media_player_get_state (player) == VALENT_MEDIA_STATE_STOPPED)
+     709                 :             :     {
+     710                 :           7 :       self->position = 0.0;
+     711                 :           7 :       self->position_time = 0.0;
+     712                 :           7 :       g_object_notify (G_OBJECT (self), "position");
+     713                 :             :     }
+     714                 :             : 
+     715         [ -  + ]:          73 :   if (G_OBJECT_CLASS (valent_mpris_player_parent_class)->notify)
+     716                 :           0 :     G_OBJECT_CLASS (valent_mpris_player_parent_class)->notify (object, pspec);
+     717                 :          73 : }
+     718                 :             : 
+     719                 :             : static void
+     720                 :           2 : valent_mpris_player_class_init (ValentMPRISPlayerClass *klass)
+     721                 :             : {
+     722                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     723                 :           2 :   ValentMediaPlayerClass *player_class = VALENT_MEDIA_PLAYER_CLASS (klass);
+     724                 :             : 
+     725                 :           2 :   object_class->finalize = valent_mpris_player_finalize;
+     726                 :           2 :   object_class->get_property = valent_mpris_player_get_property;
+     727                 :           2 :   object_class->set_property = valent_mpris_player_set_property;
+     728                 :           2 :   object_class->notify = valent_mpris_player_notify;
+     729                 :             : 
+     730                 :           2 :   player_class->get_flags = valent_mpris_player_get_flags;
+     731                 :           2 :   player_class->get_metadata = valent_mpris_player_get_metadata;
+     732                 :           2 :   player_class->get_name = valent_mpris_player_get_name;
+     733                 :           2 :   player_class->get_position = valent_mpris_player_get_position;
+     734                 :           2 :   player_class->set_position = valent_mpris_player_set_position;
+     735                 :           2 :   player_class->get_repeat = valent_mpris_player_get_repeat;
+     736                 :           2 :   player_class->set_repeat = valent_mpris_player_set_repeat;
+     737                 :           2 :   player_class->get_shuffle = valent_mpris_player_get_shuffle;
+     738                 :           2 :   player_class->set_shuffle = valent_mpris_player_set_shuffle;
+     739                 :           2 :   player_class->get_state = valent_mpris_player_get_state;
+     740                 :           2 :   player_class->get_volume = valent_mpris_player_get_volume;
+     741                 :           2 :   player_class->set_volume = valent_mpris_player_set_volume;
+     742                 :           2 :   player_class->next = valent_mpris_player_next;
+     743                 :           2 :   player_class->pause = valent_mpris_player_pause;
+     744                 :           2 :   player_class->play = valent_mpris_player_play;
+     745                 :           2 :   player_class->previous = valent_mpris_player_previous;
+     746                 :           2 :   player_class->seek = valent_mpris_player_seek;
+     747                 :           2 :   player_class->stop = valent_mpris_player_stop;
+     748                 :             : 
+     749                 :             :   /**
+     750                 :             :    * ValentMPRISPlayer:bus-name:
+     751                 :             :    *
+     752                 :             :    * The well-known or unique name that the player is on.
+     753                 :             :    */
+     754                 :           4 :   properties [PROP_BUS_NAME] =
+     755                 :           2 :     g_param_spec_string ("bus-name", NULL, NULL,
+     756                 :             :                          NULL,
+     757                 :             :                          (G_PARAM_READWRITE |
+     758                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     759                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     760                 :             :                           G_PARAM_STATIC_STRINGS));
+     761                 :             : 
+     762                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     763                 :           2 : }
+     764                 :             : 
+     765                 :             : static void
+     766                 :           5 : valent_mpris_player_init (ValentMPRISPlayer *media_player)
+     767                 :             : {
+     768                 :           5 : }
+     769                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-player.h.func-c.html b/coverage/src/plugins/mpris/valent-mpris-player.h.func-c.html new file mode 100644 index 00000000000..c868c13db25 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-player.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-player.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-player.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_PLAYER49
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-player.h.func.html b/coverage/src/plugins/mpris/valent-mpris-player.h.func.html new file mode 100644 index 00000000000..94154e29e64 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-player.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-player.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-player.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_PLAYER49
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-player.h.gcov.html b/coverage/src/plugins/mpris/valent-mpris-player.h.gcov.html new file mode 100644 index 00000000000..6ef27fd59b9 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-player.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-player.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-player.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MPRIS_PLAYER (valent_mpris_player_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          49 : G_DECLARE_FINAL_TYPE (ValentMPRISPlayer, valent_mpris_player, VALENT, MPRIS_PLAYER, ValentMediaPlayer)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-plugin.c.func-c.html b/coverage/src/plugins/mpris/valent-mpris-plugin.c.func-c.html new file mode 100644 index 00000000000..e2dff43c730 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-plugin.c.func-c.html @@ -0,0 +1,308 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %449421
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.6 %288163
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_valent_mpris_device_free1
receive_art_cb1
send_album_art_cb1
valent_mpris_plugin_receive_album_art1
valent_mpris_plugin_request_update1
valent_mpris_plugin_send_album_art1
on_player_seeked2
valent_mpris_plugin_finalize2
valent_mpris_plugin_handle_player_list2
on_players_changed3
valent_mpris_plugin_constructed3
valent_mpris_plugin_handle_player_update3
valent_mpris_plugin_init3
valent_mpris_plugin_request_player_list3
valent_mpris_plugin_destroy4
valent_mpris_plugin_find_player4
valent_mpris_plugin_handle_action5
valent_mpris_plugin_handle_mpris5
valent_mpris_plugin_send_player_list5
valent_mpris_plugin_flush9
valent_mpris_plugin_send_player_info10
valent_mpris_plugin_update_state10
_valent_media_lookup_player11
valent_mpris_plugin_handle_mpris_request11
valent_mpris_plugin_watch_media14
valent_mpris_plugin_handle_packet16
on_player_changed21
valent_mpris_plugin_get_type98
valent_mpris_plugin_class_intern_init2
valent_mpris_plugin_get_type_once2
valent_mpris_plugin_get_type94
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-plugin.c.func.html b/coverage/src/plugins/mpris/valent-mpris-plugin.c.func.html new file mode 100644 index 00000000000..78a122b9cdd --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-plugin.c.func.html @@ -0,0 +1,308 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %449421
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.6 %288163
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_valent_media_lookup_player11
_valent_mpris_device_free1
on_player_changed21
on_player_seeked2
on_players_changed3
receive_art_cb1
send_album_art_cb1
valent_mpris_plugin_constructed3
valent_mpris_plugin_destroy4
valent_mpris_plugin_finalize2
valent_mpris_plugin_find_player4
valent_mpris_plugin_flush9
valent_mpris_plugin_get_type98
valent_mpris_plugin_class_intern_init2
valent_mpris_plugin_get_type94
valent_mpris_plugin_get_type_once2
valent_mpris_plugin_handle_action5
valent_mpris_plugin_handle_mpris5
valent_mpris_plugin_handle_mpris_request11
valent_mpris_plugin_handle_packet16
valent_mpris_plugin_handle_player_list2
valent_mpris_plugin_handle_player_update3
valent_mpris_plugin_init3
valent_mpris_plugin_receive_album_art1
valent_mpris_plugin_request_player_list3
valent_mpris_plugin_request_update1
valent_mpris_plugin_send_album_art1
valent_mpris_plugin_send_player_info10
valent_mpris_plugin_send_player_list5
valent_mpris_plugin_update_state10
valent_mpris_plugin_watch_media14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-plugin.c.gcov.html b/coverage/src/plugins/mpris/valent-mpris-plugin.c.gcov.html new file mode 100644 index 00000000000..182c3a2d228 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-plugin.c.gcov.html @@ -0,0 +1,1015 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %449421
Test Date:2024-03-31 18:46:36Functions:100.0 %3030
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.6 %288163
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mpris-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <glib/gi18n.h>
+      11                 :             : #include <gio/gio.h>
+      12                 :             : #include <json-glib/json-glib.h>
+      13                 :             : #include <valent.h>
+      14                 :             : 
+      15                 :             : #include "valent-mpris-device.h"
+      16                 :             : #include "valent-mpris-plugin.h"
+      17                 :             : #include "valent-mpris-utils.h"
+      18                 :             : 
+      19                 :             : 
+      20                 :             : struct _ValentMprisPlugin
+      21                 :             : {
+      22                 :             :   ValentDevicePlugin  parent_instance;
+      23                 :             : 
+      24                 :             :   ValentMedia        *media;
+      25                 :             :   unsigned int        media_watch : 1;
+      26                 :             : 
+      27                 :             :   GPtrArray          *players;
+      28                 :             :   GHashTable         *transfers;
+      29                 :             : 
+      30                 :             :   GHashTable         *pending;
+      31                 :             :   unsigned int        flush_id;
+      32                 :             : };
+      33                 :             : 
+      34   [ +  +  +  - ]:          98 : G_DEFINE_FINAL_TYPE (ValentMprisPlugin, valent_mpris_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      35                 :             : 
+      36                 :             : static void valent_mpris_plugin_send_player_info    (ValentMprisPlugin *self,
+      37                 :             :                                                      ValentMediaPlayer *player,
+      38                 :             :                                                      gboolean           now_playing,
+      39                 :             :                                                      gboolean           volume);
+      40                 :             : static void valent_mpris_plugin_send_player_list    (ValentMprisPlugin *self);
+      41                 :             : 
+      42                 :             : 
+      43                 :             : static gpointer
+      44                 :          11 : _valent_media_lookup_player (ValentMedia *media,
+      45                 :             :                              const char  *name)
+      46                 :             : {
+      47                 :          11 :   unsigned int n_players = 0;
+      48                 :             : 
+      49         [ +  - ]:          11 :   g_assert (VALENT_IS_MEDIA (media));
+      50   [ +  -  -  + ]:          11 :   g_assert (name != NULL && *name != '\0');
+      51                 :             : 
+      52                 :          11 :   n_players = g_list_model_get_n_items (G_LIST_MODEL (media));
+      53                 :             : 
+      54         [ +  - ]:          11 :   for (unsigned int i = 0; i < n_players; i++)
+      55                 :             :     {
+      56                 :          11 :       g_autoptr (ValentMediaPlayer) player = g_list_model_get_item (G_LIST_MODEL (media), i);
+      57                 :             : 
+      58         [ +  - ]:          11 :       if (g_strcmp0 (valent_media_player_get_name (player), name) == 0)
+      59         [ +  - ]:          11 :         return player;
+      60                 :             :     }
+      61                 :             : 
+      62                 :             :   return NULL;
+      63                 :             : }
+      64                 :             : 
+      65                 :             : 
+      66                 :             : /*
+      67                 :             :  * Local Players
+      68                 :             :  */
+      69                 :             : static void
+      70                 :           1 : send_album_art_cb (ValentTransfer    *transfer,
+      71                 :             :                    GAsyncResult      *result,
+      72                 :             :                    ValentMprisPlugin *self)
+      73                 :             : {
+      74                 :           2 :   g_autoptr (GError) error = NULL;
+      75         [ -  + ]:           1 :   g_autofree char *id = NULL;
+      76                 :             : 
+      77         [ +  - ]:           1 :   g_assert (VALENT_IS_TRANSFER (transfer));
+      78                 :             : 
+      79         [ -  + ]:           1 :   if (!valent_transfer_execute_finish (transfer, result, &error))
+      80                 :           0 :     g_debug ("Failed to upload album art: %s", error->message);
+      81                 :             : 
+      82                 :           1 :   id = valent_transfer_dup_id (transfer);
+      83                 :           1 :   g_hash_table_remove (self->transfers, id);
+      84                 :           1 : }
+      85                 :             : 
+      86                 :             : static void
+      87                 :           1 : valent_mpris_plugin_send_album_art (ValentMprisPlugin *self,
+      88                 :             :                                     ValentMediaPlayer *player,
+      89                 :             :                                     const char        *requested_uri)
+      90                 :             : {
+      91                 :           1 :   g_autoptr (GVariant) metadata = NULL;
+      92                 :           1 :   const char *real_uri;
+      93         [ -  - ]:           1 :   g_autoptr (GFile) real_file = NULL;
+      94   [ +  -  -  - ]:           1 :   g_autoptr (GFile) requested_file = NULL;
+      95   [ +  -  -  - ]:           1 :   g_autoptr (JsonBuilder) builder = NULL;
+      96   [ -  +  -  - ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+      97   [ +  -  -  - ]:           1 :   g_autoptr (ValentTransfer) transfer = NULL;
+      98                 :           1 :   ValentDevice *device;
+      99                 :             : 
+     100         [ +  - ]:           1 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     101                 :             : 
+     102                 :             :   /* Ignore concurrent requests */
+     103         [ +  - ]:           1 :   if (g_hash_table_contains (self->transfers, requested_uri))
+     104                 :             :     return;
+     105                 :             : 
+     106                 :             :   /* Check player and URL are safe */
+     107   [ +  -  -  + ]:           2 :   if ((metadata = valent_media_player_get_metadata (player)) == NULL ||
+     108                 :           1 :       !g_variant_lookup (metadata, "mpris:artUrl", "&s", &real_uri))
+     109                 :             :     {
+     110                 :           0 :       g_warning ("Album art request \"%s\" for track without album art",
+     111                 :             :                  requested_uri);
+     112                 :           0 :       return;
+     113                 :             :     }
+     114                 :             : 
+     115                 :             :   /* Compare normalized URLs */
+     116                 :           1 :   requested_file = g_file_new_for_uri (requested_uri);
+     117                 :           1 :   real_file = g_file_new_for_uri (real_uri);
+     118                 :             : 
+     119         [ -  + ]:           1 :   if (!g_file_equal (requested_file, real_file))
+     120                 :             :     {
+     121                 :           0 :       g_warning ("Album art request \"%s\" doesn't match current track \"%s\"",
+     122                 :             :                  requested_uri, real_uri);
+     123                 :           0 :       return;
+     124                 :             :     }
+     125                 :             : 
+     126                 :             :   /* Build the payload packet */
+     127                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris");
+     128                 :           1 :   json_builder_set_member_name (builder, "player");
+     129                 :           1 :   json_builder_add_string_value (builder, valent_media_player_get_name (player));
+     130                 :           1 :   json_builder_set_member_name (builder, "albumArtUrl");
+     131                 :           1 :   json_builder_add_string_value (builder, requested_uri);
+     132                 :           1 :   json_builder_set_member_name (builder, "transferringAlbumArt");
+     133                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+     134                 :           1 :   packet = valent_packet_end (&builder);
+     135                 :             : 
+     136                 :             :   /* Start the transfer */
+     137                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     138                 :           1 :   transfer = valent_device_transfer_new (device, packet, real_file);
+     139                 :             : 
+     140         [ -  + ]:           1 :   g_hash_table_insert (self->transfers,
+     141                 :           1 :                        g_strdup (requested_uri),
+     142                 :             :                        g_object_ref (transfer));
+     143                 :             : 
+     144         [ +  - ]:           1 :   valent_transfer_execute (transfer,
+     145                 :             :                            NULL,
+     146                 :             :                            (GAsyncReadyCallback)send_album_art_cb,
+     147                 :             :                            self);
+     148                 :             : }
+     149                 :             : 
+     150                 :             : static gboolean
+     151                 :           9 : valent_mpris_plugin_flush (gpointer data)
+     152                 :             : {
+     153                 :           9 :   ValentMprisPlugin *self = VALENT_MPRIS_PLUGIN (data);
+     154                 :           9 :   GHashTableIter iter;
+     155                 :           9 :   ValentMediaPlayer *player;
+     156                 :             : 
+     157                 :           9 :   g_hash_table_iter_init (&iter, self->pending);
+     158         [ +  + ]:          18 :   while (g_hash_table_iter_next (&iter, (void **)&player, NULL))
+     159                 :             :     {
+     160                 :           9 :       valent_mpris_plugin_send_player_info (self, player, TRUE, TRUE);
+     161                 :           9 :       g_hash_table_iter_remove (&iter);
+     162                 :             :     }
+     163                 :             : 
+     164                 :           9 :   self->flush_id = 0;
+     165                 :             : 
+     166                 :           9 :   return G_SOURCE_REMOVE;
+     167                 :             : }
+     168                 :             : 
+     169                 :             : static void
+     170                 :           2 : on_player_seeked (ValentMediaPlayer *player,
+     171                 :             :                   double             position,
+     172                 :             :                   ValentMprisPlugin *self)
+     173                 :             : {
+     174                 :           2 :   const char *name;
+     175                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+     176         [ -  + ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+     177                 :             : 
+     178         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     179                 :             : 
+     180                 :           2 :   name = valent_media_player_get_name (player);
+     181                 :             : 
+     182                 :             :   /* Convert seconds to milliseconds */
+     183                 :           2 :   valent_packet_init (&builder, "kdeconnect.mpris");
+     184                 :           2 :   json_builder_set_member_name (builder, "player");
+     185                 :           2 :   json_builder_add_string_value (builder, name);
+     186                 :           2 :   json_builder_set_member_name (builder, "pos");
+     187                 :           2 :   json_builder_add_int_value (builder, position * 1000L);
+     188                 :           2 :   packet = valent_packet_end (&builder);
+     189                 :             : 
+     190         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     191                 :           2 : }
+     192                 :             : 
+     193                 :             : static void
+     194                 :          21 : on_player_changed (ValentMediaPlayer *player,
+     195                 :             :                    GParamSpec        *pspec,
+     196                 :             :                    ValentMprisPlugin *self)
+     197                 :             : {
+     198         [ +  - ]:          21 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     199                 :             : 
+     200         [ +  + ]:          21 :   if (g_str_equal (pspec->name, "position"))
+     201                 :             :     {
+     202                 :           2 :       double position = 0.0;
+     203                 :             : 
+     204                 :           2 :       position = valent_media_player_get_position (player);
+     205                 :           2 :       on_player_seeked (player, position, self);
+     206                 :             :     }
+     207                 :             :   else
+     208                 :             :     {
+     209                 :          19 :       g_hash_table_add (self->pending, player);
+     210                 :             : 
+     211         [ +  + ]:          19 :       if (self->flush_id == 0)
+     212                 :           9 :         self->flush_id = g_idle_add (valent_mpris_plugin_flush, self);
+     213                 :             :     }
+     214                 :          21 : }
+     215                 :             : 
+     216                 :             : static void
+     217                 :           3 : on_players_changed (ValentMedia       *media,
+     218                 :             :                     unsigned int       position,
+     219                 :             :                     unsigned int       removed,
+     220                 :             :                     unsigned int       added,
+     221                 :             :                     ValentMprisPlugin *self)
+     222                 :             : {
+     223                 :           3 :   gboolean changed = FALSE;
+     224                 :             : 
+     225         [ +  + ]:           3 :   if (removed > 0)
+     226                 :             :     {
+     227                 :           2 :       changed = TRUE;
+     228                 :           2 :       g_hash_table_remove_all (self->pending);
+     229                 :             :     }
+     230                 :             : 
+     231         [ +  + ]:           4 :   for (unsigned int i = 0; i < added; i++)
+     232                 :             :     {
+     233                 :           1 :       g_autoptr (ValentMediaPlayer) player = NULL;
+     234                 :             : 
+     235                 :           1 :       player = g_list_model_get_item (G_LIST_MODEL (media), position + i);
+     236                 :             : 
+     237                 :             :       /* Here, and below when building the player list, all `ValentMprisDevice`
+     238                 :             :        * players are being skipped. An advanced option could control whether
+     239                 :             :        * `!g_ptr_array_find (self->players, player, NULL)` passes, enabling a
+     240                 :             :        * device to act as a hub for other devices. */
+     241         [ +  - ]:           1 :       if (VALENT_IS_MPRIS_DEVICE (player))
+     242         [ +  - ]:           1 :         continue;
+     243                 :             : 
+     244                 :           0 :       changed = TRUE;
+     245                 :           0 :       g_signal_connect_object (player,
+     246                 :             :                                "notify",
+     247                 :             :                                G_CALLBACK (on_player_changed),
+     248                 :             :                                self, 0);
+     249                 :             : 
+     250         [ #  # ]:           0 :       VALENT_NOTE ("tracking %s (%s)",
+     251                 :             :                    G_OBJECT_TYPE_NAME (player),
+     252                 :             :                    valent_media_player_get_name (player));
+     253                 :             :     }
+     254                 :             : 
+     255         [ +  + ]:           3 :   if (changed)
+     256                 :           2 :     valent_mpris_plugin_send_player_list (self);
+     257                 :           3 : }
+     258                 :             : 
+     259                 :             : static void
+     260                 :           5 : valent_mpris_plugin_handle_action (ValentMprisPlugin *self,
+     261                 :             :                                    ValentMediaPlayer *player,
+     262                 :             :                                    const char        *action)
+     263                 :             : {
+     264         [ +  - ]:           5 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     265         [ -  + ]:           5 :   g_assert (VALENT_IS_MEDIA_PLAYER (player));
+     266   [ +  -  -  + ]:           5 :   g_assert (action && *action);
+     267                 :             : 
+     268         [ +  + ]:           5 :   if (g_str_equal (action, "Next"))
+     269                 :           1 :     valent_media_player_next (player);
+     270                 :             : 
+     271         [ +  + ]:           4 :   else if (g_str_equal (action, "Pause"))
+     272                 :           1 :     valent_media_player_pause (player);
+     273                 :             : 
+     274         [ +  + ]:           3 :   else if (g_str_equal (action, "Play"))
+     275                 :           1 :     valent_media_player_play (player);
+     276                 :             : 
+     277         [ -  + ]:           2 :   else if (g_str_equal (action, "PlayPause"))
+     278   [ #  #  #  #  :           0 :     valent_mpris_play_pause (player);
+                   #  # ]
+     279                 :             : 
+     280         [ +  + ]:           2 :   else if (g_str_equal (action, "Previous"))
+     281                 :           1 :     valent_media_player_previous (player);
+     282                 :             : 
+     283         [ +  - ]:           1 :   else if (g_str_equal (action, "Stop"))
+     284                 :           1 :     valent_media_player_stop (player);
+     285                 :             : 
+     286                 :             :   else
+     287                 :           0 :     g_warning ("%s(): Unknown action: %s", G_STRFUNC, action);
+     288                 :           5 : }
+     289                 :             : 
+     290                 :             : static void
+     291                 :          11 : valent_mpris_plugin_handle_mpris_request (ValentMprisPlugin *self,
+     292                 :             :                                           JsonNode          *packet)
+     293                 :             : {
+     294                 :          11 :   ValentMediaPlayer *player = NULL;
+     295                 :          11 :   const char *name;
+     296                 :          11 :   const char *action;
+     297                 :          11 :   const char *url;
+     298                 :          11 :   int64_t offset_us;
+     299                 :          11 :   int64_t position;
+     300                 :          11 :   gboolean request_now_playing;
+     301                 :          11 :   gboolean request_volume;
+     302                 :          11 :   const char *loop_status;
+     303                 :          11 :   ValentMediaRepeat repeat;
+     304                 :          11 :   gboolean shuffle;
+     305                 :          11 :   int64_t volume;
+     306                 :             : 
+     307         [ +  - ]:          11 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     308                 :             : 
+     309                 :             :   /* Start by checking for a player */
+     310         [ +  - ]:          11 :   if (valent_packet_get_string (packet, "player", &name))
+     311                 :          11 :     player = _valent_media_lookup_player (self->media, name);
+     312                 :             : 
+     313   [ +  -  -  + ]:          11 :   if (player == NULL || valent_packet_check_field (packet, "requestPlayerList"))
+     314                 :             :     {
+     315                 :           0 :       valent_mpris_plugin_send_player_list (self);
+     316                 :           0 :       return;
+     317                 :             :     }
+     318                 :             : 
+     319                 :             :   /* A request for a player's status */
+     320                 :          11 :   request_now_playing = valent_packet_check_field (packet, "requestNowPlaying");
+     321                 :          11 :   request_volume = valent_packet_check_field (packet, "requestVolume");
+     322                 :             : 
+     323         [ +  + ]:          11 :   if (request_now_playing || request_volume)
+     324                 :           1 :     valent_mpris_plugin_send_player_info (self,
+     325                 :             :                                           player,
+     326                 :             :                                           request_now_playing,
+     327                 :             :                                           request_volume);
+     328                 :             : 
+     329                 :             :   /* A player command */
+     330         [ +  + ]:          11 :   if (valent_packet_get_string (packet, "action", &action))
+     331                 :           5 :     valent_mpris_plugin_handle_action (self, player, action);
+     332                 :             : 
+     333                 :             :   /* A request to change the relative position (microseconds to seconds) */
+     334         [ +  + ]:          11 :   if (valent_packet_get_int (packet, "Seek", &offset_us))
+     335                 :           1 :     valent_media_player_seek (player, offset_us / G_TIME_SPAN_SECOND);
+     336                 :             : 
+     337                 :             :   /* A request to change the absolute position (milliseconds to seconds) */
+     338         [ -  + ]:          11 :   if (valent_packet_get_int (packet, "SetPosition", &position))
+     339                 :           0 :     valent_media_player_set_position (player, position / 1000L);
+     340                 :             : 
+     341                 :             :   /* A request to change the loop status */
+     342         [ +  + ]:          11 :   if (valent_packet_get_string (packet, "setLoopStatus", &loop_status))
+     343                 :             :     {
+     344                 :           1 :       repeat = valent_mpris_repeat_from_string (loop_status);
+     345                 :           1 :       valent_media_player_set_repeat (player, repeat);
+     346                 :             :     }
+     347                 :             : 
+     348                 :             :   /* A request to change the shuffle mode */
+     349         [ +  + ]:          11 :   if (valent_packet_get_boolean (packet, "setShuffle", &shuffle))
+     350                 :           1 :     valent_media_player_set_shuffle (player, shuffle);
+     351                 :             : 
+     352                 :             :   /* A request to change the player volume */
+     353         [ +  + ]:          11 :   if (valent_packet_get_int (packet, "setVolume", &volume))
+     354                 :           1 :     valent_media_player_set_volume (player, volume / 100.0);
+     355                 :             : 
+     356                 :             :   /* An album art request */
+     357         [ +  + ]:          11 :   if (valent_packet_get_string (packet, "albumArtUrl", &url))
+     358                 :           1 :     valent_mpris_plugin_send_album_art (self, player, url);
+     359                 :             : }
+     360                 :             : 
+     361                 :             : static void
+     362                 :          10 : valent_mpris_plugin_send_player_info (ValentMprisPlugin *self,
+     363                 :             :                                       ValentMediaPlayer *player,
+     364                 :             :                                       gboolean           request_now_playing,
+     365                 :             :                                       gboolean           request_volume)
+     366                 :             : {
+     367                 :          10 :   const char *name;
+     368                 :          20 :   g_autoptr (JsonBuilder) builder = NULL;
+     369         [ -  + ]:          10 :   g_autoptr (JsonNode) response = NULL;
+     370                 :             : 
+     371         [ +  - ]:          10 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     372         [ -  + ]:          10 :   g_assert (VALENT_IS_MEDIA_PLAYER (player));
+     373                 :             : 
+     374                 :             :   /* Start the packet */
+     375                 :          10 :   valent_packet_init (&builder, "kdeconnect.mpris");
+     376                 :             : 
+     377                 :          10 :   name = valent_media_player_get_name (player);
+     378                 :          10 :   json_builder_set_member_name (builder, "player");
+     379                 :          10 :   json_builder_add_string_value (builder, name);
+     380                 :             : 
+     381                 :             :   /* Player State & Metadata */
+     382         [ +  - ]:          10 :   if (request_now_playing)
+     383                 :             :     {
+     384                 :          10 :       ValentMediaActions flags;
+     385                 :          10 :       ValentMediaRepeat repeat;
+     386                 :          10 :       gboolean is_playing;
+     387                 :          10 :       double position;
+     388                 :          10 :       gboolean shuffle;
+     389                 :          10 :       const char *loop_status = "None";
+     390                 :          10 :       g_autoptr (GVariant) metadata = NULL;
+     391         [ +  - ]:          10 :       g_autofree char *artist = NULL;
+     392                 :          10 :       const char *title = NULL;
+     393                 :             : 
+     394                 :             :       /* Player State */
+     395                 :          10 :       flags = valent_media_player_get_flags (player);
+     396                 :          10 :       json_builder_set_member_name (builder, "canPause");
+     397                 :          10 :       json_builder_add_boolean_value (builder, (flags & VALENT_MEDIA_ACTION_PAUSE) != 0);
+     398                 :          10 :       json_builder_set_member_name (builder, "canPlay");
+     399                 :          10 :       json_builder_add_boolean_value (builder, (flags & VALENT_MEDIA_ACTION_PLAY) != 0);
+     400                 :          10 :       json_builder_set_member_name (builder, "canGoNext");
+     401                 :          10 :       json_builder_add_boolean_value (builder, (flags & VALENT_MEDIA_ACTION_NEXT) != 0);
+     402                 :          10 :       json_builder_set_member_name (builder, "canGoPrevious");
+     403                 :          10 :       json_builder_add_boolean_value (builder,(flags & VALENT_MEDIA_ACTION_PREVIOUS) != 0);
+     404                 :          10 :       json_builder_set_member_name (builder, "canSeek");
+     405                 :          10 :       json_builder_add_boolean_value (builder, (flags & VALENT_MEDIA_ACTION_SEEK) != 0);
+     406                 :             : 
+     407                 :          10 :       repeat = valent_media_player_get_repeat (player);
+     408                 :          10 :       loop_status = valent_mpris_repeat_to_string (repeat);
+     409                 :          10 :       json_builder_set_member_name (builder, "loopStatus");
+     410                 :          10 :       json_builder_add_string_value (builder, loop_status);
+     411                 :             : 
+     412                 :          10 :       shuffle = valent_media_player_get_shuffle (player);
+     413                 :          10 :       json_builder_set_member_name (builder, "shuffle");
+     414                 :          10 :       json_builder_add_boolean_value (builder, shuffle);
+     415                 :             : 
+     416                 :          10 :       is_playing = valent_media_player_get_state (player) == VALENT_MEDIA_STATE_PLAYING;
+     417                 :          10 :       json_builder_set_member_name (builder, "isPlaying");
+     418                 :          10 :       json_builder_add_boolean_value (builder, is_playing);
+     419                 :             : 
+     420                 :             :       /* Convert seconds to milliseconds */
+     421                 :          10 :       position = valent_media_player_get_position (player);
+     422                 :          10 :       json_builder_set_member_name (builder, "pos");
+     423                 :          10 :       json_builder_add_int_value (builder, position * 1000L);
+     424                 :             : 
+     425                 :             :       /* Track Metadata
+     426                 :             :        *
+     427                 :             :        * See: https://www.freedesktop.org/wiki/Specifications/mpris-spec/metadata/
+     428                 :             :        */
+     429         [ +  - ]:          10 :       if ((metadata = valent_media_player_get_metadata (player)) != NULL)
+     430                 :             :         {
+     431                 :          10 :           g_autofree const char **artists = NULL;
+     432                 :          10 :           int64_t length_us;
+     433                 :          10 :           const char *art_url;
+     434                 :          10 :           const char *album;
+     435                 :             : 
+     436         [ +  + ]:          10 :           if (g_variant_lookup (metadata, "xesam:artist", "^a&s", &artists) &&
+     437   [ +  -  +  - ]:           4 :               artists[0] != NULL && *artists[0] != '\0')
+     438                 :             :             {
+     439                 :           4 :               artist = g_strjoinv (", ", (char **)artists);
+     440                 :           4 :               json_builder_set_member_name (builder, "artist");
+     441                 :           4 :               json_builder_add_string_value (builder, artist);
+     442                 :             :             }
+     443                 :             : 
+     444         [ +  + ]:          10 :           if (g_variant_lookup (metadata, "xesam:title", "&s", &title) &&
+     445         [ +  - ]:           4 :               *title != '\0')
+     446                 :             :             {
+     447                 :           4 :               json_builder_set_member_name (builder, "title");
+     448                 :           4 :               json_builder_add_string_value (builder, title);
+     449                 :             :             }
+     450                 :             : 
+     451         [ +  + ]:          10 :           if (g_variant_lookup (metadata, "xesam:album", "&s", &album) &&
+     452         [ +  - ]:           4 :               *album != '\0')
+     453                 :             :             {
+     454                 :           4 :               json_builder_set_member_name (builder, "album");
+     455                 :           4 :               json_builder_add_string_value (builder, album);
+     456                 :             :             }
+     457                 :             : 
+     458                 :             :           /* Convert microseconds to milliseconds */
+     459         [ +  + ]:          10 :           if (g_variant_lookup (metadata, "mpris:length", "x", &length_us))
+     460                 :             :             {
+     461                 :           4 :               json_builder_set_member_name (builder, "length");
+     462                 :           4 :               json_builder_add_int_value (builder, length_us / 1000L);
+     463                 :             :             }
+     464                 :             : 
+     465         [ +  + ]:          10 :           if (g_variant_lookup (metadata, "mpris:artUrl", "&s", &art_url))
+     466                 :             :             {
+     467                 :           1 :               json_builder_set_member_name (builder, "albumArtUrl");
+     468                 :           1 :               json_builder_add_string_value (builder, art_url);
+     469                 :             :             }
+     470                 :             :         }
+     471                 :             :     }
+     472                 :             : 
+     473                 :             :   /* Volume Level */
+     474         [ +  - ]:          10 :   if (request_volume)
+     475                 :             :     {
+     476                 :          10 :       int64_t level;
+     477                 :             : 
+     478                 :          10 :       level = floor (valent_media_player_get_volume (player) * 100);
+     479                 :          10 :       json_builder_set_member_name (builder, "volume");
+     480                 :          10 :       json_builder_add_int_value (builder, level);
+     481                 :             :     }
+     482                 :             : 
+     483                 :             :   /* Send Response */
+     484                 :          10 :   response = valent_packet_end (&builder);
+     485         [ +  - ]:          10 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), response);
+     486                 :          10 : }
+     487                 :             : 
+     488                 :             : static void
+     489                 :           5 : valent_mpris_plugin_send_player_list (ValentMprisPlugin *self)
+     490                 :             : {
+     491                 :          10 :   g_autoptr (JsonBuilder) builder = NULL;
+     492         [ -  + ]:           5 :   g_autoptr (JsonNode) packet = NULL;
+     493                 :           5 :   unsigned int n_players = 0;
+     494                 :             : 
+     495         [ +  - ]:           5 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     496                 :             : 
+     497                 :           5 :   valent_packet_init (&builder, "kdeconnect.mpris");
+     498                 :             : 
+     499                 :             :   /* Player List */
+     500                 :           5 :   json_builder_set_member_name (builder, "playerList");
+     501                 :           5 :   json_builder_begin_array (builder);
+     502                 :             : 
+     503                 :           5 :   n_players = g_list_model_get_n_items (G_LIST_MODEL (self->media));
+     504                 :             : 
+     505         [ +  + ]:           6 :   for (unsigned int i = 0; i < n_players; i++)
+     506                 :             :     {
+     507                 :           1 :       g_autoptr (ValentMediaPlayer) player = NULL;
+     508                 :           1 :       const char *name;
+     509                 :             : 
+     510                 :           1 :       player = g_list_model_get_item (G_LIST_MODEL (self->media), i);
+     511                 :             : 
+     512         [ -  + ]:           1 :       if (VALENT_IS_MPRIS_DEVICE (player))
+     513         [ #  # ]:           0 :         continue;
+     514                 :             : 
+     515                 :           1 :       name = valent_media_player_get_name (player);
+     516                 :             : 
+     517         [ +  - ]:           1 :       if (name != NULL)
+     518                 :           1 :         json_builder_add_string_value (builder, name);
+     519                 :             :     }
+     520                 :             : 
+     521                 :           5 :   json_builder_end_array (builder);
+     522                 :             : 
+     523                 :             :   /* Indicate that the remote device may send us album art payloads */
+     524                 :           5 :   json_builder_set_member_name (builder, "supportAlbumArtPayload");
+     525                 :           5 :   json_builder_add_boolean_value (builder, TRUE);
+     526                 :             : 
+     527                 :           5 :   packet = valent_packet_end (&builder);
+     528         [ +  - ]:           5 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     529                 :           5 : }
+     530                 :             : 
+     531                 :             : static void
+     532                 :          14 : valent_mpris_plugin_watch_media (ValentMprisPlugin *self,
+     533                 :             :                                  gboolean           state)
+     534                 :             : {
+     535         [ +  + ]:          14 :   if (self->media_watch == state)
+     536                 :             :     return;
+     537                 :             : 
+     538                 :           6 :   self->media = valent_media_get_default ();
+     539                 :             : 
+     540         [ +  + ]:           6 :   if (state)
+     541                 :             :     {
+     542                 :           3 :       unsigned int n_players = 0;
+     543                 :             : 
+     544                 :           3 :       n_players = g_list_model_get_n_items (G_LIST_MODEL (self->media));
+     545                 :             : 
+     546         [ +  + ]:           4 :       for (unsigned int i = 0; i < n_players; i++)
+     547                 :             :         {
+     548                 :           1 :           g_autoptr (ValentMediaPlayer) player = NULL;
+     549                 :             : 
+     550                 :           1 :           player = g_list_model_get_item (G_LIST_MODEL (self->media), i);
+     551         [ +  - ]:           1 :           g_signal_connect_object (player,
+     552                 :             :                                    "notify",
+     553                 :             :                                    G_CALLBACK (on_player_changed),
+     554                 :             :                                    self, 0);
+     555                 :             :         }
+     556                 :             : 
+     557                 :           3 :       g_signal_connect_object (self->media,
+     558                 :             :                                "items-changed",
+     559                 :             :                                G_CALLBACK (on_players_changed),
+     560                 :             :                                self, 0);
+     561                 :             : 
+     562                 :           3 :       self->media_watch = TRUE;
+     563                 :             :     }
+     564                 :             :   else
+     565                 :             :     {
+     566                 :           3 :       unsigned int n_players = 0;
+     567                 :             : 
+     568                 :           3 :       n_players = g_list_model_get_n_items (G_LIST_MODEL (self->media));
+     569                 :             : 
+     570         [ -  + ]:           3 :       for (unsigned int i = 0; i < n_players; i++)
+     571                 :             :         {
+     572                 :           0 :           g_autoptr (ValentMediaPlayer) player = NULL;
+     573                 :             : 
+     574                 :           0 :           player = g_list_model_get_item (G_LIST_MODEL (self->media), i);
+     575         [ #  # ]:           0 :           g_signal_handlers_disconnect_by_data (player, self);
+     576                 :             :         }
+     577                 :             : 
+     578         [ -  + ]:           3 :       g_clear_handle_id (&self->flush_id, g_source_remove);
+     579                 :           3 :       g_signal_handlers_disconnect_by_data (self->media, self);
+     580                 :           3 :       self->media_watch = FALSE;
+     581                 :             :     }
+     582                 :             : }
+     583                 :             : 
+     584                 :             : /*
+     585                 :             :  * Remote Players
+     586                 :             :  */
+     587                 :             : static void
+     588                 :           1 : _valent_mpris_device_free (gpointer player)
+     589                 :             : {
+     590                 :           1 :   valent_media_unexport_player (valent_media_get_default (), player);
+     591                 :           1 :   g_object_unref (player);
+     592                 :           1 : }
+     593                 :             : 
+     594                 :             : static gboolean
+     595                 :           4 : valent_mpris_plugin_find_player (ValentMprisPlugin  *self,
+     596                 :             :                                  const char         *name,
+     597                 :             :                                  ValentMediaPlayer **player)
+     598                 :             : {
+     599         [ +  - ]:           4 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     600   [ +  -  -  + ]:           4 :   g_assert (name != NULL && *name != '\0');
+     601                 :             : 
+     602         [ +  - ]:           4 :   for (unsigned int i = 0, len = self->players->len; i < len; i++)
+     603                 :             :     {
+     604                 :           4 :       *player = g_ptr_array_index (self->players, i);
+     605                 :             : 
+     606         [ -  + ]:           4 :       if (g_strcmp0 (valent_media_player_get_name (*player), name) == 0)
+     607                 :             :         return TRUE;
+     608                 :             : 
+     609                 :           0 :       *player = NULL;
+     610                 :             :     }
+     611                 :             : 
+     612                 :             :   return FALSE;
+     613                 :             : }
+     614                 :             : 
+     615                 :             : static void
+     616                 :           3 : valent_mpris_plugin_request_player_list (ValentMprisPlugin *self)
+     617                 :             : {
+     618                 :           6 :   g_autoptr (JsonBuilder) builder = NULL;
+     619         [ -  + ]:           3 :   g_autoptr (JsonNode) packet = NULL;
+     620                 :             : 
+     621                 :           3 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     622                 :           3 :   json_builder_set_member_name (builder, "requestPlayerList");
+     623                 :           3 :   json_builder_add_boolean_value (builder, TRUE);
+     624                 :           3 :   packet = valent_packet_end (&builder);
+     625                 :             : 
+     626         [ +  - ]:           3 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     627                 :           3 : }
+     628                 :             : 
+     629                 :             : static void
+     630                 :           1 : receive_art_cb (ValentTransfer    *transfer,
+     631                 :             :                 GAsyncResult      *result,
+     632                 :             :                 ValentMprisPlugin *self)
+     633                 :             : {
+     634                 :           1 :   g_autoptr (JsonNode) packet = NULL;
+     635   [ -  -  +  - ]:           1 :   g_autoptr (GFile) file = NULL;
+     636   [ -  -  +  - ]:           1 :   g_autoptr (GError) error = NULL;
+     637                 :           1 :   ValentMediaPlayer *player = NULL;
+     638                 :           1 :   const char *name;
+     639                 :             : 
+     640         [ -  + ]:           1 :   if (!valent_transfer_execute_finish (transfer, result, &error))
+     641                 :             :     {
+     642         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     643                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     644                 :             : 
+     645         [ #  # ]:           0 :       return;
+     646                 :             :     }
+     647                 :             : 
+     648                 :           1 :   g_object_get (transfer,
+     649                 :             :                 "file",   &file,
+     650                 :             :                 "packet", &packet,
+     651                 :             :                 NULL);
+     652                 :             : 
+     653   [ +  -  +  - ]:           2 :   if (valent_packet_get_string (packet, "player", &name) &&
+     654                 :           1 :       valent_mpris_plugin_find_player (self, name, &player))
+     655                 :           1 :     valent_mpris_device_update_art (VALENT_MPRIS_DEVICE (player), file);
+     656                 :             : }
+     657                 :             : 
+     658                 :             : static void
+     659                 :           1 : valent_mpris_plugin_receive_album_art (ValentMprisPlugin *self,
+     660                 :             :                                        JsonNode          *packet)
+     661                 :             : {
+     662                 :           1 :   ValentDevice *device;
+     663                 :           1 :   ValentContext *context = NULL;
+     664                 :           1 :   const char *url;
+     665                 :           1 :   g_autofree char *filename = NULL;
+     666                 :           1 :   g_autoptr (GFile) file = NULL;
+     667         [ +  - ]:           1 :   g_autoptr (ValentTransfer) transfer = NULL;
+     668                 :             : 
+     669         [ -  + ]:           1 :   if (!valent_packet_get_string (packet, "albumArtUrl", &url))
+     670                 :             :     {
+     671                 :           0 :       g_debug ("%s(): expected \"albumArtUrl\" field holding a string",
+     672                 :             :                G_STRFUNC);
+     673                 :           0 :       return;
+     674                 :             :     }
+     675                 :             : 
+     676                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     677                 :           1 :   context = valent_device_get_context (device);
+     678                 :           1 :   filename = g_compute_checksum_for_string (G_CHECKSUM_MD5, url, -1);
+     679                 :           1 :   file = valent_context_get_cache_file (context, filename);
+     680                 :             : 
+     681                 :           1 :   transfer = valent_device_transfer_new (device, packet, file);
+     682         [ +  - ]:           1 :   valent_transfer_execute (transfer,
+     683                 :             :                            NULL,
+     684                 :             :                            (GAsyncReadyCallback)receive_art_cb,
+     685                 :             :                            self);
+     686                 :             : }
+     687                 :             : 
+     688                 :             : static void
+     689                 :           1 : valent_mpris_plugin_request_update (ValentMprisPlugin *self,
+     690                 :             :                                     const char        *player)
+     691                 :             : {
+     692                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     693         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     694                 :             : 
+     695                 :           1 :   valent_packet_init (&builder, "kdeconnect.mpris.request");
+     696                 :           1 :   json_builder_set_member_name (builder, "player");
+     697                 :           1 :   json_builder_add_string_value (builder, player);
+     698                 :           1 :   json_builder_set_member_name (builder, "requestNowPlaying");
+     699                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+     700                 :           1 :   json_builder_set_member_name (builder, "requestVolume");
+     701                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+     702                 :           1 :   packet = valent_packet_end (&builder);
+     703                 :             : 
+     704         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     705                 :           1 : }
+     706                 :             : 
+     707                 :             : static void
+     708                 :           2 : valent_mpris_plugin_handle_player_list (ValentMprisPlugin *self,
+     709                 :             :                                         JsonArray         *player_list)
+     710                 :             : {
+     711                 :           2 :   unsigned int n_remote, n_local, n_extant = 0;
+     712                 :           4 :   g_autofree const char **remote_names = NULL;
+     713                 :           2 :   g_autofree const char **local_names = NULL;
+     714                 :           2 :   ValentDevice *device = NULL;
+     715                 :             : 
+     716         [ +  - ]:           2 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     717         [ -  + ]:           2 :   g_assert (player_list != NULL);
+     718                 :             : 
+     719                 :             : #ifndef __clang_analyzer__
+     720                 :             :   /* Collect the remote player names */
+     721                 :           2 :   n_remote = json_array_get_length (player_list);
+     722         [ -  + ]:           2 :   remote_names = g_new0 (const char *, n_remote + 1);
+     723                 :             : 
+     724         [ +  + ]:           3 :   for (unsigned int i = 0; i < n_remote; i++)
+     725                 :           1 :     remote_names[i] = json_array_get_string_element (player_list, i);
+     726                 :             : 
+     727                 :             :   /* Remove old players */
+     728                 :           2 :   n_local = self->players->len;
+     729         [ -  + ]:           2 :   local_names = g_new0 (const char *, n_local + 1);
+     730                 :             : 
+     731         [ +  + ]:           3 :   for (unsigned int i = n_local; i-- > 0;)
+     732                 :             :     {
+     733                 :           1 :       ValentMediaPlayer *export = g_ptr_array_index (self->players, i);
+     734                 :           1 :       const char *name = valent_media_player_get_name (export);
+     735                 :             : 
+     736         [ -  + ]:           1 :       if (g_strv_contains (remote_names, name))
+     737                 :             :         {
+     738                 :           0 :           local_names[n_extant++] = name;
+     739                 :           0 :           continue;
+     740                 :             :         }
+     741                 :             : 
+     742                 :           1 :       g_ptr_array_remove_index (self->players, i);
+     743                 :             :     }
+     744                 :             : 
+     745                 :             :   /* Add new players */
+     746                 :           2 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     747                 :             : 
+     748         [ +  + ]:           3 :   for (unsigned int i = 0; remote_names[i] != NULL; i++)
+     749                 :             :     {
+     750                 :           1 :       g_autoptr (ValentMprisDevice) player = NULL;
+     751                 :           1 :       const char *name = remote_names[i];
+     752                 :             : 
+     753         [ -  + ]:           1 :       if (g_strv_contains (local_names, name))
+     754                 :           0 :         continue;
+     755                 :             : 
+     756                 :           1 :       player = valent_mpris_device_new (device);
+     757                 :           1 :       valent_mpris_device_update_name (player, name);
+     758                 :             : 
+     759                 :           1 :       g_ptr_array_add (self->players, g_object_ref (player));
+     760                 :           1 :       valent_media_export_player (self->media, VALENT_MEDIA_PLAYER (player));
+     761                 :             : 
+     762         [ +  - ]:           1 :       valent_mpris_plugin_request_update (self, name);
+     763                 :             :     }
+     764                 :             : #endif /* __clang_analyzer__ */
+     765                 :           2 : }
+     766                 :             : 
+     767                 :             : static void
+     768                 :           3 : valent_mpris_plugin_handle_player_update (ValentMprisPlugin *self,
+     769                 :             :                                           JsonNode          *packet)
+     770                 :             : {
+     771                 :           3 :   ValentMediaPlayer *player = NULL;
+     772                 :           3 :   const char *name;
+     773                 :             : 
+     774                 :             :   /* Get the remote */
+     775   [ +  -  -  + ]:           6 :   if (!valent_packet_get_string (packet, "player", &name) ||
+     776                 :           3 :       !valent_mpris_plugin_find_player (self, name, &player))
+     777                 :             :     {
+     778                 :           0 :       valent_mpris_plugin_request_player_list (self);
+     779                 :           1 :       return;
+     780                 :             :     }
+     781                 :             : 
+     782         [ +  + ]:           3 :   if (valent_packet_check_field (packet, "transferringAlbumArt"))
+     783                 :             :     {
+     784                 :           1 :       valent_mpris_plugin_receive_album_art (self, packet);
+     785                 :           1 :       return;
+     786                 :             :     }
+     787                 :             : 
+     788                 :           2 :   valent_mpris_device_handle_packet (VALENT_MPRIS_DEVICE (player), packet);
+     789                 :             : }
+     790                 :             : 
+     791                 :             : static void
+     792                 :           5 : valent_mpris_plugin_handle_mpris (ValentMprisPlugin *self,
+     793                 :             :                                   JsonNode          *packet)
+     794                 :             : {
+     795                 :           5 :   JsonArray *player_list;
+     796                 :             : 
+     797         [ +  - ]:           5 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     798         [ -  + ]:           5 :   g_assert (VALENT_IS_PACKET (packet));
+     799                 :             : 
+     800         [ +  + ]:           5 :   if (valent_packet_get_array (packet, "playerList", &player_list))
+     801                 :           2 :     valent_mpris_plugin_handle_player_list (self, player_list);
+     802                 :             : 
+     803         [ +  - ]:           3 :   else if (valent_packet_get_string (packet, "player", NULL))
+     804                 :           3 :     valent_mpris_plugin_handle_player_update (self, packet);
+     805                 :           5 : }
+     806                 :             : 
+     807                 :             : 
+     808                 :             : /*
+     809                 :             :  * ValentDevicePlugin
+     810                 :             :  */
+     811                 :             : static void
+     812                 :          10 : valent_mpris_plugin_update_state (ValentDevicePlugin *plugin,
+     813                 :             :                                   ValentDeviceState   state)
+     814                 :             : {
+     815                 :          10 :   ValentMprisPlugin *self = VALENT_MPRIS_PLUGIN (plugin);
+     816                 :          10 :   gboolean available;
+     817                 :             : 
+     818         [ +  - ]:          10 :   g_assert (VALENT_IS_MPRIS_PLUGIN (self));
+     819                 :             : 
+     820                 :          10 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     821                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     822                 :             : 
+     823         [ +  + ]:          10 :   if (available)
+     824                 :             :     {
+     825                 :           3 :       valent_mpris_plugin_watch_media (self, TRUE);
+     826                 :           3 :       valent_mpris_plugin_request_player_list (self);
+     827                 :           3 :       valent_mpris_plugin_send_player_list (self);
+     828                 :             :     }
+     829                 :             :   else
+     830                 :             :     {
+     831                 :           7 :       valent_mpris_plugin_watch_media (self, FALSE);
+     832                 :           7 :       g_ptr_array_remove_range (self->players, 0, self->players->len);
+     833                 :             :     }
+     834                 :          10 : }
+     835                 :             : 
+     836                 :             : static void
+     837                 :          16 : valent_mpris_plugin_handle_packet (ValentDevicePlugin *plugin,
+     838                 :             :                                    const char         *type,
+     839                 :             :                                    JsonNode           *packet)
+     840                 :             : {
+     841                 :          16 :   ValentMprisPlugin *self = VALENT_MPRIS_PLUGIN (plugin);
+     842                 :             : 
+     843         [ +  - ]:          16 :   g_assert (VALENT_IS_MPRIS_PLUGIN (plugin));
+     844         [ -  + ]:          16 :   g_assert (type != NULL);
+     845         [ -  + ]:          16 :   g_assert (VALENT_IS_PACKET (packet));
+     846                 :             : 
+     847         [ +  + ]:          16 :   if (g_str_equal (type, "kdeconnect.mpris"))
+     848                 :           5 :     valent_mpris_plugin_handle_mpris (self, packet);
+     849                 :             : 
+     850         [ +  - ]:          11 :   else if (g_str_equal (type, "kdeconnect.mpris.request"))
+     851                 :          11 :     valent_mpris_plugin_handle_mpris_request (self, packet);
+     852                 :             : 
+     853                 :             :   else
+     854                 :           0 :     g_assert_not_reached ();
+     855                 :          16 : }
+     856                 :             : 
+     857                 :             : /*
+     858                 :             :  * ValentObject
+     859                 :             :  */
+     860                 :             : static void
+     861                 :           4 : valent_mpris_plugin_destroy (ValentObject *object)
+     862                 :             : {
+     863                 :           4 :   ValentMprisPlugin *self = VALENT_MPRIS_PLUGIN (object);
+     864                 :             : 
+     865                 :           4 :   valent_mpris_plugin_watch_media (self, FALSE);
+     866                 :           4 :   self->media = NULL;
+     867                 :             : 
+     868                 :           4 :   VALENT_OBJECT_CLASS (valent_mpris_plugin_parent_class)->destroy (object);
+     869                 :           4 : }
+     870                 :             : 
+     871                 :             : /*
+     872                 :             :  * GObject
+     873                 :             :  */
+     874                 :             : static void
+     875                 :           3 : valent_mpris_plugin_constructed (GObject *object)
+     876                 :             : {
+     877                 :           3 :   ValentMprisPlugin *self = VALENT_MPRIS_PLUGIN (object);
+     878                 :             : 
+     879                 :           3 :   self->media = valent_media_get_default ();
+     880                 :             : 
+     881                 :           3 :   G_OBJECT_CLASS (valent_mpris_plugin_parent_class)->constructed (object);
+     882                 :           3 : }
+     883                 :             : 
+     884                 :             : static void
+     885                 :           2 : valent_mpris_plugin_finalize (GObject *object)
+     886                 :             : {
+     887                 :           2 :   ValentMprisPlugin *self = VALENT_MPRIS_PLUGIN (object);
+     888                 :             : 
+     889         [ +  - ]:           2 :   g_clear_pointer (&self->pending, g_hash_table_unref);
+     890         [ +  - ]:           2 :   g_clear_pointer (&self->players, g_ptr_array_unref);
+     891         [ +  - ]:           2 :   g_clear_pointer (&self->transfers, g_hash_table_unref);
+     892                 :             : 
+     893                 :           2 :   G_OBJECT_CLASS (valent_mpris_plugin_parent_class)->finalize (object);
+     894                 :           2 : }
+     895                 :             : 
+     896                 :             : static void
+     897                 :           2 : valent_mpris_plugin_class_init (ValentMprisPluginClass *klass)
+     898                 :             : {
+     899                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     900                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     901                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     902                 :             : 
+     903                 :           2 :   object_class->constructed = valent_mpris_plugin_constructed;
+     904                 :           2 :   object_class->finalize = valent_mpris_plugin_finalize;
+     905                 :             : 
+     906                 :           2 :   vobject_class->destroy = valent_mpris_plugin_destroy;
+     907                 :             : 
+     908                 :           2 :   plugin_class->handle_packet = valent_mpris_plugin_handle_packet;
+     909                 :           2 :   plugin_class->update_state = valent_mpris_plugin_update_state;
+     910                 :             : }
+     911                 :             : 
+     912                 :             : static void
+     913                 :           3 : valent_mpris_plugin_init (ValentMprisPlugin *self)
+     914                 :             : {
+     915                 :           3 :   self->players = g_ptr_array_new_with_free_func (_valent_mpris_device_free);
+     916                 :           3 :   self->transfers = g_hash_table_new_full (g_str_hash,
+     917                 :             :                                            g_str_equal,
+     918                 :             :                                            g_free,
+     919                 :             :                                            g_object_unref);
+     920                 :           3 :   self->pending = g_hash_table_new (NULL, NULL);
+     921                 :           3 : }
+     922                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-plugin.h.func-c.html b/coverage/src/plugins/mpris/valent-mpris-plugin.h.func-c.html new file mode 100644 index 00000000000..889c36d55e6 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_PLUGIN92
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-plugin.h.func.html b/coverage/src/plugins/mpris/valent-mpris-plugin.h.func.html new file mode 100644 index 00000000000..940ff7c7137 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MPRIS_PLUGIN92
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-plugin.h.gcov.html b/coverage/src/plugins/mpris/valent-mpris-plugin.h.gcov.html new file mode 100644 index 00000000000..7512cfa54de --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_MPRIS_PLUGIN (valent_mpris_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          92 : G_DECLARE_FINAL_TYPE (ValentMprisPlugin, valent_mpris_plugin, VALENT, MPRIS_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-utils.c.func-c.html b/coverage/src/plugins/mpris/valent-mpris-utils.c.func-c.html new file mode 100644 index 00000000000..048e5148a0b --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-utils.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3939
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:78.1 %3225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mpris_get_application_iface10
valent_mpris_get_player_iface10
valent_mpris_get_time14
valent_mpris_repeat_from_string18
valent_mpris_get_info20
valent_mpris_repeat_to_string22
valent_mpris_state_to_string31
valent_mpris_state_from_string42
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-utils.c.func.html b/coverage/src/plugins/mpris/valent-mpris-utils.c.func.html new file mode 100644 index 00000000000..71f9aafd262 --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-utils.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3939
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:78.1 %3225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_mpris_get_application_iface10
valent_mpris_get_info20
valent_mpris_get_player_iface10
valent_mpris_get_time14
valent_mpris_repeat_from_string18
valent_mpris_repeat_to_string22
valent_mpris_state_from_string42
valent_mpris_state_to_string31
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/mpris/valent-mpris-utils.c.gcov.html b/coverage/src/plugins/mpris/valent-mpris-utils.c.gcov.html new file mode 100644 index 00000000000..9641c36769c --- /dev/null +++ b/coverage/src/plugins/mpris/valent-mpris-utils.c.gcov.html @@ -0,0 +1,325 @@ + + + + + + + LCOV - Code Coverage - src/plugins/mpris/valent-mpris-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/mpris - valent-mpris-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %3939
Test Date:2024-03-31 18:46:36Functions:100.0 %88
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:78.1 %3225
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-mpris-player"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-mpris-utils.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : /*
+      17                 :             :  * DBus Interfaces
+      18                 :             :  */
+      19                 :             : static const char mpris_xml[] =
+      20                 :             :   "<node name='/org/mpris/MediaPlayer2'>"
+      21                 :             :   "  <interface name='org.mpris.MediaPlayer2'>"
+      22                 :             :   "    <method name='Raise'/>"
+      23                 :             :   "    <method name='Quit'/>"
+      24                 :             :   "    <property name='CanQuit' type='b' access='read'/>"
+      25                 :             :   "    <property name='Fullscreen' type='b' access='readwrite'/>"
+      26                 :             :   "    <property name='CanSetFullscreen' type='b' access='read'/>"
+      27                 :             :   "    <property name='CanRaise' type='b' access='read'/>"
+      28                 :             :   "    <property name='HasTrackList' type='b' access='read'/>"
+      29                 :             :   "    <property name='Identity' type='s' access='read'/>"
+      30                 :             :   "    <property name='DesktopEntry' type='s' access='read'/>"
+      31                 :             :   "    <property name='SupportedUriSchemes' type='as' access='read'/>"
+      32                 :             :   "    <property name='SupportedMimeTypes' type='as' access='read'/>"
+      33                 :             :   "  </interface>"
+      34                 :             :   "  <interface name='org.mpris.MediaPlayer2.Player'>"
+      35                 :             :   "    <method name='Next'/>"
+      36                 :             :   "    <method name='Previous'/>"
+      37                 :             :   "    <method name='Pause'/>"
+      38                 :             :   "    <method name='PlayPause'/>"
+      39                 :             :   "    <method name='Stop'/>"
+      40                 :             :   "    <method name='Play'/>"
+      41                 :             :   "    <method name='Seek'>"
+      42                 :             :   "      <arg direction='in' type='x' name='Offset'/>"
+      43                 :             :   "    </method>"
+      44                 :             :   "    <method name='SetPosition'>"
+      45                 :             :   "      <arg direction='in' type='o' name='TrackId'/>"
+      46                 :             :   "      <arg direction='in' type='x' name='Position'/>"
+      47                 :             :   "    </method>"
+      48                 :             :   "    <method name='OpenUri'>"
+      49                 :             :   "      <arg direction='in' type='s' name='Uri'/>"
+      50                 :             :   "    </method>"
+      51                 :             :   "    <property name='PlaybackStatus' type='s' access='read'/>"
+      52                 :             :   "    <property name='LoopStatus' type='s' access='readwrite'/>"
+      53                 :             :   "    <property name='Rate' type='d' access='readwrite'/>"
+      54                 :             :   "    <property name='Shuffle' type='b' access='readwrite'/>"
+      55                 :             :   "    <property name='Metadata' type='a{sv}' access='read'/>"
+      56                 :             :   "    <property name='Volume' type='d' access='readwrite'/>"
+      57                 :             :   "    <property name='Position' type='x' access='read'/>"
+      58                 :             :   "    <property name='MinimumRate' type='d' access='read'/>"
+      59                 :             :   "    <property name='MaximumRate' type='d' access='read'/>"
+      60                 :             :   "    <property name='CanGoNext' type='b' access='read'/>"
+      61                 :             :   "    <property name='CanGoPrevious' type='b' access='read'/>"
+      62                 :             :   "    <property name='CanPlay' type='b' access='read'/>"
+      63                 :             :   "    <property name='CanPause' type='b' access='read'/>"
+      64                 :             :   "    <property name='CanSeek' type='b' access='read'/>"
+      65                 :             :   "    <property name='CanControl' type='b' access='read'/>"
+      66                 :             :   "    <signal name='Seeked'>"
+      67                 :             :   "      <arg name='Position' type='x'/>"
+      68                 :             :   "    </signal>"
+      69                 :             :   "  </interface>"
+      70                 :             :   "</node>";
+      71                 :             : 
+      72                 :             : 
+      73                 :             : static inline GDBusNodeInfo *
+      74                 :          20 : valent_mpris_get_info (void)
+      75                 :             : {
+      76                 :          20 :   static GDBusNodeInfo *mpris_info = NULL;
+      77                 :          20 :   static size_t guard = 0;
+      78                 :             : 
+      79   [ +  +  +  - ]:          20 :   if (g_once_init_enter (&guard))
+      80                 :             :     {
+      81                 :           2 :       mpris_info = g_dbus_node_info_new_for_xml (mpris_xml, NULL);
+      82                 :           2 :       g_dbus_interface_info_cache_build (mpris_info->interfaces[0]);
+      83                 :           2 :       g_dbus_interface_info_cache_build (mpris_info->interfaces[1]);
+      84                 :             : 
+      85                 :           2 :       g_once_init_leave (&guard, 1);
+      86                 :             :     }
+      87                 :             : 
+      88                 :          20 :   return mpris_info;
+      89                 :             : }
+      90                 :             : 
+      91                 :             : /**
+      92                 :             :  * valent_mpris_get_application_iface:
+      93                 :             :  *
+      94                 :             :  * Get a `GDBusInterfaceInfo` for the `org.mpris.MediaPlayer2` interface.
+      95                 :             :  *
+      96                 :             :  * Returns: (transfer none): a `GDBusInterfaceInfo`
+      97                 :             :  */
+      98                 :             : GDBusInterfaceInfo *
+      99                 :          10 : valent_mpris_get_application_iface (void)
+     100                 :             : {
+     101                 :          10 :   GDBusNodeInfo *mpris_info = valent_mpris_get_info ();
+     102                 :             : 
+     103                 :          10 :   return mpris_info->interfaces[0];
+     104                 :             : }
+     105                 :             : 
+     106                 :             : /**
+     107                 :             :  * valent_mpris_get_player_iface:
+     108                 :             :  *
+     109                 :             :  * Get a `GDBusInterfaceInfo` for the `org.mpris.MediaPlayer2.Player` interface.
+     110                 :             :  *
+     111                 :             :  * Returns: (transfer none): a `GDBusInterfaceInfo`
+     112                 :             :  */
+     113                 :             : GDBusInterfaceInfo *
+     114                 :          10 : valent_mpris_get_player_iface (void)
+     115                 :             : {
+     116                 :          10 :   GDBusNodeInfo *mpris_info = valent_mpris_get_info ();
+     117                 :             : 
+     118                 :          10 :   return mpris_info->interfaces[1];
+     119                 :             : }
+     120                 :             : 
+     121                 :             : /**
+     122                 :             :  * valent_mpris_repeat_from_string:
+     123                 :             :  * @loop_status: repeat mode to translate
+     124                 :             :  *
+     125                 :             :  * Translate an MPRIS `LoopStatus` string to a `ValentMediaRepeat`.
+     126                 :             :  *
+     127                 :             :  * Returns: (transfer none): a repeat mode
+     128                 :             :  */
+     129                 :             : ValentMediaRepeat
+     130                 :          18 : valent_mpris_repeat_from_string (const char *loop_status)
+     131                 :             : {
+     132         [ +  - ]:          18 :   g_return_val_if_fail (loop_status != NULL, VALENT_MEDIA_REPEAT_NONE);
+     133                 :             : 
+     134         [ +  + ]:          18 :   if (g_str_equal (loop_status, "None"))
+     135                 :             :     return VALENT_MEDIA_REPEAT_NONE;
+     136                 :             : 
+     137         [ +  + ]:           9 :   if (g_str_equal (loop_status, "Playlist"))
+     138                 :             :     return VALENT_MEDIA_REPEAT_ALL;
+     139                 :             : 
+     140         [ -  + ]:           6 :   if (g_str_equal (loop_status, "Track"))
+     141                 :             :     return VALENT_MEDIA_REPEAT_ONE;
+     142                 :             : 
+     143                 :             :   return VALENT_MEDIA_REPEAT_NONE;
+     144                 :             : }
+     145                 :             : 
+     146                 :             : /**
+     147                 :             :  * valent_mpris_repeat_to_string:
+     148                 :             :  * @repeat: repeat mode to translate
+     149                 :             :  *
+     150                 :             :  * Translate a `ValentMediaRepeat` enum to an MPRIS `LoopStatus` string.
+     151                 :             :  *
+     152                 :             :  * Returns: (transfer none): a status string
+     153                 :             :  */
+     154                 :             : const char *
+     155                 :          22 : valent_mpris_repeat_to_string (ValentMediaRepeat repeat)
+     156                 :             : {
+     157         [ +  - ]:          22 :   g_return_val_if_fail (repeat <= VALENT_MEDIA_REPEAT_ONE, "None");
+     158                 :             : 
+     159         [ +  + ]:          22 :   if (repeat == VALENT_MEDIA_REPEAT_NONE)
+     160                 :             :       return "None";
+     161                 :             : 
+     162         [ +  + ]:          11 :   if (repeat == VALENT_MEDIA_REPEAT_ALL)
+     163                 :             :       return "Playlist";
+     164                 :             : 
+     165                 :           6 :   if (repeat == VALENT_MEDIA_REPEAT_ONE)
+     166                 :           6 :       return "Track";
+     167                 :             : 
+     168                 :             :   return "None";
+     169                 :             : }
+     170                 :             : 
+     171                 :             : /**
+     172                 :             :  * valent_mpris_state_from_string:
+     173                 :             :  * @playback_status: playback mode to translate
+     174                 :             :  *
+     175                 :             :  * Translate an MPRIS `PlaybackStatus` string to a `ValentMediaState`.
+     176                 :             :  *
+     177                 :             :  * Returns: (transfer none): a playback state
+     178                 :             :  */
+     179                 :             : ValentMediaState
+     180                 :          42 : valent_mpris_state_from_string (const char *playback_status)
+     181                 :             : {
+     182         [ +  - ]:          42 :   g_return_val_if_fail (playback_status != NULL, VALENT_MEDIA_STATE_STOPPED);
+     183                 :             : 
+     184         [ +  + ]:          42 :   if (g_str_equal (playback_status, "Stopped"))
+     185                 :             :     return VALENT_MEDIA_STATE_STOPPED;
+     186                 :             : 
+     187         [ +  + ]:          20 :   if (g_str_equal (playback_status, "Playing"))
+     188                 :             :     return VALENT_MEDIA_STATE_PLAYING;
+     189                 :             : 
+     190         [ -  + ]:           7 :   if (g_str_equal (playback_status, "Paused"))
+     191                 :             :     return VALENT_MEDIA_STATE_PAUSED;
+     192                 :             : 
+     193                 :             :   return VALENT_MEDIA_STATE_STOPPED;
+     194                 :             : }
+     195                 :             : 
+     196                 :             : /**
+     197                 :             :  * valent_mpris_state_to_string:
+     198                 :             :  * @state: playback mode to translate
+     199                 :             :  *
+     200                 :             :  * Translate a `ValentMediaState` enum to an MPRIS `PlaybackStatus` string.
+     201                 :             :  *
+     202                 :             :  * Returns: (transfer none): a status string
+     203                 :             :  */
+     204                 :             : const char *
+     205                 :          31 : valent_mpris_state_to_string (ValentMediaState state)
+     206                 :             : {
+     207         [ +  - ]:          31 :   g_return_val_if_fail (state <= VALENT_MEDIA_STATE_PAUSED, "Stopped");
+     208                 :             : 
+     209         [ +  + ]:          31 :   if (state == VALENT_MEDIA_STATE_STOPPED)
+     210                 :             :       return "Stopped";
+     211                 :             : 
+     212         [ +  + ]:          16 :   if (state == VALENT_MEDIA_STATE_PLAYING)
+     213                 :             :       return "Playing";
+     214                 :             : 
+     215                 :           7 :   if (state == VALENT_MEDIA_STATE_PAUSED)
+     216                 :           7 :       return "Paused";
+     217                 :             : 
+     218                 :             :   return "Stopped";
+     219                 :             : }
+     220                 :             : 
+     221                 :             : /**
+     222                 :             :  * valent_mpris_get_time:
+     223                 :             :  *
+     224                 :             :  * Get a monotonic timestamp, in seconds.
+     225                 :             :  *
+     226                 :             :  * Returns: a timestamp in seconds
+     227                 :             :  */
+     228                 :             : double
+     229                 :          14 : valent_mpris_get_time (void)
+     230                 :             : {
+     231                 :          14 :   return floor (g_get_real_time () / G_TIME_SPAN_SECOND);
+     232                 :             : }
+     233                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-detail-sort-b.html b/coverage/src/plugins/notification/index-detail-sort-b.html new file mode 100644 index 00000000000..b8d2f88fc8a --- /dev/null +++ b/coverage/src/plugins/notification/index-detail-sort-b.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-detail-sort-f.html b/coverage/src/plugins/notification/index-detail-sort-f.html new file mode 100644 index 00000000000..d20a4f1360d --- /dev/null +++ b/coverage/src/plugins/notification/index-detail-sort-f.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-detail-sort-l.html b/coverage/src/plugins/notification/index-detail-sort-l.html new file mode 100644 index 00000000000..2e189e253f7 --- /dev/null +++ b/coverage/src/plugins/notification/index-detail-sort-l.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-detail.html b/coverage/src/plugins/notification/index-detail.html new file mode 100644 index 00000000000..77f6765ae3f --- /dev/null +++ b/coverage/src/plugins/notification/index-detail.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-sort-b.html b/coverage/src/plugins/notification/index-sort-b.html new file mode 100644 index 00000000000..b8d2f88fc8a --- /dev/null +++ b/coverage/src/plugins/notification/index-sort-b.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-sort-f.html b/coverage/src/plugins/notification/index-sort-f.html new file mode 100644 index 00000000000..d20a4f1360d --- /dev/null +++ b/coverage/src/plugins/notification/index-sort-f.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index-sort-l.html b/coverage/src/plugins/notification/index-sort-l.html new file mode 100644 index 00000000000..2e189e253f7 --- /dev/null +++ b/coverage/src/plugins/notification/index-sort-l.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/index.html b/coverage/src/plugins/notification/index.html new file mode 100644 index 00000000000..77f6765ae3f --- /dev/null +++ b/coverage/src/plugins/notification/index.html @@ -0,0 +1,248 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notificationCoverageTotalHit
Test:Code CoverageLines:72.7 %987718
Test Date:2024-03-31 18:46:36Functions:81.1 %9073
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:41.8 %684286
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
notification-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-notification-dialog.c +
75.9%75.9%
+
75.9 %15812048.5 %663288.9 %1816
valent-notification-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-plugin.c +
79.9%79.9%
+
79.9 %45836644.5 %36216190.6 %3229
valent-notification-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-notification-preferences.c +
41.0%41.0%
+
41.0 %1666810.7 %56647.4 %199
valent-notification-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-notification-upload.c +
79.7%79.7%
+
79.7 %19715744.3 %1767893.8 %1615
valent-notification-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/notification-plugin.c.func-c.html b/coverage/src/plugins/notification/notification-plugin.c.func-c.html new file mode 100644 index 00000000000..b2aa00b044a --- /dev/null +++ b/coverage/src/plugins/notification/notification-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/notification-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - notification-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notification_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/notification-plugin.c.func.html b/coverage/src/plugins/notification/notification-plugin.c.func.html new file mode 100644 index 00000000000..f8ac5939b0d --- /dev/null +++ b/coverage/src/plugins/notification/notification-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/notification-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - notification-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notification_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/notification-plugin.c.gcov.html b/coverage/src/plugins/notification/notification-plugin.c.gcov.html new file mode 100644 index 00000000000..2db1efcdd8f --- /dev/null +++ b/coverage/src/plugins/notification/notification-plugin.c.gcov.html @@ -0,0 +1,116 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/notification-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - notification-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-notification-plugin.h"
+      10                 :             : #include "valent-notification-preferences.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_notification_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_NOTIFICATION_PLUGIN);
+      19                 :             : 
+      20                 :           2 :   peas_object_module_register_extension_type (module,
+      21                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      22                 :             :                                               VALENT_TYPE_NOTIFICATION_PREFERENCES);
+      23                 :           2 : }
+      24                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-dialog.c.func-c.html b/coverage/src/plugins/notification/valent-notification-dialog.c.func-c.html new file mode 100644 index 00000000000..6efbec046dd --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-dialog.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:75.9 %158120
Test Date:2024-03-31 18:46:36Functions:88.9 %1816
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:48.5 %6632
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
notification_close_action0
notification_reply_action0
dialog_cancel_action1
valent_notification_dialog_class_init1
valent_notification_dialog_constructed1
valent_notification_dialog_dispose1
valent_notification_dialog_finalize1
valent_notification_dialog_get_notification1
valent_notification_dialog_init1
valent_notification_dialog_set_notification1
valent_notification_dialog_get_property2
valent_notification_dialog_get_reply_id2
valent_notification_dialog_set_reply_id2
valent_notification_dialog_set_property3
valent_notification_dialog_sync4
valent_notification_dialog_get_type15
valent_notification_dialog_class_intern_init1
valent_notification_dialog_get_type_once1
valent_notification_dialog_get_type13
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-dialog.c.func.html b/coverage/src/plugins/notification/valent-notification-dialog.c.func.html new file mode 100644 index 00000000000..e9e26bf0457 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-dialog.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:75.9 %158120
Test Date:2024-03-31 18:46:36Functions:88.9 %1816
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:48.5 %6632
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
dialog_cancel_action1
notification_close_action0
notification_reply_action0
valent_notification_dialog_class_init1
valent_notification_dialog_constructed1
valent_notification_dialog_dispose1
valent_notification_dialog_finalize1
valent_notification_dialog_get_notification1
valent_notification_dialog_get_property2
valent_notification_dialog_get_reply_id2
valent_notification_dialog_get_type15
valent_notification_dialog_class_intern_init1
valent_notification_dialog_get_type13
valent_notification_dialog_get_type_once1
valent_notification_dialog_init1
valent_notification_dialog_set_notification1
valent_notification_dialog_set_property3
valent_notification_dialog_set_reply_id2
valent_notification_dialog_sync4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-dialog.c.gcov.html b/coverage/src/plugins/notification/valent-notification-dialog.c.gcov.html new file mode 100644 index 00000000000..2111da7b402 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-dialog.c.gcov.html @@ -0,0 +1,517 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-dialog.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:75.9 %158120
Test Date:2024-03-31 18:46:36Functions:88.9 %1816
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:48.5 %6632
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notification-dialog"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-notification-dialog.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentNotificationDialog
+      16                 :             : {
+      17                 :             :   GtkWindow           parent_instance;
+      18                 :             : 
+      19                 :             :   ValentDevice       *device;
+      20                 :             :   ValentNotification *notification;
+      21                 :             :   char               *reply_id;
+      22                 :             : 
+      23                 :             :   /* template */
+      24                 :             :   GtkButton          *cancel_button;
+      25                 :             :   GtkButton          *reply_button;
+      26                 :             :   GtkImage           *icon_image;
+      27                 :             :   GtkLabel           *title_label;
+      28                 :             :   GtkLabel           *body_label;
+      29                 :             :   GtkLabel           *time_label;
+      30                 :             :   GtkWidget          *reply_frame;
+      31                 :             :   GtkTextView        *reply_entry;
+      32                 :             : };
+      33                 :             : 
+      34   [ +  +  +  - ]:          15 : G_DEFINE_FINAL_TYPE (ValentNotificationDialog, valent_notification_dialog, GTK_TYPE_WINDOW)
+      35                 :             : 
+      36                 :             : enum {
+      37                 :             :   PROP_0,
+      38                 :             :   PROP_DEVICE,
+      39                 :             :   PROP_NOTIFICATION,
+      40                 :             :   PROP_REPLY_ID,
+      41                 :             :   N_PROPERTIES
+      42                 :             : };
+      43                 :             : 
+      44                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      45                 :             : 
+      46                 :             : 
+      47                 :             : static void
+      48                 :           4 : valent_notification_dialog_sync (ValentNotificationDialog *self)
+      49                 :             : {
+      50                 :           4 :   gboolean repliable = FALSE;
+      51                 :           4 :   gboolean enabled = FALSE;
+      52                 :             : 
+      53         [ +  - ]:           4 :   g_assert (VALENT_IS_NOTIFICATION_DIALOG (self));
+      54                 :             : 
+      55                 :             :   /* Check if the notification is repliable */
+      56   [ +  +  -  + ]:           4 :   repliable = (self->reply_id != NULL && *self->reply_id != '\0');
+      57                 :           4 :   gtk_widget_set_visible (GTK_WIDGET (self->reply_button), repliable);
+      58                 :           4 :   gtk_widget_set_visible (GTK_WIDGET (self->reply_frame), repliable);
+      59                 :             : 
+      60                 :             :   /* If it's repliable, check if the device action is enabled */
+      61   [ +  +  -  + ]:           4 :   if (repliable && self->device != NULL)
+      62                 :           0 :     enabled = g_action_group_get_action_enabled (G_ACTION_GROUP (self->device),
+      63                 :             :                                                  "notification.reply");
+      64                 :             : 
+      65                 :           4 :   gtk_widget_set_sensitive (GTK_WIDGET (self->reply_entry), enabled);
+      66                 :             : 
+      67                 :             :   /* If it's enabled, check if a reply is ready to be sent */
+      68         [ -  + ]:           4 :   if (enabled)
+      69                 :             :     {
+      70                 :           0 :       GtkTextBuffer *buffer;
+      71                 :             : 
+      72                 :           0 :       buffer = gtk_text_view_get_buffer (self->reply_entry);
+      73                 :           0 :       enabled = gtk_text_buffer_get_char_count (buffer) > 0;
+      74                 :             :     }
+      75                 :             : 
+      76                 :           4 :   gtk_widget_action_set_enabled (GTK_WIDGET (self),
+      77                 :             :                                  "notification.reply",
+      78                 :             :                                  enabled);
+      79                 :           4 : }
+      80                 :             : 
+      81                 :             : static void
+      82                 :           1 : valent_notification_dialog_set_notification (ValentNotificationDialog *self,
+      83                 :             :                                              ValentNotification       *notification)
+      84                 :             : {
+      85                 :           1 :   GIcon *icon;
+      86                 :           1 :   const char *title;
+      87                 :           1 :   const char *body;
+      88                 :           1 :   gint64 timestamp;
+      89                 :             : 
+      90         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_DIALOG (self));
+      91   [ +  -  -  + ]:           1 :   g_assert (notification == NULL || VALENT_IS_NOTIFICATION (notification));
+      92                 :             : 
+      93         [ +  - ]:           1 :   if (!g_set_object (&self->notification, notification))
+      94                 :             :     return;
+      95                 :             : 
+      96         [ +  - ]:           1 :   if ((icon = valent_notification_get_icon (self->notification)) != NULL)
+      97                 :           1 :     gtk_image_set_from_gicon (self->icon_image, icon);
+      98                 :             : 
+      99         [ +  - ]:           1 :   if ((title = valent_notification_get_title (self->notification)) != NULL)
+     100                 :           1 :     gtk_label_set_label (self->title_label, title);
+     101                 :             : 
+     102         [ +  - ]:           1 :   if ((body = valent_notification_get_body (self->notification)) != NULL)
+     103                 :             :     {
+     104                 :           1 :       g_autofree char *label = NULL;
+     105                 :             : 
+     106                 :           1 :       label = valent_string_to_markup (body);
+     107                 :           1 :       gtk_label_set_label (self->body_label, label);
+     108                 :             :     }
+     109                 :             : 
+     110                 :             :       // FIXME: better time string
+     111         [ -  + ]:           1 :   if ((timestamp = valent_notification_get_time (self->notification)) != 0)
+     112                 :             :     {
+     113                 :           1 :       g_autoptr (GDateTime) date = NULL;
+     114         [ #  # ]:           0 :       g_autofree char *label = NULL;
+     115                 :             : 
+     116                 :           0 :       date = g_date_time_new_from_unix_local (timestamp / 1000);
+     117                 :           0 :       label = g_date_time_format (date, "%c");
+     118                 :           0 :       gtk_label_set_label (self->time_label, label);
+     119                 :             :     }
+     120                 :             : 
+     121                 :           1 :   valent_notification_dialog_sync (self);
+     122                 :             : }
+     123                 :             : 
+     124                 :             : /*
+     125                 :             :  * GAction
+     126                 :             :  */
+     127                 :             : static void
+     128                 :           1 : dialog_cancel_action (GtkWidget  *widget,
+     129                 :             :                       const char *action_name,
+     130                 :             :                       GVariant   *parameter)
+     131                 :             : {
+     132                 :           1 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (widget);
+     133                 :             : 
+     134         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_DIALOG (self));
+     135                 :             : 
+     136                 :           1 :   gtk_window_destroy (GTK_WINDOW (self));
+     137                 :           1 : }
+     138                 :             : 
+     139                 :             : static void
+     140                 :           0 : notification_close_action (GtkWidget  *widget,
+     141                 :             :                            const char *action_name,
+     142                 :             :                            GVariant   *parameter)
+     143                 :             : {
+     144                 :           0 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (widget);
+     145                 :           0 :   const char *id = NULL;
+     146                 :             : 
+     147         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_DIALOG (self));
+     148                 :             : 
+     149                 :           0 :   id = valent_notification_get_id (self->notification);
+     150                 :           0 :   g_action_group_activate_action (G_ACTION_GROUP (self->device),
+     151                 :             :                                   "notification.close",
+     152                 :             :                                   g_variant_new_string (id));
+     153                 :           0 : }
+     154                 :             : 
+     155                 :             : static void
+     156                 :           0 : notification_reply_action (GtkWidget  *widget,
+     157                 :             :                            const char *action_name,
+     158                 :             :                            GVariant   *parameter)
+     159                 :             : {
+     160                 :           0 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (widget);
+     161                 :           0 :   g_autofree char *message = NULL;
+     162                 :           0 :   GVariant *reply = NULL;
+     163                 :           0 :   GtkTextBuffer *buffer;
+     164                 :             : 
+     165         [ #  # ]:           0 :   if (!g_action_group_get_action_enabled (G_ACTION_GROUP (self->device),
+     166                 :             :                                           "notification.reply"))
+     167                 :             :     return;
+     168                 :             : 
+     169                 :           0 :   buffer = gtk_text_view_get_buffer (self->reply_entry);
+     170                 :           0 :   g_object_get (buffer, "text", &message, NULL);
+     171   [ #  #  #  # ]:           0 :   g_return_if_fail (message != NULL && *message != '\0');
+     172                 :             : 
+     173                 :           0 :   reply = g_variant_new ("(ssv)", self->reply_id, message,
+     174                 :             :                          valent_notification_serialize (self->notification));
+     175                 :           0 :   g_action_group_activate_action (G_ACTION_GROUP (self->device),
+     176                 :             :                                   "notification.reply",
+     177                 :             :                                   reply);
+     178                 :           0 :   gtk_window_destroy (GTK_WINDOW (self));
+     179                 :             : }
+     180                 :             : 
+     181                 :             : /*
+     182                 :             :  * GObject
+     183                 :             :  */
+     184                 :             : static void
+     185                 :           1 : valent_notification_dialog_dispose (GObject *object)
+     186                 :             : {
+     187                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     188                 :             : 
+     189                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_NOTIFICATION_DIALOG);
+     190                 :             : 
+     191                 :           1 :   G_OBJECT_CLASS (valent_notification_dialog_parent_class)->dispose (object);
+     192                 :           1 : }
+     193                 :             : 
+     194                 :             : static void
+     195                 :           1 : valent_notification_dialog_constructed (GObject *object)
+     196                 :             : {
+     197                 :           1 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (object);
+     198                 :             : 
+     199         [ -  + ]:           1 :   if (self->device != NULL)
+     200                 :             :     {
+     201                 :           0 :       gtk_widget_insert_action_group (GTK_WIDGET (self),
+     202                 :             :                                       "device",
+     203                 :             :                                       G_ACTION_GROUP (self->device));
+     204                 :           0 :       g_signal_connect_object (self->device,
+     205                 :             :                                "action-added::notification.reply",
+     206                 :             :                                G_CALLBACK (valent_notification_dialog_sync),
+     207                 :             :                                self,
+     208                 :             :                                G_CONNECT_SWAPPED);
+     209                 :           0 :       g_signal_connect_object (self->device,
+     210                 :             :                                "action-removed::notification.reply",
+     211                 :             :                                G_CALLBACK (valent_notification_dialog_sync),
+     212                 :             :                                self,
+     213                 :             :                                G_CONNECT_SWAPPED);
+     214                 :           0 :       g_signal_connect_object (self->device,
+     215                 :             :                                "action-enabled-changed::notification.reply",
+     216                 :             :                                G_CALLBACK (valent_notification_dialog_sync),
+     217                 :             :                                self,
+     218                 :             :                                G_CONNECT_SWAPPED);
+     219                 :             :     }
+     220                 :             : 
+     221                 :           1 :   valent_notification_dialog_sync (self);
+     222                 :             : 
+     223                 :           1 :   G_OBJECT_CLASS (valent_notification_dialog_parent_class)->constructed (object);
+     224                 :           1 : }
+     225                 :             : 
+     226                 :             : static void
+     227                 :           1 : valent_notification_dialog_finalize (GObject *object)
+     228                 :             : {
+     229                 :           1 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (object);
+     230                 :             : 
+     231         [ +  - ]:           1 :   g_clear_object (&self->notification);
+     232         [ -  + ]:           1 :   g_clear_pointer (&self->reply_id, g_free);
+     233                 :             : 
+     234                 :           1 :   G_OBJECT_CLASS (valent_notification_dialog_parent_class)->finalize (object);
+     235                 :           1 : }
+     236                 :             : 
+     237                 :             : static void
+     238                 :           2 : valent_notification_dialog_get_property (GObject    *object,
+     239                 :             :                                          guint       prop_id,
+     240                 :             :                                          GValue     *value,
+     241                 :             :                                          GParamSpec *pspec)
+     242                 :             : {
+     243                 :           2 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (object);
+     244                 :             : 
+     245   [ -  +  +  - ]:           2 :   switch (prop_id)
+     246                 :             :     {
+     247                 :           0 :     case PROP_DEVICE:
+     248                 :           0 :       g_value_set_object (value, self->device);
+     249                 :           0 :       break;
+     250                 :             : 
+     251                 :           1 :     case PROP_NOTIFICATION:
+     252                 :           1 :       g_value_set_object (value, self->notification);
+     253                 :           1 :       break;
+     254                 :             : 
+     255                 :           1 :     case PROP_REPLY_ID:
+     256                 :           1 :       g_value_set_string (value, self->reply_id);
+     257                 :           1 :       break;
+     258                 :             : 
+     259                 :           0 :     default:
+     260                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     261                 :             :     }
+     262                 :           2 : }
+     263                 :             : 
+     264                 :             : static void
+     265                 :           3 : valent_notification_dialog_set_property (GObject      *object,
+     266                 :             :                                          guint         prop_id,
+     267                 :             :                                          const GValue *value,
+     268                 :             :                                          GParamSpec   *pspec)
+     269                 :             : {
+     270                 :           3 :   ValentNotificationDialog *self = VALENT_NOTIFICATION_DIALOG (object);
+     271                 :             : 
+     272   [ +  +  +  - ]:           3 :   switch (prop_id)
+     273                 :             :     {
+     274                 :           1 :     case PROP_DEVICE:
+     275                 :           1 :       self->device = g_value_get_object (value);
+     276                 :           1 :       break;
+     277                 :             : 
+     278                 :           1 :     case PROP_NOTIFICATION:
+     279                 :           1 :       valent_notification_dialog_set_notification (self, g_value_get_object (value));
+     280                 :           1 :       break;
+     281                 :             : 
+     282                 :           1 :     case PROP_REPLY_ID:
+     283                 :           1 :       valent_notification_dialog_set_reply_id (self, g_value_get_string (value));
+     284                 :           1 :       break;
+     285                 :             : 
+     286                 :           0 :     default:
+     287                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     288                 :             :     }
+     289                 :           3 : }
+     290                 :             : 
+     291                 :             : static void
+     292                 :           1 : valent_notification_dialog_class_init (ValentNotificationDialogClass *klass)
+     293                 :             : {
+     294                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     295                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     296                 :             : 
+     297                 :           1 :   object_class->dispose = valent_notification_dialog_dispose;
+     298                 :           1 :   object_class->constructed = valent_notification_dialog_constructed;
+     299                 :           1 :   object_class->finalize = valent_notification_dialog_finalize;
+     300                 :           1 :   object_class->get_property = valent_notification_dialog_get_property;
+     301                 :           1 :   object_class->set_property = valent_notification_dialog_set_property;
+     302                 :             : 
+     303                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/notification/valent-notification-dialog.ui");
+     304                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, cancel_button);
+     305                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, reply_button);
+     306                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, icon_image);
+     307                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, title_label);
+     308                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, body_label);
+     309                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, time_label);
+     310                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, reply_frame);
+     311                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationDialog, reply_entry);
+     312                 :             : 
+     313                 :           1 :   gtk_widget_class_install_action (widget_class, "dialog.cancel", NULL, dialog_cancel_action);
+     314                 :             : 
+     315                 :           1 :   gtk_widget_class_install_action (widget_class, "notification.close", NULL, notification_close_action);
+     316                 :           1 :   gtk_widget_class_install_action (widget_class, "notification.reply", NULL, notification_reply_action);
+     317                 :             : 
+     318                 :             :   /**
+     319                 :             :    * ValentNotificationDialog:device:
+     320                 :             :    *
+     321                 :             :    * The device that owns the notification.
+     322                 :             :    */
+     323                 :           2 :   properties [PROP_DEVICE] =
+     324                 :           1 :     g_param_spec_object ("device", NULL, NULL,
+     325                 :             :                          VALENT_TYPE_DEVICE,
+     326                 :             :                          (G_PARAM_READWRITE |
+     327                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     328                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     329                 :             :                           G_PARAM_STATIC_STRINGS));
+     330                 :             : 
+     331                 :             :   /**
+     332                 :             :    * ValentNotificationDialog:notification:
+     333                 :             :    *
+     334                 :             :    * The notification the dialog represents.
+     335                 :             :    */
+     336                 :           2 :   properties [PROP_NOTIFICATION] =
+     337                 :           1 :     g_param_spec_object ("notification", NULL, NULL,
+     338                 :             :                          VALENT_TYPE_NOTIFICATION,
+     339                 :             :                          (G_PARAM_READWRITE |
+     340                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     341                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     342                 :             :                           G_PARAM_STATIC_STRINGS));
+     343                 :             : 
+     344                 :             :   /**
+     345                 :             :    * ValentNotificationDialog:reply-id:
+     346                 :             :    *
+     347                 :             :    * The notification reply ID.
+     348                 :             :    */
+     349                 :           2 :   properties [PROP_REPLY_ID] =
+     350                 :           1 :     g_param_spec_string ("reply-id", NULL, NULL,
+     351                 :             :                          NULL,
+     352                 :             :                          (G_PARAM_READWRITE |
+     353                 :             :                           G_PARAM_CONSTRUCT |
+     354                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     355                 :             :                           G_PARAM_STATIC_STRINGS));
+     356                 :             : 
+     357                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     358                 :           1 : }
+     359                 :             : 
+     360                 :             : static void
+     361                 :           1 : valent_notification_dialog_init (ValentNotificationDialog *self)
+     362                 :             : {
+     363                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     364                 :             : 
+     365                 :           1 :   g_signal_connect_object (gtk_text_view_get_buffer (self->reply_entry),
+     366                 :             :                            "notify::text",
+     367                 :             :                            G_CALLBACK (valent_notification_dialog_sync),
+     368                 :             :                            self,
+     369                 :             :                            G_CONNECT_SWAPPED);
+     370                 :           1 : }
+     371                 :             : 
+     372                 :             : /**
+     373                 :             :  * valent_notification_dialog_get_notification:
+     374                 :             :  * @dialog: a `ValentNotificationDialog`
+     375                 :             :  *
+     376                 :             :  * Get the notification.
+     377                 :             :  *
+     378                 :             :  * Returns: (transfer none): a `ValentNotification`
+     379                 :             :  */
+     380                 :             : ValentNotification *
+     381                 :           1 : valent_notification_dialog_get_notification (ValentNotificationDialog *dialog)
+     382                 :             : {
+     383         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION_DIALOG (dialog), NULL);
+     384                 :             : 
+     385                 :           1 :   return dialog->notification;
+     386                 :             : }
+     387                 :             : 
+     388                 :             : /**
+     389                 :             :  * valent_notification_dialog_get_reply_id: (get-property reply-id)
+     390                 :             :  * @dialog: a `ValentNotificationDialog`
+     391                 :             :  *
+     392                 :             :  * Get the notification reply ID.
+     393                 :             :  *
+     394                 :             :  * Returns: (transfer none): the reply ID
+     395                 :             :  */
+     396                 :             : const char *
+     397                 :           2 : valent_notification_dialog_get_reply_id (ValentNotificationDialog *dialog)
+     398                 :             : {
+     399         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_NOTIFICATION_DIALOG (dialog), NULL);
+     400                 :             : 
+     401                 :           2 :   return dialog->reply_id;
+     402                 :             : }
+     403                 :             : 
+     404                 :             : /**
+     405                 :             :  * valent_notification_dialog_set_reply_id: (set-property reply-id)
+     406                 :             :  * @dialog: a `ValentNotificationDialog`
+     407                 :             :  * @reply_id: (nullable): a notification reply ID
+     408                 :             :  *
+     409                 :             :  * Set the notification reply ID.
+     410                 :             :  *
+     411                 :             :  * If @reply_id is %NULL or empty, the notification can not be replied to.
+     412                 :             :  */
+     413                 :             : void
+     414                 :           2 : valent_notification_dialog_set_reply_id (ValentNotificationDialog *dialog,
+     415                 :             :                                          const char               *reply_id)
+     416                 :             : {
+     417         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_NOTIFICATION_DIALOG (dialog));
+     418                 :             : 
+     419         [ +  - ]:           2 :   if (!g_set_str (&dialog->reply_id, reply_id))
+     420                 :             :     return;
+     421                 :             : 
+     422                 :           2 :   valent_notification_dialog_sync (dialog);
+     423                 :           2 :   g_object_notify_by_pspec (G_OBJECT (dialog), properties [PROP_REPLY_ID]);
+     424                 :             : }
+     425                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-dialog.h.func-c.html b/coverage/src/plugins/notification/valent-notification-dialog.h.func-c.html new file mode 100644 index 00000000000..582812d07ed --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-dialog.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_DIALOG11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-dialog.h.func.html b/coverage/src/plugins/notification/valent-notification-dialog.h.func.html new file mode 100644 index 00000000000..d0d88ee9460 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-dialog.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_DIALOG11
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-dialog.h.gcov.html b/coverage/src/plugins/notification/valent-notification-dialog.h.gcov.html new file mode 100644 index 00000000000..b8888c440ed --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-dialog.h.gcov.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-dialog.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_NOTIFICATION_DIALOG (valent_notification_dialog_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          12 : G_DECLARE_FINAL_TYPE (ValentNotificationDialog, valent_notification_dialog, VALENT, NOTIFICATION_DIALOG, GtkWindow)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentNotification * valent_notification_dialog_get_notification (ValentNotificationDialog *dialog);
+      15                 :             : const char         * valent_notification_dialog_get_reply_id     (ValentNotificationDialog *dialog);
+      16                 :             : void                 valent_notification_dialog_set_reply_id     (ValentNotificationDialog *dialog,
+      17                 :             :                                                                   const char               *reply_id);
+      18                 :             : 
+      19                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-plugin.c.func-c.html b/coverage/src/plugins/notification/valent-notification-plugin.c.func-c.html new file mode 100644 index 00000000000..a6976e09c34 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-plugin.c.func-c.html @@ -0,0 +1,322 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.9 %458366
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.5 %362161
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notification_plugin_handle_notification_action0
valent_notification_plugin_handle_notification_reply0
valent_notification_plugin_handle_notification_request0
download_icon_task1
icon_transfer_data_free1
notification_action_action1
notification_cancel_action1
notification_close_action1
notification_reply_action1
notification_send_action1
on_notification_removed1
valent_notification_plugin_download_icon1
valent_notification_plugin_download_icon_cb1
valent_notification_plugin_download_icon_finish1
valent_notification_plugin_get_icon_file1
valent_notification_plugin_close_notification2
valent_notification_plugin_handle_notification4
valent_notification_plugin_handle_packet4
valent_notification_plugin_send_notification_with_icon4
valent_notification_plugin_show_notification4
valent_notification_upload_execute_cb4
on_notification_added5
valent_notification_plugin_constructed5
valent_notification_plugin_init5
valent_notification_plugin_request_notifications5
valent_notification_plugin_send_notification6
valent_notification_plugin_destroy10
valent_notification_plugin_update_state16
valent_notification_plugin_watch_notifications26
valent_notification_plugin_get_type88
valent_notification_plugin_class_intern_init2
valent_notification_plugin_get_type_once2
valent_notification_plugin_get_type84
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-plugin.c.func.html b/coverage/src/plugins/notification/valent-notification-plugin.c.func.html new file mode 100644 index 00000000000..03c0bda1de9 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-plugin.c.func.html @@ -0,0 +1,322 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.9 %458366
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.5 %362161
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
download_icon_task1
icon_transfer_data_free1
notification_action_action1
notification_cancel_action1
notification_close_action1
notification_reply_action1
notification_send_action1
on_notification_added5
on_notification_removed1
valent_notification_plugin_close_notification2
valent_notification_plugin_constructed5
valent_notification_plugin_destroy10
valent_notification_plugin_download_icon1
valent_notification_plugin_download_icon_cb1
valent_notification_plugin_download_icon_finish1
valent_notification_plugin_get_icon_file1
valent_notification_plugin_get_type88
valent_notification_plugin_class_intern_init2
valent_notification_plugin_get_type84
valent_notification_plugin_get_type_once2
valent_notification_plugin_handle_notification4
valent_notification_plugin_handle_notification_action0
valent_notification_plugin_handle_notification_reply0
valent_notification_plugin_handle_notification_request0
valent_notification_plugin_handle_packet4
valent_notification_plugin_init5
valent_notification_plugin_request_notifications5
valent_notification_plugin_send_notification6
valent_notification_plugin_send_notification_with_icon4
valent_notification_plugin_show_notification4
valent_notification_plugin_update_state16
valent_notification_plugin_watch_notifications26
valent_notification_upload_execute_cb4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-plugin.c.gcov.html b/coverage/src/plugins/notification/valent-notification-plugin.c.gcov.html new file mode 100644 index 00000000000..e81c1820018 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-plugin.c.gcov.html @@ -0,0 +1,1149 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.9 %458366
Test Date:2024-03-31 18:46:36Functions:90.6 %3229
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.5 %362161
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notification-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gtk/gtk.h>
+       9                 :             : #include <libportal/portal.h>
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <json-glib/json-glib.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-notification-dialog.h"
+      15                 :             : #include "valent-notification-plugin.h"
+      16                 :             : #include "valent-notification-upload.h"
+      17                 :             : 
+      18                 :             : #define DEFAULT_ICON_SIZE 512
+      19                 :             : 
+      20                 :             : 
+      21                 :             : struct _ValentNotificationPlugin
+      22                 :             : {
+      23                 :             :   ValentDevicePlugin   parent_instance;
+      24                 :             : 
+      25                 :             :   GCancellable        *cancellable;
+      26                 :             :   ValentNotifications *notifications;
+      27                 :             :   ValentSession       *session;
+      28                 :             : 
+      29                 :             :   GHashTable          *cache;
+      30                 :             :   GHashTable          *dialogs;
+      31                 :             :   unsigned int         notifications_watch : 1;
+      32                 :             : };
+      33                 :             : 
+      34   [ +  +  +  - ]:          88 : G_DEFINE_FINAL_TYPE (ValentNotificationPlugin, valent_notification_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      35                 :             : 
+      36                 :             : static void valent_notification_plugin_handle_notification         (ValentNotificationPlugin *self,
+      37                 :             :                                                                     JsonNode                 *packet);
+      38                 :             : static void valent_notification_plugin_handle_notification_action  (ValentNotificationPlugin *self,
+      39                 :             :                                                                     JsonNode                 *packet);
+      40                 :             : static void valent_notification_plugin_handle_notification_reply   (ValentNotificationPlugin *self,
+      41                 :             :                                                                     JsonNode                 *packet);
+      42                 :             : static void valent_notification_plugin_handle_notification_request (ValentNotificationPlugin *self,
+      43                 :             :                                                                     JsonNode                 *packet);
+      44                 :             : 
+      45                 :             : static void valent_notification_plugin_close_notification          (ValentNotificationPlugin *self,
+      46                 :             :                                                                     const char               *id);
+      47                 :             : static void valent_notification_plugin_request_notifications       (ValentNotificationPlugin *self);
+      48                 :             : static void valent_notification_plugin_send_notification           (ValentNotificationPlugin *self,
+      49                 :             :                                                                     const char               *id,
+      50                 :             :                                                                     const char               *appName,
+      51                 :             :                                                                     const char               *title,
+      52                 :             :                                                                     const char               *body,
+      53                 :             :                                                                     GIcon                    *icon);
+      54                 :             : static void valent_notification_plugin_show_notification           (ValentNotificationPlugin *self,
+      55                 :             :                                                                     JsonNode                 *packet,
+      56                 :             :                                                                     GIcon                    *gicon);
+      57                 :             : 
+      58                 :             : 
+      59                 :             : /*
+      60                 :             :  * ValentNotifications Callbacks
+      61                 :             :  */
+      62                 :             : static void
+      63                 :           5 : on_notification_added (ValentNotifications      *listener,
+      64                 :             :                        ValentNotification       *notification,
+      65                 :             :                        ValentNotificationPlugin *self)
+      66                 :             : {
+      67                 :           5 :   GSettings *settings;
+      68                 :           5 :   const char *application;
+      69                 :          10 :   g_auto (GStrv) deny = NULL;
+      70                 :             : 
+      71         [ +  - ]:           5 :   g_assert (VALENT_IS_NOTIFICATIONS (listener));
+      72         [ -  + ]:           5 :   g_assert (VALENT_IS_NOTIFICATION (notification));
+      73         [ -  + ]:           5 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+      74                 :             : 
+      75                 :           5 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+      76                 :             : 
+      77         [ +  - ]:           5 :   if (!g_settings_get_boolean (settings, "forward-notifications"))
+      78                 :             :     return;
+      79                 :             : 
+      80   [ -  +  -  - ]:           5 :   if (!g_settings_get_boolean (settings, "forward-when-active") &&
+      81                 :           0 :       valent_session_get_active (self->session))
+      82                 :             :     return;
+      83                 :             : 
+      84                 :           5 :   application = valent_notification_get_application (notification);
+      85                 :           5 :   deny = g_settings_get_strv (settings, "forward-deny");
+      86                 :             : 
+      87   [ +  +  -  + ]:           5 :   if (application && g_strv_contains ((const char * const *)deny, application))
+      88         [ #  # ]:           0 :     return;
+      89                 :             : 
+      90         [ +  - ]:           5 :   valent_notification_plugin_send_notification (self,
+      91                 :             :                                                 valent_notification_get_id (notification),
+      92                 :             :                                                 valent_notification_get_application (notification),
+      93                 :             :                                                 valent_notification_get_title (notification),
+      94                 :             :                                                 valent_notification_get_body (notification),
+      95                 :             :                                                 valent_notification_get_icon (notification));
+      96                 :             : }
+      97                 :             : 
+      98                 :             : static void
+      99                 :           1 : on_notification_removed (ValentNotifications      *notifications,
+     100                 :             :                          const char               *id,
+     101                 :             :                          ValentNotificationPlugin *self)
+     102                 :             : {
+     103         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATIONS (notifications));
+     104         [ -  + ]:           1 :   g_assert (id != NULL);
+     105                 :             : 
+     106                 :           1 :   valent_notification_plugin_close_notification (self, id);
+     107                 :           1 : }
+     108                 :             : 
+     109                 :             : static void
+     110                 :          26 : valent_notification_plugin_watch_notifications (ValentNotificationPlugin *self,
+     111                 :             :                                                 gboolean                  watch)
+     112                 :             : {
+     113                 :          26 :   ValentNotifications *notifications = valent_notifications_get_default ();
+     114                 :             : 
+     115         [ +  - ]:          26 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     116                 :             : 
+     117         [ +  + ]:          26 :   if (self->notifications_watch == watch)
+     118                 :             :     return;
+     119                 :             : 
+     120         [ +  + ]:          10 :   if (watch)
+     121                 :             :     {
+     122                 :           5 :       g_signal_connect_object (notifications,
+     123                 :             :                                "notification-added",
+     124                 :             :                                G_CALLBACK (on_notification_added),
+     125                 :             :                                self, 0);
+     126                 :           5 :       g_signal_connect_object (notifications,
+     127                 :             :                                "notification-removed",
+     128                 :             :                                G_CALLBACK (on_notification_removed),
+     129                 :             :                                self, 0);
+     130                 :           5 :       self->notifications_watch = TRUE;
+     131                 :             :     }
+     132                 :             :   else
+     133                 :             :     {
+     134                 :           5 :       g_signal_handlers_disconnect_by_data (notifications, self);
+     135                 :           5 :       self->notifications_watch = FALSE;
+     136                 :             :     }
+     137                 :             : }
+     138                 :             : 
+     139                 :             : /*
+     140                 :             :  * Icon Transfers
+     141                 :             :  */
+     142                 :             : typedef struct
+     143                 :             : {
+     144                 :             :   GRecMutex     mutex;
+     145                 :             :   ValentDevice *device;
+     146                 :             :   JsonNode     *packet;
+     147                 :             : } IconTransferData;
+     148                 :             : 
+     149                 :             : static void
+     150                 :           1 : icon_transfer_data_free (gpointer data)
+     151                 :             : {
+     152                 :           1 :   IconTransferData *transfer = (IconTransferData *)data;
+     153                 :             : 
+     154                 :           1 :   g_rec_mutex_lock (&transfer->mutex);
+     155         [ -  + ]:           1 :   g_clear_object (&transfer->device);
+     156         [ -  + ]:           1 :   g_clear_pointer (&transfer->packet, json_node_unref);
+     157                 :           1 :   g_rec_mutex_unlock (&transfer->mutex);
+     158                 :           1 :   g_rec_mutex_clear (&transfer->mutex);
+     159                 :           1 :   g_clear_pointer (&transfer, g_free);
+     160                 :           1 : }
+     161                 :             : 
+     162                 :             : static GFile *
+     163                 :           1 : valent_notification_plugin_get_icon_file (ValentNotificationPlugin *self,
+     164                 :             :                                           JsonNode                 *packet)
+     165                 :             : {
+     166                 :           2 :   g_autoptr (GFile) file = NULL;
+     167                 :           1 :   const char *payload_hash;
+     168                 :             : 
+     169         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     170         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+     171                 :             : 
+     172         [ +  - ]:           1 :   if (valent_packet_get_string (packet, "payloadHash", &payload_hash))
+     173                 :             :     {
+     174                 :           1 :       ValentContext *context = NULL;
+     175                 :             : 
+     176                 :           1 :       context = valent_extension_get_context (VALENT_EXTENSION (self));
+     177                 :           1 :       file = valent_context_get_cache_file (context, payload_hash);
+     178                 :             :     }
+     179                 :             :   else
+     180                 :             :     {
+     181                 :           0 :       g_autoptr (GFileIOStream) stream = NULL;
+     182                 :             : 
+     183         [ #  # ]:           0 :       file = g_file_new_tmp ("valent-notification-icon.XXXXXX", &stream, NULL);
+     184                 :             :     }
+     185                 :             : 
+     186                 :           1 :   return g_steal_pointer (&file);
+     187                 :             : }
+     188                 :             : 
+     189                 :             : static void
+     190                 :           1 : download_icon_task (GTask        *task,
+     191                 :             :                     gpointer      source_object,
+     192                 :             :                     gpointer      task_data,
+     193                 :             :                     GCancellable *cancellable)
+     194                 :             : {
+     195                 :           1 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (source_object);
+     196                 :           1 :   IconTransferData *transfer = (IconTransferData *)task_data;
+     197                 :           1 :   g_autoptr (ValentDevice) device = NULL;
+     198   [ +  -  -  - ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     199   [ +  -  -  - ]:           1 :   g_autoptr (GFile) file = NULL;
+     200                 :           1 :   GError *error = NULL;
+     201                 :             : 
+     202         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     203         [ -  + ]:           1 :   g_assert (transfer != NULL);
+     204                 :             : 
+     205         [ +  - ]:           1 :   if (g_task_return_error_if_cancelled (task))
+     206                 :             :     return;
+     207                 :             : 
+     208                 :           1 :   g_rec_mutex_lock (&transfer->mutex);
+     209                 :           1 :   device = g_steal_pointer (&transfer->device);
+     210                 :           1 :   packet = g_steal_pointer (&transfer->packet);
+     211                 :           1 :   g_rec_mutex_unlock (&transfer->mutex);
+     212                 :             : 
+     213                 :           1 :   file = valent_notification_plugin_get_icon_file (self, packet);
+     214                 :             : 
+     215                 :             :   /* Check if we've already downloaded this icon */
+     216         [ +  - ]:           1 :   if (!g_file_query_exists (file, cancellable))
+     217                 :             :     {
+     218         [ -  - ]:           1 :       g_autoptr (GIOStream) source = NULL;
+     219         [ -  - ]:           1 :       g_autoptr (GFileOutputStream) target = NULL;
+     220         [ -  - ]:           1 :       g_autoptr (GFile) cache_dir = NULL;
+     221   [ +  -  -  - ]:           1 :       g_autoptr (ValentChannel) channel = NULL;
+     222                 :             : 
+     223                 :             :       /* Ensure the cache directory exists */
+     224                 :           1 :       cache_dir = g_file_get_parent (file);
+     225                 :             : 
+     226         [ -  + ]:           1 :       if (g_mkdir_with_parents (g_file_peek_path (cache_dir), 0700) != 0)
+     227                 :             :         {
+     228                 :           0 :           return g_task_return_new_error (task,
+     229                 :             :                                           G_IO_ERROR,
+     230                 :             :                                           G_IO_ERROR_FAILED,
+     231                 :             :                                           "Error: %s",
+     232                 :           0 :                                           g_strerror (errno));
+     233                 :             :         }
+     234                 :             : 
+     235                 :             :       /* Get the device channel */
+     236         [ -  + ]:           1 :       if ((channel = valent_device_ref_channel (device)) == NULL)
+     237                 :             :         {
+     238                 :           0 :           return g_task_return_new_error (task,
+     239                 :             :                                           G_IO_ERROR,
+     240                 :             :                                           G_IO_ERROR_NOT_CONNECTED,
+     241                 :             :                                           "Device is disconnected");
+     242                 :             :         }
+     243                 :             : 
+     244                 :           1 :       source = valent_channel_download (channel, packet, cancellable, &error);
+     245                 :             : 
+     246         [ -  + ]:           1 :       if (source == NULL)
+     247                 :             :         {
+     248                 :           0 :           g_file_delete (file, NULL, NULL);
+     249                 :           0 :           return g_task_return_error (task, error);
+     250                 :             :         }
+     251                 :             : 
+     252                 :             :       /* Get the output stream */
+     253                 :           1 :       target = g_file_replace (file,
+     254                 :             :                                NULL,
+     255                 :             :                                FALSE,
+     256                 :             :                                G_FILE_CREATE_REPLACE_DESTINATION,
+     257                 :             :                                cancellable,
+     258                 :             :                                &error);
+     259                 :             : 
+     260         [ -  + ]:           1 :       if (target == NULL)
+     261                 :             :         {
+     262                 :           0 :           g_file_delete (file, NULL, NULL);
+     263                 :           0 :           return g_task_return_error (task, error);
+     264                 :             :         }
+     265                 :             : 
+     266                 :             :       /* Start download */
+     267                 :           1 :       g_output_stream_splice (G_OUTPUT_STREAM (target),
+     268                 :             :                               g_io_stream_get_input_stream (source),
+     269                 :             :                               (G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
+     270                 :             :                                G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET),
+     271                 :             :                               cancellable,
+     272                 :             :                               &error);
+     273                 :             : 
+     274         [ -  + ]:           1 :       if (error != NULL)
+     275                 :             :         {
+     276                 :           0 :           g_file_delete (file, NULL, NULL);
+     277                 :           0 :           return g_task_return_error (task, error);
+     278                 :             :         }
+     279                 :             :     }
+     280                 :             : 
+     281                 :             :   /* If we're in a sandbox, send the file as a GBytesIcon in case the file path
+     282                 :             :    * is not valid for the host system. */
+     283         [ -  + ]:           1 :   if (xdp_portal_running_under_sandbox ())
+     284                 :             :     {
+     285                 :           0 :       g_autoptr (GBytes) bytes = NULL;
+     286                 :             : 
+     287                 :           0 :       bytes = g_file_load_bytes (file, cancellable, NULL, &error);
+     288                 :             : 
+     289         [ #  # ]:           0 :       if (bytes == NULL)
+     290                 :             :         {
+     291                 :           0 :           g_file_delete (file, NULL, NULL);
+     292                 :           0 :           return g_task_return_error (task, error);
+     293                 :             :         }
+     294                 :             : 
+     295                 :           0 :       g_task_return_pointer (task, g_bytes_icon_new (bytes), g_object_unref);
+     296                 :             :     }
+     297                 :             :   else
+     298                 :             :     {
+     299                 :           1 :       g_task_return_pointer (task, g_file_icon_new (file), g_object_unref);
+     300                 :             :     }
+     301                 :             : }
+     302                 :             : 
+     303                 :             : static void
+     304                 :           1 : valent_notification_plugin_download_icon (ValentNotificationPlugin *self,
+     305                 :             :                                           JsonNode                 *packet,
+     306                 :             :                                           GCancellable             *cancellable,
+     307                 :             :                                           GAsyncReadyCallback       callback,
+     308                 :             :                                           gpointer                  user_data)
+     309                 :             : {
+     310                 :           1 :   ValentExtension *extension = VALENT_EXTENSION (self);
+     311                 :           2 :   g_autoptr (GTask) task = NULL;
+     312                 :           1 :   IconTransferData *transfer = NULL;
+     313                 :             : 
+     314         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     315         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+     316   [ +  -  +  -  :           1 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     317                 :             : 
+     318                 :           1 :   transfer = g_new0 (IconTransferData, 1);
+     319                 :           1 :   g_rec_mutex_init (&transfer->mutex);
+     320                 :           1 :   g_rec_mutex_lock (&transfer->mutex);
+     321                 :           1 :   transfer->device = g_object_ref (valent_extension_get_object (extension));
+     322                 :           1 :   transfer->packet = json_node_ref (packet);
+     323                 :           1 :   g_rec_mutex_unlock (&transfer->mutex);
+     324                 :             : 
+     325                 :           1 :   task = g_task_new (self, cancellable, callback, user_data);
+     326         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_notification_plugin_download_icon);
+     327                 :           1 :   g_task_set_task_data (task, transfer, icon_transfer_data_free);
+     328         [ +  - ]:           1 :   g_task_run_in_thread (task, download_icon_task);
+     329                 :           1 : }
+     330                 :             : 
+     331                 :             : static GIcon *
+     332                 :           1 : valent_notification_plugin_download_icon_finish (ValentNotificationPlugin  *self,
+     333                 :             :                                                  GAsyncResult              *result,
+     334                 :             :                                                  GError                   **error)
+     335                 :             : {
+     336         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     337         [ -  + ]:           1 :   g_assert (g_task_is_valid (result, self));
+     338   [ +  -  -  + ]:           1 :   g_assert (error == NULL || *error == NULL);
+     339                 :             : 
+     340                 :           1 :   return g_task_propagate_pointer (G_TASK (result), error);
+     341                 :             : }
+     342                 :             : 
+     343                 :             : /*
+     344                 :             :  * Remote Notifications
+     345                 :             :  */
+     346                 :             : static void
+     347                 :           4 : valent_notification_plugin_show_notification (ValentNotificationPlugin *self,
+     348                 :             :                                               JsonNode                 *packet,
+     349                 :             :                                               GIcon                    *gicon)
+     350                 :             : {
+     351                 :           4 :   ValentDevice *device;
+     352                 :           4 :   g_autoptr (GNotification) notification = NULL;
+     353         [ +  - ]:           4 :   g_autoptr (GIcon) icon = NULL;
+     354   [ +  +  -  - ]:           4 :   g_auto (GStrv) ticker_strv = NULL;
+     355                 :           4 :   const char *id;
+     356                 :           4 :   const char *app_name = NULL;
+     357                 :           4 :   const char *title = NULL;
+     358                 :           4 :   const char *text = NULL;
+     359                 :           4 :   const char *ticker;
+     360                 :           4 :   const char *reply_id;
+     361                 :           4 :   JsonArray *actions;
+     362                 :             : 
+     363                 :             :   /* Finish the icon task */
+     364   [ +  +  +  -  :           4 :   if (G_IS_ICON (gicon))
+             +  -  +  - ]
+     365                 :           1 :     icon = g_object_ref (gicon);
+     366                 :             : 
+     367                 :             :   /* Ensure we have a notification id */
+     368         [ -  + ]:           4 :   if (!valent_packet_get_string (packet, "id", &id))
+     369                 :             :     {
+     370                 :           0 :       g_debug ("%s(): expected \"id\" field holding a string",
+     371                 :             :                G_STRFUNC);
+     372                 :           0 :       return;
+     373                 :             :     }
+     374                 :             : 
+     375                 :             :   /* This should never be absent, but we check anyways */
+     376         [ -  + ]:           4 :   if (!valent_packet_get_string (packet, "appName", &app_name))
+     377                 :             :     {
+     378                 :           0 :       g_debug ("%s(): expected \"appName\" field holding a string",
+     379                 :             :                G_STRFUNC);
+     380                 :           0 :       return;
+     381                 :             :     }
+     382                 :             : 
+     383                 :             :   /* If `title` or `text` are missing, try to compose them from `ticker` */
+     384   [ +  -  +  - ]:           8 :   if ((!valent_packet_get_string (packet, "title", &title) ||
+     385         [ -  - ]:           4 :        !valent_packet_get_string (packet, "text", &text)) &&
+     386                 :           0 :       valent_packet_get_string (packet, "ticker", &ticker))
+     387                 :             :     {
+     388                 :           0 :       ticker_strv = g_strsplit (ticker, ": ", 2);
+     389                 :           0 :       title = ticker_strv[0];
+     390                 :           0 :       text = ticker_strv[1];
+     391                 :             :     }
+     392                 :             : 
+     393   [ +  -  -  + ]:           4 :   if (title == NULL || text == NULL)
+     394                 :             :     {
+     395                 :           0 :       g_debug ("%s(): expected either title and text, or ticker",
+     396                 :             :                G_STRFUNC);
+     397         [ #  # ]:           0 :       return;
+     398                 :             :     }
+     399                 :             : 
+     400                 :           4 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     401                 :             : 
+     402                 :             :   /* Start building the GNotification */
+     403                 :           4 :   notification = g_notification_new (title);
+     404                 :             : 
+     405                 :             :   /* Repliable Notification */
+     406         [ +  + ]:           4 :   if (valent_packet_get_string (packet, "requestReplyId", &reply_id))
+     407                 :             :     {
+     408                 :           1 :       g_autoptr (ValentNotification) incoming = NULL;
+     409                 :           1 :       const char *time_str = NULL;
+     410                 :           1 :       int64_t time = 0;
+     411                 :           1 :       GVariant *target;
+     412                 :             : 
+     413         [ +  - ]:           1 :       if (valent_packet_get_string (packet, "time", &time_str))
+     414                 :           1 :         time = g_ascii_strtoll (time_str, NULL, 10);
+     415                 :             : 
+     416                 :           1 :       incoming = g_object_new (VALENT_TYPE_NOTIFICATION,
+     417                 :             :                                "id",          id,
+     418                 :             :                                "application", app_name,
+     419                 :             :                                "icon",        icon,
+     420                 :             :                                "title",       title,
+     421                 :             :                                "body",        text,
+     422                 :             :                                "time",        time,
+     423                 :             :                                NULL);
+     424                 :           1 :       target = g_variant_new ("(ssv)",
+     425                 :             :                               reply_id,
+     426                 :             :                               "",
+     427                 :             :                               valent_notification_serialize (incoming));
+     428                 :             : 
+     429         [ +  - ]:           1 :       valent_notification_set_device_action (notification,
+     430                 :             :                                              device,
+     431                 :             :                                              "notification.reply",
+     432                 :             :                                              target);
+     433                 :             :     }
+     434                 :             : 
+     435                 :             :   /* Notification Actions */
+     436         [ +  + ]:           4 :   if (valent_packet_get_array (packet, "actions", &actions))
+     437                 :             :     {
+     438                 :           1 :       unsigned int n_actions;
+     439                 :             : 
+     440                 :           1 :       n_actions = json_array_get_length (actions);
+     441                 :             : 
+     442         [ +  + ]:           4 :       for (unsigned int i = 0; i < n_actions; i++)
+     443                 :             :         {
+     444                 :           3 :           JsonNode *element;
+     445                 :           3 :           const char *action;
+     446                 :           3 :           GVariant *target;
+     447                 :             : 
+     448   [ +  -  -  + ]:           6 :           if ((element = json_array_get_element (actions, i)) == NULL ||
+     449                 :           3 :               json_node_get_value_type (element) != G_TYPE_STRING)
+     450                 :           0 :             continue;
+     451                 :             : 
+     452                 :           3 :           action = json_node_get_string (element);
+     453                 :           3 :           target = g_variant_new ("(ss)", id, action);
+     454                 :           3 :           valent_notification_add_device_button (notification,
+     455                 :             :                                                  device,
+     456                 :             :                                                  action,
+     457                 :             :                                                  "notification.action",
+     458                 :             :                                                  target);
+     459                 :             :         }
+     460                 :             :     }
+     461                 :             : 
+     462                 :             :   /* Special cases.
+     463                 :             :    *
+     464                 :             :    * In some cases, usually on Android, a notification "type" can be inferred
+     465                 :             :    * from the ID string or the appName is duplicated as the title.
+     466                 :             :    */
+     467         [ -  + ]:           4 :   if (g_strrstr (id, "MissedCall") != NULL)
+     468                 :             :     {
+     469                 :           0 :       g_notification_set_title (notification, title);
+     470                 :           0 :       g_notification_set_body (notification, text);
+     471                 :             : 
+     472         [ #  # ]:           0 :       if (icon == NULL)
+     473                 :           0 :         icon = g_themed_icon_new ("call-missed-symbolic");
+     474                 :             :     }
+     475         [ -  + ]:           4 :   else if (g_strrstr (id, "sms") != NULL)
+     476                 :             :     {
+     477                 :           0 :       g_notification_set_title (notification, title);
+     478                 :           0 :       g_notification_set_body (notification, text);
+     479                 :             : 
+     480         [ #  # ]:           0 :       if (icon == NULL)
+     481                 :           0 :         icon = g_themed_icon_new ("sms-symbolic");
+     482                 :             :     }
+     483         [ -  + ]:           4 :   else if (g_strcmp0 (app_name, title) == 0)
+     484                 :             :     {
+     485                 :           0 :       g_notification_set_title (notification, title);
+     486                 :           0 :       g_notification_set_body (notification, text);
+     487                 :             :     }
+     488                 :             :   else
+     489                 :             :     {
+     490                 :           4 :       g_autofree char *ticker_body = NULL;
+     491                 :             : 
+     492                 :           4 :       ticker_body = g_strdup_printf ("%s: %s", title, text);
+     493                 :           4 :       g_notification_set_title (notification, app_name);
+     494                 :           4 :       g_notification_set_body (notification, ticker_body);
+     495                 :             :     }
+     496                 :             : 
+     497         [ +  + ]:           4 :   if (icon != NULL)
+     498                 :           1 :     g_notification_set_icon (notification, icon);
+     499                 :             : 
+     500         [ -  + ]:           4 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     501                 :             :                                           id,
+     502                 :             :                                           notification);
+     503                 :             : }
+     504                 :             : 
+     505                 :             : static void
+     506                 :           1 : valent_notification_plugin_download_icon_cb (ValentNotificationPlugin *self,
+     507                 :             :                                              GAsyncResult             *result,
+     508                 :             :                                              gpointer                  user_data)
+     509                 :             : {
+     510                 :           1 :   g_autoptr (JsonNode) packet = user_data;
+     511   [ -  -  +  - ]:           1 :   g_autoptr (GIcon) icon = NULL;
+     512   [ -  -  +  - ]:           1 :   g_autoptr (GError) error = NULL;
+     513                 :             : 
+     514         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     515         [ -  + ]:           1 :   g_assert (g_task_is_valid (result, self));
+     516                 :             : 
+     517                 :           1 :   icon = valent_notification_plugin_download_icon_finish (self, result, &error);
+     518                 :             : 
+     519         [ -  + ]:           1 :   if (icon == NULL)
+     520                 :             :     {
+     521                 :             :       /* If the operation was cancelled, the plugin is being disposed */
+     522         [ #  # ]:           0 :       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     523         [ #  # ]:           0 :         return;
+     524                 :             : 
+     525                 :           0 :       g_warning ("Downloading icon: %s", error->message);
+     526                 :             :     }
+     527                 :             : 
+     528         [ -  + ]:           1 :   valent_notification_plugin_show_notification (self, packet, icon);
+     529                 :             : }
+     530                 :             : 
+     531                 :             : static void
+     532                 :           4 : valent_notification_plugin_handle_notification (ValentNotificationPlugin *self,
+     533                 :             :                                                 JsonNode                 *packet)
+     534                 :             : {
+     535                 :           4 :   const char *id;
+     536                 :             : 
+     537         [ +  - ]:           4 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     538         [ -  + ]:           4 :   g_assert (VALENT_IS_PACKET (packet));
+     539                 :             : 
+     540         [ -  + ]:           4 :   if (!valent_packet_get_string (packet, "id", &id))
+     541                 :             :     {
+     542                 :           0 :       g_debug ("%s(): expected \"id\" field holding a string",
+     543                 :             :                G_STRFUNC);
+     544                 :           0 :       return;
+     545                 :             :     }
+     546                 :             : 
+     547                 :             :   /* A report that a remote notification has been dismissed */
+     548         [ -  + ]:           4 :   if (valent_packet_check_field (packet, "isCancel"))
+     549                 :             :     {
+     550                 :           0 :       g_hash_table_remove (self->cache, id);
+     551                 :           0 :       valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self), id);
+     552                 :           0 :       return;
+     553                 :             :     }
+     554                 :             : 
+     555                 :             :   /* A notification that should only be shown once, already existed on the
+     556                 :             :    * device, and is already in the cache. This typically means the device just
+     557                 :             :    * re-connected and is re-sending known notifications. */
+     558   [ -  +  -  - ]:           4 :   if (valent_packet_check_field (packet, "onlyOnce") &&
+     559         [ #  # ]:           0 :       valent_packet_check_field (packet, "silent") &&
+     560                 :           0 :       g_hash_table_contains (self->cache, id))
+     561                 :             :     {
+     562                 :             :       VALENT_NOTE ("skipping existing notification: %s", id);
+     563                 :             :       return;
+     564                 :             :     }
+     565                 :             : 
+     566         [ -  + ]:           4 :   g_hash_table_replace (self->cache,
+     567                 :           4 :                         g_strdup (id),
+     568                 :           4 :                         json_node_ref (packet));
+     569                 :             : 
+     570         [ +  + ]:           4 :   if (valent_packet_has_payload (packet))
+     571                 :             :     {
+     572                 :           1 :       valent_notification_plugin_download_icon (self,
+     573                 :             :                                                 packet,
+     574                 :             :                                                 self->cancellable,
+     575                 :             :                                                 (GAsyncReadyCallback)valent_notification_plugin_download_icon_cb,
+     576                 :           1 :                                                 json_node_ref (packet));
+     577                 :             :     }
+     578                 :             :   else
+     579                 :             :     {
+     580                 :           3 :       valent_notification_plugin_show_notification (self, packet, NULL);
+     581                 :             :     }
+     582                 :             : }
+     583                 :             : 
+     584                 :             : static void
+     585                 :           0 : valent_notification_plugin_handle_notification_action (ValentNotificationPlugin *self,
+     586                 :             :                                                        JsonNode                 *packet)
+     587                 :             : {
+     588         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     589         [ #  # ]:           0 :   g_assert (VALENT_IS_PACKET (packet));
+     590                 :             : 
+     591                 :           0 :   VALENT_NOTE ("TODO: kdeconnect.notification.action");
+     592                 :           0 : }
+     593                 :             : 
+     594                 :             : static void
+     595                 :           0 : valent_notification_plugin_handle_notification_reply (ValentNotificationPlugin *self,
+     596                 :             :                                                       JsonNode                 *packet)
+     597                 :             : {
+     598         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     599         [ #  # ]:           0 :   g_assert (VALENT_IS_PACKET (packet));
+     600                 :             : 
+     601                 :           0 :   VALENT_NOTE ("TODO: kdeconnect.notification.reply");
+     602                 :           0 : }
+     603                 :             : 
+     604                 :             : static void
+     605                 :           0 : valent_notification_plugin_handle_notification_request (ValentNotificationPlugin *self,
+     606                 :             :                                                         JsonNode                 *packet)
+     607                 :             : {
+     608         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     609         [ #  # ]:           0 :   g_assert (VALENT_IS_PACKET (packet));
+     610                 :             : 
+     611                 :           0 :   VALENT_NOTE ("TODO: kdeconnect.notification.request");
+     612                 :           0 : }
+     613                 :             : 
+     614                 :             : static void
+     615                 :           5 : valent_notification_plugin_request_notifications (ValentNotificationPlugin *self)
+     616                 :             : {
+     617                 :          10 :   g_autoptr (JsonBuilder) builder = NULL;
+     618         [ -  + ]:           5 :   g_autoptr (JsonNode) packet = NULL;
+     619                 :             : 
+     620         [ +  - ]:           5 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     621                 :             : 
+     622                 :           5 :   valent_packet_init (&builder, "kdeconnect.notification.request");
+     623                 :           5 :   json_builder_set_member_name (builder, "request");
+     624                 :           5 :   json_builder_add_boolean_value (builder, TRUE);
+     625                 :           5 :   packet = valent_packet_end (&builder);
+     626                 :             : 
+     627         [ +  - ]:           5 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     628                 :           5 : }
+     629                 :             : 
+     630                 :             : static void
+     631                 :           2 : valent_notification_plugin_close_notification (ValentNotificationPlugin *self,
+     632                 :             :                                                const char               *id)
+     633                 :             : {
+     634                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+     635         [ -  + ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+     636                 :             : 
+     637         [ +  - ]:           2 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     638         [ -  + ]:           2 :   g_assert (id != NULL);
+     639                 :             : 
+     640                 :           2 :   valent_packet_init (&builder, "kdeconnect.notification.request");
+     641                 :           2 :   json_builder_set_member_name (builder, "cancel");
+     642                 :           2 :   json_builder_add_string_value (builder, id);
+     643                 :           2 :   packet = valent_packet_end (&builder);
+     644                 :             : 
+     645         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     646                 :           2 : }
+     647                 :             : 
+     648                 :             : static void
+     649                 :           4 : valent_notification_upload_execute_cb (GObject      *object,
+     650                 :             :                                        GAsyncResult *result,
+     651                 :             :                                        gpointer      user_data)
+     652                 :             : {
+     653                 :           4 :   ValentTransfer *transfer = VALENT_TRANSFER (object);
+     654                 :           8 :   g_autoptr (GError) error = NULL;
+     655                 :             : 
+     656   [ -  +  -  - ]:           4 :   if (!valent_transfer_execute_finish (transfer, result, &error) &&
+     657                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     658                 :             :     {
+     659                 :           0 :       g_autoptr (ValentDevice) device = NULL;
+     660         [ #  # ]:           0 :       g_autoptr (JsonNode) packet = NULL;
+     661                 :             : 
+     662                 :           0 :       g_object_get (transfer,
+     663                 :             :                     "device", &device,
+     664                 :             :                     "packet", &packet,
+     665                 :             :                     NULL);
+     666         [ #  # ]:           0 :       valent_device_send_packet (device, packet, NULL, NULL, NULL);
+     667                 :             :     }
+     668                 :           4 : }
+     669                 :             : 
+     670                 :             : static void
+     671                 :           4 : valent_notification_plugin_send_notification_with_icon (ValentNotificationPlugin *self,
+     672                 :             :                                                         JsonNode                 *packet,
+     673                 :             :                                                         GIcon                    *icon)
+     674                 :             : {
+     675         [ +  - ]:           4 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     676         [ -  + ]:           4 :   g_assert (VALENT_IS_PACKET (packet));
+     677   [ +  -  +  -  :           4 :   g_assert (icon == NULL || G_IS_ICON (icon));
+             +  -  -  + ]
+     678                 :             : 
+     679   [ +  -  +  -  :           4 :   if (G_IS_ICON (icon))
+             +  -  +  - ]
+     680                 :             :     {
+     681                 :           4 :       ValentDevice *device;
+     682                 :           8 :       g_autoptr (ValentTransfer) transfer = NULL;
+     683                 :             : 
+     684                 :           4 :       device = valent_extension_get_object (VALENT_EXTENSION (self));
+     685                 :           4 :       transfer = valent_notification_upload_new (device, packet, icon);
+     686                 :           4 :       valent_transfer_execute (transfer,
+     687                 :             :                                NULL,
+     688                 :             :                                valent_notification_upload_execute_cb,
+     689                 :             :                                NULL);
+     690         [ +  - ]:           4 :       return;
+     691                 :             :     }
+     692                 :             : 
+     693                 :           0 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     694                 :             : }
+     695                 :             : 
+     696                 :             : /**
+     697                 :             :  * valent_notification_plugin_send_notification:
+     698                 :             :  * @self: a `ValentNotificationPlugin`
+     699                 :             :  * @id: the notification id
+     700                 :             :  * @appName: (nullable): the notifying application
+     701                 :             :  * @title: (nullable): the notification title
+     702                 :             :  * @body: (nullable): the notification body
+     703                 :             :  * @icon: (nullable): a `GIcon`
+     704                 :             :  *
+     705                 :             :  * Send a notification to the remote device.
+     706                 :             :  */
+     707                 :             : static void
+     708                 :           6 : valent_notification_plugin_send_notification (ValentNotificationPlugin *self,
+     709                 :             :                                               const char               *id,
+     710                 :             :                                               const char               *appName,
+     711                 :             :                                               const char               *title,
+     712                 :             :                                               const char               *body,
+     713                 :             :                                               GIcon                    *icon)
+     714                 :             : {
+     715                 :           6 :   g_autoptr (JsonBuilder) builder = NULL;
+     716   [ -  +  -  - ]:           6 :   g_autoptr (JsonNode) packet = NULL;
+     717   [ +  -  -  - ]:           6 :   g_autofree char *ticker = NULL;
+     718                 :             : 
+     719         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     720         [ -  + ]:           6 :   g_return_if_fail (id != NULL);
+     721   [ +  +  +  -  :           6 :   g_return_if_fail (icon == NULL || G_IS_ICON (icon));
+             +  -  -  + ]
+     722                 :             : 
+     723                 :             :   /* Build packet */
+     724                 :           6 :   valent_packet_init (&builder, "kdeconnect.notification");
+     725                 :           6 :   json_builder_set_member_name (builder, "id");
+     726                 :           6 :   json_builder_add_string_value (builder, id);
+     727                 :             : 
+     728                 :             :   /* Application Name */
+     729                 :           6 :   json_builder_set_member_name (builder, "appName");
+     730         [ +  + ]:           7 :   json_builder_add_string_value (builder, appName ? appName : "Valent");
+     731                 :             : 
+     732                 :             :   /* Title & Body (aka Ticker) */
+     733                 :           6 :   json_builder_set_member_name (builder, "title");
+     734         [ +  + ]:           7 :   json_builder_add_string_value (builder, title ? title : "");
+     735                 :           6 :   json_builder_set_member_name (builder, "body");
+     736         [ +  + ]:           7 :   json_builder_add_string_value (builder, body ? body : "");
+     737                 :             : 
+     738                 :           6 :   ticker = g_strdup_printf ("%s: %s", title, body);
+     739                 :           6 :   json_builder_set_member_name (builder, "ticker");
+     740                 :           6 :   json_builder_add_string_value (builder, ticker);
+     741                 :             : 
+     742                 :           6 :   packet = valent_packet_end (&builder);
+     743                 :             : 
+     744         [ +  + ]:           6 :   if (icon == NULL)
+     745                 :           2 :     valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     746                 :             :   else
+     747                 :           4 :     valent_notification_plugin_send_notification_with_icon (self, packet, icon);
+     748                 :             : }
+     749                 :             : 
+     750                 :             : /*
+     751                 :             :  * GActions
+     752                 :             :  */
+     753                 :             : static void
+     754                 :           1 : notification_action_action (GSimpleAction *action,
+     755                 :             :                             GVariant      *parameter,
+     756                 :             :                             gpointer       user_data)
+     757                 :             : {
+     758                 :           1 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (user_data);
+     759                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     760         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     761                 :           1 :   char *id;
+     762                 :           1 :   char *name;
+     763                 :             : 
+     764         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     765                 :             : 
+     766                 :           1 :   g_variant_get (parameter, "(&s&s)", &id, &name);
+     767                 :             : 
+     768                 :           1 :   valent_packet_init (&builder, "kdeconnect.notification.action");
+     769                 :           1 :   json_builder_set_member_name (builder, "key");
+     770                 :           1 :   json_builder_add_string_value (builder, id);
+     771                 :           1 :   json_builder_set_member_name (builder, "action");
+     772                 :           1 :   json_builder_add_string_value (builder, name);
+     773                 :           1 :   packet = valent_packet_end (&builder);
+     774                 :             : 
+     775         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     776                 :           1 : }
+     777                 :             : 
+     778                 :             : static void
+     779                 :           1 : notification_cancel_action (GSimpleAction *action,
+     780                 :             :                             GVariant      *parameter,
+     781                 :             :                             gpointer       user_data)
+     782                 :             : {
+     783                 :           1 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (user_data);
+     784                 :           1 :   const char *id;
+     785                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     786         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     787                 :             : 
+     788         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     789                 :             : 
+     790                 :           1 :   id = g_variant_get_string (parameter, NULL);
+     791                 :             : 
+     792                 :           1 :   valent_packet_init (&builder, "kdeconnect.notification");
+     793                 :           1 :   json_builder_set_member_name (builder, "id");
+     794                 :           1 :   json_builder_add_string_value (builder, id);
+     795                 :           1 :   json_builder_set_member_name (builder, "isCancel");
+     796                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+     797                 :           1 :   packet = valent_packet_end (&builder);
+     798                 :             : 
+     799         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     800                 :           1 : }
+     801                 :             : 
+     802                 :             : static void
+     803                 :           1 : notification_close_action (GSimpleAction *action,
+     804                 :             :                            GVariant      *parameter,
+     805                 :             :                            gpointer       user_data)
+     806                 :             : {
+     807                 :           1 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (user_data);
+     808                 :           1 :   const char *id;
+     809                 :             : 
+     810         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     811                 :             : 
+     812                 :           1 :   id = g_variant_get_string (parameter, NULL);
+     813                 :           1 :   valent_notification_plugin_close_notification (self, id);
+     814                 :           1 : }
+     815                 :             : 
+     816                 :             : static void
+     817                 :           1 : notification_reply_action (GSimpleAction *action,
+     818                 :             :                            GVariant      *parameter,
+     819                 :             :                            gpointer       user_data)
+     820                 :             : {
+     821                 :           1 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (user_data);
+     822                 :           1 :   const char *reply_id;
+     823                 :           1 :   const char *message;
+     824                 :           1 :   g_autoptr (GVariant) notificationv = NULL;
+     825                 :             : 
+     826         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     827                 :             : 
+     828                 :           1 :   g_variant_get (parameter, "(&s&sv)", &reply_id, &message, &notificationv);
+     829                 :             : 
+     830                 :             :   /* If the reply ID is empty, we've received a broken request */
+     831   [ +  -  -  + ]:           1 :   if (reply_id == NULL || *reply_id == '\0')
+     832                 :             :     {
+     833                 :           0 :       g_debug ("%s(): expected requestReplyId", G_STRFUNC);
+     834                 :           0 :       return;
+     835                 :             :     }
+     836                 :             : 
+     837                 :             :   /* If the message is empty, we're being asked to show the dialog */
+     838   [ +  -  -  + ]:           1 :   if (message == NULL || *message == '\0')
+     839                 :             :     {
+     840         [ +  - ]:           1 :       g_autoptr (ValentNotificationDialog) dialog = NULL;
+     841         [ #  # ]:           0 :       g_autoptr (ValentNotification) notification = NULL;
+     842                 :             : 
+     843         [ #  # ]:           0 :       if (!gtk_is_initialized ())
+     844                 :             :         {
+     845                 :           0 :           g_warning ("%s: No display available", G_STRFUNC);
+     846                 :           0 :           return;
+     847                 :             :         }
+     848                 :             : 
+     849                 :           0 :       notification = valent_notification_deserialize (notificationv);
+     850                 :             : 
+     851         [ #  # ]:           0 :       if ((dialog = g_hash_table_lookup (self->dialogs, notification)) == NULL)
+     852                 :             :         {
+     853                 :           0 :           ValentDevice *device;
+     854                 :             : 
+     855                 :           0 :           device = valent_extension_get_object (VALENT_EXTENSION (self));
+     856                 :           0 :           dialog = g_object_new (VALENT_TYPE_NOTIFICATION_DIALOG,
+     857                 :             :                                  "device",       device,
+     858                 :             :                                  "notification", notification,
+     859                 :             :                                  "reply-id",     reply_id,
+     860                 :             :                                  NULL);
+     861                 :           0 :           g_hash_table_insert (self->dialogs,
+     862                 :             :                                g_object_ref (notification),
+     863                 :             :                                g_object_ref_sink (dialog));
+     864                 :             :         }
+     865                 :             : 
+     866         [ #  # ]:           0 :       gtk_window_present (GTK_WINDOW (dialog));
+     867                 :             :     }
+     868                 :             :   else
+     869                 :             :     {
+     870                 :           1 :       g_autoptr (JsonBuilder) builder = NULL;
+     871         [ -  + ]:           1 :       g_autoptr (JsonNode) packet = NULL;
+     872                 :             : 
+     873                 :           1 :       valent_packet_init (&builder, "kdeconnect.notification.reply");
+     874                 :           1 :       json_builder_set_member_name (builder, "requestReplyId");
+     875                 :           1 :       json_builder_add_string_value (builder, reply_id);
+     876                 :           1 :       json_builder_set_member_name (builder, "message");
+     877                 :           1 :       json_builder_add_string_value (builder, message);
+     878                 :           1 :       packet = valent_packet_end (&builder);
+     879                 :             : 
+     880         [ +  - ]:           1 :       valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     881                 :             :     }
+     882                 :             : }
+     883                 :             : 
+     884                 :             : static void
+     885                 :           1 : notification_send_action (GSimpleAction *action,
+     886                 :             :                           GVariant      *parameter,
+     887                 :             :                           gpointer       user_data)
+     888                 :             : {
+     889                 :           1 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (user_data);
+     890                 :           1 :   GVariantDict dict;
+     891                 :           2 :   g_autofree char *id = NULL;
+     892                 :           1 :   const char *app = NULL;
+     893                 :           1 :   const char *title = NULL;
+     894                 :           1 :   const char *body = NULL;
+     895                 :           1 :   g_autoptr (GVariant) iconv = NULL;
+     896         [ +  - ]:           1 :   g_autoptr (GIcon) icon = NULL;
+     897                 :             : 
+     898         [ +  - ]:           1 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     899                 :             : 
+     900                 :           1 :   g_variant_dict_init (&dict, parameter);
+     901                 :             : 
+     902                 :             :   /* Use a random ID as a fallback */
+     903         [ -  + ]:           1 :   if (!g_variant_dict_lookup (&dict, "id", "s", &id))
+     904                 :           0 :     id = g_uuid_string_random ();
+     905                 :             : 
+     906                 :           1 :   g_variant_dict_lookup (&dict, "application", "&s", &app);
+     907                 :           1 :   g_variant_dict_lookup (&dict, "title", "&s", &title);
+     908                 :           1 :   g_variant_dict_lookup (&dict, "body", "&s", &body);
+     909                 :             : 
+     910                 :             :   /* Check for a serialized GIcon */
+     911                 :           1 :   iconv = g_variant_dict_lookup_value (&dict, "icon", G_VARIANT_TYPE ("(sv)"));
+     912                 :             : 
+     913         [ +  - ]:           1 :   if (iconv != NULL)
+     914                 :           1 :     icon = g_icon_deserialize (iconv);
+     915                 :             : 
+     916                 :           1 :   valent_notification_plugin_send_notification (self, id, app, title, body, icon);
+     917                 :             : 
+     918         [ +  - ]:           1 :   g_variant_dict_clear (&dict);
+     919                 :           1 : }
+     920                 :             : 
+     921                 :             : static const GActionEntry actions[] = {
+     922                 :             :     {"action", notification_action_action, "(ss)",  NULL, NULL},
+     923                 :             :     {"cancel", notification_cancel_action, "s",     NULL, NULL},
+     924                 :             :     {"close",  notification_close_action,  "s",     NULL, NULL},
+     925                 :             :     {"reply",  notification_reply_action,  "(ssv)", NULL, NULL},
+     926                 :             :     {"send",   notification_send_action,   "a{sv}", NULL, NULL},
+     927                 :             : };
+     928                 :             : 
+     929                 :             : /*
+     930                 :             :  * ValentDevicePlugin
+     931                 :             :  */
+     932                 :             : static void
+     933                 :          16 : valent_notification_plugin_update_state (ValentDevicePlugin *plugin,
+     934                 :             :                                          ValentDeviceState   state)
+     935                 :             : {
+     936                 :          16 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (plugin);
+     937                 :          16 :   gboolean available;
+     938                 :             : 
+     939         [ +  - ]:          16 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (self));
+     940                 :             : 
+     941                 :          16 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     942                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     943                 :             : 
+     944                 :          16 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     945                 :          16 :   valent_notification_plugin_watch_notifications (self, available);
+     946                 :             : 
+     947                 :             :   /* Request Notifications */
+     948         [ +  + ]:          16 :   if (available)
+     949                 :             :     {
+     950                 :           5 :       valent_notification_plugin_request_notifications (self);
+     951                 :          16 :       VALENT_NOTE ("TODO: send active notifications");
+     952                 :             :     }
+     953                 :          16 : }
+     954                 :             : 
+     955                 :             : static void
+     956                 :           4 : valent_notification_plugin_handle_packet (ValentDevicePlugin *plugin,
+     957                 :             :                                           const char         *type,
+     958                 :             :                                           JsonNode           *packet)
+     959                 :             : {
+     960                 :           4 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (plugin);
+     961                 :             : 
+     962         [ +  - ]:           4 :   g_assert (VALENT_IS_NOTIFICATION_PLUGIN (plugin));
+     963         [ -  + ]:           4 :   g_assert (type != NULL);
+     964         [ -  + ]:           4 :   g_assert (VALENT_IS_PACKET (packet));
+     965                 :             : 
+     966         [ +  - ]:           4 :   if (g_str_equal (type, "kdeconnect.notification"))
+     967                 :           4 :     valent_notification_plugin_handle_notification (self, packet);
+     968                 :             : 
+     969         [ #  # ]:           0 :   else if (g_str_equal (type, "kdeconnect.notification.action"))
+     970                 :           0 :     valent_notification_plugin_handle_notification_action (self, packet);
+     971                 :             : 
+     972         [ #  # ]:           0 :   else if (g_str_equal (type, "kdeconnect.notification.reply"))
+     973                 :           0 :     valent_notification_plugin_handle_notification_reply (self, packet);
+     974                 :             : 
+     975         [ #  # ]:           0 :   else if (g_str_equal (type, "kdeconnect.notification.request"))
+     976                 :           0 :     valent_notification_plugin_handle_notification_request (self, packet);
+     977                 :             : 
+     978                 :             :   else
+     979                 :           0 :     g_assert_not_reached ();
+     980                 :           4 : }
+     981                 :             : 
+     982                 :             : /*
+     983                 :             :  * ValentObject
+     984                 :             :  */
+     985                 :             : static void
+     986                 :          10 : valent_notification_plugin_destroy (ValentObject *object)
+     987                 :             : {
+     988                 :          10 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (object);
+     989                 :             : 
+     990                 :          10 :   valent_notification_plugin_watch_notifications (self, FALSE);
+     991                 :             : 
+     992                 :             :   /* Close any open reply dialogs */
+     993         [ +  + ]:          10 :   g_clear_pointer (&self->cache, g_hash_table_unref);
+     994         [ +  + ]:          10 :   g_clear_pointer (&self->dialogs, g_hash_table_unref);
+     995                 :             : 
+     996                 :             :   /* Cancel any pending operations */
+     997                 :          10 :   g_cancellable_cancel (self->cancellable);
+     998         [ +  + ]:          10 :   g_clear_object (&self->cancellable);
+     999                 :             : 
+    1000                 :          10 :   VALENT_OBJECT_CLASS (valent_notification_plugin_parent_class)->destroy (object);
+    1001                 :          10 : }
+    1002                 :             : 
+    1003                 :             : /*
+    1004                 :             :  * GObject
+    1005                 :             :  */
+    1006                 :             : static void
+    1007                 :           5 : valent_notification_plugin_constructed (GObject *object)
+    1008                 :             : {
+    1009                 :           5 :   ValentNotificationPlugin *self = VALENT_NOTIFICATION_PLUGIN (object);
+    1010                 :           5 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+    1011                 :             : 
+    1012                 :           5 :   self->cancellable = g_cancellable_new ();
+    1013                 :           5 :   self->notifications = valent_notifications_get_default();
+    1014                 :           5 :   self->session = valent_session_get_default ();
+    1015                 :             : 
+    1016                 :           5 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+    1017                 :             :                                    actions,
+    1018                 :             :                                    G_N_ELEMENTS (actions),
+    1019                 :             :                                    plugin);
+    1020                 :             : 
+    1021                 :           5 :   self->cache = g_hash_table_new_full (g_str_hash,
+    1022                 :             :                                        g_str_equal,
+    1023                 :             :                                        g_free,
+    1024                 :             :                                        (GDestroyNotify)json_node_unref);
+    1025                 :           5 :   self->dialogs = g_hash_table_new_full (valent_notification_hash,
+    1026                 :             :                                          valent_notification_equal,
+    1027                 :             :                                          g_object_unref,
+    1028                 :             :                                          (GDestroyNotify)gtk_window_destroy);
+    1029                 :             : 
+    1030                 :           5 :   G_OBJECT_CLASS (valent_notification_plugin_parent_class)->constructed (object);
+    1031                 :           5 : }
+    1032                 :             : 
+    1033                 :             : static void
+    1034                 :           2 : valent_notification_plugin_class_init (ValentNotificationPluginClass *klass)
+    1035                 :             : {
+    1036                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    1037                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+    1038                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+    1039                 :             : 
+    1040                 :           2 :   object_class->constructed = valent_notification_plugin_constructed;
+    1041                 :             : 
+    1042                 :           2 :   vobject_class->destroy = valent_notification_plugin_destroy;
+    1043                 :             : 
+    1044                 :           2 :   plugin_class->handle_packet = valent_notification_plugin_handle_packet;
+    1045                 :           2 :   plugin_class->update_state = valent_notification_plugin_update_state;
+    1046                 :             : }
+    1047                 :             : 
+    1048                 :             : static void
+    1049                 :           5 : valent_notification_plugin_init (ValentNotificationPlugin *self)
+    1050                 :             : {
+    1051                 :           5 : }
+    1052                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-plugin.h.func-c.html b/coverage/src/plugins/notification/valent-notification-plugin.h.func-c.html new file mode 100644 index 00000000000..56f3dde6920 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_PLUGIN82
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-plugin.h.func.html b/coverage/src/plugins/notification/valent-notification-plugin.h.func.html new file mode 100644 index 00000000000..dd8b465cc1a --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_PLUGIN82
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-plugin.h.gcov.html b/coverage/src/plugins/notification/valent-notification-plugin.h.gcov.html new file mode 100644 index 00000000000..467325c81df --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_NOTIFICATION_PLUGIN (valent_notification_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          82 : G_DECLARE_FINAL_TYPE (ValentNotificationPlugin, valent_notification_plugin, VALENT, NOTIFICATION_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-preferences.c.func-c.html b/coverage/src/plugins/notification/valent-notification-preferences.c.func-c.html new file mode 100644 index 00000000000..2078f741075 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-preferences.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:41.0 %16668
Test Date:2024-03-31 18:46:36Functions:47.4 %199
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:10.7 %566
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
add_application0
application_list_filter0
application_list_sort0
applications_action0
on_search_changed0
on_search_started0
on_search_toggled0
on_stop_search0
on_switch_toggled0
reset_action0
populate_applications1
valent_notification_preferences_constructed1
valent_notification_preferences_dispose1
valent_notification_preferences_finalize1
valent_notification_preferences_init1
valent_notification_preferences_class_init2
valent_notification_preferences_get_type7
valent_notification_preferences_class_intern_init2
valent_notification_preferences_get_type_once2
valent_notification_preferences_get_type3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-preferences.c.func.html b/coverage/src/plugins/notification/valent-notification-preferences.c.func.html new file mode 100644 index 00000000000..03b5e3e2cc2 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-preferences.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:41.0 %16668
Test Date:2024-03-31 18:46:36Functions:47.4 %199
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:10.7 %566
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
add_application0
application_list_filter0
application_list_sort0
applications_action0
on_search_changed0
on_search_started0
on_search_toggled0
on_stop_search0
on_switch_toggled0
populate_applications1
reset_action0
valent_notification_preferences_class_init2
valent_notification_preferences_constructed1
valent_notification_preferences_dispose1
valent_notification_preferences_finalize1
valent_notification_preferences_get_type7
valent_notification_preferences_class_intern_init2
valent_notification_preferences_get_type3
valent_notification_preferences_get_type_once2
valent_notification_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-preferences.c.gcov.html b/coverage/src/plugins/notification/valent-notification-preferences.c.gcov.html new file mode 100644 index 00000000000..73b3b37043c --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-preferences.c.gcov.html @@ -0,0 +1,447 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:41.0 %16668
Test Date:2024-03-31 18:46:36Functions:47.4 %199
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:10.7 %566
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notification-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-notification-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentNotificationPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   AdwExpanderRow               *forward_notifications;
+      22                 :             :   GtkSwitch                    *forward_when_active;
+      23                 :             : 
+      24                 :             :   AdwNavigationPage            *application_page;
+      25                 :             :   GtkStack                     *application_title_stack;
+      26                 :             :   GtkToggleButton              *application_filter_button;
+      27                 :             :   GtkSearchEntry               *application_filter_entry;
+      28                 :             :   AdwActionRow                 *application_row;
+      29                 :             :   GtkListBox                   *application_list;
+      30                 :             : 
+      31                 :             :   char                         *application_filter;
+      32                 :             :   GHashTable                   *application_rows;
+      33                 :             : };
+      34                 :             : 
+      35   [ +  +  +  - ]:           7 : G_DEFINE_FINAL_TYPE (ValentNotificationPreferences, valent_notification_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      36                 :             : 
+      37                 :             : 
+      38                 :             : static gboolean
+      39                 :           0 : application_list_filter (GtkListBoxRow *row,
+      40                 :             :                          gpointer       user_data)
+      41                 :             : {
+      42                 :           0 :   ValentNotificationPreferences *self = VALENT_NOTIFICATION_PREFERENCES (user_data);
+      43                 :           0 :   g_autofree char *haystack = NULL;
+      44                 :           0 :   const char *title = NULL;
+      45                 :             : 
+      46         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+      47                 :             : 
+      48   [ #  #  #  # ]:           0 :   if (self->application_filter == NULL || *self->application_filter == '\0')
+      49                 :             :     return TRUE;
+      50                 :             : 
+      51                 :           0 :   title = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (row));
+      52                 :           0 :   haystack = g_utf8_casefold (title, -1);
+      53                 :             : 
+      54                 :           0 :   return g_strrstr (haystack, self->application_filter) != NULL;
+      55                 :             : }
+      56                 :             : 
+      57                 :             : static int
+      58                 :           0 : application_list_sort (GtkListBoxRow *row1,
+      59                 :             :                        GtkListBoxRow *row2,
+      60                 :             :                        gpointer       user_data)
+      61                 :             : {
+      62   [ #  #  #  # ]:           0 :   if G_UNLIKELY (!ADW_IS_PREFERENCES_ROW (row1) ||
+      63                 :             :                  !ADW_IS_PREFERENCES_ROW (row2))
+      64                 :           0 :     return 0;
+      65                 :             : 
+      66                 :           0 :   return g_utf8_collate (adw_preferences_row_get_title ((AdwPreferencesRow *)row1),
+      67                 :           0 :                          adw_preferences_row_get_title ((AdwPreferencesRow *)row2));
+      68                 :             : }
+      69                 :             : 
+      70                 :             : /*
+      71                 :             :  * Template Callbacks
+      72                 :             :  */
+      73                 :             : static void
+      74                 :           0 : on_search_changed (GtkSearchEntry                *entry,
+      75                 :             :                    ValentNotificationPreferences *self)
+      76                 :             : {
+      77                 :           0 :   g_autofree char *query = NULL;
+      78                 :             : 
+      79         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+      80                 :             : 
+      81                 :           0 :   query = g_utf8_casefold (gtk_editable_get_text (GTK_EDITABLE (entry)), -1);
+      82                 :             : 
+      83         [ #  # ]:           0 :   if (g_set_str (&self->application_filter, query))
+      84                 :           0 :     gtk_list_box_invalidate_filter (self->application_list);
+      85                 :           0 : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           0 : on_search_toggled (GtkToggleButton               *button,
+      89                 :             :                    GParamSpec                    *pspec,
+      90                 :             :                    ValentNotificationPreferences *self)
+      91                 :             : {
+      92         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+      93                 :             : 
+      94         [ #  # ]:           0 :   if (gtk_toggle_button_get_active (button))
+      95                 :             :     {
+      96                 :           0 :       gtk_stack_set_visible_child_name (self->application_title_stack, "search");
+      97                 :           0 :       gtk_widget_grab_focus (GTK_WIDGET (self->application_filter_entry));
+      98                 :           0 :       gtk_editable_set_position (GTK_EDITABLE (self->application_filter_entry), -1);
+      99                 :             :     }
+     100                 :             :   else
+     101                 :             :     {
+     102                 :           0 :       gtk_editable_set_text (GTK_EDITABLE (self->application_filter_entry), "");
+     103                 :           0 :       gtk_stack_set_visible_child_name (self->application_title_stack, "title");
+     104                 :             :     }
+     105                 :           0 : }
+     106                 :             : 
+     107                 :             : static void
+     108                 :           0 : on_search_started (GtkSearchEntry                *entry,
+     109                 :             :                    ValentNotificationPreferences *self)
+     110                 :             : {
+     111         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+     112                 :             : 
+     113                 :           0 :   gtk_toggle_button_set_active (self->application_filter_button, TRUE);
+     114                 :           0 : }
+     115                 :             : 
+     116                 :             : static void
+     117                 :           0 : on_stop_search (GtkSearchEntry                *entry,
+     118                 :             :                 ValentNotificationPreferences *self)
+     119                 :             : {
+     120         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+     121                 :             : 
+     122                 :           0 :   gtk_toggle_button_set_active (self->application_filter_button, FALSE);
+     123                 :           0 : }
+     124                 :             : 
+     125                 :             : static void
+     126                 :           0 : on_switch_toggled (GObject                       *object,
+     127                 :             :                    GParamSpec                    *pspec,
+     128                 :             :                    ValentNotificationPreferences *self)
+     129                 :             : {
+     130                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     131                 :           0 :   GSettings *settings;
+     132                 :           0 :   GHashTableIter iter;
+     133                 :           0 :   gpointer row;
+     134                 :           0 :   GVariantBuilder builder;
+     135                 :           0 :   GVariant *forward_deny;
+     136                 :             : 
+     137                 :           0 :   g_hash_table_iter_init (&iter, self->application_rows);
+     138                 :           0 :   g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+     139                 :             : 
+     140         [ #  # ]:           0 :   while (g_hash_table_iter_next (&iter, &row, NULL))
+     141                 :             :     {
+     142                 :           0 :       const char *name;
+     143                 :             : 
+     144         [ #  # ]:           0 :       if (adw_switch_row_get_active (ADW_SWITCH_ROW (row)))
+     145                 :           0 :         continue;
+     146                 :             : 
+     147                 :           0 :       name = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (row));
+     148                 :           0 :       g_variant_builder_add (&builder, "s", name);
+     149                 :             :     }
+     150                 :             : 
+     151                 :           0 :   forward_deny = g_variant_builder_end (&builder);
+     152                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+     153                 :           0 :   g_settings_set_value (settings, "forward-deny", forward_deny);
+     154                 :           0 : }
+     155                 :             : 
+     156                 :             : static void
+     157                 :           0 : add_application (ValentNotificationPreferences *self,
+     158                 :             :                  GVariant                      *app,
+     159                 :             :                  gboolean                       enabled)
+     160                 :             : {
+     161                 :           0 :   GtkWidget *row;
+     162                 :           0 :   GtkWidget *image;
+     163                 :           0 :   const char *title;
+     164                 :           0 :   g_autoptr (GVariant) icon_v = NULL;
+     165         [ #  # ]:           0 :   g_autoptr (GIcon) icon = NULL;
+     166                 :             : 
+     167         [ #  # ]:           0 :   if (!g_variant_lookup (app, "name", "&s", &title))
+     168                 :           0 :     return;
+     169                 :             : 
+     170                 :           0 :   row = g_object_new (ADW_TYPE_SWITCH_ROW,
+     171                 :             :                       "activatable", TRUE,
+     172                 :             :                       "selectable",  TRUE,
+     173                 :             :                       "title",       title,
+     174                 :             :                       "active",      enabled,
+     175                 :             :                       NULL);
+     176                 :           0 :   g_signal_connect_object (row,
+     177                 :             :                            "notify::active",
+     178                 :             :                            G_CALLBACK (on_switch_toggled),
+     179                 :             :                            self, 0);
+     180                 :             : 
+     181                 :             :   /* App icon */
+     182         [ #  # ]:           0 :   if ((icon_v = g_variant_lookup_value (app, "icon", NULL)) != NULL)
+     183                 :           0 :     icon = g_icon_deserialize (icon_v);
+     184                 :             : 
+     185         [ #  # ]:           0 :   if (icon == NULL)
+     186                 :           0 :     icon = g_icon_new_for_string ("application-x-executable", NULL);
+     187                 :             : 
+     188                 :           0 :   image = g_object_new (GTK_TYPE_IMAGE,
+     189                 :             :                         "gicon",     icon,
+     190                 :             :                         "icon-size", GTK_ICON_SIZE_LARGE,
+     191                 :             :                         NULL);
+     192                 :           0 :   adw_action_row_add_prefix (ADW_ACTION_ROW (row), image);
+     193                 :             : 
+     194                 :           0 :   g_hash_table_add (self->application_rows, row);
+     195         [ #  # ]:           0 :   gtk_list_box_insert (self->application_list, row, -1);
+     196                 :             : }
+     197                 :             : 
+     198                 :             : static void
+     199                 :           1 : populate_applications (ValentNotificationPreferences *self)
+     200                 :             : {
+     201                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     202                 :           1 :   GSettings *settings;
+     203                 :           1 :   GVariant *known;
+     204                 :           2 :   g_auto (GStrv) deny = NULL;
+     205                 :           1 :   GVariantIter iter;
+     206                 :           1 :   const char *key;
+     207                 :           1 :   GVariant *value;
+     208                 :             : 
+     209                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     210                 :           1 :   deny = g_settings_get_strv (settings, "forward-deny");
+     211                 :             : 
+     212                 :             :   /* Query the known applications */
+     213                 :           1 :   known = valent_notifications_get_applications (NULL);
+     214                 :           1 :   g_variant_iter_init (&iter, known);
+     215                 :             : 
+     216         [ -  + ]:           1 :   while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
+     217                 :             :     {
+     218                 :           0 :       gboolean enabled;
+     219                 :             : 
+     220                 :           0 :       enabled = !g_strv_contains ((const char * const *)deny, key);
+     221                 :           0 :       add_application (self, value, enabled);
+     222                 :             :     }
+     223                 :           1 : }
+     224                 :             : 
+     225                 :             : /*
+     226                 :             :  * GAction
+     227                 :             :  */
+     228                 :             : static void
+     229                 :           0 : applications_action (GtkWidget  *widget,
+     230                 :             :                      const char *action,
+     231                 :             :                      GVariant   *parameter)
+     232                 :             : {
+     233                 :           0 :   ValentNotificationPreferences *self = VALENT_NOTIFICATION_PREFERENCES (widget);
+     234                 :           0 :   GtkRoot *window = NULL;
+     235                 :             : 
+     236         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+     237                 :             : 
+     238         [ #  # ]:           0 :   if ((window = gtk_widget_get_root (widget)) == NULL)
+     239                 :             :     return;
+     240                 :             : 
+     241                 :           0 :   adw_preferences_window_push_subpage (ADW_PREFERENCES_WINDOW (window),
+     242                 :             :                                        self->application_page);
+     243                 :             : }
+     244                 :             : 
+     245                 :             : static void
+     246                 :           0 : reset_action (GtkWidget  *widget,
+     247                 :             :               const char *action,
+     248                 :             :               GVariant   *parameter)
+     249                 :             : {
+     250                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (widget);
+     251                 :           0 :   ValentNotificationPreferences *self = VALENT_NOTIFICATION_PREFERENCES (group);
+     252                 :           0 :   GSettings *settings;
+     253                 :           0 :   GHashTableIter iter;
+     254                 :           0 :   gpointer row_switch;
+     255                 :             : 
+     256         [ #  # ]:           0 :   g_assert (VALENT_IS_NOTIFICATION_PREFERENCES (self));
+     257         [ #  # ]:           0 :   g_assert (VALENT_IS_DEVICE_PREFERENCES_GROUP (self));
+     258                 :             : 
+     259                 :           0 :   g_hash_table_iter_init (&iter, self->application_rows);
+     260                 :             : 
+     261         [ #  # ]:           0 :   while (g_hash_table_iter_next (&iter, NULL, &row_switch))
+     262                 :           0 :     gtk_switch_set_active (GTK_SWITCH (row_switch), TRUE);
+     263                 :             : 
+     264                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+     265                 :           0 :   g_settings_reset (settings, "applications");
+     266                 :           0 : }
+     267                 :             : 
+     268                 :             : /*
+     269                 :             :  * GObject
+     270                 :             :  */
+     271                 :             : static void
+     272                 :           1 : valent_notification_preferences_constructed (GObject *object)
+     273                 :             : {
+     274                 :           1 :   ValentNotificationPreferences *self = VALENT_NOTIFICATION_PREFERENCES (object);
+     275                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     276                 :           1 :   GSettings *settings;
+     277                 :             : 
+     278                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     279                 :           1 :   g_settings_bind (settings,                    "forward-notifications",
+     280                 :           1 :                    self->forward_notifications, "enable-expansion",
+     281                 :             :                    G_SETTINGS_BIND_DEFAULT);
+     282                 :           1 :   g_settings_bind (settings,                    "forward-when-active",
+     283                 :           1 :                    self->forward_when_active,   "active",
+     284                 :             :                    G_SETTINGS_BIND_INVERT_BOOLEAN);
+     285                 :             : 
+     286                 :           1 :   gtk_list_box_set_filter_func (self->application_list,
+     287                 :             :                                 application_list_filter,
+     288                 :             :                                 self, NULL);
+     289                 :           1 :   gtk_list_box_set_sort_func (self->application_list,
+     290                 :             :                               application_list_sort,
+     291                 :             :                               self, NULL);
+     292                 :           1 :   populate_applications (self);
+     293                 :             : 
+     294                 :           1 :   G_OBJECT_CLASS (valent_notification_preferences_parent_class)->constructed (object);
+     295                 :           1 : }
+     296                 :             : 
+     297                 :             : static void
+     298                 :           1 : valent_notification_preferences_dispose (GObject *object)
+     299                 :             : {
+     300                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     301                 :             : 
+     302                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_NOTIFICATION_PREFERENCES);
+     303                 :             : 
+     304                 :           1 :   G_OBJECT_CLASS (valent_notification_preferences_parent_class)->dispose (object);
+     305                 :           1 : }
+     306                 :             : 
+     307                 :             : static void
+     308                 :           1 : valent_notification_preferences_finalize (GObject *object)
+     309                 :             : {
+     310                 :           1 :   ValentNotificationPreferences *self = VALENT_NOTIFICATION_PREFERENCES (object);
+     311                 :             : 
+     312         [ -  + ]:           1 :   g_clear_pointer (&self->application_filter, g_free);
+     313         [ +  - ]:           1 :   g_clear_pointer (&self->application_rows, g_hash_table_unref);
+     314                 :             : 
+     315                 :           1 :   G_OBJECT_CLASS (valent_notification_preferences_parent_class)->finalize (object);
+     316                 :           1 : }
+     317                 :             : 
+     318                 :             : static void
+     319                 :           2 : valent_notification_preferences_class_init (ValentNotificationPreferencesClass *klass)
+     320                 :             : {
+     321                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     322                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     323                 :             : 
+     324                 :           2 :   object_class->constructed = valent_notification_preferences_constructed;
+     325                 :           2 :   object_class->dispose = valent_notification_preferences_dispose;
+     326                 :           2 :   object_class->finalize = valent_notification_preferences_finalize;
+     327                 :             : 
+     328                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/notification/valent-notification-preferences.ui");
+     329                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, forward_notifications);
+     330                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, forward_when_active);
+     331                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, application_page);
+     332                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, application_title_stack);
+     333                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, application_filter_entry);
+     334                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, application_filter_button);
+     335                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, application_list);
+     336                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentNotificationPreferences, application_row);
+     337                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_search_changed);
+     338                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_search_started);
+     339                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_search_toggled);
+     340                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_stop_search);
+     341                 :             : 
+     342                 :           2 :   gtk_widget_class_install_action (widget_class, "preferences.applications", NULL, applications_action);
+     343                 :           2 :   gtk_widget_class_install_action (widget_class, "preferences.reset", NULL, reset_action);
+     344                 :           2 : }
+     345                 :             : 
+     346                 :             : static void
+     347                 :           1 : valent_notification_preferences_init (ValentNotificationPreferences *self)
+     348                 :             : {
+     349                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     350                 :           1 :   gtk_search_entry_set_key_capture_widget (self->application_filter_entry,
+     351                 :           1 :                                            GTK_WIDGET (self->application_page));
+     352                 :             : 
+     353                 :           1 :   self->application_rows = g_hash_table_new (NULL, NULL);
+     354                 :           1 : }
+     355                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-preferences.h.func-c.html b/coverage/src/plugins/notification/valent-notification-preferences.h.func-c.html new file mode 100644 index 00000000000..156a3913ddf --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-preferences.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_PREFERENCES0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-preferences.h.func.html b/coverage/src/plugins/notification/valent-notification-preferences.h.func.html new file mode 100644 index 00000000000..fae8c0ff61b --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-preferences.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_PREFERENCES0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-preferences.h.gcov.html b/coverage/src/plugins/notification/valent-notification-preferences.h.gcov.html new file mode 100644 index 00000000000..d2161d18071 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-preferences.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-preferences.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_NOTIFICATION_PREFERENCES (valent_notification_preferences_get_type())
+      11                 :             : 
+      12   [ #  #  #  #  :           0 : G_DECLARE_FINAL_TYPE (ValentNotificationPreferences, valent_notification_preferences, VALENT, NOTIFICATION_PREFERENCES, ValentDevicePreferencesGroup)
+                   #  # ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-upload.c.func-c.html b/coverage/src/plugins/notification/valent-notification-upload.c.func-c.html new file mode 100644 index 00000000000..e4531d0bb0a --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-upload.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-upload.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-upload.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.7 %197157
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.3 %17678
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_notification_upload_get_property0
valent_notification_upload_class_init1
_gtk_icon_theme_get_default2
_gtk_icon_theme_get_largest_icon2
get_largest_icon_file2
valent_notification_upload_execute4
valent_notification_upload_execute_task4
valent_notification_upload_finalize4
valent_notification_upload_get_icon_bytes4
valent_notification_upload_init4
valent_notification_upload_new4
on_size_prepared6
valent_notification_upload_set_property12
valent_notification_upload_get_type14
valent_notification_upload_class_intern_init1
valent_notification_upload_get_type_once1
valent_notification_upload_get_type12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-upload.c.func.html b/coverage/src/plugins/notification/valent-notification-upload.c.func.html new file mode 100644 index 00000000000..6f936767a99 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-upload.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-upload.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-upload.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.7 %197157
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.3 %17678
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_gtk_icon_theme_get_default2
_gtk_icon_theme_get_largest_icon2
get_largest_icon_file2
on_size_prepared6
valent_notification_upload_class_init1
valent_notification_upload_execute4
valent_notification_upload_execute_task4
valent_notification_upload_finalize4
valent_notification_upload_get_icon_bytes4
valent_notification_upload_get_property0
valent_notification_upload_get_type14
valent_notification_upload_class_intern_init1
valent_notification_upload_get_type12
valent_notification_upload_get_type_once1
valent_notification_upload_init4
valent_notification_upload_new4
valent_notification_upload_set_property12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-upload.c.gcov.html b/coverage/src/plugins/notification/valent-notification-upload.c.gcov.html new file mode 100644 index 00000000000..0168055804a --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-upload.c.gcov.html @@ -0,0 +1,614 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-upload.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-upload.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.7 %197157
Test Date:2024-03-31 18:46:36Functions:93.8 %1615
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.3 %17678
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-notification-upload"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-notification-upload.h"
+      14                 :             : 
+      15                 :             : #define DEFAULT_ICON_SIZE 512
+      16                 :             : 
+      17                 :             : 
+      18                 :             : /**
+      19                 :             :  * ValentNotificationUpload:
+      20                 :             :  *
+      21                 :             :  * A class for notification icon uploads.
+      22                 :             :  *
+      23                 :             :  * `ValentNotificationUpload` is a class that abstracts uploading notifications
+      24                 :             :  * with icon payloads for `ValentNotificationPlugin`.
+      25                 :             :  */
+      26                 :             : 
+      27                 :             : struct _ValentNotificationUpload
+      28                 :             : {
+      29                 :             :   ValentTransfer  parent_instance;
+      30                 :             : 
+      31                 :             :   ValentDevice   *device;
+      32                 :             :   JsonNode       *packet;
+      33                 :             :   GIcon          *icon;
+      34                 :             : };
+      35                 :             : 
+      36   [ +  +  +  - ]:          14 : G_DEFINE_FINAL_TYPE (ValentNotificationUpload, valent_notification_upload, VALENT_TYPE_TRANSFER)
+      37                 :             : 
+      38                 :             : enum {
+      39                 :             :   PROP_0,
+      40                 :             :   PROP_DEVICE,
+      41                 :             :   PROP_ICON,
+      42                 :             :   PROP_PACKET,
+      43                 :             :   N_PROPERTIES,
+      44                 :             : };
+      45                 :             : 
+      46                 :             : static GParamSpec *properties[N_PROPERTIES] = { 0, };
+      47                 :             : 
+      48                 :             : 
+      49                 :             : /*
+      50                 :             :  * GIcon Helpers
+      51                 :             :  */
+      52                 :             : static GtkIconTheme *
+      53                 :           2 : _gtk_icon_theme_get_default (void)
+      54                 :             : {
+      55                 :           2 :   static GtkIconTheme *icon_theme = NULL;
+      56                 :           2 :   size_t guard = 0;
+      57                 :             : 
+      58   [ +  -  +  - ]:           2 :   if (g_once_init_enter (&guard))
+      59                 :             :     {
+      60         [ +  - ]:           2 :       if (gtk_is_initialized ())
+      61                 :             :         {
+      62                 :           2 :           GdkDisplay *display = NULL;
+      63                 :             : 
+      64         [ +  - ]:           2 :           if ((display = gdk_display_get_default ()) != NULL)
+      65                 :           2 :             icon_theme = gtk_icon_theme_get_for_display (display);
+      66                 :             :         }
+      67                 :             : 
+      68                 :           2 :       g_once_init_leave (&guard, 1);
+      69                 :             :     }
+      70                 :             : 
+      71                 :           2 :   return icon_theme;
+      72                 :             : }
+      73                 :             : 
+      74                 :             : static int
+      75                 :           2 : _gtk_icon_theme_get_largest_icon (GtkIconTheme *theme,
+      76                 :             :                                   const char   *name)
+      77                 :             : {
+      78                 :           4 :   g_autofree int *sizes = NULL;
+      79                 :           2 :   int ret = 0;
+      80                 :             : 
+      81   [ +  -  +  -  :           2 :   g_assert (GTK_IS_ICON_THEME (theme));
+             -  +  -  - ]
+      82         [ -  + ]:           2 :   g_assert (name != NULL);
+      83                 :             : 
+      84         [ +  - ]:           2 :   if (!gtk_icon_theme_has_icon (theme, name))
+      85                 :             :     return ret;
+      86                 :             : 
+      87                 :           2 :   sizes = gtk_icon_theme_get_icon_sizes (theme, name);
+      88                 :             : 
+      89         [ +  - ]:           2 :   for (unsigned int i = 0; sizes[i] != 0; i++)
+      90                 :             :     {
+      91         [ -  + ]:           2 :       if (sizes[i] == -1)
+      92                 :             :         return -1;
+      93                 :             : 
+      94                 :           0 :       if (sizes[i] > ret)
+      95                 :             :         ret = sizes[i];
+      96                 :             :     }
+      97                 :             : 
+      98                 :             :   return ret;
+      99                 :             : }
+     100                 :             : 
+     101                 :             : static GFile *
+     102                 :           2 : get_largest_icon_file (GIcon *icon)
+     103                 :             : {
+     104                 :           2 :   GtkIconTheme *icon_theme = NULL;
+     105                 :           2 :   const char * const *names;
+     106                 :           4 :   g_autoptr (GtkIconPaintable) info = NULL;
+     107                 :             : 
+     108   [ +  -  +  -  :           2 :   g_assert (G_IS_THEMED_ICON (icon));
+             -  +  -  - ]
+     109                 :             : 
+     110                 :           2 :   icon_theme = _gtk_icon_theme_get_default ();
+     111                 :             : 
+     112         [ +  - ]:           2 :   if (icon_theme == NULL)
+     113                 :             :     return NULL;
+     114                 :             : 
+     115                 :           2 :   names = g_themed_icon_get_names (G_THEMED_ICON (icon));
+     116                 :             : 
+     117         [ +  - ]:           2 :   for (unsigned int i = 0; names[i]; i++)
+     118                 :             :     {
+     119                 :           2 :       int size;
+     120                 :             : 
+     121         [ -  + ]:           2 :       if ((size = _gtk_icon_theme_get_largest_icon (icon_theme, names[i])) == 0)
+     122                 :           0 :         continue;
+     123                 :             : 
+     124                 :           2 :       info = gtk_icon_theme_lookup_icon (icon_theme,
+     125                 :             :                                          names[i],
+     126                 :             :                                          NULL,
+     127                 :             :                                          size,
+     128                 :             :                                          1,
+     129                 :             :                                          GTK_TEXT_DIR_NONE,
+     130                 :             :                                          0);
+     131                 :             : 
+     132         [ +  - ]:           2 :       if (info != NULL)
+     133                 :           2 :         return gtk_icon_paintable_get_file (info);
+     134                 :             :     }
+     135                 :             : 
+     136                 :             :   return NULL;
+     137                 :             : }
+     138                 :             : 
+     139                 :             : static void
+     140                 :           6 : on_size_prepared (GdkPixbufLoader *loader,
+     141                 :             :                   int              width,
+     142                 :             :                   int              height,
+     143                 :             :                   gpointer         user_data)
+     144                 :             : {
+     145                 :           6 :   GdkPixbufFormat *format = gdk_pixbuf_loader_get_format (loader);
+     146                 :             : 
+     147         [ +  + ]:           6 :   if (!gdk_pixbuf_format_is_scalable (format))
+     148                 :             :     return;
+     149                 :             : 
+     150         [ +  - ]:           4 :   if (width >= DEFAULT_ICON_SIZE || height >= DEFAULT_ICON_SIZE)
+     151                 :             :     return;
+     152                 :             : 
+     153                 :           4 :   gdk_pixbuf_loader_set_size (loader, DEFAULT_ICON_SIZE, DEFAULT_ICON_SIZE);
+     154                 :             : }
+     155                 :             : 
+     156                 :             : static GBytes *
+     157                 :           4 : valent_notification_upload_get_icon_bytes (GIcon         *icon,
+     158                 :             :                                            GCancellable  *cancellable,
+     159                 :             :                                            GError       **error)
+     160                 :             : {
+     161                 :           8 :   g_autoptr (GBytes) bytes = NULL;
+     162         [ +  - ]:           4 :   g_autoptr (GdkPixbufLoader) loader = NULL;
+     163                 :           4 :   GdkPixbuf *pixbuf = NULL;
+     164         [ +  - ]:           4 :   g_autoptr (GError) warn = NULL;
+     165                 :           4 :   char *data;
+     166                 :           4 :   size_t size;
+     167                 :             : 
+     168   [ +  -  +  -  :           4 :   g_assert (G_IS_ICON (icon));
+             +  -  -  + ]
+     169   [ +  -  +  -  :           4 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     170   [ +  -  -  + ]:           4 :   g_assert (error == NULL || *error == NULL);
+     171                 :             : 
+     172                 :             :   /* First try to get the bytes of the GIcon */
+     173   [ +  -  +  +  :           4 :   if (G_IS_THEMED_ICON (icon))
+                   -  + ]
+     174                 :             :     {
+     175                 :           2 :       g_autoptr (GFile) file = NULL;
+     176                 :             : 
+     177                 :           2 :       file = get_largest_icon_file (icon);
+     178                 :             : 
+     179         [ -  + ]:           2 :       if (file == NULL)
+     180                 :             :         {
+     181                 :           0 :           g_set_error (error,
+     182                 :             :                        G_IO_ERROR,
+     183                 :             :                        G_IO_ERROR_FAILED,
+     184                 :             :                        "Failed to load themed icon");
+     185                 :           0 :           return NULL;
+     186                 :             :         }
+     187                 :             : 
+     188                 :           2 :       bytes = g_file_load_bytes (file, cancellable, NULL, error);
+     189                 :             :     }
+     190   [ +  -  +  +  :           2 :   else if (G_IS_FILE_ICON (icon))
+                   -  + ]
+     191                 :             :     {
+     192                 :           1 :       GFile *file;
+     193                 :             : 
+     194                 :           1 :       file = g_file_icon_get_file (G_FILE_ICON (icon));
+     195                 :           1 :       bytes = g_file_load_bytes (file, cancellable, NULL, error);
+     196                 :             :     }
+     197   [ +  -  -  +  :           1 :   else if (G_IS_BYTES_ICON (icon))
+                   -  - ]
+     198                 :             :     {
+     199                 :           1 :       GBytes *buffer;
+     200                 :             : 
+     201                 :           1 :       buffer = g_bytes_icon_get_bytes (G_BYTES_ICON (icon));
+     202                 :             : 
+     203         [ -  + ]:           1 :       if (buffer == NULL)
+     204                 :             :         {
+     205                 :           0 :           g_set_error (error,
+     206                 :             :                        G_IO_ERROR,
+     207                 :             :                        G_IO_ERROR_FAILED,
+     208                 :             :                        "Failed to load icon bytes");
+     209                 :           0 :           return NULL;
+     210                 :             :         }
+     211                 :             : 
+     212                 :           1 :       bytes = g_bytes_ref (buffer);
+     213                 :             :     }
+     214   [ #  #  #  #  :           0 :   else if (GDK_IS_PIXBUF (icon))
+                   #  # ]
+     215                 :             :     {
+     216                 :           0 :       bytes = gdk_pixbuf_read_pixel_bytes (GDK_PIXBUF (icon));
+     217                 :             :     }
+     218                 :             : 
+     219         [ -  + ]:           4 :   if (bytes == NULL)
+     220                 :           0 :     return NULL;
+     221                 :             : 
+     222                 :             :   /* Now attempt to load the bytes as a pixbuf */
+     223                 :           4 :   loader = gdk_pixbuf_loader_new ();
+     224                 :             : 
+     225                 :           4 :   g_signal_connect_object (loader,
+     226                 :             :                            "size-prepared",
+     227                 :             :                            G_CALLBACK (on_size_prepared),
+     228                 :             :                            NULL, 0);
+     229                 :             : 
+     230   [ +  -  -  + ]:           8 :   if (!gdk_pixbuf_loader_write_bytes (loader, bytes, &warn) ||
+     231                 :           4 :       !gdk_pixbuf_loader_close (loader, &warn))
+     232                 :             :     {
+     233                 :           0 :       g_debug ("%s(): %s", G_STRFUNC, warn->message);
+     234                 :           0 :       return g_steal_pointer (&bytes);
+     235                 :             :     }
+     236                 :             : 
+     237         [ -  + ]:           4 :   if ((pixbuf = gdk_pixbuf_loader_get_pixbuf (loader)) == NULL)
+     238                 :             :     {
+     239                 :           0 :       g_debug ("%s(): Failed to create pixbuf from bytes", G_STRFUNC);
+     240                 :           0 :       return g_steal_pointer (&bytes);
+     241                 :             :     }
+     242                 :             : 
+     243         [ -  + ]:           4 :   if (!gdk_pixbuf_save_to_buffer (pixbuf, &data, &size, "png", &warn, NULL))
+     244                 :             :     {
+     245                 :           0 :       g_debug ("%s(): %s", G_STRFUNC, warn->message);
+     246                 :           0 :       return g_steal_pointer (&bytes);
+     247                 :             :     }
+     248                 :             : 
+     249                 :           4 :   return g_bytes_new_take (data, size);
+     250                 :             : }
+     251                 :             : 
+     252                 :             : /*
+     253                 :             :  * ValentTransfer
+     254                 :             :  */
+     255                 :             : static void
+     256                 :           4 : valent_notification_upload_execute_task (GTask        *task,
+     257                 :             :                                          gpointer      source_object,
+     258                 :             :                                          gpointer      task_data,
+     259                 :             :                                          GCancellable *cancellable)
+     260                 :             : {
+     261                 :           4 :   ValentNotificationUpload *self = VALENT_NOTIFICATION_UPLOAD (source_object);
+     262                 :           4 :   g_autoptr (ValentChannel) channel = NULL;
+     263         [ -  - ]:           4 :   g_autoptr (GIcon) icon = NULL;
+     264   [ +  -  -  - ]:           4 :   g_autoptr (JsonNode) packet = NULL;
+     265   [ +  -  -  - ]:           4 :   g_autoptr (GBytes) bytes = NULL;
+     266         [ -  - ]:           4 :   g_autoptr (GIOStream) target = NULL;
+     267         [ -  - ]:           4 :   g_autofree char *payload_hash = NULL;
+     268                 :           4 :   const uint8_t *payload_data = NULL;
+     269                 :           4 :   size_t payload_size = 0;
+     270                 :           4 :   gboolean ret = FALSE;
+     271                 :           4 :   GError *error = NULL;
+     272                 :             : 
+     273         [ +  - ]:           4 :   g_assert (VALENT_IS_NOTIFICATION_UPLOAD (self));
+     274                 :             : 
+     275         [ +  - ]:           4 :   if (g_task_return_error_if_cancelled (task))
+     276                 :             :     return;
+     277                 :             : 
+     278                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     279                 :           4 :   channel = valent_device_ref_channel (self->device);
+     280                 :           4 :   icon = g_object_ref (self->icon);
+     281                 :           4 :   packet = json_node_ref (self->packet);
+     282                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     283                 :             : 
+     284         [ -  + ]:           4 :   if (channel == NULL)
+     285                 :             :     {
+     286                 :           0 :       g_task_return_new_error (task,
+     287                 :             :                                G_IO_ERROR,
+     288                 :             :                                G_IO_ERROR_NOT_CONNECTED,
+     289                 :             :                                "Device is disconnected");
+     290                 :           0 :       return;
+     291                 :             :     }
+     292                 :             : 
+     293                 :             :   /* Try to get the icon bytes */
+     294                 :           4 :   bytes = valent_notification_upload_get_icon_bytes (icon, cancellable, &error);
+     295                 :             : 
+     296         [ -  + ]:           4 :   if (bytes == NULL)
+     297                 :           0 :     return g_task_return_error (task, error);
+     298                 :             : 
+     299                 :             :   /* A payload hash is included, allowing the remote device to ignore icon
+     300                 :             :    * transfers that it already has cached. */
+     301                 :           4 :   payload_data = g_bytes_get_data (bytes, &payload_size);
+     302                 :           4 :   payload_hash = g_compute_checksum_for_data (G_CHECKSUM_MD5,
+     303                 :             :                                               payload_data,
+     304                 :             :                                               payload_size);
+     305                 :           4 :   json_object_set_string_member (valent_packet_get_body (packet),
+     306                 :             :                                  "payloadHash",
+     307                 :             :                                  payload_hash);
+     308                 :           4 :   valent_packet_set_payload_size (packet, payload_size);
+     309                 :             : 
+     310                 :           4 :   target = valent_channel_upload (channel, packet, cancellable, &error);
+     311                 :             : 
+     312         [ -  + ]:           4 :   if (target == NULL)
+     313                 :           0 :     return g_task_return_error (task, error);
+     314                 :             : 
+     315                 :             :   /* Upload the icon */
+     316                 :           4 :   ret = g_output_stream_write_all (g_io_stream_get_output_stream (target),
+     317                 :             :                                    payload_data,
+     318                 :             :                                    payload_size,
+     319                 :             :                                    NULL,
+     320                 :             :                                    cancellable,
+     321                 :             :                                    &error);
+     322                 :             : 
+     323         [ -  + ]:           4 :   if (!ret)
+     324                 :           0 :     return g_task_return_error (task, error);
+     325                 :             : 
+     326                 :           4 :   g_task_return_boolean (task, TRUE);
+     327                 :             : }
+     328                 :             : 
+     329                 :             : static void
+     330                 :           4 : valent_notification_upload_execute (ValentTransfer      *transfer,
+     331                 :             :                                     GCancellable        *cancellable,
+     332                 :             :                                     GAsyncReadyCallback  callback,
+     333                 :             :                                     gpointer             user_data)
+     334                 :             : {
+     335                 :           8 :   g_autoptr (GTask) task = NULL;
+     336                 :             : 
+     337         [ +  - ]:           4 :   g_assert (VALENT_IS_NOTIFICATION_UPLOAD (transfer));
+     338   [ +  -  +  -  :           4 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     339                 :             : 
+     340                 :           4 :   task = g_task_new (transfer, cancellable, callback, user_data);
+     341         [ +  - ]:           4 :   g_task_set_source_tag (task, valent_notification_upload_execute);
+     342         [ +  - ]:           4 :   g_task_run_in_thread (task, valent_notification_upload_execute_task);
+     343                 :           4 : }
+     344                 :             : 
+     345                 :             : /*
+     346                 :             :  * GObject
+     347                 :             :  */
+     348                 :             : static void
+     349                 :           4 : valent_notification_upload_finalize (GObject *object)
+     350                 :             : {
+     351                 :           4 :   ValentNotificationUpload *self = VALENT_NOTIFICATION_UPLOAD (object);
+     352                 :             : 
+     353                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     354         [ +  - ]:           4 :   g_clear_object (&self->device);
+     355         [ +  - ]:           4 :   g_clear_object (&self->icon);
+     356         [ +  - ]:           4 :   g_clear_pointer (&self->packet, json_node_unref);
+     357                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     358                 :             : 
+     359                 :           4 :   G_OBJECT_CLASS (valent_notification_upload_parent_class)->finalize (object);
+     360                 :           4 : }
+     361                 :             : 
+     362                 :             : static void
+     363                 :           0 : valent_notification_upload_get_property (GObject    *object,
+     364                 :             :                                          guint       prop_id,
+     365                 :             :                                          GValue     *value,
+     366                 :             :                                          GParamSpec *pspec)
+     367                 :             : {
+     368                 :           0 :   ValentNotificationUpload *self = VALENT_NOTIFICATION_UPLOAD (object);
+     369                 :             : 
+     370   [ #  #  #  # ]:           0 :   switch (prop_id)
+     371                 :             :     {
+     372                 :             :     case PROP_DEVICE:
+     373                 :           0 :       valent_object_lock (VALENT_OBJECT (self));
+     374                 :           0 :       g_value_set_object (value, self->device);
+     375                 :           0 :       valent_object_unlock (VALENT_OBJECT (self));
+     376                 :           0 :       break;
+     377                 :             : 
+     378                 :             :     case PROP_ICON:
+     379                 :           0 :       valent_object_lock (VALENT_OBJECT (self));
+     380                 :           0 :       g_value_set_object (value, self->icon);
+     381                 :           0 :       valent_object_unlock (VALENT_OBJECT (self));
+     382                 :           0 :       break;
+     383                 :             : 
+     384                 :             :     case PROP_PACKET:
+     385                 :           0 :       valent_object_lock (VALENT_OBJECT (self));
+     386                 :           0 :       g_value_set_boxed (value, self->packet);
+     387                 :           0 :       valent_object_unlock (VALENT_OBJECT (self));
+     388                 :           0 :       break;
+     389                 :             : 
+     390                 :           0 :     default:
+     391                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     392                 :             :     }
+     393                 :           0 : }
+     394                 :             : 
+     395                 :             : static void
+     396                 :          12 : valent_notification_upload_set_property (GObject      *object,
+     397                 :             :                                          guint         prop_id,
+     398                 :             :                                          const GValue *value,
+     399                 :             :                                          GParamSpec   *pspec)
+     400                 :             : {
+     401                 :          12 :   ValentNotificationUpload *self = VALENT_NOTIFICATION_UPLOAD (object);
+     402                 :             : 
+     403   [ +  +  +  - ]:          12 :   switch (prop_id)
+     404                 :             :     {
+     405                 :             :     case PROP_DEVICE:
+     406                 :           4 :       valent_object_lock (VALENT_OBJECT (self));
+     407                 :           4 :       self->device = g_value_dup_object (value);
+     408                 :           4 :       valent_object_unlock (VALENT_OBJECT (self));
+     409                 :           4 :       break;
+     410                 :             : 
+     411                 :             :     case PROP_ICON:
+     412                 :           4 :       valent_object_lock (VALENT_OBJECT (self));
+     413                 :           4 :       self->icon = g_value_dup_object (value);
+     414                 :           4 :       valent_object_unlock (VALENT_OBJECT (self));
+     415                 :           4 :       break;
+     416                 :             : 
+     417                 :             :     case PROP_PACKET:
+     418                 :           4 :       valent_object_lock (VALENT_OBJECT (self));
+     419                 :           4 :       self->packet = g_value_dup_boxed (value);
+     420                 :           4 :       valent_object_unlock (VALENT_OBJECT (self));
+     421                 :           4 :       break;
+     422                 :             : 
+     423                 :           0 :     default:
+     424                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     425                 :             :     }
+     426                 :          12 : }
+     427                 :             : 
+     428                 :             : static void
+     429                 :           1 : valent_notification_upload_class_init (ValentNotificationUploadClass *klass)
+     430                 :             : {
+     431                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     432                 :           1 :   ValentTransferClass *transfer_class = VALENT_TRANSFER_CLASS (klass);
+     433                 :             : 
+     434                 :           1 :   object_class->finalize = valent_notification_upload_finalize;
+     435                 :           1 :   object_class->get_property = valent_notification_upload_get_property;
+     436                 :           1 :   object_class->set_property = valent_notification_upload_set_property;
+     437                 :             : 
+     438                 :           1 :   transfer_class->execute = valent_notification_upload_execute;
+     439                 :             : 
+     440                 :             :   /**
+     441                 :             :    * ValentNotificationUpload:device:
+     442                 :             :    *
+     443                 :             :    * The [class@Valent.Device] this transfer is for.
+     444                 :             :    */
+     445                 :           2 :   properties [PROP_DEVICE] =
+     446                 :           1 :     g_param_spec_object ("device", NULL, NULL,
+     447                 :             :                          VALENT_TYPE_DEVICE,
+     448                 :             :                          (G_PARAM_READWRITE |
+     449                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     450                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     451                 :             :                           G_PARAM_STATIC_STRINGS));
+     452                 :             : 
+     453                 :             :   /**
+     454                 :             :    * ValentNotificationUpload:icon:
+     455                 :             :    *
+     456                 :             :    * The [iface@Gio.Icon] for the notification.
+     457                 :             :    */
+     458                 :           2 :   properties [PROP_ICON] =
+     459                 :           1 :     g_param_spec_object ("icon", NULL, NULL,
+     460                 :             :                          G_TYPE_ICON,
+     461                 :             :                          (G_PARAM_READWRITE |
+     462                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     463                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     464                 :             :                           G_PARAM_STATIC_STRINGS));
+     465                 :             : 
+     466                 :             :   /**
+     467                 :             :    * ValentNotificationUpload:packet:
+     468                 :             :    *
+     469                 :             :    * The packet to send the payload with.
+     470                 :             :    */
+     471                 :           2 :   properties [PROP_PACKET] =
+     472                 :           1 :     g_param_spec_boxed ("packet", NULL, NULL,
+     473                 :             :                         JSON_TYPE_NODE,
+     474                 :             :                         (G_PARAM_READWRITE |
+     475                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     476                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     477                 :             :                          G_PARAM_STATIC_STRINGS));
+     478                 :             : 
+     479                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     480                 :           1 : }
+     481                 :             : 
+     482                 :             : static void
+     483                 :           4 : valent_notification_upload_init (ValentNotificationUpload *self)
+     484                 :             : {
+     485                 :           4 : }
+     486                 :             : 
+     487                 :             : /**
+     488                 :             :  * valent_notification_upload_new:
+     489                 :             :  * @device: a `ValentDevice`
+     490                 :             :  * @packet: a KDE Connect packet
+     491                 :             :  * @icon: a `GIcon`
+     492                 :             :  *
+     493                 :             :  * Create a new `ValentNotificationUpload` for @packet and @icon.
+     494                 :             :  *
+     495                 :             :  * Returns: (transfer full): a `ValentNotificationUpload`
+     496                 :             :  */
+     497                 :             : ValentTransfer *
+     498                 :           4 : valent_notification_upload_new (ValentDevice *device,
+     499                 :             :                                 JsonNode     *packet,
+     500                 :             :                                 GIcon        *icon)
+     501                 :             : {
+     502         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+     503         [ -  + ]:           4 :   g_return_val_if_fail (VALENT_IS_PACKET (packet), NULL);
+     504   [ +  -  +  -  :           4 :   g_return_val_if_fail (G_IS_ICON (icon), NULL);
+             +  -  -  + ]
+     505                 :             : 
+     506                 :           4 :   return g_object_new (VALENT_TYPE_NOTIFICATION_UPLOAD,
+     507                 :             :                        "device", device,
+     508                 :             :                        "icon",   icon,
+     509                 :             :                        "packet", packet,
+     510                 :             :                        NULL);
+     511                 :             : }
+     512                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-upload.h.func-c.html b/coverage/src/plugins/notification/valent-notification-upload.h.func-c.html new file mode 100644 index 00000000000..e285046095c --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-upload.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-upload.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-upload.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_UPLOAD8
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-upload.h.func.html b/coverage/src/plugins/notification/valent-notification-upload.h.func.html new file mode 100644 index 00000000000..02c54dc941f --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-upload.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-upload.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-upload.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_NOTIFICATION_UPLOAD8
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/notification/valent-notification-upload.h.gcov.html b/coverage/src/plugins/notification/valent-notification-upload.h.gcov.html new file mode 100644 index 00000000000..72bd06e15b6 --- /dev/null +++ b/coverage/src/plugins/notification/valent-notification-upload.h.gcov.html @@ -0,0 +1,112 @@ + + + + + + + LCOV - Code Coverage - src/plugins/notification/valent-notification-upload.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/notification - valent-notification-upload.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_NOTIFICATION_UPLOAD (valent_notification_upload_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           8 : G_DECLARE_FINAL_TYPE (ValentNotificationUpload, valent_notification_upload, VALENT, NOTIFICATION_UPLOAD, ValentTransfer)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentTransfer * valent_notification_upload_new (ValentDevice *device,
+      15                 :             :                                                  JsonNode     *packet,
+      16                 :             :                                                  GIcon        *icon);
+      17                 :             : 
+      18                 :             : G_END_DECLS
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-detail-sort-b.html b/coverage/src/plugins/ping/index-detail-sort-b.html new file mode 100644 index 00000000000..40c6d2e18ec --- /dev/null +++ b/coverage/src/plugins/ping/index-detail-sort-b.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-detail-sort-f.html b/coverage/src/plugins/ping/index-detail-sort-f.html new file mode 100644 index 00000000000..432c36dc1c6 --- /dev/null +++ b/coverage/src/plugins/ping/index-detail-sort-f.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-detail-sort-l.html b/coverage/src/plugins/ping/index-detail-sort-l.html new file mode 100644 index 00000000000..dad54877feb --- /dev/null +++ b/coverage/src/plugins/ping/index-detail-sort-l.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-detail.html b/coverage/src/plugins/ping/index-detail.html new file mode 100644 index 00000000000..c9a3cacd6b2 --- /dev/null +++ b/coverage/src/plugins/ping/index-detail.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-sort-b.html b/coverage/src/plugins/ping/index-sort-b.html new file mode 100644 index 00000000000..40c6d2e18ec --- /dev/null +++ b/coverage/src/plugins/ping/index-sort-b.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-sort-f.html b/coverage/src/plugins/ping/index-sort-f.html new file mode 100644 index 00000000000..432c36dc1c6 --- /dev/null +++ b/coverage/src/plugins/ping/index-sort-f.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index-sort-l.html b/coverage/src/plugins/ping/index-sort-l.html new file mode 100644 index 00000000000..dad54877feb --- /dev/null +++ b/coverage/src/plugins/ping/index-sort-l.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/index.html b/coverage/src/plugins/ping/index.html new file mode 100644 index 00000000000..c9a3cacd6b2 --- /dev/null +++ b/coverage/src/plugins/ping/index.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pingCoverageTotalHit
Test:Code CoverageLines:100.0 %7474
Test Date:2024-03-31 18:46:36Functions:100.0 %1313
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:59.5 %4225
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
ping-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-ping-plugin.c +
100.0%
+
100.0 %707061.1 %3622100.0 %1111
valent-ping-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/ping-plugin.c.func-c.html b/coverage/src/plugins/ping/ping-plugin.c.func-c.html new file mode 100644 index 00000000000..5fd3f3f0f6a --- /dev/null +++ b/coverage/src/plugins/ping/ping-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/ping-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - ping-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_ping_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/ping-plugin.c.func.html b/coverage/src/plugins/ping/ping-plugin.c.func.html new file mode 100644 index 00000000000..69bb2c227f6 --- /dev/null +++ b/coverage/src/plugins/ping/ping-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/ping-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - ping-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_ping_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/ping-plugin.c.gcov.html b/coverage/src/plugins/ping/ping-plugin.c.gcov.html new file mode 100644 index 00000000000..118b316db08 --- /dev/null +++ b/coverage/src/plugins/ping/ping-plugin.c.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/ping-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - ping-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-ping-plugin.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           1 : valent_ping_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           1 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_PING_PLUGIN);
+      18                 :           1 : }
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/valent-ping-plugin.c.func-c.html b/coverage/src/plugins/ping/valent-ping-plugin.c.func-c.html new file mode 100644 index 00000000000..23a03fefe7c --- /dev/null +++ b/coverage/src/plugins/ping/valent-ping-plugin.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/valent-ping-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - valent-ping-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %7070
Test Date:2024-03-31 18:46:36Functions:100.0 %1111
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %3622
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ping_action2
valent_ping_plugin_handle_packet2
valent_ping_plugin_handle_ping2
valent_ping_plugin_send_ping2
valent_ping_plugin_constructed4
valent_ping_plugin_init4
valent_ping_plugin_destroy8
valent_ping_plugin_update_state13
valent_ping_plugin_get_type24
valent_ping_plugin_class_intern_init1
valent_ping_plugin_get_type_once1
valent_ping_plugin_get_type22
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/valent-ping-plugin.c.func.html b/coverage/src/plugins/ping/valent-ping-plugin.c.func.html new file mode 100644 index 00000000000..0c418e9cfff --- /dev/null +++ b/coverage/src/plugins/ping/valent-ping-plugin.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/valent-ping-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - valent-ping-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %7070
Test Date:2024-03-31 18:46:36Functions:100.0 %1111
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %3622
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ping_action2
valent_ping_plugin_constructed4
valent_ping_plugin_destroy8
valent_ping_plugin_get_type24
valent_ping_plugin_class_intern_init1
valent_ping_plugin_get_type22
valent_ping_plugin_get_type_once1
valent_ping_plugin_handle_packet2
valent_ping_plugin_handle_ping2
valent_ping_plugin_init4
valent_ping_plugin_send_ping2
valent_ping_plugin_update_state13
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/valent-ping-plugin.c.gcov.html b/coverage/src/plugins/ping/valent-ping-plugin.c.gcov.html new file mode 100644 index 00000000000..2a59223ff93 --- /dev/null +++ b/coverage/src/plugins/ping/valent-ping-plugin.c.gcov.html @@ -0,0 +1,272 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/valent-ping-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - valent-ping-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %7070
Test Date:2024-03-31 18:46:36Functions:100.0 %1111
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:61.1 %3622
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-ping-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-ping-plugin.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentPingPlugin
+      17                 :             : {
+      18                 :             :   ValentDevicePlugin  parent_instance;
+      19                 :             : };
+      20                 :             : 
+      21   [ +  +  +  - ]:          24 : G_DEFINE_FINAL_TYPE (ValentPingPlugin, valent_ping_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      22                 :             : 
+      23                 :             : 
+      24                 :             : static void
+      25                 :           2 : valent_ping_plugin_handle_ping (ValentPingPlugin *self,
+      26                 :             :                                 JsonNode         *packet)
+      27                 :             : {
+      28                 :           4 :   g_autoptr (GNotification) notification = NULL;
+      29                 :           2 :   const char *message;
+      30                 :           2 :   ValentDevice *device;
+      31                 :             : 
+      32         [ +  - ]:           2 :   g_assert (VALENT_IS_PING_PLUGIN (self));
+      33         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+      34                 :             : 
+      35                 :             :   /* Check for the optional message */
+      36         [ +  + ]:           2 :   if (!valent_packet_get_string (packet, "message", &message))
+      37                 :           1 :     message = _("Ping!");
+      38                 :             : 
+      39                 :             :   /* Show a notification */
+      40                 :           2 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+      41                 :           2 :   notification = g_notification_new (valent_device_get_name (device));
+      42                 :           2 :   g_notification_set_body (notification, message);
+      43         [ +  - ]:           2 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+      44                 :             :                                           "ping",
+      45                 :             :                                           notification);
+      46                 :           2 : }
+      47                 :             : 
+      48                 :             : static void
+      49                 :           2 : valent_ping_plugin_send_ping (ValentPingPlugin *self,
+      50                 :             :                               const char       *message)
+      51                 :             : {
+      52                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+      53         [ -  + ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+      54                 :             : 
+      55         [ +  - ]:           2 :   g_assert (VALENT_IS_PING_PLUGIN (self));
+      56                 :             : 
+      57                 :           2 :   valent_packet_init (&builder, "kdeconnect.ping");
+      58                 :             : 
+      59   [ +  +  +  - ]:           2 :   if (message != NULL && *message != '\0')
+      60                 :             :     {
+      61                 :           1 :       json_builder_set_member_name (builder, "message");
+      62                 :           1 :       json_builder_add_string_value (builder, message);
+      63                 :             :     }
+      64                 :             : 
+      65                 :           2 :   packet = valent_packet_end (&builder);
+      66                 :             : 
+      67         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      68                 :           2 : }
+      69                 :             : 
+      70                 :             : /*
+      71                 :             :  * GActions
+      72                 :             :  */
+      73                 :             : static void
+      74                 :           2 : ping_action (GSimpleAction *action,
+      75                 :             :              GVariant      *parameter,
+      76                 :             :              gpointer       user_data)
+      77                 :             : {
+      78                 :           2 :   ValentPingPlugin *self = VALENT_PING_PLUGIN (user_data);
+      79                 :           2 :   const char *message = NULL;
+      80                 :             : 
+      81         [ +  - ]:           2 :   g_assert (VALENT_IS_PING_PLUGIN (self));
+      82                 :             : 
+      83         [ +  + ]:           2 :   if (parameter != NULL)
+      84                 :           1 :     message = g_variant_get_string (parameter, NULL);
+      85                 :             : 
+      86                 :           2 :   valent_ping_plugin_send_ping (self, message);
+      87                 :           2 : }
+      88                 :             : 
+      89                 :             : static const GActionEntry actions[] = {
+      90                 :             :     {"ping",    ping_action, NULL, NULL, NULL},
+      91                 :             :     {"message", ping_action, "s",  NULL, NULL}
+      92                 :             : };
+      93                 :             : 
+      94                 :             : /*
+      95                 :             :  * ValentDevicePlugin
+      96                 :             :  */
+      97                 :             : static void
+      98                 :          13 : valent_ping_plugin_update_state (ValentDevicePlugin *plugin,
+      99                 :             :                                  ValentDeviceState   state)
+     100                 :             : {
+     101                 :          13 :   gboolean available;
+     102                 :             : 
+     103         [ +  - ]:          13 :   g_assert (VALENT_IS_PING_PLUGIN (plugin));
+     104                 :             : 
+     105                 :          13 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     106                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     107                 :             : 
+     108                 :          13 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     109                 :          13 : }
+     110                 :             : 
+     111                 :             : static void
+     112                 :           2 : valent_ping_plugin_handle_packet (ValentDevicePlugin *plugin,
+     113                 :             :                                   const char         *type,
+     114                 :             :                                   JsonNode           *packet)
+     115                 :             : {
+     116                 :           2 :   ValentPingPlugin *self = VALENT_PING_PLUGIN (plugin);
+     117                 :             : 
+     118         [ +  - ]:           2 :   g_assert (VALENT_IS_PING_PLUGIN (self));
+     119         [ -  + ]:           2 :   g_assert (type != NULL);
+     120         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     121                 :             : 
+     122         [ +  - ]:           2 :   if (g_str_equal (type, "kdeconnect.ping"))
+     123                 :           2 :     valent_ping_plugin_handle_ping (self, packet);
+     124                 :             :   else
+     125                 :           2 :     g_assert_not_reached ();
+     126                 :           2 : }
+     127                 :             : 
+     128                 :             : /*
+     129                 :             :  * ValentObject
+     130                 :             :  */
+     131                 :             : static void
+     132                 :           8 : valent_ping_plugin_destroy (ValentObject *object)
+     133                 :             : {
+     134                 :           8 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     135                 :             : 
+     136                 :           8 :   valent_device_plugin_set_menu_item (plugin, "device.ping.ping", NULL);
+     137                 :             : 
+     138                 :           8 :   VALENT_OBJECT_CLASS (valent_ping_plugin_parent_class)->destroy (object);
+     139                 :           8 : }
+     140                 :             : 
+     141                 :             : /*
+     142                 :             :  * GObject
+     143                 :             :  */
+     144                 :             : static void
+     145                 :           4 : valent_ping_plugin_constructed (GObject *object)
+     146                 :             : {
+     147                 :           4 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     148                 :             : 
+     149                 :           4 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     150                 :             :                                    actions,
+     151                 :             :                                    G_N_ELEMENTS (actions),
+     152                 :             :                                    plugin);
+     153                 :           4 :   valent_device_plugin_set_menu_action (plugin,
+     154                 :             :                                         "device.ping.ping",
+     155                 :           4 :                                         _("Ping"),
+     156                 :             :                                         "dialog-information-symbolic");
+     157                 :             : 
+     158                 :           4 :   G_OBJECT_CLASS (valent_ping_plugin_parent_class)->constructed (object);
+     159                 :           4 : }
+     160                 :             : 
+     161                 :             : static void
+     162                 :           1 : valent_ping_plugin_class_init (ValentPingPluginClass *klass)
+     163                 :             : {
+     164                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     165                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     166                 :           1 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     167                 :             : 
+     168                 :           1 :   object_class->constructed = valent_ping_plugin_constructed;
+     169                 :             : 
+     170                 :           1 :   vobject_class->destroy = valent_ping_plugin_destroy;
+     171                 :             : 
+     172                 :           1 :   plugin_class->handle_packet = valent_ping_plugin_handle_packet;
+     173                 :           1 :   plugin_class->update_state = valent_ping_plugin_update_state;
+     174                 :             : }
+     175                 :             : 
+     176                 :             : static void
+     177                 :           4 : valent_ping_plugin_init (ValentPingPlugin *self)
+     178                 :             : {
+     179                 :           4 : }
+     180                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/valent-ping-plugin.h.func-c.html b/coverage/src/plugins/ping/valent-ping-plugin.h.func-c.html new file mode 100644 index 00000000000..ec85c8d5457 --- /dev/null +++ b/coverage/src/plugins/ping/valent-ping-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/valent-ping-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - valent-ping-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PING_PLUGIN21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/valent-ping-plugin.h.func.html b/coverage/src/plugins/ping/valent-ping-plugin.h.func.html new file mode 100644 index 00000000000..cde2f1d1beb --- /dev/null +++ b/coverage/src/plugins/ping/valent-ping-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/valent-ping-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - valent-ping-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PING_PLUGIN21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/ping/valent-ping-plugin.h.gcov.html b/coverage/src/plugins/ping/valent-ping-plugin.h.gcov.html new file mode 100644 index 00000000000..ee4f6c9a4bf --- /dev/null +++ b/coverage/src/plugins/ping/valent-ping-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/ping/valent-ping-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/ping - valent-ping-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_PING_PLUGIN (valent_ping_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          21 : G_DECLARE_FINAL_TYPE (ValentPingPlugin, valent_ping_plugin, VALENT, PING_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-detail-sort-b.html b/coverage/src/plugins/presenter/index-detail-sort-b.html new file mode 100644 index 00000000000..146adcb44b8 --- /dev/null +++ b/coverage/src/plugins/presenter/index-detail-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-detail-sort-f.html b/coverage/src/plugins/presenter/index-detail-sort-f.html new file mode 100644 index 00000000000..c9a4d50bba9 --- /dev/null +++ b/coverage/src/plugins/presenter/index-detail-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-detail-sort-l.html b/coverage/src/plugins/presenter/index-detail-sort-l.html new file mode 100644 index 00000000000..1a6064c6f23 --- /dev/null +++ b/coverage/src/plugins/presenter/index-detail-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-detail.html b/coverage/src/plugins/presenter/index-detail.html new file mode 100644 index 00000000000..8c3c32e75d9 --- /dev/null +++ b/coverage/src/plugins/presenter/index-detail.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-sort-b.html b/coverage/src/plugins/presenter/index-sort-b.html new file mode 100644 index 00000000000..146adcb44b8 --- /dev/null +++ b/coverage/src/plugins/presenter/index-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-sort-f.html b/coverage/src/plugins/presenter/index-sort-f.html new file mode 100644 index 00000000000..c9a4d50bba9 --- /dev/null +++ b/coverage/src/plugins/presenter/index-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index-sort-l.html b/coverage/src/plugins/presenter/index-sort-l.html new file mode 100644 index 00000000000..1a6064c6f23 --- /dev/null +++ b/coverage/src/plugins/presenter/index-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/index.html b/coverage/src/plugins/presenter/index.html new file mode 100644 index 00000000000..8c3c32e75d9 --- /dev/null +++ b/coverage/src/plugins/presenter/index.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenterCoverageTotalHit
Test:Code CoverageLines:73.4 %192141
Test Date:2024-03-31 18:46:36Functions:85.7 %2824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:37.0 %10840
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
presenter-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-presenter-plugin.c +
88.0%88.0%
+
88.0 %1089548.5 %663292.9 %1413
valent-presenter-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-presenter-remote.c +
53.2%53.2%
+
53.2 %794216.7 %30581.8 %119
valent-presenter-remote.h +
0.0%
+
0.0 %10.0 %60.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/presenter-plugin.c.func-c.html b/coverage/src/plugins/presenter/presenter-plugin.c.func-c.html new file mode 100644 index 00000000000..392109f3798 --- /dev/null +++ b/coverage/src/plugins/presenter/presenter-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/presenter-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - presenter-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_presenter_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/presenter-plugin.c.func.html b/coverage/src/plugins/presenter/presenter-plugin.c.func.html new file mode 100644 index 00000000000..19da86aade9 --- /dev/null +++ b/coverage/src/plugins/presenter/presenter-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/presenter-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - presenter-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_presenter_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/presenter-plugin.c.gcov.html b/coverage/src/plugins/presenter/presenter-plugin.c.gcov.html new file mode 100644 index 00000000000..bca69714a39 --- /dev/null +++ b/coverage/src/plugins/presenter/presenter-plugin.c.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/presenter-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - presenter-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-presenter-plugin.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           2 : valent_presenter_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           2 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_PRESENTER_PLUGIN);
+      18                 :           2 : }
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-plugin.c.func-c.html b/coverage/src/plugins/presenter/valent-presenter-plugin.c.func-c.html new file mode 100644 index 00000000000..6dc284c2cfc --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-plugin.c.func-c.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.0 %10895
Test Date:2024-03-31 18:46:36Functions:92.9 %1413
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:48.5 %6632
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
presenter_remote_action0
valent_presenter_plugin_send_motion1
valent_presenter_plugin_send_stop1
presenter_pointer_action2
valent_presenter_plugin_handle_packet2
valent_presenter_plugin_handle_presenter2
valent_presenter_plugin_constructed5
valent_presenter_plugin_init5
valent_presenter_plugin_destroy8
valent_presenter_plugin_toggle_actions15
valent_presenter_plugin_update_state15
valent_presenter_plugin_get_type44
valent_presenter_plugin_class_intern_init2
valent_presenter_plugin_get_type_once2
valent_presenter_plugin_get_type40
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-plugin.c.func.html b/coverage/src/plugins/presenter/valent-presenter-plugin.c.func.html new file mode 100644 index 00000000000..f6354f68849 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-plugin.c.func.html @@ -0,0 +1,196 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.0 %10895
Test Date:2024-03-31 18:46:36Functions:92.9 %1413
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:48.5 %6632
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
presenter_pointer_action2
presenter_remote_action0
valent_presenter_plugin_constructed5
valent_presenter_plugin_destroy8
valent_presenter_plugin_get_type44
valent_presenter_plugin_class_intern_init2
valent_presenter_plugin_get_type40
valent_presenter_plugin_get_type_once2
valent_presenter_plugin_handle_packet2
valent_presenter_plugin_handle_presenter2
valent_presenter_plugin_init5
valent_presenter_plugin_send_motion1
valent_presenter_plugin_send_stop1
valent_presenter_plugin_toggle_actions15
valent_presenter_plugin_update_state15
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-plugin.c.gcov.html b/coverage/src/plugins/presenter/valent-presenter-plugin.c.gcov.html new file mode 100644 index 00000000000..def27aa1841 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-plugin.c.gcov.html @@ -0,0 +1,351 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:88.0 %10895
Test Date:2024-03-31 18:46:36Functions:92.9 %1413
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:48.5 %6632
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-presenter-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <json-glib/json-glib.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-presenter-plugin.h"
+      15                 :             : #include "valent-presenter-remote.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : struct _ValentPresenterPlugin
+      19                 :             : {
+      20                 :             :   ValentDevicePlugin  parent_instance;
+      21                 :             : 
+      22                 :             :   ValentInput        *input;
+      23                 :             :   GtkWindow          *remote;
+      24                 :             : };
+      25                 :             : 
+      26   [ +  +  +  - ]:          44 : G_DEFINE_FINAL_TYPE (ValentPresenterPlugin, valent_presenter_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      27                 :             : 
+      28                 :             : 
+      29                 :             : static void
+      30                 :           2 : valent_presenter_plugin_handle_presenter (ValentPresenterPlugin *self,
+      31                 :             :                                           JsonNode              *packet)
+      32                 :             : {
+      33                 :           2 :   double dx, dy;
+      34                 :           2 :   gboolean stop;
+      35                 :             : 
+      36         [ +  - ]:           2 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+      37         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+      38                 :             : 
+      39                 :             :   /* NOTE: these are gyroscope motion deltas, but they're translated to pointer
+      40                 :             :    *       deltas due to lack of a virtual "laser pointer". */
+      41   [ +  -  +  - ]:           4 :   if (valent_packet_get_double (packet, "dx", &dx) &&
+      42                 :           2 :       valent_packet_get_double (packet, "dy", &dy))
+      43                 :             :     {
+      44                 :           2 :       valent_input_pointer_motion (self->input, dx * 1000, dy * 1000);
+      45                 :           4 :       return;
+      46                 :             :     }
+      47                 :             : 
+      48                 :             :   /* NOTE: this signifies that no more gyroscope deltas are incoming, so the
+      49                 :             :    *       "laser pointer" can be turned off. */
+      50         [ #  # ]:           0 :   if (valent_packet_get_boolean (packet, "stop", &stop))
+      51                 :             :     {
+      52                 :             :       VALENT_NOTE ("The \"stop\" field is not supported");
+      53                 :             :       return;
+      54                 :             :     }
+      55                 :             : }
+      56                 :             : 
+      57                 :             : static void
+      58                 :           1 : valent_presenter_plugin_send_motion (ValentPresenterPlugin *self,
+      59                 :             :                                      double                 dx,
+      60                 :             :                                      double                 dy)
+      61                 :             : {
+      62                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+      63         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+      64                 :             : 
+      65         [ +  - ]:           1 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+      66                 :             : 
+      67                 :           1 :   valent_packet_init (&builder, "kdeconnect.presenter");
+      68                 :           1 :   json_builder_set_member_name (builder, "dx");
+      69                 :           1 :   json_builder_add_double_value (builder, dx);
+      70                 :           1 :   json_builder_set_member_name (builder, "dy");
+      71                 :           1 :   json_builder_add_double_value (builder, dy);
+      72                 :           1 :   packet = valent_packet_end (&builder);
+      73                 :             : 
+      74         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      75                 :           1 : }
+      76                 :             : 
+      77                 :             : static void
+      78                 :           1 : valent_presenter_plugin_send_stop (ValentPresenterPlugin *self)
+      79                 :             : {
+      80                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+      81         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+      82                 :             : 
+      83         [ +  - ]:           1 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+      84                 :             : 
+      85                 :           1 :   valent_packet_init (&builder, "kdeconnect.presenter");
+      86                 :           1 :   json_builder_set_member_name (builder, "stop");
+      87                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+      88                 :           1 :   packet = valent_packet_end (&builder);
+      89                 :             : 
+      90         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+      91                 :           1 : }
+      92                 :             : 
+      93                 :             : /*
+      94                 :             :  * GActions
+      95                 :             :  */
+      96                 :             : static void
+      97                 :          15 : valent_presenter_plugin_toggle_actions (ValentPresenterPlugin *self,
+      98                 :             :                                         gboolean               available)
+      99                 :             : {
+     100                 :          15 :   GAction *action;
+     101                 :             : 
+     102         [ +  - ]:          15 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+     103                 :             : 
+     104                 :          15 :   action = g_action_map_lookup_action (G_ACTION_MAP (self), "remote");
+     105   [ +  +  +  - ]:          34 :   g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+     106                 :           4 :                                available && gtk_is_initialized ());
+     107                 :             : 
+     108                 :          15 :   action = g_action_map_lookup_action (G_ACTION_MAP (self), "pointer");
+     109                 :          15 :   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), available);
+     110                 :          15 : }
+     111                 :             : 
+     112                 :             : static void
+     113                 :           0 : presenter_remote_action (GSimpleAction *action,
+     114                 :             :                          GVariant      *parameter,
+     115                 :             :                          gpointer       user_data)
+     116                 :             : {
+     117                 :           0 :   ValentPresenterPlugin *self = VALENT_PRESENTER_PLUGIN (user_data);
+     118                 :             : 
+     119         [ #  # ]:           0 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+     120         [ #  # ]:           0 :   g_assert (gtk_is_initialized ());
+     121                 :             : 
+     122         [ #  # ]:           0 :   if (self->remote == NULL)
+     123                 :             :     {
+     124                 :           0 :       ValentDevice *device;
+     125                 :             : 
+     126                 :           0 :       device = valent_extension_get_object (VALENT_EXTENSION (self));
+     127                 :           0 :       self->remote = g_object_new (VALENT_TYPE_PRESENTER_REMOTE,
+     128                 :             :                                    "device", device,
+     129                 :             :                                    NULL);
+     130                 :           0 :       g_object_add_weak_pointer (G_OBJECT (self->remote),
+     131                 :           0 :                                  (gpointer) &self->remote);
+     132                 :             :     }
+     133                 :             : 
+     134                 :           0 :   gtk_window_present (self->remote);
+     135                 :           0 : }
+     136                 :             : 
+     137                 :             : static void
+     138                 :           2 : presenter_pointer_action (GSimpleAction *action,
+     139                 :             :                           GVariant      *parameter,
+     140                 :             :                           gpointer       user_data)
+     141                 :             : {
+     142                 :           2 :   ValentPresenterPlugin *self = VALENT_PRESENTER_PLUGIN (user_data);
+     143                 :           2 :   double dx = 0.0;
+     144                 :           2 :   double dy = 0.0;
+     145                 :           2 :   unsigned int mask = 0;
+     146                 :             : 
+     147         [ +  - ]:           2 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+     148                 :             : 
+     149                 :           2 :   g_variant_get (parameter, "(ddu)", &dx, &dy, &mask);
+     150                 :             : 
+     151   [ +  +  -  +  :           2 :   if (!G_APPROX_VALUE (dx, 0.0, 0.01) || !G_APPROX_VALUE (dy, 0.0, 0.01))
+          +  -  -  +  -  
+                -  -  + ]
+     152                 :           1 :     valent_presenter_plugin_send_motion (self, dx, dy);
+     153                 :             : 
+     154         [ +  + ]:           2 :   if (mask != 0)
+     155                 :           1 :     valent_presenter_plugin_send_stop (self);
+     156                 :           2 : }
+     157                 :             : 
+     158                 :             : static const GActionEntry actions[] = {
+     159                 :             :     {"remote",  presenter_remote_action,  NULL,    NULL, NULL},
+     160                 :             :     {"pointer", presenter_pointer_action, "(ddu)", NULL, NULL}
+     161                 :             : };
+     162                 :             : 
+     163                 :             : /*
+     164                 :             :  * ValentDevicePlugin
+     165                 :             :  */
+     166                 :             : static void
+     167                 :          15 : valent_presenter_plugin_update_state (ValentDevicePlugin *plugin,
+     168                 :             :                                       ValentDeviceState   state)
+     169                 :             : {
+     170                 :          15 :   ValentPresenterPlugin *self = VALENT_PRESENTER_PLUGIN (plugin);
+     171                 :             : 
+     172                 :          15 :   gboolean available;
+     173                 :             : 
+     174         [ +  - ]:          15 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+     175                 :             : 
+     176                 :          15 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     177                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     178                 :             : 
+     179                 :          15 :   valent_presenter_plugin_toggle_actions (self, available);
+     180                 :          15 : }
+     181                 :             : 
+     182                 :             : static void
+     183                 :           2 : valent_presenter_plugin_handle_packet (ValentDevicePlugin *plugin,
+     184                 :             :                                        const char         *type,
+     185                 :             :                                        JsonNode           *packet)
+     186                 :             : {
+     187                 :           2 :   ValentPresenterPlugin *self = VALENT_PRESENTER_PLUGIN (plugin);
+     188                 :             : 
+     189         [ +  - ]:           2 :   g_assert (VALENT_IS_PRESENTER_PLUGIN (self));
+     190         [ -  + ]:           2 :   g_assert (type != NULL);
+     191         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     192                 :             : 
+     193         [ +  - ]:           2 :   if (g_str_equal (type, "kdeconnect.presenter"))
+     194                 :           2 :     valent_presenter_plugin_handle_presenter (self, packet);
+     195                 :             :   else
+     196                 :           2 :     g_assert_not_reached ();
+     197                 :           2 : }
+     198                 :             : 
+     199                 :             : /*
+     200                 :             :  * ValentObject
+     201                 :             :  */
+     202                 :             : static void
+     203                 :           8 : valent_presenter_plugin_destroy (ValentObject *object)
+     204                 :             : {
+     205                 :           8 :   ValentPresenterPlugin *self = VALENT_PRESENTER_PLUGIN (object);
+     206                 :           8 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     207                 :             : 
+     208                 :             :   /* Destroy the presentation remote if necessary */
+     209         [ -  + ]:           8 :   g_clear_pointer (&self->remote, gtk_window_destroy);
+     210                 :             : 
+     211                 :           8 :   valent_device_plugin_set_menu_item (plugin, "device.presenter.remote", NULL);
+     212                 :             : 
+     213                 :           8 :   VALENT_OBJECT_CLASS (valent_presenter_plugin_parent_class)->destroy (object);
+     214                 :           8 : }
+     215                 :             : 
+     216                 :             : /*
+     217                 :             :  * GObject
+     218                 :             :  */
+     219                 :             : static void
+     220                 :           5 : valent_presenter_plugin_constructed (GObject *object)
+     221                 :             : {
+     222                 :           5 :   ValentPresenterPlugin *self = VALENT_PRESENTER_PLUGIN (object);
+     223                 :           5 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     224                 :             : 
+     225                 :           5 :   self->input = valent_input_get_default ();
+     226                 :           5 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     227                 :             :                                    actions,
+     228                 :             :                                    G_N_ELEMENTS (actions),
+     229                 :             :                                    plugin);
+     230                 :           5 :   valent_device_plugin_set_menu_action (plugin,
+     231                 :             :                                         "device.presenter.remote",
+     232                 :           5 :                                         _("Presentation Remote"),
+     233                 :             :                                         "valent-presenter-plugin");
+     234                 :             : 
+     235                 :           5 :   G_OBJECT_CLASS (valent_presenter_plugin_parent_class)->constructed (object);
+     236                 :           5 : }
+     237                 :             : 
+     238                 :             : static void
+     239                 :           2 : valent_presenter_plugin_class_init (ValentPresenterPluginClass *klass)
+     240                 :             : {
+     241                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     242                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     243                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     244                 :             : 
+     245                 :           2 :   object_class->constructed = valent_presenter_plugin_constructed;
+     246                 :             : 
+     247                 :           2 :   vobject_class->destroy = valent_presenter_plugin_destroy;
+     248                 :             : 
+     249                 :           2 :   plugin_class->handle_packet = valent_presenter_plugin_handle_packet;
+     250                 :           2 :   plugin_class->update_state = valent_presenter_plugin_update_state;
+     251                 :             : }
+     252                 :             : 
+     253                 :             : static void
+     254                 :           5 : valent_presenter_plugin_init (ValentPresenterPlugin *self)
+     255                 :             : {
+     256                 :           5 : }
+     257                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-plugin.h.func-c.html b/coverage/src/plugins/presenter/valent-presenter-plugin.h.func-c.html new file mode 100644 index 00000000000..f6bc04c4988 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PRESENTER_PLUGIN38
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-plugin.h.func.html b/coverage/src/plugins/presenter/valent-presenter-plugin.h.func.html new file mode 100644 index 00000000000..5e42f3c2e63 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PRESENTER_PLUGIN38
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-plugin.h.gcov.html b/coverage/src/plugins/presenter/valent-presenter-plugin.h.gcov.html new file mode 100644 index 00000000000..215eedaaaf3 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_PRESENTER_PLUGIN (valent_presenter_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          38 : G_DECLARE_FINAL_TYPE (ValentPresenterPlugin, valent_presenter_plugin, VALENT, PRESENTER_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-remote.c.func-c.html b/coverage/src/plugins/presenter/valent-presenter-remote.c.func-c.html new file mode 100644 index 00000000000..fe844f99149 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-remote.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-remote.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:53.2 %7942
Test Date:2024-03-31 18:46:36Functions:81.8 %119
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:16.7 %305
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_file_dialog_open_cb0
presenter_open_action0
valent_presenter_remote_class_init1
valent_presenter_remote_constructed1
valent_presenter_remote_dispose1
valent_presenter_remote_get_property1
valent_presenter_remote_init1
valent_presenter_remote_set_property1
valent_presenter_remote_get_type4
valent_presenter_remote_class_intern_init1
valent_presenter_remote_get_type_once1
valent_presenter_remote_get_type2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-remote.c.func.html b/coverage/src/plugins/presenter/valent-presenter-remote.c.func.html new file mode 100644 index 00000000000..81069f2dba8 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-remote.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-remote.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:53.2 %7942
Test Date:2024-03-31 18:46:36Functions:81.8 %119
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:16.7 %305
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_file_dialog_open_cb0
presenter_open_action0
valent_presenter_remote_class_init1
valent_presenter_remote_constructed1
valent_presenter_remote_dispose1
valent_presenter_remote_get_property1
valent_presenter_remote_get_type4
valent_presenter_remote_class_intern_init1
valent_presenter_remote_get_type2
valent_presenter_remote_get_type_once1
valent_presenter_remote_init1
valent_presenter_remote_set_property1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-remote.c.gcov.html b/coverage/src/plugins/presenter/valent-presenter-remote.c.gcov.html new file mode 100644 index 00000000000..de3cd7baa9d --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-remote.c.gcov.html @@ -0,0 +1,308 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-remote.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-remote.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:53.2 %7942
Test Date:2024-03-31 18:46:36Functions:81.8 %119
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:16.7 %305
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-presenter-remote"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-presenter-remote.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentPresenterRemote
+      17                 :             : {
+      18                 :             :   AdwWindow     parent_instance;
+      19                 :             : 
+      20                 :             :   ValentDevice *device;
+      21                 :             : };
+      22                 :             : 
+      23   [ +  +  +  - ]:           4 : G_DEFINE_FINAL_TYPE (ValentPresenterRemote, valent_presenter_remote, ADW_TYPE_WINDOW)
+      24                 :             : 
+      25                 :             : enum {
+      26                 :             :   PROP_0,
+      27                 :             :   PROP_DEVICE,
+      28                 :             :   N_PROPERTIES
+      29                 :             : };
+      30                 :             : 
+      31                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * File Filter
+      35                 :             :  */
+      36                 :             : static const char *mimetypes[] = {
+      37                 :             :   "application/vnd.ms-powerpoint",
+      38                 :             :   "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
+      39                 :             :   "application/vnd.ms-powerpoint.slide.macroEnabled.12",
+      40                 :             :   "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
+      41                 :             :   "application/vnd.oasis.opendocument.presentation",
+      42                 :             :   "application/vnd.oasis.opendocument.presentation-flat-xml",
+      43                 :             :   "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+      44                 :             :   "application/vnd.openxmlformats-officedocument.presentationml.slide",
+      45                 :             :   "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
+      46                 :             :   NULL
+      47                 :             : };
+      48                 :             : 
+      49                 :             : /*
+      50                 :             :  * GtkWidget
+      51                 :             :  */
+      52                 :             : static void
+      53                 :           0 : gtk_file_dialog_open_cb (GtkFileDialog         *dialog,
+      54                 :             :                          GAsyncResult          *result,
+      55                 :             :                          ValentPresenterRemote *self)
+      56                 :             : {
+      57                 :           0 :   g_autoptr (GFile) file = NULL;
+      58                 :           0 :   g_autoptr (GError) error = NULL;
+      59                 :           0 :   char *uri = NULL;
+      60                 :             : 
+      61         [ #  # ]:           0 :   if ((file = gtk_file_dialog_open_finish (dialog, result, &error)) == NULL)
+      62                 :             :     {
+      63   [ #  #  #  # ]:           0 :       if (!g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED) &&
+      64                 :           0 :           !g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_DISMISSED))
+      65                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+      66                 :             : 
+      67         [ #  # ]:           0 :       return;
+      68                 :             :     }
+      69                 :             : 
+      70                 :           0 :   uri = g_file_get_uri (file);
+      71         [ #  # ]:           0 :   g_action_group_activate_action (G_ACTION_GROUP (self->device),
+      72                 :             :                                   "share.open",
+      73                 :             :                                   g_variant_new_take_string (uri));
+      74                 :             : }
+      75                 :             : 
+      76                 :             : static void
+      77                 :           0 : presenter_open_action (GtkWidget  *widget,
+      78                 :             :                        const char *action_name,
+      79                 :             :                        GVariant   *parameter)
+      80                 :             : {
+      81                 :           0 :   ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (widget);
+      82                 :           0 :   g_autoptr (GtkFileDialog) dialog = NULL;
+      83         [ #  # ]:           0 :   g_autoptr (GListStore) filters = NULL;
+      84         [ #  # ]:           0 :   g_autoptr (GtkFileFilter) presentations_filter = NULL;
+      85         [ #  # ]:           0 :   g_autoptr (GtkFileFilter) all_filter = NULL;
+      86                 :             : 
+      87         [ #  # ]:           0 :   g_assert (VALENT_IS_PRESENTER_REMOTE (self));
+      88                 :             : 
+      89                 :             :   /* Select single files */
+      90                 :           0 :   dialog = g_object_new (GTK_TYPE_FILE_DIALOG,
+      91                 :             :                          "title",        _("Select Presentation"),
+      92                 :             :                          "accept-label", _("Open"),
+      93                 :             :                          "modal",        TRUE,
+      94                 :             :                          NULL);
+      95                 :             : 
+      96                 :             :   /* Filter presentation files */
+      97                 :           0 :   filters = g_list_store_new (GTK_TYPE_FILE_FILTER);
+      98                 :             : 
+      99                 :           0 :   presentations_filter = gtk_file_filter_new ();
+     100                 :           0 :   gtk_file_filter_set_name (presentations_filter, _("Presentations"));
+     101                 :             : 
+     102         [ #  # ]:           0 :   for (unsigned int i = 0; mimetypes[i] != NULL; i++)
+     103                 :           0 :     gtk_file_filter_add_mime_type (presentations_filter, mimetypes[i]);
+     104                 :             : 
+     105                 :             :   /* Allow any files */
+     106                 :           0 :   all_filter = gtk_file_filter_new ();
+     107                 :           0 :   gtk_file_filter_set_name (all_filter, _("All Files"));
+     108                 :           0 :   gtk_file_filter_add_pattern (all_filter, "*");
+     109                 :             : 
+     110                 :           0 :   filters = g_list_store_new (GTK_TYPE_FILE_FILTER);
+     111                 :           0 :   g_list_store_append (filters, all_filter);
+     112                 :           0 :   g_list_store_append (filters, presentations_filter);
+     113                 :           0 :   gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters));
+     114                 :             : 
+     115         [ #  # ]:           0 :   gtk_file_dialog_open (dialog,
+     116                 :             :                         GTK_WINDOW (self),
+     117                 :             :                         NULL,
+     118                 :             :                         (GAsyncReadyCallback)gtk_file_dialog_open_cb,
+     119                 :             :                         self);
+     120                 :           0 : }
+     121                 :             : 
+     122                 :             : /*
+     123                 :             :  * GObject
+     124                 :             :  */
+     125                 :             : static void
+     126                 :           1 : valent_presenter_remote_constructed (GObject *object)
+     127                 :             : {
+     128                 :           1 :   ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (object);
+     129                 :             : 
+     130                 :           1 :   gtk_widget_insert_action_group (GTK_WIDGET (self),
+     131                 :             :                                   "device",
+     132                 :           1 :                                   G_ACTION_GROUP (self->device));
+     133                 :             : 
+     134                 :           1 :   G_OBJECT_CLASS (valent_presenter_remote_parent_class)->constructed (object);
+     135                 :           1 : }
+     136                 :             : 
+     137                 :             : static void
+     138                 :           1 : valent_presenter_remote_dispose (GObject *object)
+     139                 :             : {
+     140                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     141                 :             : 
+     142                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_PRESENTER_REMOTE);
+     143                 :             : 
+     144                 :           1 :   G_OBJECT_CLASS (valent_presenter_remote_parent_class)->dispose (object);
+     145                 :           1 : }
+     146                 :             : 
+     147                 :             : static void
+     148                 :           1 : valent_presenter_remote_get_property (GObject    *object,
+     149                 :             :                                       guint       prop_id,
+     150                 :             :                                       GValue     *value,
+     151                 :             :                                       GParamSpec *pspec)
+     152                 :             : {
+     153                 :           1 :   ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (object);
+     154                 :             : 
+     155         [ +  - ]:           1 :   switch (prop_id)
+     156                 :             :     {
+     157                 :           1 :     case PROP_DEVICE:
+     158                 :           1 :       g_value_set_object (value, self->device);
+     159                 :           1 :       break;
+     160                 :             : 
+     161                 :           0 :     default:
+     162                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     163                 :             :     }
+     164                 :           1 : }
+     165                 :             : 
+     166                 :             : static void
+     167                 :           1 : valent_presenter_remote_set_property (GObject      *object,
+     168                 :             :                                       guint         prop_id,
+     169                 :             :                                       const GValue *value,
+     170                 :             :                                       GParamSpec   *pspec)
+     171                 :             : {
+     172                 :           1 :   ValentPresenterRemote *self = VALENT_PRESENTER_REMOTE (object);
+     173                 :             : 
+     174         [ +  - ]:           1 :   switch (prop_id)
+     175                 :             :     {
+     176                 :           1 :     case PROP_DEVICE:
+     177                 :           1 :       self->device = g_value_get_object (value);
+     178                 :           1 :       break;
+     179                 :             : 
+     180                 :           0 :     default:
+     181                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     182                 :             :     }
+     183                 :           1 : }
+     184                 :             : 
+     185                 :             : static void
+     186                 :           1 : valent_presenter_remote_class_init (ValentPresenterRemoteClass *klass)
+     187                 :             : {
+     188                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     189                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     190                 :             : 
+     191                 :           1 :   object_class->constructed = valent_presenter_remote_constructed;
+     192                 :           1 :   object_class->dispose = valent_presenter_remote_dispose;
+     193                 :           1 :   object_class->get_property = valent_presenter_remote_get_property;
+     194                 :           1 :   object_class->set_property = valent_presenter_remote_set_property;
+     195                 :             : 
+     196                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/presenter/valent-presenter-remote.ui");
+     197                 :             : 
+     198                 :           1 :   gtk_widget_class_install_action (widget_class, "remote.open", NULL, presenter_open_action);
+     199                 :             : 
+     200                 :           2 :   properties [PROP_DEVICE] =
+     201                 :           1 :     g_param_spec_object ("device", NULL, NULL,
+     202                 :             :                          VALENT_TYPE_DEVICE,
+     203                 :             :                          (G_PARAM_READWRITE |
+     204                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     205                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     206                 :             :                           G_PARAM_STATIC_STRINGS));
+     207                 :             : 
+     208                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     209                 :           1 : }
+     210                 :             : 
+     211                 :             : static void
+     212                 :           1 : valent_presenter_remote_init (ValentPresenterRemote *self)
+     213                 :             : {
+     214                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     215                 :           1 : }
+     216                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-remote.h.func-c.html b/coverage/src/plugins/presenter/valent-presenter-remote.h.func-c.html new file mode 100644 index 00000000000..588b54c6ebc --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-remote.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-remote.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PRESENTER_REMOTE0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-remote.h.func.html b/coverage/src/plugins/presenter/valent-presenter-remote.h.func.html new file mode 100644 index 00000000000..139fc04546c --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-remote.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-remote.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PRESENTER_REMOTE0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/presenter/valent-presenter-remote.h.gcov.html b/coverage/src/plugins/presenter/valent-presenter-remote.h.gcov.html new file mode 100644 index 00000000000..c77d9f0e4b0 --- /dev/null +++ b/coverage/src/plugins/presenter/valent-presenter-remote.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/presenter/valent-presenter-remote.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/presenter - valent-presenter-remote.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_PRESENTER_REMOTE (valent_presenter_remote_get_type())
+      11                 :             : 
+      12   [ #  #  #  #  :           0 : G_DECLARE_FINAL_TYPE (ValentPresenterRemote, valent_presenter_remote, VALENT, PRESENTER_REMOTE, AdwWindow)
+                   #  # ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-detail-sort-b.html b/coverage/src/plugins/pulseaudio/index-detail-sort-b.html new file mode 100644 index 00000000000..fe847c586c3 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-detail-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-detail-sort-f.html b/coverage/src/plugins/pulseaudio/index-detail-sort-f.html new file mode 100644 index 00000000000..75cc25500dc --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-detail-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-detail-sort-l.html b/coverage/src/plugins/pulseaudio/index-detail-sort-l.html new file mode 100644 index 00000000000..16976619c1b --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-detail-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-detail.html b/coverage/src/plugins/pulseaudio/index-detail.html new file mode 100644 index 00000000000..9ccd992ed78 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-detail.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-sort-b.html b/coverage/src/plugins/pulseaudio/index-sort-b.html new file mode 100644 index 00000000000..fe847c586c3 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-sort-b.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-sort-f.html b/coverage/src/plugins/pulseaudio/index-sort-f.html new file mode 100644 index 00000000000..75cc25500dc --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-sort-f.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index-sort-l.html b/coverage/src/plugins/pulseaudio/index-sort-l.html new file mode 100644 index 00000000000..16976619c1b --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index-sort-l.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/index.html b/coverage/src/plugins/pulseaudio/index.html new file mode 100644 index 00000000000..9ccd992ed78 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/index.html @@ -0,0 +1,188 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudioCoverageTotalHit
Test:Code CoverageLines:0.0 %2720
Test Date:2024-03-31 18:46:36Functions:0.0 %380
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
pulseaudio-plugin.c +
0.0%
+
0.0 %3-0.0 %1
valent-pa-mixer.c +
0.0%
+
0.0 %152-0.0 %19
valent-pa-mixer.h +
0.0%
+
0.0 %1-0.0 %1
valent-pa-stream.c +
0.0%
+
0.0 %115-0.0 %16
valent-pa-stream.h +
0.0%
+
0.0 %1-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.func-c.html b/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.func-c.html new file mode 100644 index 00000000000..29c4fdff59f --- /dev/null +++ b/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/pulseaudio-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - pulseaudio-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %30
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_pulseaudio_plugin_register_types0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.func.html b/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.func.html new file mode 100644 index 00000000000..3c95232a232 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/pulseaudio-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - pulseaudio-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %30
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_pulseaudio_plugin_register_types0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.gcov.html b/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.gcov.html new file mode 100644 index 00000000000..0b999ef51d7 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/pulseaudio-plugin.c.gcov.html @@ -0,0 +1,110 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/pulseaudio-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - pulseaudio-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %30
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-pa-mixer.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           0 : valent_pulseaudio_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           0 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_MIXER_ADAPTER,
+      17                 :             :                                               VALENT_TYPE_PA_MIXER);
+      18                 :           0 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.func-c.html b/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.func-c.html new file mode 100644 index 00000000000..4a39ca0b3db --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-mixer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-mixer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1520
Test Date:2024-03-31 18:46:36Functions:0.0 %190
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_default_sink_changed0
on_default_source_changed0
on_state_changed0
on_stream_added0
on_stream_changed0
on_stream_removed0
valent_pa_mixer_constructed0
valent_pa_mixer_destroy0
valent_pa_mixer_finalize0
valent_pa_mixer_get_default_input0
valent_pa_mixer_get_default_output0
valent_pa_mixer_get_type0
valent_pa_mixer_class_intern_init0
valent_pa_mixer_get_type0
valent_pa_mixer_get_type_once0
valent_pa_mixer_init0
valent_pa_mixer_load0
valent_pa_mixer_set_default_input0
valent_pa_mixer_set_default_output0
valent_pa_mixer_unload0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.func.html b/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.func.html new file mode 100644 index 00000000000..d4b89092e75 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-mixer.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-mixer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1520
Test Date:2024-03-31 18:46:36Functions:0.0 %190
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_default_sink_changed0
on_default_source_changed0
on_state_changed0
on_stream_added0
on_stream_changed0
on_stream_removed0
valent_pa_mixer_constructed0
valent_pa_mixer_destroy0
valent_pa_mixer_finalize0
valent_pa_mixer_get_default_input0
valent_pa_mixer_get_default_output0
valent_pa_mixer_get_type0
valent_pa_mixer_class_intern_init0
valent_pa_mixer_get_type0
valent_pa_mixer_get_type_once0
valent_pa_mixer_init0
valent_pa_mixer_load0
valent_pa_mixer_set_default_input0
valent_pa_mixer_set_default_output0
valent_pa_mixer_unload0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.gcov.html b/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.gcov.html new file mode 100644 index 00000000000..35d37e1fd4f --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-mixer.c.gcov.html @@ -0,0 +1,465 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-mixer.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-mixer.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1520
Test Date:2024-03-31 18:46:36Functions:0.0 %190
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-pa-mixer"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gvc-mixer-control.h>
+       9                 :             : #include <gvc-mixer-sink.h>
+      10                 :             : #include <gvc-mixer-source.h>
+      11                 :             : #include <gvc-mixer-stream.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-pa-mixer.h"
+      15                 :             : #include "valent-pa-stream.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : struct _ValentPaMixer
+      19                 :             : {
+      20                 :             :   ValentMixerAdapter  parent_instance;
+      21                 :             : 
+      22                 :             :   GvcMixerControl    *control;
+      23                 :             : 
+      24                 :             :   GHashTable         *streams;
+      25                 :             :   unsigned int        input;
+      26                 :             :   unsigned int        output;
+      27                 :             :   unsigned int        vol_max;
+      28                 :             : };
+      29                 :             : 
+      30                 :           0 : G_DEFINE_FINAL_TYPE (ValentPaMixer, valent_pa_mixer, VALENT_TYPE_MIXER_ADAPTER)
+      31                 :             : 
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * Gvc Callbacks
+      35                 :             :  */
+      36                 :             : static void
+      37                 :           0 : on_default_sink_changed (GvcMixerControl *control,
+      38                 :             :                          unsigned int     stream_id,
+      39                 :             :                          ValentPaMixer   *self)
+      40                 :             : {
+      41                 :           0 :   g_assert (GVC_IS_MIXER_CONTROL (control));
+      42                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+      43                 :             : 
+      44                 :           0 :   if (self->output == stream_id)
+      45                 :             :     return;
+      46                 :             : 
+      47                 :           0 :   self->output = stream_id;
+      48                 :           0 :   g_object_notify (G_OBJECT (self), "default-output");
+      49                 :             : }
+      50                 :             : 
+      51                 :             : static void
+      52                 :           0 : on_default_source_changed (GvcMixerControl *control,
+      53                 :             :                            unsigned int     stream_id,
+      54                 :             :                            ValentPaMixer   *self)
+      55                 :             : {
+      56                 :           0 :   g_assert (GVC_IS_MIXER_CONTROL (control));
+      57                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+      58                 :             : 
+      59                 :           0 :   if (self->input == stream_id)
+      60                 :             :     return;
+      61                 :             : 
+      62                 :           0 :   self->input = stream_id;
+      63                 :           0 :   g_object_notify (G_OBJECT (self), "default-input");
+      64                 :             : }
+      65                 :             : 
+      66                 :             : static void
+      67                 :           0 : on_stream_added (GvcMixerControl *control,
+      68                 :             :                  unsigned int     stream_id,
+      69                 :             :                  ValentPaMixer   *self)
+      70                 :             : {
+      71                 :           0 :   GvcMixerStream *base_stream = NULL;
+      72                 :           0 :   ValentMixerStream *stream = NULL;
+      73                 :           0 :   ValentMixerDirection direction;
+      74                 :             : 
+      75                 :           0 :   base_stream = gvc_mixer_control_lookup_stream_id (control, stream_id);
+      76                 :             : 
+      77                 :             :   /* Ignore source outputs and sink inputs */
+      78                 :           0 :   if (GVC_IS_MIXER_SINK (base_stream))
+      79                 :             :     direction = VALENT_MIXER_OUTPUT;
+      80                 :           0 :   else if (GVC_IS_MIXER_SOURCE (base_stream))
+      81                 :             :     direction = VALENT_MIXER_INPUT;
+      82                 :             :   else
+      83                 :             :     return;
+      84                 :             : 
+      85                 :           0 :   stream = g_object_new (VALENT_TYPE_PA_STREAM,
+      86                 :             :                          "base-stream", base_stream,
+      87                 :             :                          "direction",   direction,
+      88                 :             :                          "vol-max",     self->vol_max,
+      89                 :             :                          NULL);
+      90                 :             : 
+      91                 :           0 :   if (!g_hash_table_replace (self->streams, GUINT_TO_POINTER (stream_id), stream))
+      92                 :             :     {
+      93                 :           0 :       g_warning ("%s: Duplicate Stream: %s",
+      94                 :             :                  G_OBJECT_TYPE_NAME (self),
+      95                 :             :                  valent_mixer_stream_get_name (stream));
+      96                 :             :     }
+      97                 :             : 
+      98                 :           0 :   valent_mixer_adapter_stream_added (VALENT_MIXER_ADAPTER (self), stream);
+      99                 :             : }
+     100                 :             : 
+     101                 :             : static void
+     102                 :           0 : on_stream_removed (GvcMixerControl *control,
+     103                 :             :                    unsigned int     stream_id,
+     104                 :             :                    ValentPaMixer   *self)
+     105                 :             : {
+     106                 :           0 :   ValentMixerStream *stream = NULL;
+     107                 :             : 
+     108                 :           0 :   g_assert (GVC_IS_MIXER_CONTROL (control));
+     109                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+     110                 :             : 
+     111                 :           0 :   stream = g_hash_table_lookup (self->streams, GUINT_TO_POINTER (stream_id));
+     112                 :             : 
+     113                 :           0 :   if (stream == NULL)
+     114                 :             :     return;
+     115                 :             : 
+     116                 :             :   /* FIXME: If the stream being removed is the default, the change notification
+     117                 :             :    *        will come after the removal notification. As a side effect, if the
+     118                 :             :    *        kdeconnect-android activity is open it will automatically select a
+     119                 :             :    *        remaining stream and override any automatic selection the system
+     120                 :             :    *        wants to perform.
+     121                 :             :    */
+     122                 :             : 
+     123                 :           0 :   valent_mixer_adapter_stream_removed (VALENT_MIXER_ADAPTER (self), stream);
+     124                 :           0 :   g_hash_table_remove (self->streams, GUINT_TO_POINTER (stream_id));
+     125                 :             : }
+     126                 :             : 
+     127                 :             : static void
+     128                 :           0 : on_stream_changed (GvcMixerControl *control,
+     129                 :             :                    unsigned int     stream_id,
+     130                 :             :                    ValentPaMixer   *self)
+     131                 :             : {
+     132                 :           0 :   ValentMixerStream *stream = NULL;
+     133                 :             : 
+     134                 :           0 :   g_assert (GVC_IS_MIXER_CONTROL (control));
+     135                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+     136                 :             : 
+     137                 :           0 :   stream = g_hash_table_lookup (self->streams, GUINT_TO_POINTER (stream_id));
+     138                 :             : 
+     139                 :           0 :   if (stream == NULL)
+     140                 :             :     return;
+     141                 :             : 
+     142                 :           0 :   g_object_notify (G_OBJECT (stream), "level");
+     143                 :             : }
+     144                 :             : 
+     145                 :             : static void
+     146                 :           0 : valent_pa_mixer_load (ValentPaMixer *self)
+     147                 :             : {
+     148                 :           0 :   g_autoptr (GSList) sources = NULL;
+     149                 :           0 :   g_autoptr (GSList) sinks = NULL;
+     150                 :           0 :   GvcMixerStream *stream = NULL;
+     151                 :             : 
+     152                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+     153                 :             : 
+     154                 :             :   /* Get current defaults */
+     155                 :           0 :   self->vol_max = gvc_mixer_control_get_vol_max_norm (self->control);
+     156                 :             : 
+     157                 :             :   /* Query the default streams before emitting signals */
+     158                 :           0 :   if ((stream = gvc_mixer_control_get_default_sink (self->control)) != NULL)
+     159                 :           0 :     self->output = gvc_mixer_stream_get_id (stream);
+     160                 :             : 
+     161                 :           0 :   if ((stream = gvc_mixer_control_get_default_source (self->control)) != NULL)
+     162                 :           0 :     self->input = gvc_mixer_stream_get_id (stream);
+     163                 :             : 
+     164                 :             :   /* Get current streams */
+     165                 :           0 :   sinks = gvc_mixer_control_get_sinks (self->control);
+     166                 :             : 
+     167                 :           0 :   for (const GSList *iter = sinks; iter; iter = iter->next)
+     168                 :           0 :     on_stream_added (self->control, gvc_mixer_stream_get_id (iter->data), self);
+     169                 :             : 
+     170                 :           0 :   sources = gvc_mixer_control_get_sources (self->control);
+     171                 :             : 
+     172                 :           0 :   for (const GSList *iter = sources; iter; iter = iter->next)
+     173                 :           0 :     on_stream_added (self->control, gvc_mixer_stream_get_id (iter->data), self);
+     174                 :             : 
+     175                 :             :   /* Watch stream changes */
+     176                 :           0 :   g_object_connect (self->control,
+     177                 :             :                     "signal::default-sink-changed",   on_default_sink_changed,   self,
+     178                 :             :                     "signal::default-source-changed", on_default_source_changed, self,
+     179                 :             :                     "signal::stream-added",           on_stream_added,           self,
+     180                 :             :                     "signal::stream-removed",         on_stream_removed,         self,
+     181                 :             :                     "signal::stream-changed",         on_stream_changed,         self,
+     182                 :             :                     NULL);
+     183                 :           0 : }
+     184                 :             : 
+     185                 :             : static void
+     186                 :           0 : valent_pa_mixer_unload (ValentPaMixer *self)
+     187                 :             : {
+     188                 :           0 :   ValentMixerAdapter *adapter = VALENT_MIXER_ADAPTER (self);
+     189                 :           0 :   GHashTableIter iter;
+     190                 :           0 :   ValentMixerStream *stream;
+     191                 :             : 
+     192                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+     193                 :             : 
+     194                 :             :   /* Clear the current defaults */
+     195                 :           0 :   self->input = 0;
+     196                 :           0 :   g_object_notify (G_OBJECT (self), "default-input");
+     197                 :           0 :   self->output = 0;
+     198                 :           0 :   g_object_notify (G_OBJECT (self), "default-output");
+     199                 :             : 
+     200                 :           0 :   g_hash_table_iter_init (&iter, self->streams);
+     201                 :             : 
+     202                 :           0 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&stream))
+     203                 :             :     {
+     204                 :           0 :       valent_mixer_adapter_stream_removed (adapter, stream);
+     205                 :           0 :       g_hash_table_iter_remove (&iter);
+     206                 :             :     }
+     207                 :             : 
+     208                 :           0 :   g_signal_handlers_disconnect_by_func (self->control, on_default_sink_changed, self);
+     209                 :           0 :   g_signal_handlers_disconnect_by_func (self->control, on_default_source_changed, self);
+     210                 :           0 :   g_signal_handlers_disconnect_by_func (self->control, on_stream_added, self);
+     211                 :           0 :   g_signal_handlers_disconnect_by_func (self->control, on_stream_removed, self);
+     212                 :           0 :   g_signal_handlers_disconnect_by_func (self->control, on_stream_changed, self);
+     213                 :           0 : }
+     214                 :             : 
+     215                 :             : static void
+     216                 :           0 : on_state_changed (GvcMixerControl      *control,
+     217                 :             :                   GvcMixerControlState  state,
+     218                 :             :                   ValentPaMixer        *self)
+     219                 :             : {
+     220                 :           0 :   g_autoptr (GError) error = NULL;
+     221                 :             : 
+     222                 :           0 :   g_assert (VALENT_IS_PA_MIXER (self));
+     223                 :             : 
+     224                 :           0 :   switch (state)
+     225                 :             :     {
+     226                 :           0 :     case GVC_STATE_CLOSED:
+     227                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     228                 :             :                                              VALENT_PLUGIN_STATE_INACTIVE,
+     229                 :             :                                              error);
+     230                 :           0 :       valent_pa_mixer_unload (self);
+     231                 :           0 :       break;
+     232                 :             : 
+     233                 :           0 :     case GVC_STATE_READY:
+     234                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     235                 :             :                                              VALENT_PLUGIN_STATE_ACTIVE,
+     236                 :             :                                              error);
+     237                 :           0 :       valent_pa_mixer_load (self);
+     238                 :           0 :       break;
+     239                 :             : 
+     240                 :           0 :     case GVC_STATE_CONNECTING:
+     241                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     242                 :             :                                              VALENT_PLUGIN_STATE_INACTIVE,
+     243                 :             :                                              error);
+     244                 :           0 :       break;
+     245                 :             : 
+     246                 :           0 :     case GVC_STATE_FAILED:
+     247                 :           0 :       g_set_error_literal (&error,
+     248                 :             :                            G_IO_ERROR,
+     249                 :             :                            G_IO_ERROR_FAILED,
+     250                 :             :                            "failed to connect to PulseAudio server");
+     251                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     252                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+     253                 :             :                                              error);
+     254                 :           0 :       valent_pa_mixer_unload (self);
+     255                 :           0 :       break;
+     256                 :             :     }
+     257                 :           0 : }
+     258                 :             : 
+     259                 :             : /*
+     260                 :             :  * ValentMixerAdapter
+     261                 :             :  */
+     262                 :             : static ValentMixerStream *
+     263                 :           0 : valent_pa_mixer_get_default_input (ValentMixerAdapter *adapter)
+     264                 :             : {
+     265                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (adapter);
+     266                 :             : 
+     267                 :           0 :   return g_hash_table_lookup (self->streams, GUINT_TO_POINTER (self->input));
+     268                 :             : }
+     269                 :             : 
+     270                 :             : static void
+     271                 :           0 : valent_pa_mixer_set_default_input (ValentMixerAdapter *adapter,
+     272                 :             :                                    ValentMixerStream  *stream)
+     273                 :             : {
+     274                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (adapter);
+     275                 :           0 :   GvcMixerStream *base_stream = NULL;
+     276                 :             : 
+     277                 :           0 :   g_object_get (stream, "base-stream", &base_stream, NULL);
+     278                 :           0 :   gvc_mixer_control_set_default_source (self->control, base_stream);
+     279                 :           0 :   g_clear_object (&base_stream);
+     280                 :           0 : }
+     281                 :             : 
+     282                 :             : static ValentMixerStream *
+     283                 :           0 : valent_pa_mixer_get_default_output (ValentMixerAdapter *adapter)
+     284                 :             : {
+     285                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (adapter);
+     286                 :             : 
+     287                 :           0 :   return g_hash_table_lookup (self->streams, GUINT_TO_POINTER (self->output));
+     288                 :             : }
+     289                 :             : 
+     290                 :             : static void
+     291                 :           0 : valent_pa_mixer_set_default_output (ValentMixerAdapter *adapter,
+     292                 :             :                                     ValentMixerStream  *stream)
+     293                 :             : {
+     294                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (adapter);
+     295                 :           0 :   GvcMixerStream *base_stream = NULL;
+     296                 :             : 
+     297                 :           0 :   g_object_get (stream, "base-stream", &base_stream, NULL);
+     298                 :           0 :   gvc_mixer_control_set_default_sink (self->control, base_stream);
+     299                 :           0 :   g_clear_object (&base_stream);
+     300                 :           0 : }
+     301                 :             : 
+     302                 :             : /*
+     303                 :             :  * ValentObject
+     304                 :             :  */
+     305                 :             : static void
+     306                 :           0 : valent_pa_mixer_destroy (ValentObject *object)
+     307                 :             : {
+     308                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (object);
+     309                 :             : 
+     310                 :           0 :   g_signal_handlers_disconnect_by_data (self->control, self);
+     311                 :           0 :   gvc_mixer_control_close (self->control);
+     312                 :           0 :   g_hash_table_remove_all (self->streams);
+     313                 :             : 
+     314                 :           0 :   VALENT_OBJECT_CLASS (valent_pa_mixer_parent_class)->destroy (object);
+     315                 :           0 : }
+     316                 :             : 
+     317                 :             : /*
+     318                 :             :  * GObject
+     319                 :             :  */
+     320                 :             : static void
+     321                 :           0 : valent_pa_mixer_constructed (GObject *object)
+     322                 :             : {
+     323                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (object);
+     324                 :             : 
+     325                 :           0 :   self->vol_max = gvc_mixer_control_get_vol_max_norm (self->control);
+     326                 :             : 
+     327                 :           0 :   g_signal_connect_object (self->control,
+     328                 :             :                            "state-changed",
+     329                 :             :                            G_CALLBACK (on_state_changed),
+     330                 :             :                            self, 0);
+     331                 :           0 :   gvc_mixer_control_open (self->control);
+     332                 :             : 
+     333                 :           0 :   G_OBJECT_CLASS (valent_pa_mixer_parent_class)->constructed (object);
+     334                 :           0 : }
+     335                 :             : 
+     336                 :             : static void
+     337                 :           0 : valent_pa_mixer_finalize (GObject *object)
+     338                 :             : {
+     339                 :           0 :   ValentPaMixer *self = VALENT_PA_MIXER (object);
+     340                 :             : 
+     341                 :           0 :   g_clear_pointer (&self->streams, g_hash_table_unref);
+     342                 :           0 :   g_clear_object (&self->control);
+     343                 :             : 
+     344                 :           0 :   G_OBJECT_CLASS (valent_pa_mixer_parent_class)->finalize (object);
+     345                 :           0 : }
+     346                 :             : 
+     347                 :             : static void
+     348                 :           0 : valent_pa_mixer_class_init (ValentPaMixerClass *klass)
+     349                 :             : {
+     350                 :           0 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     351                 :           0 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     352                 :           0 :   ValentMixerAdapterClass *adapter_class = VALENT_MIXER_ADAPTER_CLASS (klass);
+     353                 :             : 
+     354                 :           0 :   object_class->constructed = valent_pa_mixer_constructed;
+     355                 :           0 :   object_class->finalize = valent_pa_mixer_finalize;
+     356                 :             : 
+     357                 :           0 :   vobject_class->destroy = valent_pa_mixer_destroy;
+     358                 :             : 
+     359                 :           0 :   adapter_class->get_default_input = valent_pa_mixer_get_default_input;
+     360                 :           0 :   adapter_class->set_default_input = valent_pa_mixer_set_default_input;
+     361                 :           0 :   adapter_class->get_default_output = valent_pa_mixer_get_default_output;
+     362                 :           0 :   adapter_class->set_default_output = valent_pa_mixer_set_default_output;
+     363                 :             : }
+     364                 :             : 
+     365                 :             : static void
+     366                 :           0 : valent_pa_mixer_init (ValentPaMixer *self)
+     367                 :             : {
+     368                 :           0 :   self->control = g_object_new (GVC_TYPE_MIXER_CONTROL,
+     369                 :             :                                 "name", "Valent",
+     370                 :             :                                 NULL);
+     371                 :           0 :   self->streams = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
+     372                 :           0 : }
+     373                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.func-c.html b/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.func-c.html new file mode 100644 index 00000000000..d4d1e08d0e3 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-mixer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-mixer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PA_MIXER0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.func.html b/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.func.html new file mode 100644 index 00000000000..f08942f17fd --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-mixer.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-mixer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PA_MIXER0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.gcov.html b/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.gcov.html new file mode 100644 index 00000000000..fe377470428 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-mixer.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-mixer.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-mixer.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_PA_MIXER (valent_pa_mixer_get_type ())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentPaMixer, valent_pa_mixer, VALENT, PA_MIXER, ValentMixerAdapter)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-stream.c.func-c.html b/coverage/src/plugins/pulseaudio/valent-pa-stream.c.func-c.html new file mode 100644 index 00000000000..bb154f9fd56 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-stream.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-stream.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-stream.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1150
Test Date:2024-03-31 18:46:36Functions:0.0 %160
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_port_changed0
valent_pa_stream_class_init0
valent_pa_stream_constructed0
valent_pa_stream_finalize0
valent_pa_stream_get_description0
valent_pa_stream_get_level0
valent_pa_stream_get_muted0
valent_pa_stream_get_name0
valent_pa_stream_get_property0
valent_pa_stream_get_type0
valent_pa_stream_class_intern_init0
valent_pa_stream_get_type0
valent_pa_stream_get_type_once0
valent_pa_stream_init0
valent_pa_stream_set_level0
valent_pa_stream_set_muted0
valent_pa_stream_set_property0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-stream.c.func.html b/coverage/src/plugins/pulseaudio/valent-pa-stream.c.func.html new file mode 100644 index 00000000000..fe7075b5d5d --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-stream.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-stream.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-stream.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1150
Test Date:2024-03-31 18:46:36Functions:0.0 %160
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_port_changed0
valent_pa_stream_class_init0
valent_pa_stream_constructed0
valent_pa_stream_finalize0
valent_pa_stream_get_description0
valent_pa_stream_get_level0
valent_pa_stream_get_muted0
valent_pa_stream_get_name0
valent_pa_stream_get_property0
valent_pa_stream_get_type0
valent_pa_stream_class_intern_init0
valent_pa_stream_get_type0
valent_pa_stream_get_type_once0
valent_pa_stream_init0
valent_pa_stream_set_level0
valent_pa_stream_set_muted0
valent_pa_stream_set_property0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-stream.c.gcov.html b/coverage/src/plugins/pulseaudio/valent-pa-stream.c.gcov.html new file mode 100644 index 00000000000..bc5c68e4b77 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-stream.c.gcov.html @@ -0,0 +1,369 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-stream.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-stream.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1150
Test Date:2024-03-31 18:46:36Functions:0.0 %160
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-pa-stream"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <math.h>
+       9                 :             : 
+      10                 :             : #include <gvc-mixer-stream.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-pa-stream.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentPaStream
+      17                 :             : {
+      18                 :             :   ValentMixerStream  parent_instance;
+      19                 :             : 
+      20                 :             :   GvcMixerStream    *stream;
+      21                 :             :   char              *description;
+      22                 :             :   unsigned int       vol_max;
+      23                 :             : };
+      24                 :             : 
+      25                 :           0 : G_DEFINE_FINAL_TYPE (ValentPaStream, valent_pa_stream, VALENT_TYPE_MIXER_STREAM)
+      26                 :             : 
+      27                 :             : enum {
+      28                 :             :   PROP_0,
+      29                 :             :   PROP_BASE_STREAM,
+      30                 :             :   PROP_VOL_MAX,
+      31                 :             :   N_PROPERTIES
+      32                 :             : };
+      33                 :             : 
+      34                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      35                 :             : 
+      36                 :             : 
+      37                 :             : static void
+      38                 :           0 : on_port_changed (GvcMixerStream *stream,
+      39                 :             :                  GParamSpec     *pspec,
+      40                 :             :                  ValentPaStream *self)
+      41                 :             : {
+      42                 :           0 :   const GvcMixerStreamPort *port;
+      43                 :             : 
+      44                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+      45                 :             : 
+      46                 :           0 :   g_clear_pointer (&self->description, g_free);
+      47                 :             : 
+      48                 :           0 :   if ((port = gvc_mixer_stream_get_port (self->stream)) != NULL)
+      49                 :             :     {
+      50                 :           0 :       const char *description;
+      51                 :             : 
+      52                 :           0 :       description = gvc_mixer_stream_get_description (self->stream);
+      53                 :           0 :       self->description = g_strdup_printf ("%s (%s)",
+      54                 :           0 :                                            port->human_port,
+      55                 :             :                                            description);
+      56                 :             :     }
+      57                 :             : 
+      58                 :           0 :   g_object_notify (G_OBJECT (self), "description");
+      59                 :           0 : }
+      60                 :             : 
+      61                 :             : /*
+      62                 :             :  * ValentMixerStream
+      63                 :             :  */
+      64                 :             : static const char *
+      65                 :           0 : valent_pa_stream_get_description (ValentMixerStream *stream)
+      66                 :             : {
+      67                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (stream);
+      68                 :             : 
+      69                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+      70                 :             : 
+      71                 :           0 :   if (self->description == NULL)
+      72                 :           0 :     return gvc_mixer_stream_get_description (self->stream);
+      73                 :             : 
+      74                 :             :   return self->description;
+      75                 :             : }
+      76                 :             : 
+      77                 :             : static unsigned int
+      78                 :           0 : valent_pa_stream_get_level (ValentMixerStream *stream)
+      79                 :             : {
+      80                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (stream);
+      81                 :           0 :   unsigned int volume;
+      82                 :           0 :   double percent;
+      83                 :           0 :   unsigned int level;
+      84                 :             : 
+      85                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+      86                 :           0 :   g_assert (GVC_IS_MIXER_STREAM (self->stream));
+      87                 :             : 
+      88                 :           0 :   volume = gvc_mixer_stream_get_volume (self->stream);
+      89                 :           0 :   percent = (double)volume / (double)self->vol_max;
+      90                 :           0 :   level = floor (percent * 100);
+      91                 :             : 
+      92                 :           0 :   return (unsigned int)level;
+      93                 :             : }
+      94                 :             : 
+      95                 :             : static void
+      96                 :           0 : valent_pa_stream_set_level (ValentMixerStream *stream,
+      97                 :             :                             unsigned int       level)
+      98                 :             : {
+      99                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (stream);
+     100                 :           0 :   double percent;
+     101                 :           0 :   unsigned int volume;
+     102                 :             : 
+     103                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+     104                 :           0 :   g_assert (GVC_IS_MIXER_STREAM (self->stream));
+     105                 :             : 
+     106                 :           0 :   percent = (double)level / (double)100;
+     107                 :           0 :   volume = floor (percent * (double)self->vol_max);
+     108                 :             : 
+     109                 :           0 :   gvc_mixer_stream_set_volume (self->stream, (uint32_t)volume);
+     110                 :           0 :   gvc_mixer_stream_push_volume (self->stream);
+     111                 :           0 :   g_object_notify (G_OBJECT (stream), "level");
+     112                 :           0 : }
+     113                 :             : 
+     114                 :             : static gboolean
+     115                 :           0 : valent_pa_stream_get_muted (ValentMixerStream *stream)
+     116                 :             : {
+     117                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (stream);
+     118                 :             : 
+     119                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+     120                 :           0 :   g_assert (GVC_IS_MIXER_STREAM (self->stream));
+     121                 :             : 
+     122                 :           0 :   return gvc_mixer_stream_get_is_muted (self->stream);
+     123                 :             : }
+     124                 :             : 
+     125                 :             : static void
+     126                 :           0 : valent_pa_stream_set_muted (ValentMixerStream *stream,
+     127                 :             :                             gboolean           state)
+     128                 :             : {
+     129                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (stream);
+     130                 :             : 
+     131                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+     132                 :           0 :   g_assert (GVC_IS_MIXER_STREAM (self->stream));
+     133                 :             : 
+     134                 :           0 :   gvc_mixer_stream_change_is_muted (self->stream, state);
+     135                 :           0 :   g_object_notify (G_OBJECT (stream), "muted");
+     136                 :           0 : }
+     137                 :             : 
+     138                 :             : static const char *
+     139                 :           0 : valent_pa_stream_get_name (ValentMixerStream *stream)
+     140                 :             : {
+     141                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (stream);
+     142                 :             : 
+     143                 :           0 :   g_assert (VALENT_IS_PA_STREAM (self));
+     144                 :           0 :   g_assert (GVC_IS_MIXER_STREAM (self->stream));
+     145                 :             : 
+     146                 :           0 :   return gvc_mixer_stream_get_name (self->stream);
+     147                 :             : }
+     148                 :             : 
+     149                 :             : /*
+     150                 :             :  * GObject
+     151                 :             :  */
+     152                 :             : static void
+     153                 :           0 : valent_pa_stream_get_property (GObject    *object,
+     154                 :             :                                guint       prop_id,
+     155                 :             :                                GValue     *value,
+     156                 :             :                                GParamSpec *pspec)
+     157                 :             : {
+     158                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (object);
+     159                 :             : 
+     160                 :           0 :   switch (prop_id)
+     161                 :             :     {
+     162                 :           0 :     case PROP_BASE_STREAM:
+     163                 :           0 :       g_value_set_object (value, self->stream);
+     164                 :           0 :       break;
+     165                 :             : 
+     166                 :           0 :     case PROP_VOL_MAX:
+     167                 :           0 :       g_value_set_uint (value, self->vol_max);
+     168                 :           0 :       break;
+     169                 :             : 
+     170                 :           0 :     default:
+     171                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     172                 :             :     }
+     173                 :           0 : }
+     174                 :             : 
+     175                 :             : static void
+     176                 :           0 : valent_pa_stream_set_property (GObject      *object,
+     177                 :             :                                guint         prop_id,
+     178                 :             :                                const GValue *value,
+     179                 :             :                                GParamSpec   *pspec)
+     180                 :             : {
+     181                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (object);
+     182                 :             : 
+     183                 :           0 :   switch (prop_id)
+     184                 :             :     {
+     185                 :           0 :     case PROP_BASE_STREAM:
+     186                 :           0 :       self->stream = g_value_dup_object (value);
+     187                 :           0 :       break;
+     188                 :             : 
+     189                 :           0 :     case PROP_VOL_MAX:
+     190                 :           0 :       self->vol_max = g_value_get_uint (value);
+     191                 :           0 :       break;
+     192                 :             : 
+     193                 :           0 :     default:
+     194                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     195                 :             :     }
+     196                 :           0 : }
+     197                 :             : 
+     198                 :             : static void
+     199                 :           0 : valent_pa_stream_constructed (GObject *object)
+     200                 :             : {
+     201                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (object);
+     202                 :             : 
+     203                 :           0 :   g_assert (self->stream != NULL);
+     204                 :             : 
+     205                 :           0 :   g_signal_connect_object (self->stream,
+     206                 :             :                            "notify::port",
+     207                 :             :                            G_CALLBACK (on_port_changed),
+     208                 :             :                            self, 0);
+     209                 :           0 :   on_port_changed (self->stream, NULL, self);
+     210                 :             : 
+     211                 :           0 :   G_OBJECT_CLASS (valent_pa_stream_parent_class)->constructed (object);
+     212                 :           0 : }
+     213                 :             : 
+     214                 :             : static void
+     215                 :           0 : valent_pa_stream_finalize (GObject *object)
+     216                 :             : {
+     217                 :           0 :   ValentPaStream *self = VALENT_PA_STREAM (object);
+     218                 :             : 
+     219                 :           0 :   g_signal_handlers_disconnect_by_data (self->stream, self);
+     220                 :           0 :   g_clear_object (&self->stream);
+     221                 :             : 
+     222                 :           0 :   G_OBJECT_CLASS (valent_pa_stream_parent_class)->finalize (object);
+     223                 :           0 : }
+     224                 :             : 
+     225                 :             : static void
+     226                 :           0 : valent_pa_stream_class_init (ValentPaStreamClass *klass)
+     227                 :             : {
+     228                 :           0 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     229                 :           0 :   ValentMixerStreamClass *stream_class = VALENT_MIXER_STREAM_CLASS (klass);
+     230                 :             : 
+     231                 :           0 :   object_class->constructed = valent_pa_stream_constructed;
+     232                 :           0 :   object_class->finalize = valent_pa_stream_finalize;
+     233                 :           0 :   object_class->get_property = valent_pa_stream_get_property;
+     234                 :           0 :   object_class->set_property = valent_pa_stream_set_property;
+     235                 :             : 
+     236                 :           0 :   stream_class->get_name = valent_pa_stream_get_name;
+     237                 :           0 :   stream_class->get_description = valent_pa_stream_get_description;
+     238                 :           0 :   stream_class->get_level = valent_pa_stream_get_level;
+     239                 :           0 :   stream_class->set_level = valent_pa_stream_set_level;
+     240                 :           0 :   stream_class->get_muted = valent_pa_stream_get_muted;
+     241                 :           0 :   stream_class->set_muted = valent_pa_stream_set_muted;
+     242                 :             : 
+     243                 :             :   /**
+     244                 :             :    * ValentPaStream:base-stream:
+     245                 :             :    *
+     246                 :             :    * The `GvcMixerStream` this stream wraps.
+     247                 :             :    */
+     248                 :           0 :   properties [PROP_BASE_STREAM] =
+     249                 :           0 :     g_param_spec_object ("base-stream", NULL, NULL,
+     250                 :             :                          GVC_TYPE_MIXER_STREAM,
+     251                 :             :                          (G_PARAM_READWRITE |
+     252                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     253                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     254                 :             :                           G_PARAM_STATIC_STRINGS));
+     255                 :             : 
+     256                 :             :   /**
+     257                 :             :    * ValentPaStream:vol-max:
+     258                 :             :    *
+     259                 :             :    * The maximum volume.
+     260                 :             :    */
+     261                 :           0 :   properties [PROP_VOL_MAX] =
+     262                 :           0 :     g_param_spec_uint ("vol-max", NULL, NULL,
+     263                 :             :                        0, G_MAXUINT32,
+     264                 :             :                        G_MAXUINT32,
+     265                 :             :                        (G_PARAM_READWRITE |
+     266                 :             :                         G_PARAM_CONSTRUCT_ONLY |
+     267                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     268                 :             :                         G_PARAM_STATIC_STRINGS));
+     269                 :             : 
+     270                 :           0 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     271                 :           0 : }
+     272                 :             : 
+     273                 :             : static void
+     274                 :           0 : valent_pa_stream_init (ValentPaStream *self)
+     275                 :             : {
+     276                 :           0 : }
+     277                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-stream.h.func-c.html b/coverage/src/plugins/pulseaudio/valent-pa-stream.h.func-c.html new file mode 100644 index 00000000000..6e2a92fe48e --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-stream.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-stream.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-stream.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PA_STREAM0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-stream.h.func.html b/coverage/src/plugins/pulseaudio/valent-pa-stream.h.func.html new file mode 100644 index 00000000000..3ca2b543b81 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-stream.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-stream.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-stream.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_PA_STREAM0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/pulseaudio/valent-pa-stream.h.gcov.html b/coverage/src/plugins/pulseaudio/valent-pa-stream.h.gcov.html new file mode 100644 index 00000000000..d97f0602f52 --- /dev/null +++ b/coverage/src/plugins/pulseaudio/valent-pa-stream.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/pulseaudio/valent-pa-stream.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/pulseaudio - valent-pa-stream.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_PA_STREAM (valent_pa_stream_get_type ())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentPaStream, valent_pa_stream, VALENT, PA_STREAM, ValentMixerStream)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-detail-sort-b.html b/coverage/src/plugins/runcommand/index-detail-sort-b.html new file mode 100644 index 00000000000..cee68cb8e4c --- /dev/null +++ b/coverage/src/plugins/runcommand/index-detail-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-detail-sort-f.html b/coverage/src/plugins/runcommand/index-detail-sort-f.html new file mode 100644 index 00000000000..6f7e58eb197 --- /dev/null +++ b/coverage/src/plugins/runcommand/index-detail-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-detail-sort-l.html b/coverage/src/plugins/runcommand/index-detail-sort-l.html new file mode 100644 index 00000000000..5a1f7a5a016 --- /dev/null +++ b/coverage/src/plugins/runcommand/index-detail-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-detail.html b/coverage/src/plugins/runcommand/index-detail.html new file mode 100644 index 00000000000..a2fa33ee54a --- /dev/null +++ b/coverage/src/plugins/runcommand/index-detail.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-sort-b.html b/coverage/src/plugins/runcommand/index-sort-b.html new file mode 100644 index 00000000000..cee68cb8e4c --- /dev/null +++ b/coverage/src/plugins/runcommand/index-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-sort-f.html b/coverage/src/plugins/runcommand/index-sort-f.html new file mode 100644 index 00000000000..6f7e58eb197 --- /dev/null +++ b/coverage/src/plugins/runcommand/index-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index-sort-l.html b/coverage/src/plugins/runcommand/index-sort-l.html new file mode 100644 index 00000000000..5a1f7a5a016 --- /dev/null +++ b/coverage/src/plugins/runcommand/index-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/index.html b/coverage/src/plugins/runcommand/index.html new file mode 100644 index 00000000000..a2fa33ee54a --- /dev/null +++ b/coverage/src/plugins/runcommand/index.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommandCoverageTotalHit
Test:Code CoverageLines:76.8 %560430
Test Date:2024-03-31 18:46:36Functions:85.2 %6152
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:46.4 %308143
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
runcommand-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-runcommand-editor.c +
96.9%96.9%
+
96.9 %12812457.6 %6638100.0 %1818
valent-runcommand-editor.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-plugin.c +
92.5%92.5%
+
92.5 %25423550.6 %1608190.9 %2220
valent-runcommand-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-preferences.c +
39.8%39.8%
+
39.8 %1616425.9 %581562.5 %1610
valent-runcommand-preferences.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-runcommand-utils.c +
0.0%
+
0.0 %100.0 %60.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/runcommand-plugin.c.func-c.html b/coverage/src/plugins/runcommand/runcommand-plugin.c.func-c.html new file mode 100644 index 00000000000..c0e6b279ba7 --- /dev/null +++ b/coverage/src/plugins/runcommand/runcommand-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/runcommand-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - runcommand-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_runcommand_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/runcommand-plugin.c.func.html b/coverage/src/plugins/runcommand/runcommand-plugin.c.func.html new file mode 100644 index 00000000000..a47b754082b --- /dev/null +++ b/coverage/src/plugins/runcommand/runcommand-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/runcommand-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - runcommand-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_runcommand_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/runcommand-plugin.c.gcov.html b/coverage/src/plugins/runcommand/runcommand-plugin.c.gcov.html new file mode 100644 index 00000000000..2bd7b00c42b --- /dev/null +++ b/coverage/src/plugins/runcommand/runcommand-plugin.c.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/runcommand-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - runcommand-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-runcommand-plugin.h"
+      10                 :             : #include "valent-runcommand-preferences.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_runcommand_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_RUNCOMMAND_PLUGIN);
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      21                 :             :                                               VALENT_TYPE_RUNCOMMAND_PREFERENCES);
+      22                 :           2 : }
+      23                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-editor.c.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-editor.c.func-c.html new file mode 100644 index 00000000000..a5ea9aa3b83 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-editor.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-editor.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-editor.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.9 %128124
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.6 %6638
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
editor_cancel_action1
editor_remove_action1
editor_save_action1
valent_runcommand_editor_class_init1
valent_runcommand_editor_dispose1
valent_runcommand_editor_finalize1
valent_runcommand_editor_init1
valent_runcommand_editor_set_command1
valent_runcommand_editor_set_uuid1
valent_runcommand_editor_get_property2
valent_runcommand_editor_set_property2
valent_runcommand_editor_sync2
valent_runcommand_editor_get_uuid3
valent_runcommand_editor_get_command6
on_entry_changed10
valent_runcommand_editor_get_type28
valent_runcommand_editor_class_intern_init1
valent_runcommand_editor_get_type_once1
valent_runcommand_editor_get_type26
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-editor.c.func.html b/coverage/src/plugins/runcommand/valent-runcommand-editor.c.func.html new file mode 100644 index 00000000000..5562a13ebfc --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-editor.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-editor.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-editor.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.9 %128124
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.6 %6638
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
editor_cancel_action1
editor_remove_action1
editor_save_action1
on_entry_changed10
valent_runcommand_editor_class_init1
valent_runcommand_editor_dispose1
valent_runcommand_editor_finalize1
valent_runcommand_editor_get_command6
valent_runcommand_editor_get_property2
valent_runcommand_editor_get_type28
valent_runcommand_editor_class_intern_init1
valent_runcommand_editor_get_type26
valent_runcommand_editor_get_type_once1
valent_runcommand_editor_get_uuid3
valent_runcommand_editor_init1
valent_runcommand_editor_set_command1
valent_runcommand_editor_set_property2
valent_runcommand_editor_set_uuid1
valent_runcommand_editor_sync2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-editor.c.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-editor.c.gcov.html new file mode 100644 index 00000000000..b2ee62e2e21 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-editor.c.gcov.html @@ -0,0 +1,441 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-editor.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-editor.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:96.9 %128124
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.6 %6638
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-runcommand-editor"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <gio/gio.h>
+      12                 :             : #include <json-glib/json-glib.h>
+      13                 :             : #include <valent.h>
+      14                 :             : 
+      15                 :             : #include "valent-runcommand-editor.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : struct _ValentRuncommandEditor
+      19                 :             : {
+      20                 :             :   GtkWindow    parent_instance;
+      21                 :             : 
+      22                 :             :   char        *uuid;
+      23                 :             :   GVariant    *command;
+      24                 :             : 
+      25                 :             :   /* template */
+      26                 :             :   GtkWidget   *save_button;
+      27                 :             :   AdwEntryRow *argv_entry;
+      28                 :             :   AdwEntryRow *name_entry;
+      29                 :             :   GtkWidget   *remove_group;
+      30                 :             : };
+      31                 :             : 
+      32   [ +  +  +  - ]:          28 : G_DEFINE_TYPE (ValentRuncommandEditor, valent_runcommand_editor, GTK_TYPE_WINDOW)
+      33                 :             : 
+      34                 :             : enum {
+      35                 :             :   PROP_0,
+      36                 :             :   PROP_COMMAND,
+      37                 :             :   PROP_UUID,
+      38                 :             :   N_PROPERTIES
+      39                 :             : };
+      40                 :             : 
+      41                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      42                 :             : 
+      43                 :             : 
+      44                 :             : static void
+      45                 :          10 : on_entry_changed (AdwEntryRow            *entry,
+      46                 :             :                   ValentRuncommandEditor *self)
+      47                 :             : {
+      48                 :          10 :   const char *argv_text;
+      49                 :          10 :   const char *name_text;
+      50                 :             : 
+      51   [ +  +  +  - ]:          10 :   g_assert (entry == NULL || ADW_IS_ENTRY_ROW (entry));
+      52         [ -  + ]:          10 :   g_assert (VALENT_IS_RUNCOMMAND_EDITOR (self));
+      53                 :             : 
+      54                 :          10 :   argv_text = gtk_editable_get_text (GTK_EDITABLE (self->argv_entry));
+      55                 :          10 :   name_text = gtk_editable_get_text (GTK_EDITABLE (self->name_entry));
+      56                 :             : 
+      57   [ +  -  +  +  :          10 :   if (argv_text != NULL && *argv_text != '\0' &&
+                   +  - ]
+      58         [ +  + ]:           7 :       name_text != NULL && *name_text != '\0')
+      59                 :           5 :     gtk_widget_action_set_enabled (GTK_WIDGET (self), "editor.save", TRUE);
+      60                 :             :   else
+      61                 :           5 :     gtk_widget_action_set_enabled (GTK_WIDGET (self), "editor.save", FALSE);
+      62                 :          10 : }
+      63                 :             : 
+      64                 :             : static void
+      65                 :           2 : valent_runcommand_editor_sync (ValentRuncommandEditor *self)
+      66                 :             : {
+      67                 :           2 :   const char *name_text = "";
+      68                 :           2 :   const char *argv_text = "";
+      69                 :             : 
+      70         [ +  - ]:           2 :   g_assert (VALENT_IS_RUNCOMMAND_EDITOR (self));
+      71                 :             : 
+      72                 :             :   /* Parse command */
+      73         [ +  - ]:           2 :   if (self->command != NULL)
+      74                 :             :     {
+      75                 :           2 :       g_variant_lookup (self->command, "name", "&s", &name_text);
+      76                 :           2 :       g_variant_lookup (self->command, "command", "&s", &argv_text);
+      77                 :             :     }
+      78                 :             : 
+      79                 :             :   /* Update editor content */
+      80                 :           2 :   gtk_editable_set_text (GTK_EDITABLE (self->name_entry), name_text);
+      81                 :           2 :   gtk_editable_set_text (GTK_EDITABLE (self->argv_entry), argv_text);
+      82                 :           2 :   gtk_widget_set_visible (self->remove_group, self->command != NULL);
+      83                 :           2 :   on_entry_changed (NULL, self);
+      84                 :           2 : }
+      85                 :             : 
+      86                 :             : /*
+      87                 :             :  * GAction
+      88                 :             :  */
+      89                 :             : static void
+      90                 :           1 : editor_cancel_action (GtkWidget  *widget,
+      91                 :             :                       const char *action_name,
+      92                 :             :                       GVariant   *parameter)
+      93                 :             : {
+      94                 :           1 :   ValentRuncommandEditor *self = VALENT_RUNCOMMAND_EDITOR (widget);
+      95                 :             : 
+      96                 :           1 :   valent_runcommand_editor_sync (self);
+      97                 :           1 :   g_object_notify_by_pspec (G_OBJECT (widget), properties [PROP_COMMAND]);
+      98                 :           1 : }
+      99                 :             : 
+     100                 :             : static void
+     101                 :           1 : editor_remove_action (GtkWidget  *widget,
+     102                 :             :                       const char *action_name,
+     103                 :             :                       GVariant   *parameter)
+     104                 :             : {
+     105                 :           1 :   ValentRuncommandEditor *self = VALENT_RUNCOMMAND_EDITOR (widget);
+     106                 :             : 
+     107                 :           1 :   gtk_editable_set_text (GTK_EDITABLE (self->name_entry), "");
+     108                 :           1 :   gtk_editable_set_text (GTK_EDITABLE (self->argv_entry), "");
+     109                 :             : 
+     110         [ +  - ]:           1 :   g_clear_pointer (&self->command, g_variant_unref);
+     111                 :           1 :   g_object_notify_by_pspec (G_OBJECT (widget), properties [PROP_COMMAND]);
+     112                 :           1 : }
+     113                 :             : 
+     114                 :             : static void
+     115                 :           1 : editor_save_action (GtkWidget  *widget,
+     116                 :             :                     const char *action_name,
+     117                 :             :                     GVariant   *parameter)
+     118                 :             : {
+     119                 :           1 :   ValentRuncommandEditor *self = VALENT_RUNCOMMAND_EDITOR (widget);
+     120                 :           1 :   GVariant *command = NULL;
+     121                 :           1 :   const char *name_text = NULL;
+     122                 :           1 :   const char *argv_text = NULL;
+     123                 :             : 
+     124         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_EDITOR (self));
+     125                 :             : 
+     126                 :           1 :   name_text = gtk_editable_get_text (GTK_EDITABLE (self->name_entry));
+     127                 :           1 :   argv_text = gtk_editable_get_text (GTK_EDITABLE (self->argv_entry));
+     128                 :             : 
+     129   [ +  -  +  -  :           1 :   g_return_if_fail (argv_text != NULL && *argv_text != '\0' &&
+             +  -  -  + ]
+     130                 :             :                     name_text != NULL && *name_text != '\0');
+     131                 :             : 
+     132                 :           1 :   command = g_variant_new_parsed ("{"
+     133                 :             :                                     "'name': <%s>, "
+     134                 :             :                                     "'command': <%s>"
+     135                 :             :                                   "}",
+     136                 :             :                                   name_text,
+     137                 :             :                                   argv_text);
+     138                 :             : 
+     139         [ +  - ]:           1 :   g_clear_pointer (&self->command, g_variant_unref);
+     140                 :           1 :   self->command = g_variant_ref_sink (command);
+     141                 :           1 :   g_object_notify_by_pspec (G_OBJECT (widget), properties [PROP_COMMAND]);
+     142                 :             : }
+     143                 :             : 
+     144                 :             : /*
+     145                 :             :  * GObject
+     146                 :             :  */
+     147                 :             : static void
+     148                 :           1 : valent_runcommand_editor_dispose (GObject *object)
+     149                 :             : {
+     150                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     151                 :             : 
+     152                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_RUNCOMMAND_EDITOR);
+     153                 :             : 
+     154                 :           1 :   G_OBJECT_CLASS (valent_runcommand_editor_parent_class)->dispose (object);
+     155                 :           1 : }
+     156                 :             : 
+     157                 :             : static void
+     158                 :           1 : valent_runcommand_editor_finalize (GObject *object)
+     159                 :             : {
+     160                 :           1 :   ValentRuncommandEditor *self = VALENT_RUNCOMMAND_EDITOR (object);
+     161                 :             : 
+     162         [ -  + ]:           1 :   g_clear_pointer (&self->command, g_variant_unref);
+     163         [ +  - ]:           1 :   g_clear_pointer (&self->uuid, g_free);
+     164                 :             : 
+     165                 :           1 :   G_OBJECT_CLASS (valent_runcommand_editor_parent_class)->finalize (object);
+     166                 :           1 : }
+     167                 :             : 
+     168                 :             : static void
+     169                 :           2 : valent_runcommand_editor_get_property (GObject    *object,
+     170                 :             :                                        guint       prop_id,
+     171                 :             :                                        GValue     *value,
+     172                 :             :                                        GParamSpec *pspec)
+     173                 :             : {
+     174                 :           2 :   ValentRuncommandEditor *self = VALENT_RUNCOMMAND_EDITOR (object);
+     175                 :             : 
+     176      [ +  +  - ]:           2 :   switch (prop_id)
+     177                 :             :     {
+     178                 :           1 :     case PROP_COMMAND:
+     179                 :           1 :       g_value_set_variant (value, self->command);
+     180                 :           1 :       break;
+     181                 :             : 
+     182                 :           1 :     case PROP_UUID:
+     183                 :           1 :       g_value_set_string (value, self->uuid);
+     184                 :           1 :       break;
+     185                 :             : 
+     186                 :           0 :     default:
+     187                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     188                 :             :     }
+     189                 :           2 : }
+     190                 :             : 
+     191                 :             : static void
+     192                 :           2 : valent_runcommand_editor_set_property (GObject      *object,
+     193                 :             :                                        guint         prop_id,
+     194                 :             :                                        const GValue *value,
+     195                 :             :                                        GParamSpec   *pspec)
+     196                 :             : {
+     197                 :           2 :   ValentRuncommandEditor *self = VALENT_RUNCOMMAND_EDITOR (object);
+     198                 :             : 
+     199      [ +  +  - ]:           2 :   switch (prop_id)
+     200                 :             :     {
+     201                 :           1 :     case PROP_COMMAND:
+     202                 :           1 :       valent_runcommand_editor_set_command (self, g_value_get_variant (value));
+     203                 :           1 :       break;
+     204                 :             : 
+     205                 :           1 :     case PROP_UUID:
+     206                 :           1 :       valent_runcommand_editor_set_uuid (self, g_value_get_string (value));
+     207                 :           1 :       break;
+     208                 :             : 
+     209                 :           0 :     default:
+     210                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     211                 :             :     }
+     212                 :           2 : }
+     213                 :             : 
+     214                 :             : static void
+     215                 :           1 : valent_runcommand_editor_class_init (ValentRuncommandEditorClass *klass)
+     216                 :             : {
+     217                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     218                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     219                 :             : 
+     220                 :           1 :   object_class->dispose = valent_runcommand_editor_dispose;
+     221                 :           1 :   object_class->finalize = valent_runcommand_editor_finalize;
+     222                 :           1 :   object_class->get_property = valent_runcommand_editor_get_property;
+     223                 :           1 :   object_class->set_property = valent_runcommand_editor_set_property;
+     224                 :             : 
+     225                 :             :   /**
+     226                 :             :    * ValentRuncommandEditor:command: (getter get_command) (setter set_command)
+     227                 :             :    *
+     228                 :             :    * The command the editor is operating on.
+     229                 :             :    *
+     230                 :             :    * Since: 1.0
+     231                 :             :    */
+     232                 :           2 :   properties [PROP_COMMAND] =
+     233                 :           1 :     g_param_spec_variant ("command", NULL, NULL,
+     234                 :             :                           G_VARIANT_TYPE_VARDICT,
+     235                 :             :                           NULL,
+     236                 :             :                          (G_PARAM_READWRITE |
+     237                 :             :                           G_PARAM_CONSTRUCT |
+     238                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     239                 :             :                           G_PARAM_STATIC_STRINGS));
+     240                 :             : 
+     241                 :             :   /**
+     242                 :             :    * ValentRuncommandEditor:uuid: (getter get_uuid) (setter set_uuid)
+     243                 :             :    *
+     244                 :             :    * The uuid the editor is operating on.
+     245                 :             :    *
+     246                 :             :    * Since: 1.0
+     247                 :             :    */
+     248                 :           2 :   properties [PROP_UUID] =
+     249                 :           1 :     g_param_spec_string ("uuid", NULL, NULL,
+     250                 :             :                          "",
+     251                 :             :                          (G_PARAM_READWRITE |
+     252                 :             :                           G_PARAM_CONSTRUCT |
+     253                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     254                 :             :                           G_PARAM_STATIC_STRINGS));
+     255                 :             : 
+     256                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     257                 :             : 
+     258                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/runcommand/valent-runcommand-editor.ui");
+     259                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentRuncommandEditor, save_button);
+     260                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentRuncommandEditor, argv_entry);
+     261                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentRuncommandEditor, name_entry);
+     262                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentRuncommandEditor, remove_group);
+     263                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_entry_changed);
+     264                 :             : 
+     265                 :           1 :   gtk_widget_class_install_action (widget_class, "editor.cancel", NULL, editor_cancel_action);
+     266                 :           1 :   gtk_widget_class_install_action (widget_class, "editor.remove", NULL, editor_remove_action);
+     267                 :           1 :   gtk_widget_class_install_action (widget_class, "editor.save", NULL, editor_save_action);
+     268                 :           1 : }
+     269                 :             : 
+     270                 :             : static void
+     271                 :           1 : valent_runcommand_editor_init (ValentRuncommandEditor *self)
+     272                 :             : {
+     273                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     274                 :           1 : }
+     275                 :             : 
+     276                 :             : /**
+     277                 :             :  * valent_runcommand_editor_get_command:
+     278                 :             :  * @editor: a `ValentRuncommandEditor`
+     279                 :             :  *
+     280                 :             :  * Get the command the editor is operating on.
+     281                 :             :  *
+     282                 :             :  * Returns: (transfer none) (nullable): the command
+     283                 :             :  */
+     284                 :             : GVariant *
+     285                 :           6 : valent_runcommand_editor_get_command (ValentRuncommandEditor *editor)
+     286                 :             : {
+     287         [ +  - ]:           6 :   g_return_val_if_fail (VALENT_IS_RUNCOMMAND_EDITOR (editor), NULL);
+     288                 :             : 
+     289                 :           6 :   return editor->command;
+     290                 :             : }
+     291                 :             : 
+     292                 :             : /**
+     293                 :             :  * valent_runcommand_editor_set_command:
+     294                 :             :  * @editor: a `ValentRuncommandEditor`
+     295                 :             :  * @command: a command entry
+     296                 :             :  *
+     297                 :             :  * Set the command for the editor to operate on.
+     298                 :             :  */
+     299                 :             : void
+     300                 :           1 : valent_runcommand_editor_set_command (ValentRuncommandEditor *editor,
+     301                 :             :                                       GVariant               *command)
+     302                 :             : {
+     303         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_RUNCOMMAND_EDITOR (editor));
+     304   [ +  -  -  + ]:           1 :   g_return_if_fail (command == NULL || g_variant_is_of_type (command, G_VARIANT_TYPE_VARDICT));
+     305                 :             : 
+     306                 :             :   /* Update the property */
+     307         [ -  + ]:           1 :   g_clear_pointer (&editor->command, g_variant_unref);
+     308         [ +  - ]:           1 :   editor->command = command ? g_variant_ref_sink (command) : NULL;
+     309                 :           1 :   g_object_notify_by_pspec (G_OBJECT (editor), properties [PROP_COMMAND]);
+     310                 :             : 
+     311                 :           1 :   valent_runcommand_editor_sync (editor);
+     312                 :             : }
+     313                 :             : 
+     314                 :             : /**
+     315                 :             :  * valent_runcommand_editor_get_uuid:
+     316                 :             :  * @editor: a `ValentRuncommandEditor`
+     317                 :             :  *
+     318                 :             :  * Get the UUID of the command for @editor
+     319                 :             :  *
+     320                 :             :  * Returns: (not nullable) (transfer none): the command UUID
+     321                 :             :  */
+     322                 :             : const char *
+     323                 :           3 : valent_runcommand_editor_get_uuid (ValentRuncommandEditor *editor)
+     324                 :             : {
+     325         [ +  - ]:           3 :   g_return_val_if_fail (VALENT_IS_RUNCOMMAND_EDITOR (editor), NULL);
+     326                 :             : 
+     327                 :           3 :   return editor->uuid;
+     328                 :             : }
+     329                 :             : 
+     330                 :             : /**
+     331                 :             :  * valent_runcommand_editor_set_uuid:
+     332                 :             :  * @editor: a `ValentRuncommandEditor`
+     333                 :             :  * @uuid: a command UUID
+     334                 :             :  *
+     335                 :             :  * Set the UUID of the command for @editor to @uuid.
+     336                 :             :  */
+     337                 :             : void
+     338                 :           1 : valent_runcommand_editor_set_uuid (ValentRuncommandEditor *editor,
+     339                 :             :                                    const char             *uuid)
+     340                 :             : {
+     341         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_RUNCOMMAND_EDITOR (editor));
+     342         [ -  + ]:           1 :   g_return_if_fail (uuid != NULL);
+     343                 :             : 
+     344         [ +  - ]:           1 :   if (g_set_str (&editor->uuid, uuid))
+     345                 :           1 :     g_object_notify_by_pspec (G_OBJECT (editor), properties [PROP_UUID]);
+     346                 :             : }
+     347                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-editor.h.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-editor.h.func-c.html new file mode 100644 index 00000000000..7368199a2d3 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-editor.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-editor.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-editor.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_RUNCOMMAND_EDITOR24
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-editor.h.func.html b/coverage/src/plugins/runcommand/valent-runcommand-editor.h.func.html new file mode 100644 index 00000000000..1ad48f49325 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-editor.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-editor.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-editor.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_RUNCOMMAND_EDITOR24
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-editor.h.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-editor.h.gcov.html new file mode 100644 index 00000000000..2d7a8ff048f --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-editor.h.gcov.html @@ -0,0 +1,114 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-editor.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-editor.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_RUNCOMMAND_EDITOR (valent_runcommand_editor_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          25 : G_DECLARE_FINAL_TYPE (ValentRuncommandEditor, valent_runcommand_editor, VALENT, RUNCOMMAND_EDITOR, GtkWindow)
+                   -  + ]
+      13                 :             : 
+      14                 :             : GVariant   * valent_runcommand_editor_get_command (ValentRuncommandEditor *editor);
+      15                 :             : void         valent_runcommand_editor_set_command (ValentRuncommandEditor *editor,
+      16                 :             :                                                    GVariant               *command);
+      17                 :             : const char * valent_runcommand_editor_get_uuid    (ValentRuncommandEditor *editor);
+      18                 :             : void         valent_runcommand_editor_set_uuid    (ValentRuncommandEditor *editor,
+      19                 :             :                                                    const char             *uuid);
+      20                 :             : 
+      21                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.func-c.html new file mode 100644 index 00000000000..c1c3d6072a1 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.func-c.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.5 %254235
Test Date:2024-03-31 18:46:36Functions:90.9 %2220
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.6 %16081
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
launcher_watch0
runcommand_commands_action0
launcher_clear1
launcher_execute1
launcher_init1
on_commands_changed1
runcommand_execute_action1
valent_runcommand_plugin_execute_local_command1
valent_runcommand_plugin_execute_remote_command1
valent_runcommand_plugin_handle_command_list1
valent_runcommand_plugin_handle_runcommand1
valent_runcommand_plugin_handle_runcommand_request2
valent_runcommand_plugin_constructed3
valent_runcommand_plugin_finalize3
valent_runcommand_plugin_handle_packet3
valent_runcommand_plugin_init3
valent_runcommand_plugin_send_command_list5
valent_runcommand_plugin_destroy6
valent_runcommand_plugin_update_state10
valent_runcommand_plugin_get_type30
valent_runcommand_plugin_class_intern_init2
valent_runcommand_plugin_get_type_once2
valent_runcommand_plugin_get_type26
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.func.html b/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.func.html new file mode 100644 index 00000000000..f2fba8d85ed --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.func.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.5 %254235
Test Date:2024-03-31 18:46:36Functions:90.9 %2220
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.6 %16081
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
launcher_clear1
launcher_execute1
launcher_init1
launcher_watch0
on_commands_changed1
runcommand_commands_action0
runcommand_execute_action1
valent_runcommand_plugin_constructed3
valent_runcommand_plugin_destroy6
valent_runcommand_plugin_execute_local_command1
valent_runcommand_plugin_execute_remote_command1
valent_runcommand_plugin_finalize3
valent_runcommand_plugin_get_type30
valent_runcommand_plugin_class_intern_init2
valent_runcommand_plugin_get_type26
valent_runcommand_plugin_get_type_once2
valent_runcommand_plugin_handle_command_list1
valent_runcommand_plugin_handle_packet3
valent_runcommand_plugin_handle_runcommand1
valent_runcommand_plugin_handle_runcommand_request2
valent_runcommand_plugin_init3
valent_runcommand_plugin_send_command_list5
valent_runcommand_plugin_update_state10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.gcov.html new file mode 100644 index 00000000000..92c3e0c2076 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-plugin.c.gcov.html @@ -0,0 +1,631 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:92.5 %254235
Test Date:2024-03-31 18:46:36Functions:90.9 %2220
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.6 %16081
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-runcommand-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <libportal/portal.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-runcommand-plugin.h"
+      14                 :             : #include "valent-runcommand-utils.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentRuncommandPlugin
+      18                 :             : {
+      19                 :             :   ValentDevicePlugin   parent_instance;
+      20                 :             : 
+      21                 :             :   GSubprocessLauncher *launcher;
+      22                 :             :   GHashTable          *subprocesses;
+      23                 :             : 
+      24                 :             :   unsigned long        commands_changed_id;
+      25                 :             : };
+      26                 :             : 
+      27   [ +  +  +  - ]:          30 : G_DEFINE_FINAL_TYPE (ValentRuncommandPlugin, valent_runcommand_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      28                 :             : 
+      29                 :             : static void valent_runcommand_plugin_execute_local_command     (ValentRuncommandPlugin *self,
+      30                 :             :                                                                 const char             *key);
+      31                 :             : static void valent_runcommand_plugin_execute_remote_command    (ValentRuncommandPlugin *self,
+      32                 :             :                                                                 const char             *key);
+      33                 :             : static void valent_runcommand_plugin_handle_command_list       (ValentRuncommandPlugin *self,
+      34                 :             :                                                                 JsonObject             *command_list);
+      35                 :             : static void valent_runcommand_plugin_handle_runcommand         (ValentRuncommandPlugin *self,
+      36                 :             :                                                                 JsonNode               *packet);
+      37                 :             : static void valent_runcommand_plugin_handle_runcommand_request (ValentRuncommandPlugin *self,
+      38                 :             :                                                                 JsonNode               *packet);
+      39                 :             : static void valent_runcommand_plugin_send_command_list         (ValentRuncommandPlugin *self);
+      40                 :             : 
+      41                 :             : 
+      42                 :             : /*
+      43                 :             :  * Launcher Helpers
+      44                 :             :  */
+      45                 :             : static void
+      46                 :           1 : launcher_init (ValentRuncommandPlugin *self)
+      47                 :             : {
+      48                 :           1 :   ValentDevice *device;
+      49                 :           1 :   GSubprocessFlags flags;
+      50                 :             : 
+      51         [ +  - ]:           1 :   if G_UNLIKELY (self->launcher != NULL)
+      52                 :             :     return;
+      53                 :             : 
+      54                 :             : #ifdef VALENT_ENABLE_DEBUG
+      55                 :           1 :   flags = G_SUBPROCESS_FLAGS_NONE;
+      56                 :             : #else
+      57                 :             :   flags = (G_SUBPROCESS_FLAGS_STDERR_SILENCE |
+      58                 :             :            G_SUBPROCESS_FLAGS_STDOUT_SILENCE);
+      59                 :             : #endif /* VALENT_ENABLE_DEBUG */
+      60                 :             : 
+      61                 :           1 :   self->launcher = g_subprocess_launcher_new (flags);
+      62                 :             : 
+      63                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+      64                 :           1 :   g_subprocess_launcher_setenv (self->launcher,
+      65                 :             :                                 "VALENT_DEVICE_ID",
+      66                 :           1 :                                 valent_device_get_id (device),
+      67                 :             :                                 TRUE);
+      68                 :           1 :   g_subprocess_launcher_setenv (self->launcher,
+      69                 :             :                                 "VALENT_DEVICE_NAME",
+      70                 :           1 :                                 valent_device_get_name (device),
+      71                 :             :                                 TRUE);
+      72                 :             : }
+      73                 :             : 
+      74                 :             : static void
+      75                 :           1 : launcher_clear (ValentRuncommandPlugin *self)
+      76                 :             : {
+      77                 :           1 :   GHashTableIter iter;
+      78                 :           1 :   gpointer subprocess;
+      79                 :             : 
+      80                 :           1 :   g_hash_table_iter_init (&iter, self->subprocesses);
+      81                 :             : 
+      82         [ -  + ]:           1 :   while (g_hash_table_iter_next (&iter, NULL, &subprocess))
+      83                 :             :     {
+      84                 :           0 :       g_subprocess_force_exit (G_SUBPROCESS (subprocess));
+      85                 :           0 :       g_hash_table_iter_remove (&iter);
+      86                 :             :     }
+      87                 :             : 
+      88         [ -  + ]:           1 :   g_clear_object (&self->launcher);
+      89                 :           1 : }
+      90                 :             : 
+      91                 :             : static void
+      92                 :           0 : launcher_watch (GSubprocess  *subprocess,
+      93                 :             :                 GAsyncResult *result,
+      94                 :             :                 GHashTable   *subprocesses)
+      95                 :             : {
+      96                 :           0 :   g_autoptr (GError) error = NULL;
+      97                 :             : 
+      98   [ #  #  #  # ]:           0 :   if (!g_subprocess_wait_finish (subprocess, result, &error) &&
+      99                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     100                 :           0 :     g_warning ("Process failed: %s", error->message);
+     101                 :             : 
+     102                 :           0 :   g_hash_table_remove (subprocesses, subprocess);
+     103         [ #  # ]:           0 :   g_hash_table_unref (subprocesses);
+     104                 :           0 : }
+     105                 :             : 
+     106                 :             : static gboolean
+     107                 :           1 : launcher_execute (ValentRuncommandPlugin  *self,
+     108                 :             :                   GVariant                *command,
+     109                 :             :                   GError                 **error)
+     110                 :             : {
+     111                 :           2 :   g_autoptr (GSubprocess) subprocess = NULL;
+     112         [ +  - ]:           1 :   g_autoptr (GString) args = NULL;
+     113                 :           1 :   g_auto (GStrv) argv = NULL;
+     114         [ +  - ]:           1 :   g_autofree char *command_quoted = NULL;
+     115                 :           1 :   const char *command_args = "";
+     116                 :             : 
+     117         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     118   [ +  -  -  + ]:           1 :   g_assert (command != NULL && g_variant_is_of_type (command, G_VARIANT_TYPE_VARDICT));
+     119   [ +  -  -  + ]:           1 :   g_assert (error == NULL || *error == NULL);
+     120                 :             : 
+     121                 :           1 :   launcher_init (self);
+     122                 :             : 
+     123                 :           1 :   args = g_string_new ("");
+     124                 :           1 :   g_variant_lookup (command, "command", "&s", &command_args);
+     125                 :             : 
+     126                 :             : 
+     127                 :             :   /* When running in a Flatpak, run the command on the host if possible */
+     128   [ -  +  -  - ]:           1 :   if (xdp_portal_running_under_flatpak () &&
+     129                 :           0 :       valent_runcommand_can_spawn_host ())
+     130         [ #  # ]:           0 :     g_string_append (args, "flatpak-spawn --host ");
+     131                 :             : 
+     132                 :             :   /* Quote the arguments for the shell */
+     133                 :           1 :   command_quoted = g_shell_quote (command_args);
+     134                 :           1 :   g_string_append_printf (args, "sh -c %s", command_quoted);
+     135                 :             : 
+     136         [ -  + ]:           1 :   if (!g_shell_parse_argv (args->str, NULL, &argv, error))
+     137                 :             :     return FALSE;
+     138                 :             : 
+     139                 :           1 :   subprocess = g_subprocess_launcher_spawnv (self->launcher,
+     140                 :             :                                              (const char * const *)argv,
+     141                 :             :                                              error);
+     142                 :             : 
+     143         [ -  + ]:           1 :   if (subprocess == NULL)
+     144                 :             :     return FALSE;
+     145                 :             : 
+     146                 :             :   /* The task holds the final reference to the GSubprocess object */
+     147                 :           1 :   g_subprocess_wait_async (subprocess,
+     148                 :             :                            NULL,
+     149                 :             :                            (GAsyncReadyCallback)launcher_watch,
+     150                 :           1 :                            g_hash_table_ref (self->subprocesses));
+     151                 :           1 :   g_hash_table_add (self->subprocesses, subprocess);
+     152                 :             : 
+     153                 :           1 :   return TRUE;
+     154                 :             : }
+     155                 :             : 
+     156                 :             : /*
+     157                 :             :  * Local Commands
+     158                 :             :  */
+     159                 :             : static void
+     160                 :           1 : on_commands_changed (GSettings              *settings,
+     161                 :             :                      const char             *key,
+     162                 :             :                      ValentRuncommandPlugin *self)
+     163                 :             : {
+     164                 :           1 :   ValentDevice *device;
+     165                 :           1 :   ValentDeviceState state;
+     166                 :             : 
+     167   [ +  -  +  -  :           1 :   g_assert (G_IS_SETTINGS (settings));
+             -  +  -  - ]
+     168         [ -  + ]:           1 :   g_assert (key != NULL);
+     169         [ -  + ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     170                 :             : 
+     171                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     172                 :           1 :   state = valent_device_get_state (device);
+     173                 :             : 
+     174         [ +  - ]:           1 :   if ((state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     175                 :             :       (state & VALENT_DEVICE_STATE_PAIRED) != 0)
+     176                 :           1 :     valent_runcommand_plugin_send_command_list (self);
+     177                 :           1 : }
+     178                 :             : 
+     179                 :             : static void
+     180                 :           1 : valent_runcommand_plugin_execute_local_command (ValentRuncommandPlugin *self,
+     181                 :             :                                                 const char             *key)
+     182                 :             : {
+     183                 :           1 :   GSettings *settings;
+     184                 :           1 :   g_autoptr (GVariant) commands = NULL;
+     185   [ +  -  -  - ]:           1 :   g_autoptr (GVariant) command = NULL;
+     186   [ +  -  -  - ]:           1 :   g_autoptr (GError) error = NULL;
+     187                 :             : 
+     188         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     189         [ -  + ]:           1 :   g_return_if_fail (key != NULL);
+     190                 :             : 
+     191                 :             :   /* Lookup the command by UUID */
+     192                 :           1 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     193                 :           1 :   commands = g_settings_get_value (settings, "commands");
+     194                 :             : 
+     195         [ -  + ]:           1 :   if (!g_variant_lookup (commands, key, "@a{sv}", &command))
+     196                 :           0 :     return valent_runcommand_plugin_send_command_list (self);
+     197                 :             : 
+     198         [ -  + ]:           1 :   if (!launcher_execute (self, command, &error))
+     199                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     200                 :             : }
+     201                 :             : 
+     202                 :             : static void
+     203                 :           5 : valent_runcommand_plugin_send_command_list (ValentRuncommandPlugin *self)
+     204                 :             : {
+     205                 :           5 :   GSettings *settings;
+     206                 :          10 :   g_autoptr (JsonBuilder) builder = NULL;
+     207         [ -  + ]:           5 :   g_autoptr (JsonNode) packet = NULL;
+     208         [ +  - ]:           5 :   g_autoptr (GVariant) commands = NULL;
+     209         [ +  - ]:           5 :   g_autoptr (JsonBuilder) commands_builder = NULL;
+     210         [ +  - ]:           5 :   g_autoptr (JsonNode) commands_node = NULL;
+     211         [ +  - ]:           5 :   g_autofree char *commands_json = NULL;
+     212                 :           5 :   GVariantIter iter;
+     213                 :           5 :   char *key;
+     214                 :           5 :   GVariant *value;
+     215                 :             : 
+     216         [ +  - ]:           5 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     217                 :             : 
+     218                 :           5 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     219                 :           5 :   commands = g_settings_get_value (settings, "commands");
+     220                 :             : 
+     221                 :             :   /* The `commandList` dictionary is sent as a string of serialized JSON */
+     222                 :           5 :   commands_builder = json_builder_new ();
+     223                 :           5 :   json_builder_begin_object (commands_builder);
+     224                 :             : 
+     225                 :           5 :   g_variant_iter_init (&iter, commands);
+     226                 :             : 
+     227         [ +  + ]:           7 :   while (g_variant_iter_next (&iter, "{sv}", &key, &value))
+     228                 :             :     {
+     229                 :           2 :       const char *name = NULL;
+     230                 :           2 :       const char *command = NULL;
+     231                 :             : 
+     232   [ +  -  +  - ]:           4 :       if (g_variant_lookup (value, "name", "&s", &name) &&
+     233                 :           2 :           g_variant_lookup (value, "command", "&s", &command))
+     234                 :             :         {
+     235                 :           2 :           json_builder_set_member_name (commands_builder, key);
+     236                 :           2 :           json_builder_begin_object (commands_builder);
+     237                 :           2 :           json_builder_set_member_name (commands_builder, "name");
+     238                 :           2 :           json_builder_add_string_value (commands_builder, name);
+     239                 :           2 :           json_builder_set_member_name (commands_builder, "command");
+     240                 :           2 :           json_builder_add_string_value (commands_builder, command);
+     241                 :           2 :           json_builder_end_object (commands_builder);
+     242                 :             :         }
+     243                 :             : 
+     244         [ +  - ]:           2 :       g_clear_pointer (&key, g_free);
+     245         [ +  - ]:           2 :       g_clear_pointer (&value, g_variant_unref);
+     246                 :             :     }
+     247                 :             : 
+     248                 :           5 :   json_builder_end_object (commands_builder);
+     249                 :           5 :   commands_node = json_builder_get_root (commands_builder);
+     250                 :           5 :   commands_json = json_to_string (commands_node, FALSE);
+     251                 :             : 
+     252                 :           5 :   valent_packet_init (&builder, "kdeconnect.runcommand");
+     253                 :           5 :   json_builder_set_member_name (builder, "commandList");
+     254                 :           5 :   json_builder_add_string_value (builder, commands_json);
+     255                 :           5 :   packet = valent_packet_end (&builder);
+     256                 :             : 
+     257                 :           5 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     258                 :           5 : }
+     259                 :             : 
+     260                 :             : static void
+     261                 :           2 : valent_runcommand_plugin_handle_runcommand_request (ValentRuncommandPlugin *self,
+     262                 :             :                                                     JsonNode               *packet)
+     263                 :             : {
+     264                 :           2 :   const char *key;
+     265                 :             : 
+     266         [ +  - ]:           2 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     267         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     268                 :             : 
+     269                 :             :   /* A request for the local command list */
+     270         [ +  + ]:           2 :   if (valent_packet_check_field (packet, "requestCommandList"))
+     271                 :           1 :     valent_runcommand_plugin_send_command_list (self);
+     272                 :             : 
+     273                 :             :   /* A request to execute a local command */
+     274         [ +  + ]:           2 :   if (valent_packet_get_string (packet, "key", &key))
+     275                 :           1 :     valent_runcommand_plugin_execute_local_command (self, key);
+     276                 :           2 : }
+     277                 :             : 
+     278                 :             : /*
+     279                 :             :  * Remote Commands
+     280                 :             :  */
+     281                 :             : static void
+     282                 :           1 : valent_runcommand_plugin_execute_remote_command (ValentRuncommandPlugin *self,
+     283                 :             :                                                  const char             *key)
+     284                 :             : {
+     285                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     286         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     287                 :             : 
+     288         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     289         [ -  + ]:           1 :   g_assert (key != NULL);
+     290                 :             : 
+     291                 :           1 :   valent_packet_init (&builder, "kdeconnect.runcommand.request");
+     292                 :           1 :   json_builder_set_member_name (builder, "key");
+     293                 :           1 :   json_builder_add_string_value (builder, key);
+     294                 :           1 :   packet = valent_packet_end (&builder);
+     295                 :             : 
+     296         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     297                 :           1 : }
+     298                 :             : 
+     299                 :             : static void
+     300                 :           1 : valent_runcommand_plugin_handle_command_list (ValentRuncommandPlugin *self,
+     301                 :             :                                               JsonObject             *command_list)
+     302                 :             : {
+     303                 :           1 :   JsonObjectIter iter;
+     304                 :           1 :   const char *key;
+     305                 :           1 :   JsonNode *command_node;
+     306                 :           2 :   g_autoptr (GMenuItem) cmd_item = NULL;
+     307         [ +  - ]:           1 :   g_autoptr (GIcon) cmd_icon = NULL;
+     308         [ +  - ]:           1 :   g_autoptr (GMenu) cmd_menu = NULL;
+     309                 :           1 :   GAction *commands;
+     310                 :             : 
+     311         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     312         [ -  + ]:           1 :   g_assert (command_list != NULL);
+     313                 :             : 
+     314                 :           1 :   cmd_menu = g_menu_new ();
+     315                 :             : 
+     316                 :           1 :   cmd_icon = g_themed_icon_new ("system-run-symbolic");
+     317                 :           1 :   cmd_item = g_menu_item_new (_("Run Command"), "device.runcommand.commands");
+     318                 :           1 :   g_menu_item_set_icon (cmd_item, cmd_icon);
+     319                 :           1 :   g_menu_item_set_attribute (cmd_item, "hidden-when", "s", "action-disabled");
+     320                 :           1 :   g_menu_item_set_submenu (cmd_item, G_MENU_MODEL (cmd_menu));
+     321                 :             : 
+     322                 :             :   /* Iterate the commands */
+     323                 :           1 :   json_object_iter_init (&iter, command_list);
+     324                 :             : 
+     325         [ +  + ]:           3 :   while (json_object_iter_next (&iter, &key, &command_node))
+     326                 :             :     {
+     327                 :           2 :       JsonObject *cmd;
+     328                 :           2 :       const char *name;
+     329                 :           2 :       const char *command;
+     330                 :           2 :       g_autofree char *action = NULL;
+     331                 :           2 :       g_autoptr (GMenuItem) item = NULL;
+     332                 :             : 
+     333                 :           2 :       cmd = json_node_get_object (command_node);
+     334                 :           2 :       name = json_object_get_string_member (cmd, "name");
+     335                 :           2 :       command = json_object_get_string_member (cmd, "command");
+     336                 :           2 :       action = g_strdup_printf ("device.runcommand.execute::%s", key);
+     337                 :             : 
+     338                 :           2 :       item = g_menu_item_new (name, action);
+     339                 :           2 :       g_menu_item_set_attribute (item, "command", "s", command);
+     340         [ +  - ]:           2 :       g_menu_append_item (cmd_menu, item);
+     341                 :             :     }
+     342                 :             : 
+     343                 :           1 :   commands = g_action_map_lookup_action (G_ACTION_MAP (self), "commands");
+     344                 :           1 :   g_simple_action_set_enabled (G_SIMPLE_ACTION (commands),
+     345                 :           1 :                                json_object_get_size (command_list) > 0);
+     346         [ +  - ]:           1 :   valent_device_plugin_set_menu_item (VALENT_DEVICE_PLUGIN (self),
+     347                 :             :                                       "device.runcommand.commands",
+     348                 :             :                                       cmd_item);
+     349                 :           1 : }
+     350                 :             : 
+     351                 :             : static void
+     352                 :           1 : valent_runcommand_plugin_handle_runcommand (ValentRuncommandPlugin *self,
+     353                 :             :                                             JsonNode               *packet)
+     354                 :             : {
+     355                 :           1 :   JsonObject *body;
+     356                 :           1 :   g_autoptr (JsonNode) command_node = NULL;
+     357                 :           1 :   const char *command_json;
+     358                 :           1 :   JsonObject *command_list;
+     359                 :             : 
+     360         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     361         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+     362                 :             : 
+     363                 :           1 :   body = valent_packet_get_body (packet);
+     364                 :           1 :   command_json = json_object_get_string_member_with_default (body, "commandList", "{}");
+     365                 :           1 :   command_node = json_from_string (command_json, NULL);
+     366                 :             : 
+     367   [ +  -  -  + ]:           1 :   if (command_node == NULL || !JSON_NODE_HOLDS_OBJECT (command_node))
+     368                 :             :     {
+     369                 :           0 :       g_warning ("%s(): malformed commandList field", G_STRFUNC);
+     370         [ #  # ]:           0 :       return;
+     371                 :             :     }
+     372                 :             : 
+     373                 :           1 :   command_list = json_node_get_object (command_node);
+     374                 :           1 :   valent_runcommand_plugin_handle_command_list (self, command_list);
+     375                 :             : }
+     376                 :             : 
+     377                 :             : /*
+     378                 :             :  * GActions
+     379                 :             :  */
+     380                 :             : static void
+     381                 :           0 : runcommand_commands_action (GSimpleAction *action,
+     382                 :             :                             GVariant      *parameter,
+     383                 :             :                             gpointer       user_data)
+     384                 :             : {
+     385                 :             :   // Mock action
+     386                 :           0 : }
+     387                 :             : 
+     388                 :             : static void
+     389                 :           1 : runcommand_execute_action (GSimpleAction *action,
+     390                 :             :                            GVariant      *parameter,
+     391                 :             :                            gpointer       user_data)
+     392                 :             : {
+     393                 :           1 :   ValentRuncommandPlugin *self = VALENT_RUNCOMMAND_PLUGIN (user_data);
+     394                 :           1 :   const char *key;
+     395                 :             : 
+     396         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     397                 :             : 
+     398                 :           1 :   key = g_variant_get_string (parameter, NULL);
+     399                 :           1 :   valent_runcommand_plugin_execute_remote_command (self, key);
+     400                 :             : }
+     401                 :             : 
+     402                 :             : static const GActionEntry actions[] = {
+     403                 :             :     {"commands", runcommand_commands_action, NULL, NULL, NULL}, // "as"
+     404                 :             :     {"execute",  runcommand_execute_action,   "s", NULL, NULL}
+     405                 :             : };
+     406                 :             : 
+     407                 :             : /**
+     408                 :             :  * ValentDevicePlugin
+     409                 :             :  */
+     410                 :             : static void
+     411                 :          10 : valent_runcommand_plugin_update_state (ValentDevicePlugin *plugin,
+     412                 :             :                                        ValentDeviceState   state)
+     413                 :             : {
+     414                 :          10 :   ValentRuncommandPlugin *self = VALENT_RUNCOMMAND_PLUGIN (plugin);
+     415                 :          10 :   GSettings *settings;
+     416                 :          10 :   gboolean available;
+     417                 :             : 
+     418         [ +  - ]:          10 :   g_assert (VALENT_IS_RUNCOMMAND_PLUGIN (self));
+     419                 :             : 
+     420                 :          10 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     421                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     422                 :             : 
+     423                 :          10 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     424                 :             : 
+     425                 :          10 :   settings = valent_extension_get_settings (VALENT_EXTENSION (plugin));
+     426                 :             : 
+     427         [ +  + ]:          10 :   if (available)
+     428                 :             :     {
+     429         [ +  - ]:           3 :       if (self->commands_changed_id == 0)
+     430                 :             :         {
+     431                 :           3 :           self->commands_changed_id =
+     432                 :           3 :             g_signal_connect_object (settings,
+     433                 :             :                                      "changed::commands",
+     434                 :             :                                      G_CALLBACK (on_commands_changed),
+     435                 :             :                                      self, 0);
+     436                 :             :         }
+     437                 :             : 
+     438                 :           3 :       valent_runcommand_plugin_send_command_list (self);
+     439                 :             :     }
+     440                 :             :   else
+     441                 :             :     {
+     442         [ +  + ]:           7 :       g_clear_signal_handler (&self->commands_changed_id, settings);
+     443                 :             :     }
+     444                 :             : 
+     445                 :             :   /* If the device is unpaired it is no longer trusted */
+     446         [ +  + ]:          10 :   if ((state & VALENT_DEVICE_STATE_PAIRED) == 0)
+     447                 :           1 :     launcher_clear (self);
+     448                 :          10 : }
+     449                 :             : 
+     450                 :             : static void
+     451                 :           3 : valent_runcommand_plugin_handle_packet (ValentDevicePlugin *plugin,
+     452                 :             :                                         const char         *type,
+     453                 :             :                                         JsonNode           *packet)
+     454                 :             : {
+     455                 :           3 :   ValentRuncommandPlugin *self = VALENT_RUNCOMMAND_PLUGIN (plugin);
+     456                 :             : 
+     457         [ +  - ]:           3 :   g_assert (VALENT_IS_DEVICE_PLUGIN (plugin));
+     458         [ -  + ]:           3 :   g_assert (type != NULL);
+     459         [ -  + ]:           3 :   g_assert (VALENT_IS_PACKET (packet));
+     460                 :             : 
+     461                 :             :   /* A request for the local command list or local execution */
+     462         [ +  + ]:           3 :   if (g_str_equal (type, "kdeconnect.runcommand.request"))
+     463                 :           2 :     valent_runcommand_plugin_handle_runcommand_request (self, packet);
+     464                 :             : 
+     465                 :             :   /* A response to a request for the remote command list */
+     466         [ +  - ]:           1 :   else if (g_str_equal (type, "kdeconnect.runcommand"))
+     467                 :           1 :     valent_runcommand_plugin_handle_runcommand (self, packet);
+     468                 :             : 
+     469                 :             :   else
+     470                 :           0 :     g_assert_not_reached ();
+     471                 :           3 : }
+     472                 :             : 
+     473                 :             : /*
+     474                 :             :  * ValentObject
+     475                 :             :  */
+     476                 :             : static void
+     477                 :           6 : valent_runcommand_plugin_destroy (ValentObject *object)
+     478                 :             : {
+     479                 :           6 :   ValentRuncommandPlugin *self = VALENT_RUNCOMMAND_PLUGIN (object);
+     480                 :           6 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     481                 :           6 :   GSettings *settings;
+     482                 :             : 
+     483                 :             :   /* Stop watching for command changes */
+     484                 :           6 :   settings = valent_extension_get_settings (VALENT_EXTENSION (plugin));
+     485         [ -  + ]:           6 :   g_clear_signal_handler (&self->commands_changed_id, settings);
+     486                 :             : 
+     487                 :           6 :   VALENT_OBJECT_CLASS (valent_runcommand_plugin_parent_class)->destroy (object);
+     488                 :           6 : }
+     489                 :             : 
+     490                 :             : /*
+     491                 :             :  * GObject
+     492                 :             :  */
+     493                 :             : static void
+     494                 :           3 : valent_runcommand_plugin_constructed (GObject *object)
+     495                 :             : {
+     496                 :           3 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     497                 :             : 
+     498                 :           3 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     499                 :             :                                    actions,
+     500                 :             :                                    G_N_ELEMENTS (actions),
+     501                 :             :                                    plugin);
+     502                 :             : 
+     503                 :           3 :   G_OBJECT_CLASS (valent_runcommand_plugin_parent_class)->constructed (object);
+     504                 :           3 : }
+     505                 :             : 
+     506                 :             : static void
+     507                 :           3 : valent_runcommand_plugin_finalize (GObject *object)
+     508                 :             : {
+     509                 :           3 :   ValentRuncommandPlugin *self = VALENT_RUNCOMMAND_PLUGIN (object);
+     510                 :             : 
+     511         [ +  + ]:           3 :   g_clear_object (&self->launcher);
+     512         [ +  - ]:           3 :   g_clear_pointer (&self->subprocesses, g_hash_table_unref);
+     513                 :             : 
+     514                 :           3 :   G_OBJECT_CLASS (valent_runcommand_plugin_parent_class)->finalize (object);
+     515                 :           3 : }
+     516                 :             : 
+     517                 :             : static void
+     518                 :           2 : valent_runcommand_plugin_class_init (ValentRuncommandPluginClass *klass)
+     519                 :             : {
+     520                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     521                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     522                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     523                 :             : 
+     524                 :           2 :   object_class->constructed = valent_runcommand_plugin_constructed;
+     525                 :           2 :   object_class->finalize = valent_runcommand_plugin_finalize;
+     526                 :             : 
+     527                 :           2 :   vobject_class->destroy = valent_runcommand_plugin_destroy;
+     528                 :             : 
+     529                 :           2 :   plugin_class->handle_packet = valent_runcommand_plugin_handle_packet;
+     530                 :           2 :   plugin_class->update_state = valent_runcommand_plugin_update_state;
+     531                 :             : }
+     532                 :             : 
+     533                 :             : static void
+     534                 :           3 : valent_runcommand_plugin_init (ValentRuncommandPlugin *self)
+     535                 :             : {
+     536                 :           3 :   self->subprocesses = g_hash_table_new (NULL, NULL);
+     537                 :           3 : }
+     538                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.func-c.html new file mode 100644 index 00000000000..575ba8dbd66 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_RUNCOMMAND_PLUGIN24
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.func.html b/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.func.html new file mode 100644 index 00000000000..99d6d3024c4 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_RUNCOMMAND_PLUGIN24
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.gcov.html new file mode 100644 index 00000000000..f4764897982 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_RUNCOMMAND_PLUGIN (valent_runcommand_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          24 : G_DECLARE_FINAL_TYPE (ValentRuncommandPlugin, valent_runcommand_plugin, VALENT, RUNCOMMAND_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.func-c.html new file mode 100644 index 00000000000..ef1637046f7 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:39.8 %16164
Test Date:2024-03-31 18:46:36Functions:62.5 %1610
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:25.9 %5815
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_command_changed0
runcommand_add_action0
runcommand_edit_action0
runcommand_remove_action0
runcommand_save_action0
sort_commands0
_adw_expander_row_get_list1
valent_runcommand_preferences_constructed1
valent_runcommand_preferences_dispose1
valent_runcommand_preferences_finalize1
valent_runcommand_preferences_init1
valent_runcommand_preferences_populate1
valent_runcommand_preferences_class_init2
valent_runcommand_preferences_get_type8
valent_runcommand_preferences_class_intern_init2
valent_runcommand_preferences_get_type_once2
valent_runcommand_preferences_get_type4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.func.html b/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.func.html new file mode 100644 index 00000000000..4a9c1e7ff56 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:39.8 %16164
Test Date:2024-03-31 18:46:36Functions:62.5 %1610
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:25.9 %5815
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_adw_expander_row_get_list1
on_command_changed0
runcommand_add_action0
runcommand_edit_action0
runcommand_remove_action0
runcommand_save_action0
sort_commands0
valent_runcommand_preferences_class_init2
valent_runcommand_preferences_constructed1
valent_runcommand_preferences_dispose1
valent_runcommand_preferences_finalize1
valent_runcommand_preferences_get_type8
valent_runcommand_preferences_class_intern_init2
valent_runcommand_preferences_get_type4
valent_runcommand_preferences_get_type_once2
valent_runcommand_preferences_init1
valent_runcommand_preferences_populate1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.gcov.html new file mode 100644 index 00000000000..5e7199703f2 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-preferences.c.gcov.html @@ -0,0 +1,438 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:39.8 %16164
Test Date:2024-03-31 18:46:36Functions:62.5 %1610
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:25.9 %5815
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-runcommand-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <libportal/portal.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-runcommand-editor.h"
+      15                 :             : #include "valent-runcommand-preferences.h"
+      16                 :             : #include "valent-runcommand-utils.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : struct _ValentRuncommandPreferences
+      20                 :             : {
+      21                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      22                 :             : 
+      23                 :             :   GtkWindow                    *editor;
+      24                 :             : 
+      25                 :             :   /* template */
+      26                 :             :   AdwExpanderRow               *command_list_row;
+      27                 :             :   GtkListBox                   *command_list;
+      28                 :             : };
+      29                 :             : 
+      30   [ +  +  +  - ]:           8 : G_DEFINE_FINAL_TYPE (ValentRuncommandPreferences, valent_runcommand_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      31                 :             : 
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * Rows
+      35                 :             :  */
+      36                 :             : static void
+      37                 :           1 : valent_runcommand_preferences_populate (ValentRuncommandPreferences *self)
+      38                 :             : {
+      39                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      40                 :           1 :   GSettings *settings;
+      41                 :           1 :   GtkWidget *child;
+      42                 :           2 :   g_autoptr (GVariant) commands = NULL;
+      43                 :           1 :   GVariantIter iter;
+      44                 :           1 :   char *uuid;
+      45                 :           1 :   GVariant *item;
+      46                 :             : 
+      47         [ +  - ]:           1 :   g_assert (VALENT_IS_RUNCOMMAND_PREFERENCES (self));
+      48                 :             : 
+      49                 :           1 :   for (child = gtk_widget_get_first_child (GTK_WIDGET (self->command_list));
+      50         [ -  + ]:           1 :        child != NULL;)
+      51                 :             :     {
+      52                 :           0 :       GtkWidget *current_child = child;
+      53                 :           0 :       child = gtk_widget_get_next_sibling (current_child);
+      54                 :           0 :       gtk_list_box_remove (self->command_list, current_child);
+      55                 :             :     }
+      56                 :             : 
+      57                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+      58                 :           1 :   commands = g_settings_get_value (settings, "commands");
+      59                 :             : 
+      60                 :           1 :   g_variant_iter_init (&iter, commands);
+      61                 :             : 
+      62         [ -  + ]:           1 :   while (g_variant_iter_next (&iter, "{sv}", &uuid, &item))
+      63                 :             :     {
+      64                 :           0 :       const char *name = NULL;
+      65                 :           0 :       const char *command = NULL;
+      66                 :             : 
+      67   [ #  #  #  # ]:           0 :       if (g_variant_lookup (item, "name", "&s", &name) &&
+      68                 :           0 :           g_variant_lookup (item, "command", "&s", &command))
+      69                 :             :         {
+      70                 :           0 :           GtkWidget *row;
+      71                 :           0 :           GtkWidget *icon;
+      72                 :             : 
+      73                 :           0 :           row = g_object_new (ADW_TYPE_ACTION_ROW,
+      74                 :             :                               "name",          uuid,
+      75                 :             :                               "title",         name,
+      76                 :             :                               "subtitle",      command,
+      77                 :             :                               "activatable",   TRUE,
+      78                 :             :                               "selectable",    FALSE,
+      79                 :             :                               "action-target", g_variant_new_string (uuid),
+      80                 :             :                               "action-name",   "runcommand.edit",
+      81                 :             :                               NULL);
+      82                 :             : 
+      83                 :           0 :           icon = g_object_new (GTK_TYPE_IMAGE,
+      84                 :             :                                "icon-name",    "document-edit-symbolic",
+      85                 :             :                                "tooltip-text", _("Edit Command"),
+      86                 :             :                                NULL);
+      87                 :           0 :           gtk_widget_add_css_class (icon, "dim-label");
+      88                 :           0 :           adw_action_row_add_suffix (ADW_ACTION_ROW (row), icon);
+      89                 :             : 
+      90                 :             :           /* a11y: an activatable widget would change the label and description,
+      91                 :             :            * but a button is unnecessary and the label should be unchanged. */
+      92                 :           0 :           gtk_accessible_update_relation (GTK_ACCESSIBLE (row),
+      93                 :             :                                           GTK_ACCESSIBLE_RELATION_DESCRIBED_BY,
+      94                 :             :                                             icon, NULL,
+      95                 :             :                                           -1);
+      96                 :             : 
+      97                 :           0 :           gtk_list_box_append (self->command_list, row);
+      98                 :             :         }
+      99                 :             : 
+     100         [ #  # ]:           0 :       g_clear_pointer (&uuid, g_free);
+     101         [ #  # ]:           0 :       g_clear_pointer (&item, g_variant_unref);
+     102                 :             :     }
+     103                 :           1 : }
+     104                 :             : 
+     105                 :             : static int
+     106                 :           0 : sort_commands (GtkListBoxRow *row1,
+     107                 :             :                GtkListBoxRow *row2,
+     108                 :             :                gpointer       user_data)
+     109                 :             : {
+     110                 :           0 :   const char *title1;
+     111                 :           0 :   const char *title2;
+     112                 :             : 
+     113                 :           0 :   title1 = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (row1));
+     114                 :           0 :   title2 = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (row2));
+     115                 :             : 
+     116                 :           0 :   return g_utf8_collate (title1, title2);
+     117                 :             : }
+     118                 :             : 
+     119                 :             : static inline GtkListBox *
+     120                 :           1 : _adw_expander_row_get_list (AdwExpanderRow *row)
+     121                 :             : {
+     122                 :           1 :   GtkWidget *box;
+     123                 :           1 :   GtkWidget *child;
+     124                 :             : 
+     125                 :             :   /* First child is a GtkBox */
+     126                 :           1 :   box = gtk_widget_get_first_child (GTK_WIDGET (row));
+     127                 :             : 
+     128                 :             :   /* The GtkBox contains the primary AdwActionRow and a GtkRevealer */
+     129                 :           1 :   for (child = gtk_widget_get_first_child (box);
+     130         [ +  - ]:           2 :        child != NULL;
+     131                 :           1 :        child = gtk_widget_get_next_sibling (child))
+     132                 :             :     {
+     133   [ +  -  +  +  :           2 :       if (GTK_IS_REVEALER (child))
+                   +  - ]
+     134                 :             :         break;
+     135                 :             :     }
+     136                 :             : 
+     137                 :             :   /* The GtkRevealer's child is the GtkListBox */
+     138   [ +  -  +  -  :           1 :   if (GTK_IS_REVEALER (child))
+             -  +  -  - ]
+     139                 :           1 :     return GTK_LIST_BOX (gtk_revealer_get_child (GTK_REVEALER (child)));
+     140                 :             : 
+     141                 :             :   return NULL;
+     142                 :             : }
+     143                 :             : 
+     144                 :             : /*
+     145                 :             :  * GAction
+     146                 :             :  */
+     147                 :             : static void
+     148                 :           0 : on_command_changed (ValentRuncommandEditor      *editor,
+     149                 :             :                     GParamSpec                  *pspec,
+     150                 :             :                     ValentRuncommandPreferences *self)
+     151                 :             : {
+     152                 :           0 :   const char *uuid;
+     153                 :           0 :   GVariant *command;
+     154                 :             : 
+     155         [ #  # ]:           0 :   g_assert (VALENT_IS_RUNCOMMAND_EDITOR (editor));
+     156         [ #  # ]:           0 :   g_assert (VALENT_IS_RUNCOMMAND_PREFERENCES (self));
+     157                 :             : 
+     158                 :           0 :   uuid = valent_runcommand_editor_get_uuid (editor);
+     159                 :           0 :   command = valent_runcommand_editor_get_command (editor);
+     160                 :             : 
+     161         [ #  # ]:           0 :   if (command != NULL)
+     162                 :           0 :     gtk_widget_activate_action (GTK_WIDGET (self), "runcommand.save", "s", uuid);
+     163                 :             :   else
+     164                 :           0 :     gtk_widget_activate_action (GTK_WIDGET (self), "runcommand.remove", "s", uuid);
+     165                 :             : 
+     166                 :           0 :   gtk_window_destroy (GTK_WINDOW (editor));
+     167                 :           0 : }
+     168                 :             : 
+     169                 :             : static void
+     170                 :           0 : runcommand_add_action (GtkWidget  *widget,
+     171                 :             :                        const char *action_name,
+     172                 :             :                        GVariant   *parameter)
+     173                 :             : {
+     174                 :           0 :   g_autofree char *uuid = NULL;
+     175                 :             : 
+     176         [ #  # ]:           0 :   g_assert (VALENT_IS_RUNCOMMAND_PREFERENCES (widget));
+     177                 :             : 
+     178                 :           0 :   uuid = g_uuid_string_random ();
+     179                 :           0 :   gtk_widget_activate_action (widget, "runcommand.edit", "s", uuid);
+     180                 :           0 : }
+     181                 :             : 
+     182                 :             : static void
+     183                 :           0 : runcommand_edit_action (GtkWidget  *widget,
+     184                 :             :                         const char *action_name,
+     185                 :             :                         GVariant   *parameter)
+     186                 :             : {
+     187                 :           0 :   ValentRuncommandPreferences *self = VALENT_RUNCOMMAND_PREFERENCES (widget);
+     188                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     189                 :           0 :   const char *uuid = NULL;
+     190                 :           0 :   GSettings *settings;
+     191                 :           0 :   GtkRoot *window;
+     192                 :           0 :   g_autoptr (GVariant) commands = NULL;
+     193         [ #  # ]:           0 :   g_autoptr (GVariant) command = NULL;
+     194                 :             : 
+     195         [ #  # ]:           0 :   g_assert (VALENT_IS_RUNCOMMAND_PREFERENCES (self));
+     196                 :             : 
+     197                 :           0 :   uuid = g_variant_get_string (parameter, NULL);
+     198                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+     199                 :           0 :   commands = g_settings_get_value (settings, "commands");
+     200                 :           0 :   g_variant_lookup (commands, uuid, "@a{sv}", &command);
+     201                 :             : 
+     202                 :           0 :   window = gtk_widget_get_root (GTK_WIDGET (self));
+     203                 :           0 :   self->editor = g_object_new (VALENT_TYPE_RUNCOMMAND_EDITOR,
+     204                 :             :                                "uuid",          uuid,
+     205                 :             :                                "command",       command,
+     206                 :             :                                "modal",         (window != NULL),
+     207                 :             :                                "transient-for", window,
+     208                 :             :                                NULL);
+     209                 :           0 :   g_object_add_weak_pointer (G_OBJECT (self->editor),
+     210                 :           0 :                              (gpointer) &self->editor);
+     211                 :           0 :   g_signal_connect_object (self->editor,
+     212                 :             :                            "notify::command",
+     213                 :             :                            G_CALLBACK (on_command_changed),
+     214                 :             :                            self, 0);
+     215                 :             : 
+     216         [ #  # ]:           0 :   gtk_window_present_with_time (self->editor, GDK_CURRENT_TIME);
+     217                 :           0 : }
+     218                 :             : 
+     219                 :             : static void
+     220                 :           0 : runcommand_save_action (GtkWidget  *widget,
+     221                 :             :                         const char *action_name,
+     222                 :             :                         GVariant   *parameter)
+     223                 :             : {
+     224                 :           0 :   ValentRuncommandPreferences *self = VALENT_RUNCOMMAND_PREFERENCES (widget);
+     225                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     226                 :           0 :   GSettings *settings;
+     227                 :           0 :   g_autoptr (GVariant) commands = NULL;
+     228                 :           0 :   GVariant *command;
+     229                 :           0 :   const char *uuid;
+     230                 :           0 :   GVariantDict dict;
+     231                 :           0 :   GVariant *value;
+     232                 :             : 
+     233         [ #  # ]:           0 :   g_assert (VALENT_IS_RUNCOMMAND_PREFERENCES (self));
+     234                 :             : 
+     235                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+     236                 :           0 :   commands = g_settings_get_value (settings, "commands");
+     237                 :             : 
+     238                 :           0 :   uuid = valent_runcommand_editor_get_uuid (VALENT_RUNCOMMAND_EDITOR (self->editor));
+     239                 :           0 :   command = valent_runcommand_editor_get_command (VALENT_RUNCOMMAND_EDITOR (self->editor));
+     240                 :             : 
+     241                 :           0 :   g_variant_dict_init (&dict, commands);
+     242                 :           0 :   g_variant_dict_insert_value (&dict, uuid, command);
+     243                 :           0 :   value = g_variant_dict_end (&dict);
+     244                 :             : 
+     245         [ #  # ]:           0 :   g_settings_set_value (settings, "commands", value);
+     246                 :           0 : }
+     247                 :             : 
+     248                 :             : static void
+     249                 :           0 : runcommand_remove_action (GtkWidget  *widget,
+     250                 :             :                           const char *action_name,
+     251                 :             :                           GVariant   *parameter)
+     252                 :             : {
+     253                 :           0 :   ValentRuncommandPreferences *self = VALENT_RUNCOMMAND_PREFERENCES (widget);
+     254                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     255                 :           0 :   GSettings *settings;
+     256                 :           0 :   g_autoptr (GVariant) commands = NULL;
+     257                 :           0 :   GVariantDict dict;
+     258                 :           0 :   GVariant *value;
+     259                 :           0 :   const char *uuid = NULL;
+     260                 :             : 
+     261         [ #  # ]:           0 :   g_assert (VALENT_IS_RUNCOMMAND_PREFERENCES (self));
+     262                 :             : 
+     263                 :           0 :   uuid = g_variant_get_string (parameter, NULL);
+     264                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+     265                 :           0 :   commands = g_settings_get_value (settings, "commands");
+     266                 :             : 
+     267                 :           0 :   g_variant_dict_init (&dict, commands);
+     268                 :           0 :   g_variant_dict_remove (&dict, uuid);
+     269                 :           0 :   value = g_variant_dict_end (&dict);
+     270                 :             : 
+     271         [ #  # ]:           0 :   g_settings_set_value (settings, "commands", value);
+     272                 :           0 : }
+     273                 :             : 
+     274                 :             : /*
+     275                 :             :  * GObject
+     276                 :             :  */
+     277                 :             : static void
+     278                 :           1 : valent_runcommand_preferences_constructed (GObject *object)
+     279                 :             : {
+     280                 :           1 :   ValentRuncommandPreferences *self = VALENT_RUNCOMMAND_PREFERENCES (object);
+     281                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     282                 :           1 :   GSettings *settings;
+     283                 :             : 
+     284                 :           1 :   gtk_list_box_set_sort_func (self->command_list, sort_commands, self, NULL);
+     285                 :             : 
+     286                 :             :   /* Setup GSettings */
+     287                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     288                 :           1 :   g_signal_connect_object (settings,
+     289                 :             :                            "changed::commands",
+     290                 :             :                            G_CALLBACK (valent_runcommand_preferences_populate),
+     291                 :             :                            self,
+     292                 :             :                            G_CONNECT_SWAPPED);
+     293                 :           1 :   valent_runcommand_preferences_populate (self);
+     294                 :             : 
+     295                 :           1 :   G_OBJECT_CLASS (valent_runcommand_preferences_parent_class)->constructed (object);
+     296                 :           1 : }
+     297                 :             : 
+     298                 :             : static void
+     299                 :           1 : valent_runcommand_preferences_dispose (GObject *object)
+     300                 :             : {
+     301                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     302                 :             : 
+     303                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_RUNCOMMAND_PREFERENCES);
+     304                 :             : 
+     305                 :           1 :   G_OBJECT_CLASS (valent_runcommand_preferences_parent_class)->dispose (object);
+     306                 :           1 : }
+     307                 :             : 
+     308                 :             : static void
+     309                 :           1 : valent_runcommand_preferences_finalize (GObject *object)
+     310                 :             : {
+     311                 :           1 :   ValentRuncommandPreferences *self = VALENT_RUNCOMMAND_PREFERENCES (object);
+     312                 :             : 
+     313         [ -  + ]:           1 :   g_clear_pointer (&self->editor, gtk_window_destroy);
+     314                 :             : 
+     315                 :           1 :   G_OBJECT_CLASS (valent_runcommand_preferences_parent_class)->finalize (object);
+     316                 :           1 : }
+     317                 :             : 
+     318                 :             : static void
+     319                 :           2 : valent_runcommand_preferences_class_init (ValentRuncommandPreferencesClass *klass)
+     320                 :             : {
+     321                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     322                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     323                 :             : 
+     324                 :           2 :   object_class->constructed = valent_runcommand_preferences_constructed;
+     325                 :           2 :   object_class->dispose = valent_runcommand_preferences_dispose;
+     326                 :           2 :   object_class->finalize = valent_runcommand_preferences_finalize;
+     327                 :             : 
+     328                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/runcommand/valent-runcommand-preferences.ui");
+     329                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentRuncommandPreferences, command_list_row);
+     330                 :             : 
+     331                 :           2 :   gtk_widget_class_install_action (widget_class, "runcommand.add", NULL, runcommand_add_action);
+     332                 :           2 :   gtk_widget_class_install_action (widget_class, "runcommand.edit", "s", runcommand_edit_action);
+     333                 :           2 :   gtk_widget_class_install_action (widget_class, "runcommand.remove", "s", runcommand_remove_action);
+     334                 :           2 :   gtk_widget_class_install_action (widget_class, "runcommand.save", "s", runcommand_save_action);
+     335                 :           2 : }
+     336                 :             : 
+     337                 :             : static void
+     338                 :           1 : valent_runcommand_preferences_init (ValentRuncommandPreferences *self)
+     339                 :             : {
+     340                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     341                 :             : 
+     342                 :           1 :   self->command_list = _adw_expander_row_get_list (self->command_list_row);
+     343                 :           1 : }
+     344                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.func-c.html new file mode 100644 index 00000000000..56b7e8c5994 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_RUNCOMMAND_PREFERENCES1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.func.html b/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.func.html new file mode 100644 index 00000000000..2ac45834e4a --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_RUNCOMMAND_PREFERENCES1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.gcov.html new file mode 100644 index 00000000000..5f75e597319 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-preferences.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-preferences.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_RUNCOMMAND_PREFERENCES (valent_runcommand_preferences_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           1 : G_DECLARE_FINAL_TYPE (ValentRuncommandPreferences, valent_runcommand_preferences, VALENT, RUNCOMMAND_PREFERENCES, ValentDevicePreferencesGroup)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-utils.c.func-c.html b/coverage/src/plugins/runcommand/valent-runcommand-utils.c.func-c.html new file mode 100644 index 00000000000..825628653d4 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-utils.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %100
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_runcommand_can_spawn_host0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-utils.c.func.html b/coverage/src/plugins/runcommand/valent-runcommand-utils.c.func.html new file mode 100644 index 00000000000..abfaaf57196 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-utils.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %100
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_runcommand_can_spawn_host0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/runcommand/valent-runcommand-utils.c.gcov.html b/coverage/src/plugins/runcommand/valent-runcommand-utils.c.gcov.html new file mode 100644 index 00000000000..6318e26c801 --- /dev/null +++ b/coverage/src/plugins/runcommand/valent-runcommand-utils.c.gcov.html @@ -0,0 +1,136 @@ + + + + + + + LCOV - Code Coverage - src/plugins/runcommand/valent-runcommand-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/runcommand - valent-runcommand-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %100
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-runcommand-utils"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <libportal/portal.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-runcommand-utils.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : /**
+      16                 :             :  * valent_runcommand_can_spawn_host:
+      17                 :             :  *
+      18                 :             :  * Check if subprocesses can be spawned on the host system.
+      19                 :             :  *
+      20                 :             :  * Returns: %TRUE if available, %FALSE otherwise.
+      21                 :             :  */
+      22                 :             : gboolean
+      23                 :           0 : valent_runcommand_can_spawn_host (void)
+      24                 :             : {
+      25                 :           0 :   static gboolean host = TRUE;
+      26                 :           0 :   static size_t guard = 0;
+      27                 :             : 
+      28   [ #  #  #  # ]:           0 :   if (g_once_init_enter (&guard))
+      29                 :             :     {
+      30         [ #  # ]:           0 :       if (xdp_portal_running_under_flatpak ())
+      31                 :             :         {
+      32                 :           0 :           int status = 0;
+      33                 :             : 
+      34                 :           0 :           g_spawn_command_line_sync ("flatpak-spawn --host true",
+      35                 :             :                                      NULL, NULL, &status, NULL);
+      36                 :           0 :           host = g_spawn_check_wait_status (status, NULL);
+      37                 :             :         }
+      38                 :             : 
+      39                 :           0 :       g_once_init_leave (&guard, 1);
+      40                 :             :     }
+      41                 :             : 
+      42                 :           0 :   return host;
+      43                 :             : }
+      44                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-detail-sort-b.html b/coverage/src/plugins/sftp/index-detail-sort-b.html new file mode 100644 index 00000000000..ed74e32df78 --- /dev/null +++ b/coverage/src/plugins/sftp/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-detail-sort-f.html b/coverage/src/plugins/sftp/index-detail-sort-f.html new file mode 100644 index 00000000000..4a525d38d42 --- /dev/null +++ b/coverage/src/plugins/sftp/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-detail-sort-l.html b/coverage/src/plugins/sftp/index-detail-sort-l.html new file mode 100644 index 00000000000..0b40a967376 --- /dev/null +++ b/coverage/src/plugins/sftp/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-detail.html b/coverage/src/plugins/sftp/index-detail.html new file mode 100644 index 00000000000..6b422ec5525 --- /dev/null +++ b/coverage/src/plugins/sftp/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-sort-b.html b/coverage/src/plugins/sftp/index-sort-b.html new file mode 100644 index 00000000000..ed74e32df78 --- /dev/null +++ b/coverage/src/plugins/sftp/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-sort-f.html b/coverage/src/plugins/sftp/index-sort-f.html new file mode 100644 index 00000000000..4a525d38d42 --- /dev/null +++ b/coverage/src/plugins/sftp/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index-sort-l.html b/coverage/src/plugins/sftp/index-sort-l.html new file mode 100644 index 00000000000..0b40a967376 --- /dev/null +++ b/coverage/src/plugins/sftp/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/index.html b/coverage/src/plugins/sftp/index.html new file mode 100644 index 00000000000..6b422ec5525 --- /dev/null +++ b/coverage/src/plugins/sftp/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftpCoverageTotalHit
Test:Code CoverageLines:49.7 %344171
Test Date:2024-03-31 18:46:36Functions:63.2 %3824
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:19.2 %24046
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sftp-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-sftp-plugin.c +
45.1%45.1%
+
45.1 %29513318.7 %2144053.6 %2815
valent-sftp-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sftp-preferences.c +
75.0%75.0%
+
75.0 %443315.0 %20387.5 %87
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/sftp-plugin.c.func-c.html b/coverage/src/plugins/sftp/sftp-plugin.c.func-c.html new file mode 100644 index 00000000000..98f8644fdb6 --- /dev/null +++ b/coverage/src/plugins/sftp/sftp-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/sftp-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - sftp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_sftp_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/sftp-plugin.c.func.html b/coverage/src/plugins/sftp/sftp-plugin.c.func.html new file mode 100644 index 00000000000..f142f7650be --- /dev/null +++ b/coverage/src/plugins/sftp/sftp-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/sftp-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - sftp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_sftp_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/sftp-plugin.c.gcov.html b/coverage/src/plugins/sftp/sftp-plugin.c.gcov.html new file mode 100644 index 00000000000..ed60e4e4142 --- /dev/null +++ b/coverage/src/plugins/sftp/sftp-plugin.c.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/sftp-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - sftp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-sftp-plugin.h"
+      10                 :             : #include "valent-sftp-preferences.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_sftp_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_SFTP_PLUGIN);
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      21                 :             :                                               VALENT_TYPE_SFTP_PREFERENCES);
+      22                 :           2 : }
+      23                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-plugin.c.func-c.html b/coverage/src/plugins/sftp/valent-sftp-plugin.c.func-c.html new file mode 100644 index 00000000000..4365e99e746 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-plugin.c.func-c.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:45.1 %295133
Test Date:2024-03-31 18:46:36Functions:53.6 %2815
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:18.7 %21440
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ask_password_cb0
ask_question_cb0
handle_sftp_mount0
mount_cb0
on_mount_added0
on_mount_removed0
remove_host_key0
sftp_session_begin0
sftp_session_end0
sftp_session_end_cb0
sftp_session_free0
sftp_session_new0
ssh_add_cb0
handle_sftp_error1
mount_action1
valent_sftp_plugin_handle_request1
valent_sftp_plugin_handle_sftp1
valent_sftp_plugin_sftp_request1
valent_sftp_plugin_handle_packet2
valent_sftp_plugin_constructed3
valent_sftp_plugin_init3
get_device_host4
sftp_session_find4
valent_sftp_plugin_destroy6
valent_sftp_plugin_update_state10
valent_sftp_plugin_get_type23
valent_sftp_plugin_class_intern_init2
valent_sftp_plugin_get_type_once2
valent_sftp_plugin_get_type19
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-plugin.c.func.html b/coverage/src/plugins/sftp/valent-sftp-plugin.c.func.html new file mode 100644 index 00000000000..e6ec00e4948 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-plugin.c.func.html @@ -0,0 +1,294 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:45.1 %295133
Test Date:2024-03-31 18:46:36Functions:53.6 %2815
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:18.7 %21440
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ask_password_cb0
ask_question_cb0
get_device_host4
handle_sftp_error1
handle_sftp_mount0
mount_action1
mount_cb0
on_mount_added0
on_mount_removed0
remove_host_key0
sftp_session_begin0
sftp_session_end0
sftp_session_end_cb0
sftp_session_find4
sftp_session_free0
sftp_session_new0
ssh_add_cb0
valent_sftp_plugin_constructed3
valent_sftp_plugin_destroy6
valent_sftp_plugin_get_type23
valent_sftp_plugin_class_intern_init2
valent_sftp_plugin_get_type19
valent_sftp_plugin_get_type_once2
valent_sftp_plugin_handle_packet2
valent_sftp_plugin_handle_request1
valent_sftp_plugin_handle_sftp1
valent_sftp_plugin_init3
valent_sftp_plugin_sftp_request1
valent_sftp_plugin_update_state10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-plugin.c.gcov.html b/coverage/src/plugins/sftp/valent-sftp-plugin.c.gcov.html new file mode 100644 index 00000000000..62276ec39c8 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-plugin.c.gcov.html @@ -0,0 +1,808 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:45.1 %295133
Test Date:2024-03-31 18:46:36Functions:53.6 %2815
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:18.7 %21440
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sftp-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-sftp-plugin.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : typedef struct _ValentSftpSession ValentSftpSession;
+      17                 :             : 
+      18                 :             : struct _ValentSftpPlugin
+      19                 :             : {
+      20                 :             :   ValentDevicePlugin  parent_instance;
+      21                 :             : 
+      22                 :             :   GVolumeMonitor     *monitor;
+      23                 :             :   ValentSftpSession  *session;
+      24                 :             : };
+      25                 :             : 
+      26   [ +  +  +  - ]:          23 : G_DEFINE_FINAL_TYPE (ValentSftpPlugin, valent_sftp_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      27                 :             : 
+      28                 :             : 
+      29                 :             : static char *
+      30                 :           4 : get_device_host (ValentSftpPlugin *self)
+      31                 :             : {
+      32                 :           4 :   ValentDevice *device;
+      33                 :           8 :   g_autoptr (ValentChannel) channel = NULL;
+      34         [ +  - ]:           4 :   g_autofree char *host = NULL;
+      35                 :           4 :   GParamSpec *pspec = NULL;
+      36                 :             : 
+      37                 :             :   /* The plugin doesn't know ValentChannel derivations, so we have to check for
+      38                 :             :    * a "host" property to ensure it's IP-based */
+      39                 :           4 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+      40                 :           4 :   channel = valent_device_ref_channel (device);
+      41                 :             : 
+      42         [ +  - ]:           4 :   if G_LIKELY (channel != NULL)
+      43                 :           4 :     pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (channel), "host");
+      44                 :             : 
+      45         [ +  - ]:           4 :   if G_LIKELY (pspec != NULL)
+      46                 :           4 :     g_object_get (channel, "host", &host, NULL);
+      47                 :             : 
+      48                 :           4 :   return g_steal_pointer (&host);
+      49                 :             : }
+      50                 :             : 
+      51                 :             : /**
+      52                 :             :  * ValentSftpSession:
+      53                 :             :  * @host: Host name or IP
+      54                 :             :  * @port: Port
+      55                 :             :  * @username: Username (deprecated)
+      56                 :             :  * @password: Password (deprecated)
+      57                 :             :  * @mount: A `GMount` for the session
+      58                 :             :  *
+      59                 :             :  * `ValentSftpSession` is a simple representation of a SFTP session.
+      60                 :             :  */
+      61                 :             : typedef struct _ValentSftpSession
+      62                 :             : {
+      63                 :             :   char     *host;
+      64                 :             :   uint16_t  port;
+      65                 :             :   char     *username;
+      66                 :             :   char     *password;
+      67                 :             : 
+      68                 :             :   char    *uri;
+      69                 :             :   GMount  *mount;
+      70                 :             : } ValentSftpSession;
+      71                 :             : 
+      72                 :             : 
+      73                 :             : static ValentSftpSession *
+      74                 :           0 : sftp_session_new (ValentSftpPlugin *self,
+      75                 :             :                   JsonNode         *packet)
+      76                 :             : {
+      77                 :           0 :   ValentSftpSession *session;
+      78                 :           0 :   g_autofree char *host = NULL;
+      79                 :           0 :   int64_t port;
+      80                 :           0 :   const char *password;
+      81                 :           0 :   const char *username;
+      82                 :             : 
+      83                 :             :   /* Ultimately, these are the only packet fields we really need */
+      84         [ #  # ]:           0 :   if (!valent_packet_get_int (packet, "port", &port) ||
+      85         [ #  # ]:           0 :       (port < 0 || port > G_MAXUINT16))
+      86                 :             :     {
+      87                 :           0 :       g_debug ("%s(): expected \"port\" field holding a uint16",
+      88                 :             :                G_STRFUNC);
+      89                 :           0 :       return NULL;
+      90                 :             :     }
+      91                 :             : 
+      92         [ #  # ]:           0 :   if ((host = get_device_host (self)) == NULL)
+      93                 :             :     {
+      94                 :           0 :       g_warning ("%s(): failed to get host address",
+      95                 :             :                  G_STRFUNC);
+      96                 :           0 :       return NULL;
+      97                 :             :     }
+      98                 :             : 
+      99                 :             :   // Create a session struct
+     100                 :           0 :   session = g_new0 (ValentSftpSession, 1);
+     101                 :           0 :   session->host = g_steal_pointer (&host);
+     102                 :           0 :   session->port = (uint16_t)port;
+     103                 :             : 
+     104         [ #  # ]:           0 :   if (valent_packet_get_string (packet, "user", &username))
+     105         [ #  # ]:           0 :     session->username = g_strdup (username);
+     106                 :             : 
+     107         [ #  # ]:           0 :   if (valent_packet_get_string (packet, "password", &password))
+     108         [ #  # ]:           0 :     session->password = g_strdup (password);
+     109                 :             : 
+     110                 :             :   // Gvfs
+     111                 :           0 :   session->uri = g_strdup_printf ("sftp://%s:%u/",
+     112                 :             :                                   session->host,
+     113                 :             :                                   session->port);
+     114                 :             : 
+     115                 :           0 :   return session;
+     116                 :             : }
+     117                 :             : 
+     118                 :             : static void
+     119                 :           0 : sftp_session_free (gpointer data)
+     120                 :             : {
+     121                 :           0 :   ValentSftpSession *session = data;
+     122                 :             : 
+     123         [ #  # ]:           0 :   g_clear_pointer (&session->host, g_free);
+     124         [ #  # ]:           0 :   g_clear_pointer (&session->username, g_free);
+     125         [ #  # ]:           0 :   g_clear_pointer (&session->password, g_free);
+     126                 :             : 
+     127         [ #  # ]:           0 :   g_clear_object (&session->mount);
+     128         [ #  # ]:           0 :   g_clear_pointer (&session->uri, g_free);
+     129                 :             : 
+     130                 :           0 :   g_free (session);
+     131                 :           0 : }
+     132                 :             : 
+     133                 :             : static void
+     134                 :           0 : sftp_session_end_cb (GMount       *mount,
+     135                 :             :                      GAsyncResult *result,
+     136                 :             :                      gpointer      user_data)
+     137                 :             : {
+     138                 :           0 :   g_autoptr (GError) error = NULL;
+     139                 :             : 
+     140         [ #  # ]:           0 :   if (!g_mount_unmount_with_operation_finish (mount, result, &error))
+     141                 :           0 :     g_debug ("Failed unmounting: %s", error->message);
+     142                 :           0 : }
+     143                 :             : 
+     144                 :             : static void
+     145                 :           0 : sftp_session_end (gpointer data)
+     146                 :             : {
+     147                 :           0 :   ValentSftpSession *session = data;
+     148                 :           0 :   g_autoptr (GMount) mount = NULL;
+     149                 :           0 :   g_autoptr (GMountOperation) op = NULL;
+     150                 :             : 
+     151                 :           0 :   mount = g_steal_pointer (&session->mount);
+     152                 :           0 :   sftp_session_free (session);
+     153                 :             : 
+     154         [ #  # ]:           0 :   if (mount == NULL)
+     155                 :             :     return;
+     156                 :             : 
+     157                 :           0 :   op = g_mount_operation_new ();
+     158         [ #  # ]:           0 :   g_mount_unmount_with_operation (mount,
+     159                 :             :                                   G_MOUNT_UNMOUNT_FORCE,
+     160                 :             :                                   op,
+     161                 :             :                                   NULL,
+     162                 :             :                                   (GAsyncReadyCallback)sftp_session_end_cb,
+     163                 :             :                                   NULL);
+     164                 :             : }
+     165                 :             : 
+     166                 :             : static gboolean
+     167                 :           4 : sftp_session_find (ValentSftpPlugin *self)
+     168                 :             : {
+     169                 :           8 :   g_autofree char *host = NULL;
+     170                 :           4 :   g_autofree char *host_pattern = NULL;
+     171                 :           4 :   g_autoptr (GRegex) regex = NULL;
+     172         [ +  - ]:           4 :   g_autolist (GMount) mounts = NULL;
+     173                 :             : 
+     174   [ -  +  -  - ]:           4 :   if (self->session && self->session->mount)
+     175                 :             :     return TRUE;
+     176                 :             : 
+     177         [ +  - ]:           4 :   if ((host = get_device_host (self)) == NULL)
+     178                 :             :     return FALSE;
+     179                 :             : 
+     180                 :             :   // TODO: is this reasonable?
+     181                 :           4 :   host_pattern = g_strdup_printf ("sftp://(%s):([22-65535])", host);
+     182                 :           4 :   regex = g_regex_new (host_pattern, G_REGEX_OPTIMIZE, 0, NULL);
+     183                 :             : 
+     184                 :             :   /* Search through each mount in the volume monitor... */
+     185                 :           4 :   mounts = g_volume_monitor_get_mounts (self->monitor);
+     186                 :             : 
+     187         [ -  + ]:           4 :   for (const GList *iter = mounts; iter; iter = iter->next)
+     188                 :             :     {
+     189                 :           4 :       g_autoptr (GFile) root = NULL;
+     190   [ #  #  #  # ]:           0 :       g_autofree char *uri = NULL;
+     191                 :             : 
+     192                 :           0 :       root = g_mount_get_root (iter->data);
+     193                 :           0 :       uri = g_file_get_uri (root);
+     194                 :             : 
+     195                 :             :       /* The URI matches our mount */
+     196         [ #  # ]:           0 :       if (g_regex_match (regex, uri, 0, NULL))
+     197                 :             :         {
+     198         [ #  # ]:           0 :           if (self->session == NULL)
+     199                 :           0 :             self->session = g_new0 (ValentSftpSession, 1);
+     200                 :             : 
+     201                 :           0 :           g_set_object (&self->session->mount, iter->data);
+     202                 :           0 :           g_set_str (&self->session->uri, uri);
+     203                 :             : 
+     204                 :           0 :           return TRUE;
+     205                 :             :         }
+     206                 :             :     }
+     207                 :             : 
+     208                 :             :   return FALSE;
+     209                 :             : }
+     210                 :             : 
+     211                 :             : 
+     212                 :             : /*
+     213                 :             :  * GVolumeMonitor Callbacks
+     214                 :             :  */
+     215                 :             : static void
+     216                 :           0 : on_mount_added (GVolumeMonitor   *volume_monitor,
+     217                 :             :                 GMount           *mount,
+     218                 :             :                 ValentSftpPlugin *self)
+     219                 :             : {
+     220                 :           0 :   g_autoptr (GFile) root = NULL;
+     221         [ #  # ]:           0 :   g_autofree char *uri = NULL;
+     222                 :             : 
+     223         [ #  # ]:           0 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     224                 :             : 
+     225         [ #  # ]:           0 :   if (self->session == NULL)
+     226                 :           0 :     return;
+     227                 :             : 
+     228                 :           0 :   root = g_mount_get_root (mount);
+     229                 :           0 :   uri = g_file_get_uri (root);
+     230                 :             : 
+     231         [ #  # ]:           0 :   if (g_strcmp0 (self->session->uri, uri) == 0)
+     232                 :           0 :     g_set_object (&self->session->mount, mount);
+     233                 :             : }
+     234                 :             : 
+     235                 :             : static void
+     236                 :           0 : on_mount_removed (GVolumeMonitor   *volume_monitor,
+     237                 :             :                   GMount           *mount,
+     238                 :             :                   ValentSftpPlugin *self)
+     239                 :             : {
+     240                 :           0 :   g_autoptr (GFile) root = NULL;
+     241         [ #  # ]:           0 :   g_autofree char *uri = NULL;
+     242                 :             : 
+     243         [ #  # ]:           0 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     244                 :             : 
+     245         [ #  # ]:           0 :   if (self->session == NULL)
+     246                 :           0 :     return;
+     247                 :             : 
+     248                 :           0 :   root = g_mount_get_root (mount);
+     249                 :           0 :   uri = g_file_get_uri (root);
+     250                 :             : 
+     251         [ #  # ]:           0 :   if (g_strcmp0 (self->session->uri, uri) == 0)
+     252         [ #  # ]:           0 :     g_clear_pointer (&self->session, sftp_session_free);
+     253                 :             : }
+     254                 :             : 
+     255                 :             : 
+     256                 :             : /* GMountOperation Callbacks
+     257                 :             :  *
+     258                 :             :  * Rather than setting the password ahead of time, we set it upon request to
+     259                 :             :  * avoid password authentication if possible.
+     260                 :             :  *
+     261                 :             :  * All host keys are accepted since we connect to known hosts as communicated
+     262                 :             :  * over the TLS encrypted `ValentLanChannel`.
+     263                 :             :  */
+     264                 :             : static void
+     265                 :           0 : ask_password_cb (GMountOperation   *op,
+     266                 :             :                  char              *message,
+     267                 :             :                  char              *default_user,
+     268                 :             :                  char              *default_domain,
+     269                 :             :                  GAskPasswordFlags  flags,
+     270                 :             :                  gpointer           user_data)
+     271                 :             : {
+     272                 :           0 :   ValentSftpSession *session = user_data;
+     273                 :             : 
+     274         [ #  # ]:           0 :   if (flags & G_ASK_PASSWORD_NEED_USERNAME)
+     275                 :           0 :     g_mount_operation_set_username (op, session->username);
+     276                 :             : 
+     277         [ #  # ]:           0 :   if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
+     278                 :             :     {
+     279                 :           0 :       g_mount_operation_set_password (op, session->password);
+     280                 :           0 :       g_mount_operation_set_password_save (op, G_PASSWORD_SAVE_NEVER);
+     281                 :             :     }
+     282                 :             : 
+     283                 :           0 :   g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
+     284                 :           0 : }
+     285                 :             : 
+     286                 :             : static void
+     287                 :           0 : ask_question_cb (GMountOperation *op,
+     288                 :             :                  char            *message,
+     289                 :             :                  GStrv            choices,
+     290                 :             :                  gpointer         user_data)
+     291                 :             : {
+     292                 :           0 :   g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
+     293                 :           0 : }
+     294                 :             : 
+     295                 :             : /**
+     296                 :             :  * remove_host_key:
+     297                 :             :  * @host: An IP or hostname
+     298                 :             :  *
+     299                 :             :  * Remove all host keys associated with @host from the ssh-agent.
+     300                 :             :  */
+     301                 :             : static void
+     302                 :           0 : remove_host_key (const char *host)
+     303                 :             : {
+     304         [ #  # ]:           0 :   g_assert (host != NULL);
+     305                 :             : 
+     306         [ #  # ]:           0 :   for (uint16_t port = 1739; port <= 1764; port++)
+     307                 :             :     {
+     308                 :           0 :       g_autoptr (GSubprocess) proc = NULL;
+     309         [ #  # ]:           0 :       g_autofree char *match = NULL;
+     310                 :             : 
+     311                 :           0 :       match = g_strdup_printf ("[%s]:%d", host, port);
+     312                 :           0 :       proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE |
+     313                 :             :                                G_SUBPROCESS_FLAGS_STDERR_MERGE,
+     314                 :             :                                NULL,
+     315                 :             :                                "ssh-keygen", "-R", match,
+     316                 :             :                                NULL);
+     317                 :             : 
+     318         [ #  # ]:           0 :       if (proc != NULL)
+     319                 :           0 :         g_subprocess_wait_async (proc, NULL, NULL, NULL);
+     320                 :             :     }
+     321                 :           0 : }
+     322                 :             : 
+     323                 :             : /*
+     324                 :             :  * Packet Handlers
+     325                 :             :  */
+     326                 :             : static void
+     327                 :           0 : mount_cb (GFile            *file,
+     328                 :             :           GAsyncResult     *result,
+     329                 :             :           ValentSftpPlugin *self)
+     330                 :             : {
+     331                 :           0 :   g_autoptr (GError) error = NULL;
+     332                 :             : 
+     333         [ #  # ]:           0 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     334                 :             : 
+     335                 :             :   /* On success we will acquire the mount from the volume monitor */
+     336         [ #  # ]:           0 :   if (g_file_mount_enclosing_volume_finish (file, result, &error))
+     337                 :             :     return;
+     338                 :             : 
+     339                 :             :   /* On the off-chance this happens, we will just ensure we have the mount */
+     340   [ #  #  #  # ]:           0 :   if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_ALREADY_MOUNTED) &&
+     341                 :           0 :       sftp_session_find (self))
+     342                 :             :     return;
+     343                 :             : 
+     344                 :             :   /* On failure, we're particularly interested in host key failures so that
+     345                 :             :    * we can remove those from the ssh-agent. These are reported by GVfs as
+     346                 :             :    * G_IO_ERROR_FAILED with a localized string, so we just assume. */
+     347         [ #  # ]:           0 :   if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_FAILED))
+     348                 :             :     {
+     349                 :           0 :       g_warning ("%s(): Error mounting: %s", G_STRFUNC, error->message);
+     350                 :             : 
+     351   [ #  #  #  # ]:           0 :       if (self->session && self->session->host)
+     352                 :           0 :         remove_host_key (self->session->host);
+     353                 :             :     }
+     354                 :             : 
+     355   [ #  #  #  # ]:           0 :   g_clear_pointer (&self->session, sftp_session_free);
+     356                 :             : }
+     357                 :             : 
+     358                 :             : static void
+     359                 :           0 : ssh_add_cb (GSubprocess      *proc,
+     360                 :             :             GAsyncResult     *result,
+     361                 :             :             ValentSftpPlugin *self)
+     362                 :             : {
+     363                 :           0 :   ValentSftpSession *session = self->session;
+     364                 :           0 :   g_autoptr (GError) error = NULL;
+     365   [ #  #  #  # ]:           0 :   g_autoptr (GFile) file = NULL;
+     366   [ #  #  #  # ]:           0 :   g_autoptr (GMountOperation) op = NULL;
+     367                 :             : 
+     368         [ #  # ]:           0 :   g_assert (self->session != NULL);
+     369                 :             : 
+     370         [ #  # ]:           0 :   if (!g_subprocess_wait_check_finish (proc, result, &error))
+     371                 :             :     {
+     372                 :           0 :       g_warning ("%s(): Failed to add host key: %s", G_STRFUNC, error->message);
+     373         [ #  # ]:           0 :       g_clear_pointer (&self->session, sftp_session_free);
+     374         [ #  # ]:           0 :       return;
+     375                 :             :     }
+     376                 :             : 
+     377                 :             :   /* Prepare the mount operation */
+     378                 :           0 :   op = g_mount_operation_new ();
+     379                 :           0 :   g_signal_connect (op, "ask-password", G_CALLBACK (ask_password_cb), session);
+     380                 :           0 :   g_signal_connect (op, "ask-question", G_CALLBACK (ask_question_cb), NULL);
+     381                 :             : 
+     382                 :             :   /* Start the mount operation */
+     383                 :           0 :   file = g_file_new_for_uri (session->uri);
+     384         [ #  # ]:           0 :   g_file_mount_enclosing_volume (file,
+     385                 :             :                                  G_MOUNT_MOUNT_NONE,
+     386                 :             :                                  op,
+     387                 :             :                                  NULL,
+     388                 :             :                                  (GAsyncReadyCallback)mount_cb,
+     389                 :             :                                  self);
+     390                 :             : }
+     391                 :             : 
+     392                 :             : static void
+     393                 :           0 : sftp_session_begin (ValentSftpPlugin  *self,
+     394                 :             :                     ValentSftpSession *session)
+     395                 :             : {
+     396                 :           0 :   g_autoptr (ValentContext) context = NULL;
+     397   [ #  #  #  # ]:           0 :   g_autoptr (GSubprocess) proc = NULL;
+     398         [ #  # ]:           0 :   g_autoptr (GError) error = NULL;
+     399   [ #  #  #  # ]:           0 :   g_autoptr (GFile) private_key = NULL;
+     400                 :             : 
+     401         [ #  # ]:           0 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     402                 :             : 
+     403                 :             :   /* Get the root context and add the private key to the ssh-agent */
+     404                 :           0 :   context = valent_context_new (NULL, NULL, NULL);
+     405                 :           0 :   private_key = valent_context_get_config_file (context, "private.pem");
+     406                 :           0 :   proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE |
+     407                 :             :                            G_SUBPROCESS_FLAGS_STDERR_MERGE,
+     408                 :             :                            &error,
+     409                 :             :                            "ssh-add", g_file_peek_path (private_key),
+     410                 :             :                            NULL);
+     411                 :             : 
+     412         [ #  # ]:           0 :   if (proc == NULL)
+     413                 :             :     {
+     414                 :           0 :       g_warning ("%s(): Failed to add host key: %s", G_STRFUNC, error->message);
+     415         [ #  # ]:           0 :       g_clear_pointer (&self->session, sftp_session_free);
+     416         [ #  # ]:           0 :       return;
+     417                 :             :     }
+     418                 :             : 
+     419         [ #  # ]:           0 :   g_subprocess_wait_check_async (proc,
+     420                 :             :                                  NULL,
+     421                 :             :                                  (GAsyncReadyCallback)ssh_add_cb,
+     422                 :             :                                  self);
+     423                 :             : }
+     424                 :             : 
+     425                 :             : 
+     426                 :             : /*
+     427                 :             :  * Packet Handlers
+     428                 :             :  */
+     429                 :             : static void
+     430                 :           1 : handle_sftp_error (ValentSftpPlugin *self,
+     431                 :             :                    JsonNode         *packet)
+     432                 :             : {
+     433                 :           1 :   ValentDevice *device;
+     434                 :           2 :   g_autoptr (GNotification) notification = NULL;
+     435         [ +  - ]:           1 :   g_autoptr (GIcon) error_icon = NULL;
+     436         [ +  - ]:           1 :   g_autofree char *error_title = NULL;
+     437                 :           1 :   const char *error_message;
+     438                 :           1 :   const char *device_name;
+     439                 :           1 :   JsonObject *body;
+     440                 :             : 
+     441         [ +  - ]:           1 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     442                 :             : 
+     443                 :           1 :   body = valent_packet_get_body (packet);
+     444                 :             : 
+     445                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     446                 :           1 :   device_name = valent_device_get_name (device);
+     447                 :             : 
+     448                 :           1 :   error_icon = g_themed_icon_new ("dialog-error-symbolic");
+     449                 :           1 :   error_title = g_strdup_printf ("%s: SFTP", device_name);
+     450                 :           1 :   error_message = json_object_get_string_member (body, "errorMessage");
+     451                 :             : 
+     452                 :             :   /* Send notification */
+     453                 :           1 :   notification = g_notification_new (error_title);
+     454                 :           1 :   g_notification_set_body (notification, error_message);
+     455                 :           1 :   g_notification_set_icon (notification, error_icon);
+     456                 :           1 :   g_notification_set_priority (notification, G_NOTIFICATION_PRIORITY_HIGH);
+     457                 :           1 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     458                 :             :                                           "sftp-error",
+     459                 :             :                                           notification);
+     460                 :           1 : }
+     461                 :             : 
+     462                 :             : static void
+     463                 :           0 : handle_sftp_mount (ValentSftpPlugin *self,
+     464                 :             :                    JsonNode         *packet)
+     465                 :             : {
+     466         [ #  # ]:           0 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     467                 :             : 
+     468                 :             :   /* Check if we're already mounted or mounting */
+     469         [ #  # ]:           0 :   if (self->session != NULL)
+     470                 :             :     return;
+     471                 :             : 
+     472                 :             :   /* Parse the connection data */
+     473                 :           0 :   self->session = sftp_session_new (self, packet);
+     474                 :             : 
+     475         [ #  # ]:           0 :   if (self->session != NULL)
+     476                 :           0 :     sftp_session_begin (self, self->session);
+     477                 :             : }
+     478                 :             : 
+     479                 :             : static void
+     480                 :           1 : valent_sftp_plugin_handle_sftp (ValentSftpPlugin *self,
+     481                 :             :                                 JsonNode         *packet)
+     482                 :             : {
+     483         [ +  - ]:           1 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     484                 :             : 
+     485                 :             :   /* The request for mount information failed, most likely due to the remote
+     486                 :             :    * device not being setup yet.
+     487                 :             :    */
+     488         [ +  - ]:           1 :   if (valent_packet_check_field (packet, "errorMessage"))
+     489                 :           1 :     handle_sftp_error (self, packet);
+     490                 :             : 
+     491                 :             :   /* Otherwise we've been sent the information necessary to open an SSH/SFTP
+     492                 :             :    * connection to the remote device.
+     493                 :             :    */
+     494                 :             :   else
+     495                 :           0 :     handle_sftp_mount (self, packet);
+     496                 :           1 : }
+     497                 :             : 
+     498                 :             : /*
+     499                 :             :  * Packet Providers
+     500                 :             :  */
+     501                 :             : static void
+     502                 :           1 : valent_sftp_plugin_handle_request (ValentSftpPlugin *self,
+     503                 :             :                                    JsonNode         *packet)
+     504                 :             : {
+     505                 :           1 :   GSettings *settings;
+     506                 :           1 :   g_autoptr (JsonBuilder) builder = NULL;
+     507   [ -  -  -  + ]:           1 :   g_autoptr (JsonNode) response = NULL;
+     508                 :             : 
+     509         [ +  - ]:           1 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     510                 :             : 
+     511         [ -  + ]:           1 :   if (!valent_packet_check_field (packet, "startBrowsing"))
+     512         [ #  # ]:           0 :     return;
+     513                 :             : 
+     514                 :           1 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     515                 :           1 :   valent_packet_init (&builder, "kdeconnect.sftp");
+     516                 :             : 
+     517         [ -  + ]:           1 :   if (g_settings_get_boolean (settings, "local-allow"))
+     518                 :             :     {
+     519                 :           0 :       uint16_t local_port;
+     520                 :             : 
+     521                 :           0 :       json_builder_set_member_name (builder, "user");
+     522                 :           0 :       json_builder_add_string_value (builder, g_get_user_name ());
+     523                 :             : 
+     524                 :           0 :       local_port = g_settings_get_uint (settings, "local-port");
+     525                 :           0 :       json_builder_set_member_name (builder, "port");
+     526                 :           0 :       json_builder_add_int_value (builder, local_port);
+     527                 :             : 
+     528                 :           0 :       json_builder_set_member_name (builder, "multiPaths");
+     529                 :           0 :       json_builder_begin_array (builder);
+     530                 :           0 :       json_builder_add_string_value (builder, g_get_home_dir ());
+     531                 :           0 :       json_builder_end_array (builder);
+     532                 :             : 
+     533                 :           0 :       json_builder_set_member_name (builder, "pathNames");
+     534                 :           0 :       json_builder_begin_array (builder);
+     535                 :           0 :       json_builder_add_string_value (builder, _("Home"));
+     536                 :           0 :       json_builder_end_array (builder);
+     537                 :             :     }
+     538                 :             :   else
+     539                 :             :     {
+     540                 :           1 :       json_builder_set_member_name (builder, "errorMessage");
+     541                 :           1 :       json_builder_add_string_value (builder, _("Permission denied"));
+     542                 :             :     }
+     543                 :             : 
+     544                 :           1 :   response = valent_packet_end (&builder);
+     545         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), response);
+     546                 :             : }
+     547                 :             : 
+     548                 :             : static void
+     549                 :           1 : valent_sftp_plugin_sftp_request (ValentSftpPlugin *self)
+     550                 :             : {
+     551                 :           1 :   g_autoptr (JsonBuilder) builder = NULL;
+     552   [ -  -  -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     553                 :             : 
+     554         [ +  - ]:           1 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     555                 :             : 
+     556         [ -  + ]:           1 :   if (sftp_session_find (self))
+     557         [ #  # ]:           0 :     return;
+     558                 :             : 
+     559                 :           1 :   valent_packet_init (&builder, "kdeconnect.sftp.request");
+     560                 :           1 :   json_builder_set_member_name (builder, "startBrowsing");
+     561                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+     562                 :           1 :   packet = valent_packet_end (&builder);
+     563                 :             : 
+     564         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     565                 :             : }
+     566                 :             : 
+     567                 :             : /*
+     568                 :             :  * GActions
+     569                 :             :  */
+     570                 :             : static void
+     571                 :           1 : mount_action (GSimpleAction *action,
+     572                 :             :               GVariant      *parameter,
+     573                 :             :               gpointer       user_data)
+     574                 :             : {
+     575                 :           1 :   ValentSftpPlugin *self = VALENT_SFTP_PLUGIN (user_data);
+     576                 :             : 
+     577         [ +  - ]:           1 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     578                 :             : 
+     579   [ -  +  -  - ]:           1 :   if (self->session != NULL && self->session->uri != NULL)
+     580                 :           0 :     g_app_info_launch_default_for_uri_async (self->session->uri,
+     581                 :             :                                              NULL, NULL, NULL, NULL);
+     582                 :             :   else
+     583                 :           1 :     valent_sftp_plugin_sftp_request (self);
+     584                 :           1 : }
+     585                 :             : 
+     586                 :             : static const GActionEntry actions[] = {
+     587                 :             :     {"browse", mount_action, NULL, NULL, NULL}
+     588                 :             : };
+     589                 :             : 
+     590                 :             : 
+     591                 :             : /*
+     592                 :             :  * ValentDevicePlugin
+     593                 :             :  */
+     594                 :             : static void
+     595                 :          10 : valent_sftp_plugin_update_state (ValentDevicePlugin *plugin,
+     596                 :             :                                  ValentDeviceState   state)
+     597                 :             : {
+     598                 :          10 :   ValentSftpPlugin *self = VALENT_SFTP_PLUGIN (plugin);
+     599                 :          10 :   gboolean available;
+     600                 :             : 
+     601         [ +  - ]:          10 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     602                 :             : 
+     603                 :          10 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     604                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     605                 :             : 
+     606                 :          10 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     607                 :             : 
+     608                 :             :   /* GMounts */
+     609         [ +  + ]:          10 :   if (available)
+     610                 :             :     {
+     611                 :           3 :       GSettings *settings;
+     612                 :             : 
+     613                 :           3 :       sftp_session_find (self);
+     614                 :             : 
+     615                 :           3 :       settings = valent_extension_get_settings (VALENT_EXTENSION (plugin));
+     616                 :             : 
+     617         [ -  + ]:           3 :       if (g_settings_get_boolean (settings, "auto-mount"))
+     618                 :           0 :         valent_sftp_plugin_sftp_request (self);
+     619                 :             :     }
+     620                 :          10 : }
+     621                 :             : 
+     622                 :             : static void
+     623                 :           2 : valent_sftp_plugin_handle_packet (ValentDevicePlugin *plugin,
+     624                 :             :                                   const char         *type,
+     625                 :             :                                   JsonNode           *packet)
+     626                 :             : {
+     627                 :           2 :   ValentSftpPlugin *self = VALENT_SFTP_PLUGIN (plugin);
+     628                 :             : 
+     629         [ +  - ]:           2 :   g_assert (VALENT_IS_SFTP_PLUGIN (self));
+     630         [ -  + ]:           2 :   g_assert (type != NULL);
+     631         [ -  + ]:           2 :   g_assert (VALENT_IS_PACKET (packet));
+     632                 :             : 
+     633         [ +  + ]:           2 :   if (g_str_equal (type, "kdeconnect.sftp"))
+     634                 :           1 :     valent_sftp_plugin_handle_sftp (self, packet);
+     635                 :             : 
+     636         [ +  - ]:           1 :   else if (g_str_equal (type, "kdeconnect.sftp.request"))
+     637                 :           1 :     valent_sftp_plugin_handle_request (self, packet);
+     638                 :             : 
+     639                 :             :   else
+     640                 :           0 :     g_warn_if_reached ();
+     641                 :           2 : }
+     642                 :             : 
+     643                 :             : /*
+     644                 :             :  * ValentObject
+     645                 :             :  */
+     646                 :             : static void
+     647                 :           6 : valent_sftp_plugin_destroy (ValentObject *object)
+     648                 :             : {
+     649                 :           6 :   ValentSftpPlugin *self = VALENT_SFTP_PLUGIN (object);
+     650                 :           6 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     651                 :             : 
+     652                 :             :   /* Stop watching the volume monitor and unmount any current session */
+     653         [ +  + ]:           6 :   if (self->monitor != NULL)
+     654                 :             :     {
+     655                 :           3 :       g_signal_handlers_disconnect_by_data (self->monitor, self);
+     656         [ +  - ]:           3 :       g_clear_object (&self->monitor);
+     657                 :             :     }
+     658         [ -  + ]:           6 :   g_clear_pointer (&self->session, sftp_session_end);
+     659                 :             : 
+     660                 :           6 :   valent_device_plugin_set_menu_item (plugin, "device.sftp.browse", NULL);
+     661                 :             : 
+     662                 :           6 :   VALENT_OBJECT_CLASS (valent_sftp_plugin_parent_class)->destroy (object);
+     663                 :           6 : }
+     664                 :             : 
+     665                 :             : /*
+     666                 :             :  * GObject
+     667                 :             :  */
+     668                 :             : static void
+     669                 :           3 : valent_sftp_plugin_constructed (GObject *object)
+     670                 :             : {
+     671                 :           3 :   ValentSftpPlugin *self = VALENT_SFTP_PLUGIN (object);
+     672                 :           3 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     673                 :             : 
+     674                 :           3 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     675                 :             :                                    actions,
+     676                 :             :                                    G_N_ELEMENTS (actions),
+     677                 :             :                                    plugin);
+     678                 :           3 :   valent_device_plugin_set_menu_action (plugin,
+     679                 :             :                                         "device.sftp.browse",
+     680                 :           3 :                                         _("Browse Files"),
+     681                 :             :                                         "folder-remote-symbolic");
+     682                 :             : 
+     683                 :             :   /* Watch the volume monitor */
+     684                 :           3 :   self->monitor = g_volume_monitor_get ();
+     685                 :           3 :   g_signal_connect_object (self->monitor,
+     686                 :             :                            "mount-added",
+     687                 :             :                            G_CALLBACK (on_mount_added),
+     688                 :             :                            self, 0);
+     689                 :           3 :   g_signal_connect_object (self->monitor,
+     690                 :             :                            "mount-removed",
+     691                 :             :                            G_CALLBACK (on_mount_removed),
+     692                 :             :                            self, 0);
+     693                 :             : 
+     694                 :           3 :   G_OBJECT_CLASS (valent_sftp_plugin_parent_class)->constructed (object);
+     695                 :           3 : }
+     696                 :             : 
+     697                 :             : static void
+     698                 :           2 : valent_sftp_plugin_class_init (ValentSftpPluginClass *klass)
+     699                 :             : {
+     700                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     701                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     702                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     703                 :             : 
+     704                 :           2 :   object_class->constructed = valent_sftp_plugin_constructed;
+     705                 :             : 
+     706                 :           2 :   vobject_class->destroy = valent_sftp_plugin_destroy;
+     707                 :             : 
+     708                 :           2 :   plugin_class->handle_packet = valent_sftp_plugin_handle_packet;
+     709                 :           2 :   plugin_class->update_state = valent_sftp_plugin_update_state;
+     710                 :             : }
+     711                 :             : 
+     712                 :             : static void
+     713                 :           3 : valent_sftp_plugin_init (ValentSftpPlugin *self)
+     714                 :             : {
+     715                 :           3 : }
+     716                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-plugin.h.func-c.html b/coverage/src/plugins/sftp/valent-sftp-plugin.h.func-c.html new file mode 100644 index 00000000000..068932f2eaf --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SFTP_PLUGIN17
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-plugin.h.func.html b/coverage/src/plugins/sftp/valent-sftp-plugin.h.func.html new file mode 100644 index 00000000000..4aa0febbbc9 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SFTP_PLUGIN17
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-plugin.h.gcov.html b/coverage/src/plugins/sftp/valent-sftp-plugin.h.gcov.html new file mode 100644 index 00000000000..9f87cafc188 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SFTP_PLUGIN (valent_sftp_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          17 : G_DECLARE_FINAL_TYPE (ValentSftpPlugin, valent_sftp_plugin, VALENT, SFTP_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-preferences.c.func-c.html b/coverage/src/plugins/sftp/valent-sftp-preferences.c.func-c.html new file mode 100644 index 00000000000..e5c6239cf74 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-preferences.c.func-c.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:75.0 %4433
Test Date:2024-03-31 18:46:36Functions:87.5 %87
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:15.0 %203
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_toggle_row0
valent_sftp_preferences_constructed1
valent_sftp_preferences_dispose1
valent_sftp_preferences_init1
valent_sftp_preferences_class_init2
valent_sftp_preferences_get_type7
valent_sftp_preferences_class_intern_init2
valent_sftp_preferences_get_type_once2
valent_sftp_preferences_get_type3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-preferences.c.func.html b/coverage/src/plugins/sftp/valent-sftp-preferences.c.func.html new file mode 100644 index 00000000000..d6da599ef2c --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-preferences.c.func.html @@ -0,0 +1,154 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:75.0 %4433
Test Date:2024-03-31 18:46:36Functions:87.5 %87
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:15.0 %203
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_toggle_row0
valent_sftp_preferences_class_init2
valent_sftp_preferences_constructed1
valent_sftp_preferences_dispose1
valent_sftp_preferences_get_type7
valent_sftp_preferences_class_intern_init2
valent_sftp_preferences_get_type3
valent_sftp_preferences_get_type_once2
valent_sftp_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sftp/valent-sftp-preferences.c.gcov.html b/coverage/src/plugins/sftp/valent-sftp-preferences.c.gcov.html new file mode 100644 index 00000000000..10a63285666 --- /dev/null +++ b/coverage/src/plugins/sftp/valent-sftp-preferences.c.gcov.html @@ -0,0 +1,198 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sftp/valent-sftp-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sftp - valent-sftp-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:75.0 %4433
Test Date:2024-03-31 18:46:36Functions:87.5 %87
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:15.0 %203
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sftp-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-sftp-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentSftpPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   GtkSwitch                    *auto_mount;
+      22                 :             :   AdwExpanderRow               *local_allow;
+      23                 :             :   GtkAdjustment                *local_port;
+      24                 :             : };
+      25                 :             : 
+      26   [ +  +  +  - ]:           7 : G_DEFINE_FINAL_TYPE (ValentSftpPreferences, valent_sftp_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      27                 :             : 
+      28                 :             : 
+      29                 :             : static void
+      30                 :           0 : on_toggle_row (GtkListBox    *box,
+      31                 :             :                GtkListBoxRow *row,
+      32                 :             :                gpointer       user_data)
+      33                 :             : {
+      34                 :           0 :   gboolean active;
+      35                 :           0 :   GtkWidget *grid;
+      36                 :           0 :   GtkWidget *toggle;
+      37                 :             : 
+      38   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX (box));
+             #  #  #  # ]
+      39   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX_ROW (row));
+             #  #  #  # ]
+      40                 :             : 
+      41                 :           0 :   grid = gtk_list_box_row_get_child (row);
+      42                 :           0 :   toggle = gtk_grid_get_child_at (GTK_GRID (grid), 1, 0);
+      43                 :             : 
+      44                 :           0 :   g_object_get (toggle, "active", &active, NULL);
+      45                 :           0 :   g_object_set (toggle, "active", !active, NULL);
+      46                 :           0 : }
+      47                 :             : 
+      48                 :             : /*
+      49                 :             :  * GObject
+      50                 :             :  */
+      51                 :             : static void
+      52                 :           1 : valent_sftp_preferences_constructed (GObject *object)
+      53                 :             : {
+      54                 :           1 :   ValentSftpPreferences *self = VALENT_SFTP_PREFERENCES (object);
+      55                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      56                 :           1 :   GSettings *settings;
+      57                 :             : 
+      58                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+      59                 :           1 :   g_settings_bind (settings,         "auto-mount",
+      60                 :           1 :                    self->auto_mount, "active",
+      61                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      62                 :           1 :   g_settings_bind (settings,          "local-allow",
+      63                 :           1 :                    self->local_allow, "enable-expansion",
+      64                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      65                 :           1 :   g_settings_bind (settings,         "local-port",
+      66                 :           1 :                    self->local_port, "value",
+      67                 :             :                    G_SETTINGS_BIND_DEFAULT);
+      68                 :             : 
+      69                 :           1 :   G_OBJECT_CLASS (valent_sftp_preferences_parent_class)->constructed (object);
+      70                 :           1 : }
+      71                 :             : 
+      72                 :             : static void
+      73                 :           1 : valent_sftp_preferences_dispose (GObject *object)
+      74                 :             : {
+      75                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+      76                 :             : 
+      77                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_SFTP_PREFERENCES);
+      78                 :             : 
+      79                 :           1 :   G_OBJECT_CLASS (valent_sftp_preferences_parent_class)->dispose (object);
+      80                 :           1 : }
+      81                 :             : 
+      82                 :             : static void
+      83                 :           2 : valent_sftp_preferences_class_init (ValentSftpPreferencesClass *klass)
+      84                 :             : {
+      85                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+      86                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+      87                 :             : 
+      88                 :           2 :   object_class->constructed = valent_sftp_preferences_constructed;
+      89                 :           2 :   object_class->dispose = valent_sftp_preferences_dispose;
+      90                 :             : 
+      91                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/sftp/valent-sftp-preferences.ui");
+      92                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSftpPreferences, auto_mount);
+      93                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSftpPreferences, local_allow);
+      94                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSftpPreferences, local_port);
+      95                 :             : 
+      96                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_toggle_row);
+      97                 :           2 : }
+      98                 :             : 
+      99                 :             : static void
+     100                 :           1 : valent_sftp_preferences_init (ValentSftpPreferences *self)
+     101                 :             : {
+     102                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     103                 :           1 : }
+     104                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-detail-sort-b.html b/coverage/src/plugins/share/index-detail-sort-b.html new file mode 100644 index 00000000000..db2da805d2e --- /dev/null +++ b/coverage/src/plugins/share/index-detail-sort-b.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-detail-sort-f.html b/coverage/src/plugins/share/index-detail-sort-f.html new file mode 100644 index 00000000000..a4c3a6521c5 --- /dev/null +++ b/coverage/src/plugins/share/index-detail-sort-f.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-detail-sort-l.html b/coverage/src/plugins/share/index-detail-sort-l.html new file mode 100644 index 00000000000..0be93354d8b --- /dev/null +++ b/coverage/src/plugins/share/index-detail-sort-l.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-detail.html b/coverage/src/plugins/share/index-detail.html new file mode 100644 index 00000000000..80d9568187c --- /dev/null +++ b/coverage/src/plugins/share/index-detail.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-sort-b.html b/coverage/src/plugins/share/index-sort-b.html new file mode 100644 index 00000000000..db2da805d2e --- /dev/null +++ b/coverage/src/plugins/share/index-sort-b.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-sort-f.html b/coverage/src/plugins/share/index-sort-f.html new file mode 100644 index 00000000000..a4c3a6521c5 --- /dev/null +++ b/coverage/src/plugins/share/index-sort-f.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index-sort-l.html b/coverage/src/plugins/share/index-sort-l.html new file mode 100644 index 00000000000..0be93354d8b --- /dev/null +++ b/coverage/src/plugins/share/index-sort-l.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/index.html b/coverage/src/plugins/share/index.html new file mode 100644 index 00000000000..80d9568187c --- /dev/null +++ b/coverage/src/plugins/share/index.html @@ -0,0 +1,338 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/shareCoverageTotalHit
Test:Code CoverageLines:76.5 %13081001
Test Date:2024-03-31 18:46:36Functions:82.4 %136112
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:39.8 %840334
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
share-plugin.c +
100.0%
+
100.0 %55-100.0 %11
valent-share-download.c +
78.7%78.7%
+
78.7 %12710039.8 %883588.9 %1816
valent-share-download.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-plugin.c +
78.8%78.8%
+
78.8 %57545344.1 %37416582.9 %3529
valent-share-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-preferences.c +
57.3%57.3%
+
57.3 %754317.9 %28580.0 %108
valent-share-preferences.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-target-chooser.c +
65.3%65.3%
+
65.3 %17311331.7 %822666.7 %2114
valent-share-target-chooser.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-target.c +
36.8%36.8%
+
36.8 %381412.5 %32471.4 %75
valent-share-target.h +
0.0%
+
0.0 %10.0 %60.0 %1
valent-share-text-dialog.c +
72.3%72.3%
+
72.3 %946835.0 %401480.0 %1512
valent-share-text-dialog.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-share-upload.c +
93.5%93.5%
+
93.5 %21420045.5 %15470100.0 %2222
valent-share-upload.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/share-plugin.c.func-c.html b/coverage/src/plugins/share/share-plugin.c.func-c.html new file mode 100644 index 00000000000..ec756666bce --- /dev/null +++ b/coverage/src/plugins/share/share-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/share-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - share-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_share_plugin_register_types6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/share-plugin.c.func.html b/coverage/src/plugins/share/share-plugin.c.func.html new file mode 100644 index 00000000000..f41d9e8bd79 --- /dev/null +++ b/coverage/src/plugins/share/share-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/share-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - share-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_share_plugin_register_types6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/share-plugin.c.gcov.html b/coverage/src/plugins/share/share-plugin.c.gcov.html new file mode 100644 index 00000000000..b832baea8bd --- /dev/null +++ b/coverage/src/plugins/share/share-plugin.c.gcov.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/share-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - share-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %55
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-share-plugin.h"
+      10                 :             : #include "valent-share-preferences.h"
+      11                 :             : #include "valent-share-target.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : _VALENT_EXTERN void
+      15                 :           6 : valent_share_plugin_register_types (PeasObjectModule *module)
+      16                 :             : {
+      17                 :           6 :   peas_object_module_register_extension_type (module,
+      18                 :             :                                               VALENT_TYPE_APPLICATION_PLUGIN,
+      19                 :             :                                               VALENT_TYPE_SHARE_TARGET);
+      20                 :           6 :   peas_object_module_register_extension_type (module,
+      21                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      22                 :             :                                               VALENT_TYPE_SHARE_PLUGIN);
+      23                 :           6 :   peas_object_module_register_extension_type (module,
+      24                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      25                 :             :                                               VALENT_TYPE_SHARE_PREFERENCES);
+      26                 :           6 : }
+      27                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-download.c.func-c.html b/coverage/src/plugins/share/valent-share-download.c.func-c.html new file mode 100644 index 00000000000..87a2a7d7976 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-download.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-download.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-download.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.7 %127100
Test Date:2024-03-31 18:46:36Functions:88.9 %1816
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:39.8 %8835
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_share_download_get_item_type0
valent_share_download_update0
valent_share_download_timeout1
g_list_model_iface_init2
valent_share_download_class_init2
valent_share_download_finalize4
valent_share_download_get_item4
valent_share_download_execute5
valent_share_download_init5
valent_share_download_new5
valent_share_download_set_property5
valent_share_download_add_file6
valent_transfer_execute_cb6
valent_share_download_get_n_items10
valent_share_download_get_property10
valent_share_download_get_type30
valent_share_download_class_intern_init2
valent_share_download_get_type_once2
valent_share_download_get_type26
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-download.c.func.html b/coverage/src/plugins/share/valent-share-download.c.func.html new file mode 100644 index 00000000000..fb0e907e533 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-download.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-download.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-download.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.7 %127100
Test Date:2024-03-31 18:46:36Functions:88.9 %1816
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:39.8 %8835
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init2
valent_share_download_add_file6
valent_share_download_class_init2
valent_share_download_execute5
valent_share_download_finalize4
valent_share_download_get_item4
valent_share_download_get_item_type0
valent_share_download_get_n_items10
valent_share_download_get_property10
valent_share_download_get_type30
valent_share_download_class_intern_init2
valent_share_download_get_type26
valent_share_download_get_type_once2
valent_share_download_init5
valent_share_download_new5
valent_share_download_set_property5
valent_share_download_timeout1
valent_share_download_update0
valent_transfer_execute_cb6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-download.c.gcov.html b/coverage/src/plugins/share/valent-share-download.c.gcov.html new file mode 100644 index 00000000000..df548f4187c --- /dev/null +++ b/coverage/src/plugins/share/valent-share-download.c.gcov.html @@ -0,0 +1,476 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-download.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-download.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.7 %127100
Test Date:2024-03-31 18:46:36Functions:88.9 %1816
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:39.8 %8835
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-download"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-share-download.h"
+      12                 :             : 
+      13                 :             : /* The maximum time in milliseconds to wait for the next expected transfer item,
+      14                 :             :  * allowing for the gap between one file completing and the packet for the next.
+      15                 :             :  *
+      16                 :             :  * The current timeout matches kdeconnect-android which waits 1000ms before
+      17                 :             :  * reporting an error, while kdeconnect-kde has no wait period. */
+      18                 :             : #define OPERATION_TIMEOUT_MS 1000
+      19                 :             : 
+      20                 :             : 
+      21                 :             : /**
+      22                 :             :  * ValentShareDownload:
+      23                 :             :  *
+      24                 :             :  * A class for multi-file downloads.
+      25                 :             :  *
+      26                 :             :  * `ValentShareDownload` is a class that supports multi-file downloads for
+      27                 :             :  * `ValentSharePlugin`.
+      28                 :             :  */
+      29                 :             : 
+      30                 :             : struct _ValentShareDownload
+      31                 :             : {
+      32                 :             :   ValentTransfer  parent_instance;
+      33                 :             : 
+      34                 :             :   ValentDevice   *device;
+      35                 :             :   GPtrArray      *items;
+      36                 :             : 
+      37                 :             :   unsigned int    position;
+      38                 :             :   int64_t         number_of_files;
+      39                 :             :   goffset         payload_size;
+      40                 :             : };
+      41                 :             : 
+      42                 :             : static void       g_list_model_iface_init       (GListModelInterface *iface);
+      43                 :             : static gboolean   valent_share_download_timeout (gpointer             data);
+      44                 :             : 
+      45   [ +  +  +  - ]:          30 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentShareDownload, valent_share_download, VALENT_TYPE_TRANSFER,
+      46                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      47                 :             : 
+      48                 :             : enum {
+      49                 :             :   PROP_0,
+      50                 :             :   PROP_DEVICE,
+      51                 :             :   N_PROPERTIES,
+      52                 :             : };
+      53                 :             : 
+      54                 :             : static GParamSpec *properties[N_PROPERTIES] = { 0, };
+      55                 :             : 
+      56                 :             : 
+      57                 :             : /*
+      58                 :             :  * ValentTransfer
+      59                 :             :  */
+      60                 :             : static void
+      61                 :           6 : valent_transfer_execute_cb (GObject      *object,
+      62                 :             :                             GAsyncResult *result,
+      63                 :             :                             gpointer      user_data)
+      64                 :             : {
+      65                 :           6 :   ValentTransfer *transfer = VALENT_TRANSFER (object);
+      66                 :           6 :   ValentShareDownload *self = g_task_get_source_object (G_TASK (user_data));
+      67                 :           6 :   g_autoptr (GTask) task = G_TASK (user_data);
+      68   [ -  -  +  - ]:           6 :   g_autoptr (GError) error = NULL;
+      69                 :             : 
+      70         [ -  + ]:           6 :   if (!valent_transfer_execute_finish (transfer, result, &error))
+      71         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+      72                 :             : 
+      73         [ -  + ]:           6 :   if (self->position < self->items->len)
+      74                 :             :     {
+      75                 :           0 :       ValentTransfer *item = g_ptr_array_index (self->items, self->position++);
+      76                 :             : 
+      77                 :           0 :       valent_transfer_execute (item,
+      78                 :             :                                g_task_get_cancellable (task),
+      79                 :             :                                valent_transfer_execute_cb,
+      80                 :             :                                g_object_ref (task));
+      81                 :             :     }
+      82         [ +  + ]:           6 :   else if (self->position < self->number_of_files)
+      83                 :             :     {
+      84         [ -  + ]:           6 :       g_autoptr (GSource) source = NULL;
+      85                 :             : 
+      86                 :           2 :       source = g_timeout_source_new (OPERATION_TIMEOUT_MS);
+      87         [ +  - ]:           2 :       g_task_attach_source (task, source, valent_share_download_timeout);
+      88                 :             :     }
+      89                 :             :   else
+      90                 :             :     {
+      91                 :           4 :       g_task_return_boolean (task, TRUE);
+      92                 :             :     }
+      93                 :             : }
+      94                 :             : 
+      95                 :             : static gboolean
+      96                 :           1 : valent_share_download_timeout (gpointer data)
+      97                 :             : {
+      98                 :           1 :   ValentShareDownload *self = g_task_get_source_object (G_TASK (data));
+      99                 :           1 :   GTask *task = G_TASK (data);
+     100                 :             : 
+     101         [ +  - ]:           1 :   if (g_task_return_error_if_cancelled (task))
+     102                 :             :     return G_SOURCE_REMOVE;
+     103                 :             : 
+     104         [ +  - ]:           1 :   if (self->position < self->items->len)
+     105                 :             :     {
+     106                 :           1 :       ValentTransfer *item = g_ptr_array_index (self->items, self->position++);
+     107                 :             : 
+     108                 :           1 :       valent_transfer_execute (item,
+     109                 :             :                                g_task_get_cancellable (task),
+     110                 :             :                                valent_transfer_execute_cb,
+     111                 :             :                                g_object_ref (task));
+     112                 :             :     }
+     113         [ #  # ]:           0 :   else if (self->position < self->number_of_files)
+     114                 :             :     {
+     115                 :           0 :       g_task_return_new_error (task,
+     116                 :             :                                G_IO_ERROR,
+     117                 :             :                                G_IO_ERROR_PARTIAL_INPUT,
+     118                 :             :                                "Failed to receive %u of %u files",
+     119                 :             :                                (unsigned int)self->number_of_files - self->position,
+     120                 :             :                                (unsigned int)self->number_of_files);
+     121                 :             :     }
+     122                 :             : 
+     123                 :             :   return G_SOURCE_REMOVE;
+     124                 :             : }
+     125                 :             : 
+     126                 :             : static void
+     127                 :           5 : valent_share_download_execute (ValentTransfer      *transfer,
+     128                 :             :                                GCancellable        *cancellable,
+     129                 :             :                                GAsyncReadyCallback  callback,
+     130                 :             :                                gpointer             user_data)
+     131                 :             : {
+     132                 :           5 :   ValentShareDownload *self = VALENT_SHARE_DOWNLOAD (transfer);
+     133                 :          10 :   g_autoptr (GTask) task = NULL;
+     134                 :             : 
+     135         [ +  - ]:           5 :   g_assert (VALENT_IS_SHARE_DOWNLOAD (self));
+     136   [ +  -  +  -  :           5 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     137                 :             : 
+     138                 :           5 :   task = g_task_new (self, cancellable, callback, user_data);
+     139         [ +  - ]:           5 :   g_task_set_source_tag (task, valent_share_download_execute);
+     140                 :             : 
+     141         [ +  - ]:           5 :   if (self->position < self->items->len)
+     142                 :             :     {
+     143                 :           5 :       ValentTransfer *item = g_ptr_array_index (self->items, self->position++);
+     144                 :             : 
+     145                 :           5 :       valent_transfer_execute (item,
+     146                 :             :                                g_task_get_cancellable (task),
+     147                 :             :                                valent_transfer_execute_cb,
+     148                 :             :                                g_object_ref (task));
+     149                 :             :     }
+     150         [ #  # ]:           0 :   else if (self->position < self->number_of_files)
+     151                 :             :     {
+     152         [ +  - ]:           5 :       g_autoptr (GSource) source = NULL;
+     153                 :             : 
+     154                 :           0 :       source = g_timeout_source_new (OPERATION_TIMEOUT_MS);
+     155         [ #  # ]:           0 :       g_task_attach_source (task, source, valent_share_download_timeout);
+     156                 :             :     }
+     157                 :             :   else
+     158                 :             :     {
+     159                 :           0 :       g_task_return_boolean (task, TRUE);
+     160                 :             :     }
+     161                 :           5 : }
+     162                 :             : 
+     163                 :             : /*
+     164                 :             :  * GListModel
+     165                 :             :  */
+     166                 :             : static gpointer
+     167                 :           4 : valent_share_download_get_item (GListModel   *model,
+     168                 :             :                                 unsigned int  position)
+     169                 :             : {
+     170                 :           4 :   ValentShareDownload *self = VALENT_SHARE_DOWNLOAD (model);
+     171                 :             : 
+     172         [ +  - ]:           4 :   g_assert (VALENT_SHARE_DOWNLOAD (self));
+     173                 :             : 
+     174         [ +  - ]:           4 :   if G_UNLIKELY (position >= self->items->len)
+     175                 :             :     return NULL;
+     176                 :             : 
+     177                 :           4 :   return g_object_ref (g_ptr_array_index (self->items, position));
+     178                 :             : }
+     179                 :             : 
+     180                 :             : static GType
+     181                 :           0 : valent_share_download_get_item_type (GListModel *model)
+     182                 :             : {
+     183         [ #  # ]:           0 :   g_assert (VALENT_SHARE_DOWNLOAD (model));
+     184                 :             : 
+     185                 :           0 :   return VALENT_TYPE_TRANSFER;
+     186                 :             : }
+     187                 :             : 
+     188                 :             : static unsigned int
+     189                 :          10 : valent_share_download_get_n_items (GListModel *model)
+     190                 :             : {
+     191                 :          10 :   ValentShareDownload *self = VALENT_SHARE_DOWNLOAD (model);
+     192                 :             : 
+     193         [ +  - ]:          10 :   g_assert (VALENT_SHARE_DOWNLOAD (self));
+     194                 :             : 
+     195                 :             :   /* FIXME: this indicates the number of total transfers, not the number of
+     196                 :             :    *        items currently available in the list model. */
+     197                 :          10 :   return self->number_of_files;
+     198                 :             : }
+     199                 :             : 
+     200                 :             : static void
+     201                 :           2 : g_list_model_iface_init (GListModelInterface *iface)
+     202                 :             : {
+     203                 :           2 :   iface->get_item = valent_share_download_get_item;
+     204                 :           2 :   iface->get_item_type = valent_share_download_get_item_type;
+     205                 :           2 :   iface->get_n_items = valent_share_download_get_n_items;
+     206                 :           2 : }
+     207                 :             : 
+     208                 :             : /*
+     209                 :             :  * GObject
+     210                 :             :  */
+     211                 :             : static void
+     212                 :           4 : valent_share_download_finalize (GObject *object)
+     213                 :             : {
+     214                 :           4 :   ValentShareDownload *self = VALENT_SHARE_DOWNLOAD (object);
+     215                 :             : 
+     216         [ +  - ]:           4 :   g_clear_object (&self->device);
+     217         [ +  - ]:           4 :   g_clear_pointer (&self->items, g_ptr_array_unref);
+     218                 :             : 
+     219                 :           4 :   G_OBJECT_CLASS (valent_share_download_parent_class)->finalize (object);
+     220                 :           4 : }
+     221                 :             : 
+     222                 :             : static void
+     223                 :          10 : valent_share_download_get_property (GObject    *object,
+     224                 :             :                                     guint       prop_id,
+     225                 :             :                                     GValue     *value,
+     226                 :             :                                     GParamSpec *pspec)
+     227                 :             : {
+     228                 :          10 :   ValentShareDownload *self = VALENT_SHARE_DOWNLOAD (object);
+     229                 :             : 
+     230         [ +  - ]:          10 :   switch (prop_id)
+     231                 :             :     {
+     232                 :          10 :     case PROP_DEVICE:
+     233                 :          10 :       g_value_set_object (value, self->device);
+     234                 :          10 :       break;
+     235                 :             : 
+     236                 :           0 :     default:
+     237                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     238                 :             :     }
+     239                 :          10 : }
+     240                 :             : 
+     241                 :             : static void
+     242                 :           5 : valent_share_download_set_property (GObject      *object,
+     243                 :             :                                     guint         prop_id,
+     244                 :             :                                     const GValue *value,
+     245                 :             :                                     GParamSpec   *pspec)
+     246                 :             : {
+     247                 :           5 :   ValentShareDownload *self = VALENT_SHARE_DOWNLOAD (object);
+     248                 :             : 
+     249         [ +  - ]:           5 :   switch (prop_id)
+     250                 :             :     {
+     251                 :           5 :     case PROP_DEVICE:
+     252                 :           5 :       self->device = g_value_dup_object (value);
+     253                 :           5 :       break;
+     254                 :             : 
+     255                 :           0 :     default:
+     256                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     257                 :             :     }
+     258                 :           5 : }
+     259                 :             : 
+     260                 :             : static void
+     261                 :           2 : valent_share_download_class_init (ValentShareDownloadClass *klass)
+     262                 :             : {
+     263                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     264                 :           2 :   ValentTransferClass *transfer_class = VALENT_TRANSFER_CLASS (klass);
+     265                 :             : 
+     266                 :           2 :   object_class->finalize = valent_share_download_finalize;
+     267                 :           2 :   object_class->get_property = valent_share_download_get_property;
+     268                 :           2 :   object_class->set_property = valent_share_download_set_property;
+     269                 :             : 
+     270                 :           2 :   transfer_class->execute = valent_share_download_execute;
+     271                 :             : 
+     272                 :             :   /**
+     273                 :             :    * ValentShareDownload:device:
+     274                 :             :    *
+     275                 :             :    * The [class@Valent.Device] this transfer is for.
+     276                 :             :    */
+     277                 :           4 :   properties [PROP_DEVICE] =
+     278                 :           2 :     g_param_spec_object ("device", NULL, NULL,
+     279                 :             :                          VALENT_TYPE_DEVICE,
+     280                 :             :                          (G_PARAM_READWRITE |
+     281                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     282                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     283                 :             :                           G_PARAM_STATIC_STRINGS));
+     284                 :             : 
+     285                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     286                 :           2 : }
+     287                 :             : 
+     288                 :             : static void
+     289                 :           5 : valent_share_download_init (ValentShareDownload *self)
+     290                 :             : {
+     291                 :           5 :   self->items = g_ptr_array_new_with_free_func (g_object_unref);
+     292                 :           5 : }
+     293                 :             : 
+     294                 :             : /**
+     295                 :             :  * valent_share_download_new:
+     296                 :             :  * @device: a `ValentDevice`
+     297                 :             :  *
+     298                 :             :  * Create a new `ValentShareDownload`.
+     299                 :             :  *
+     300                 :             :  * Returns: (transfer full): a new `ValentShareDownload`
+     301                 :             :  */
+     302                 :             : ValentTransfer *
+     303                 :           5 : valent_share_download_new (ValentDevice *device)
+     304                 :             : {
+     305         [ +  - ]:           5 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+     306                 :             : 
+     307                 :           5 :   return g_object_new (VALENT_TYPE_SHARE_DOWNLOAD,
+     308                 :             :                        "device", device,
+     309                 :             :                        NULL);
+     310                 :             : }
+     311                 :             : 
+     312                 :             : /**
+     313                 :             :  * valent_share_download_add_file:
+     314                 :             :  * @group: a `ValentShareDownload`
+     315                 :             :  * @file: a `GFile`
+     316                 :             :  * @packet: a KDE Connect packet
+     317                 :             :  *
+     318                 :             :  * Add @file to the transfer operation.
+     319                 :             :  */
+     320                 :             : void
+     321                 :           6 : valent_share_download_add_file (ValentShareDownload *download,
+     322                 :             :                                 GFile               *file,
+     323                 :             :                                 JsonNode            *packet)
+     324                 :             : {
+     325                 :           6 :   g_autoptr (ValentTransfer) item = NULL;
+     326                 :           6 :   unsigned int position, added;
+     327                 :           6 :   int64_t number_of_files;
+     328                 :           6 :   goffset total_payload_size;
+     329                 :             : 
+     330         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_SHARE_DOWNLOAD (download));
+     331   [ +  -  +  -  :           6 :   g_return_if_fail (G_IS_FILE (file));
+             +  -  -  + ]
+     332         [ -  + ]:           6 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     333                 :             : 
+     334         [ -  + ]:           6 :   if (!valent_packet_get_int (packet, "numberOfFiles", &number_of_files))
+     335                 :           0 :     number_of_files = download->number_of_files + 1;
+     336                 :             : 
+     337         [ -  + ]:           6 :   if (!valent_packet_get_int (packet, "totalPayloadSize", &total_payload_size))
+     338                 :           0 :     total_payload_size = download->payload_size + valent_packet_get_payload_size (packet);
+     339                 :             : 
+     340                 :           6 :   position = download->items->len;
+     341                 :           6 :   added = number_of_files - download->number_of_files;
+     342                 :             : 
+     343                 :           6 :   download->number_of_files = number_of_files;
+     344                 :           6 :   download->payload_size = total_payload_size;
+     345                 :             : 
+     346                 :           6 :   item = valent_device_transfer_new (download->device, packet, file);
+     347                 :           6 :   g_ptr_array_add (download->items, g_steal_pointer (&item));
+     348                 :             : 
+     349                 :             :   /* FIXME: this indicates the number of total transfers, not the number of
+     350                 :             :    *        items currently available in the list model. */
+     351                 :           6 :   g_list_model_items_changed (G_LIST_MODEL (download), position, 0, added);
+     352                 :             : }
+     353                 :             : 
+     354                 :             : /**
+     355                 :             :  * valent_share_download_update:
+     356                 :             :  * @download: a `ValentShareDownload`
+     357                 :             :  * @packet: a KDE Connect packet
+     358                 :             :  *
+     359                 :             :  * Update the number of files and total payload size for @download.
+     360                 :             :  */
+     361                 :             : void
+     362                 :           0 : valent_share_download_update (ValentShareDownload *self,
+     363                 :             :                               JsonNode            *packet)
+     364                 :             : {
+     365         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_SHARE_DOWNLOAD (self));
+     366         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_PACKET (packet));
+     367                 :             : 
+     368         [ #  # ]:           0 :   if (!valent_packet_get_int (packet, "numberOfFiles", &self->number_of_files))
+     369                 :             :     {
+     370                 :           0 :       g_debug ("%s(): expected \"numberOfFiles\" field holding an integer",
+     371                 :             :                G_STRFUNC);
+     372                 :           0 :       return;
+     373                 :             :     }
+     374                 :             : 
+     375         [ #  # ]:           0 :   if (!valent_packet_get_int (packet, "totalPayloadSize", &self->payload_size))
+     376                 :             :     {
+     377                 :           0 :       g_debug ("%s(): expected \"totalPayloadSize\" field holding an integer",
+     378                 :             :                G_STRFUNC);
+     379                 :           0 :       return;
+     380                 :             :     }
+     381                 :             : }
+     382                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-download.h.func-c.html b/coverage/src/plugins/share/valent-share-download.h.func-c.html new file mode 100644 index 00000000000..be02539d34d --- /dev/null +++ b/coverage/src/plugins/share/valent-share-download.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-download.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-download.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_DOWNLOAD21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-download.h.func.html b/coverage/src/plugins/share/valent-share-download.h.func.html new file mode 100644 index 00000000000..fdf661bc7c7 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-download.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-download.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-download.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_DOWNLOAD21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-download.h.gcov.html b/coverage/src/plugins/share/valent-share-download.h.gcov.html new file mode 100644 index 00000000000..5b961b8155b --- /dev/null +++ b/coverage/src/plugins/share/valent-share-download.h.gcov.html @@ -0,0 +1,115 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-download.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-download.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SHARE_DOWNLOAD (valent_share_download_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          21 : G_DECLARE_FINAL_TYPE (ValentShareDownload, valent_share_download, VALENT, SHARE_DOWNLOAD, ValentTransfer)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentTransfer * valent_share_download_new      (ValentDevice         *device);
+      15                 :             : void             valent_share_download_add_file (ValentShareDownload  *download,
+      16                 :             :                                                  GFile                *file,
+      17                 :             :                                                  JsonNode             *packet);
+      18                 :             : void             valent_share_download_update   (ValentShareDownload  *download,
+      19                 :             :                                                  JsonNode             *packet);
+      20                 :             : 
+      21                 :             : G_END_DECLS
+      22                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-plugin.c.func-c.html b/coverage/src/plugins/share/valent-share-plugin.c.func-c.html new file mode 100644 index 00000000000..3f17a7c8e9e --- /dev/null +++ b/coverage/src/plugins/share/valent-share-plugin.c.func-c.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.8 %575453
Test Date:2024-03-31 18:46:36Functions:82.9 %3529
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.1 %374165
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_file_dialog_open_multiple_cb0
share_cancel_action0
share_chooser_action0
share_view_action0
valent_share_plugin_handle_text_cb0
valent_share_plugin_upload_files0
share_text_action1
share_uris_action1
valent_share_download_open_cb1
valent_share_download_open_notification1
valent_share_plugin_handle_file_update1
valent_share_plugin_handle_text1
valent_share_plugin_handle_url1
valent_share_plugin_open_file1
valent_share_upload_open_cb1
share_open_action2
valent_share_upload_file_cb2
valent_share_upload_open_notification2
valent_share_download_file_cb4
valent_share_plugin_upload_file5
valent_share_upload_files_added5
valent_share_plugin_create_download_file7
valent_share_plugin_handle_file7
valent_share_upload_file_notification7
share_uri_action9
valent_share_download_file_notification10
valent_share_plugin_finalize10
valent_share_plugin_handle_packet10
valent_share_plugin_constructed11
valent_share_plugin_init11
valent_share_plugin_destroy20
valent_share_plugin_update_state36
valent_share_plugin_get_type107
valent_share_plugin_class_intern_init6
valent_share_plugin_get_type_once6
valent_share_plugin_get_type95
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-plugin.c.func.html b/coverage/src/plugins/share/valent-share-plugin.c.func.html new file mode 100644 index 00000000000..b002a7364ac --- /dev/null +++ b/coverage/src/plugins/share/valent-share-plugin.c.func.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.8 %575453
Test Date:2024-03-31 18:46:36Functions:82.9 %3529
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.1 %374165
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_file_dialog_open_multiple_cb0
share_cancel_action0
share_chooser_action0
share_open_action2
share_text_action1
share_uri_action9
share_uris_action1
share_view_action0
valent_share_download_file_cb4
valent_share_download_file_notification10
valent_share_download_open_cb1
valent_share_download_open_notification1
valent_share_plugin_constructed11
valent_share_plugin_create_download_file7
valent_share_plugin_destroy20
valent_share_plugin_finalize10
valent_share_plugin_get_type107
valent_share_plugin_class_intern_init6
valent_share_plugin_get_type95
valent_share_plugin_get_type_once6
valent_share_plugin_handle_file7
valent_share_plugin_handle_file_update1
valent_share_plugin_handle_packet10
valent_share_plugin_handle_text1
valent_share_plugin_handle_text_cb0
valent_share_plugin_handle_url1
valent_share_plugin_init11
valent_share_plugin_open_file1
valent_share_plugin_update_state36
valent_share_plugin_upload_file5
valent_share_plugin_upload_files0
valent_share_upload_file_cb2
valent_share_upload_file_notification7
valent_share_upload_files_added5
valent_share_upload_open_cb1
valent_share_upload_open_notification2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-plugin.c.gcov.html b/coverage/src/plugins/share/valent-share-plugin.c.gcov.html new file mode 100644 index 00000000000..02e8ab6c77f --- /dev/null +++ b/coverage/src/plugins/share/valent-share-plugin.c.gcov.html @@ -0,0 +1,1386 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:78.8 %575453
Test Date:2024-03-31 18:46:36Functions:82.9 %3529
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:44.1 %374165
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <json-glib/json-glib.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-share-plugin.h"
+      15                 :             : #include "valent-share-download.h"
+      16                 :             : #include "valent-share-text-dialog.h"
+      17                 :             : #include "valent-share-upload.h"
+      18                 :             : 
+      19                 :             : 
+      20                 :             : struct _ValentSharePlugin
+      21                 :             : {
+      22                 :             :   ValentDevicePlugin  parent_instance;
+      23                 :             : 
+      24                 :             :   GHashTable         *transfers;
+      25                 :             :   ValentTransfer     *upload;
+      26                 :             :   ValentTransfer     *download;
+      27                 :             : 
+      28                 :             :   GPtrArray          *windows;
+      29                 :             : };
+      30                 :             : 
+      31   [ +  +  +  - ]:         107 : G_DEFINE_FINAL_TYPE (ValentSharePlugin, valent_share_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      32                 :             : 
+      33                 :             : 
+      34                 :             : static GFile *
+      35                 :           7 : valent_share_plugin_create_download_file (ValentSharePlugin *self,
+      36                 :             :                                           const char        *filename,
+      37                 :             :                                           gboolean           unique)
+      38                 :             : {
+      39                 :           7 :   GSettings *settings;
+      40                 :          14 :   g_autofree char *download_folder = NULL;
+      41                 :             : 
+      42         [ +  - ]:           7 :   g_return_val_if_fail (VALENT_IS_SHARE_PLUGIN (self), NULL);
+      43         [ -  + ]:           7 :   g_return_val_if_fail (filename != NULL, NULL);
+      44                 :             : 
+      45                 :             :   /* Check for a configured download directory, returning a fallback if
+      46                 :             :    * necessary, but don't save the fallback as though it were configured. */
+      47                 :           7 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+      48                 :           7 :   download_folder = g_settings_get_string (settings, "download-folder");
+      49                 :             : 
+      50   [ +  -  +  - ]:           7 :   if (download_folder == NULL || *download_folder == '\0')
+      51                 :             :     {
+      52                 :           7 :       const char *user_download = NULL;
+      53                 :             : 
+      54                 :           7 :       user_download = valent_get_user_directory (G_USER_DIRECTORY_DOWNLOAD);
+      55                 :           7 :       g_set_str (&download_folder, user_download);
+      56                 :             :     }
+      57                 :             : 
+      58         [ -  + ]:           7 :   if (g_mkdir_with_parents (download_folder, 0700) == -1)
+      59                 :             :     {
+      60                 :           0 :       int error = errno;
+      61                 :             : 
+      62                 :           0 :       g_critical ("%s(): creating \"%s\": %s",
+      63                 :             :                   G_STRFUNC,
+      64                 :             :                   download_folder,
+      65                 :             :                   g_strerror (error));
+      66                 :             :     }
+      67                 :             : 
+      68                 :           7 :   return valent_get_user_file (download_folder, filename, unique);
+      69                 :             : }
+      70                 :             : 
+      71                 :             : /*
+      72                 :             :  * File Downloads
+      73                 :             :  */
+      74                 :             : static void
+      75                 :          10 : valent_share_download_file_notification (ValentSharePlugin *self,
+      76                 :             :                                          ValentTransfer    *transfer)
+      77                 :             : {
+      78                 :          10 :   g_autoptr (ValentDevice) device = NULL;
+      79   [ +  -  -  - ]:          10 :   g_autoptr (GNotification) notification = NULL;
+      80   [ +  -  -  - ]:          10 :   g_autoptr (GIcon) icon = NULL;
+      81                 :          10 :   const char *title = NULL;
+      82   [ +  -  -  - ]:          10 :   g_autofree char *body = NULL;
+      83                 :          10 :   g_autofree char *id = NULL;
+      84                 :          10 :   unsigned int n_files = 0;
+      85                 :          10 :   const char *device_name;
+      86                 :          10 :   ValentTransferState state = VALENT_TRANSFER_STATE_PENDING;
+      87                 :             : 
+      88         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+      89         [ -  + ]:          10 :   g_return_if_fail (VALENT_IS_SHARE_DOWNLOAD (transfer));
+      90                 :             : 
+      91         [ +  - ]:          10 :   if ((n_files = g_list_model_get_n_items (G_LIST_MODEL (transfer))) == 0)
+      92                 :             :     return;
+      93                 :             : 
+      94                 :          10 :   g_object_get (transfer,
+      95                 :             :                 "device", &device,
+      96                 :             :                 "id",     &id,
+      97                 :             :                 "state",  &state,
+      98                 :             :                 NULL);
+      99                 :          10 :   device_name = valent_device_get_name (device);
+     100                 :             : 
+     101   [ +  +  -  - ]:          10 :   switch (state)
+     102                 :             :     {
+     103                 :           6 :     case VALENT_TRANSFER_STATE_PENDING:
+     104                 :             :     case VALENT_TRANSFER_STATE_ACTIVE:
+     105                 :           6 :       icon = g_themed_icon_new ("document-save-symbolic");
+     106                 :           6 :       title = _("Transferring Files");
+     107                 :           6 :       body = g_strdup_printf (ngettext ("Receiving one file from %1$s",
+     108                 :             :                                         "Receiving %2$d files from %1$s",
+     109                 :             :                                         n_files),
+     110                 :             :                               device_name, n_files);
+     111                 :           6 :       break;
+     112                 :             : 
+     113                 :           4 :     case VALENT_TRANSFER_STATE_COMPLETE:
+     114                 :           4 :       icon = g_themed_icon_new ("document-save-symbolic");
+     115                 :           4 :       title = _("Transfer Complete");
+     116                 :           4 :       body = g_strdup_printf (ngettext ("Received one file from %1$s",
+     117                 :             :                                         "Received %2$d files from %1$s",
+     118                 :             :                                         n_files),
+     119                 :             :                               device_name, n_files);
+     120                 :           4 :       break;
+     121                 :             : 
+     122                 :           0 :     case VALENT_TRANSFER_STATE_FAILED:
+     123                 :           0 :       icon = g_themed_icon_new ("dialog-warning-symbolic");
+     124                 :           0 :       title = _("Transfer Failed");
+     125                 :           0 :       body = g_strdup_printf (ngettext ("Receiving one file from %1$s",
+     126                 :             :                                         "Receiving %2$d files from %1$s",
+     127                 :             :                                         n_files),
+     128                 :             :                               device_name, n_files);
+     129                 :           0 :       break;
+     130                 :             :     }
+     131                 :             : 
+     132                 :          10 :   notification = g_notification_new (title);
+     133                 :          10 :   g_notification_set_body (notification, body);
+     134                 :          10 :   g_notification_set_icon (notification, icon);
+     135                 :             : 
+     136         [ +  + ]:          10 :   if (state == VALENT_TRANSFER_STATE_ACTIVE)
+     137                 :             :     {
+     138                 :           6 :       valent_notification_add_device_button (notification,
+     139                 :             :                                              device,
+     140                 :           6 :                                              _("Cancel"),
+     141                 :             :                                              "share.cancel",
+     142                 :             :                                              g_variant_new_string (id));
+     143                 :             :     }
+     144         [ +  - ]:           4 :   else if (state == VALENT_TRANSFER_STATE_COMPLETE)
+     145                 :             :     {
+     146                 :          14 :       g_autoptr (ValentTransfer) item = NULL;
+     147         [ +  - ]:           4 :       g_autoptr (GFile) file = NULL;
+     148         [ +  - ]:           4 :       g_autoptr (GFile) dir = NULL;
+     149         [ +  - ]:           4 :       g_autofree char *dirname = NULL;
+     150                 :             : 
+     151                 :           4 :       item = g_list_model_get_item (G_LIST_MODEL (transfer), 0);
+     152                 :           4 :       file = valent_device_transfer_ref_file (VALENT_DEVICE_TRANSFER (item));
+     153                 :           4 :       dir = g_file_get_parent (file);
+     154                 :           4 :       dirname = g_file_get_uri (dir);
+     155                 :             : 
+     156                 :           4 :       valent_notification_add_device_button (notification,
+     157                 :             :                                              device,
+     158                 :           4 :                                              _("Open Folder"),
+     159                 :             :                                              "share.view",
+     160                 :             :                                              g_variant_new_string (dirname));
+     161                 :             : 
+     162         [ +  - ]:           4 :       if (n_files == 1)
+     163                 :             :         {
+     164                 :           4 :           g_autofree char *uri = NULL;
+     165                 :             : 
+     166                 :           4 :           uri = g_file_get_uri (file);
+     167                 :           8 :           valent_notification_add_device_button (notification,
+     168                 :             :                                                  device,
+     169                 :           4 :                                                  _("Open File"),
+     170                 :             :                                                  "share.view",
+     171                 :             :                                                  g_variant_new_string (uri));
+     172                 :             :         }
+     173                 :             :     }
+     174                 :             : 
+     175                 :          10 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     176                 :             :                                           id,
+     177                 :             :                                           notification);
+     178                 :             : }
+     179                 :             : 
+     180                 :             : static void
+     181                 :           4 : valent_share_download_file_cb (ValentTransfer *transfer,
+     182                 :             :                                GAsyncResult   *result,
+     183                 :             :                                gpointer        user_data)
+     184                 :             : {
+     185                 :           8 :   g_autoptr (ValentSharePlugin) self = VALENT_SHARE_PLUGIN (user_data);
+     186                 :           4 :   g_autofree char *id = NULL;
+     187                 :           4 :   g_autoptr (GError) error = NULL;
+     188                 :             : 
+     189         [ +  - ]:           4 :   g_assert (VALENT_IS_TRANSFER (transfer));
+     190                 :             : 
+     191                 :           4 :   id = valent_transfer_dup_id (transfer);
+     192                 :             : 
+     193   [ -  +  -  - ]:           4 :   if (valent_transfer_execute_finish (transfer, result, &error) ||
+     194                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     195                 :           4 :     valent_share_download_file_notification (self, transfer);
+     196                 :             :   else
+     197                 :           0 :     valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self), id);
+     198                 :             : 
+     199         [ +  + ]:           4 :   if (self->download == transfer)
+     200         [ +  - ]:           3 :     g_clear_object (&self->download);
+     201                 :             : 
+     202         [ -  + ]:           4 :   g_hash_table_remove (self->transfers, id);
+     203                 :           4 : }
+     204                 :             : 
+     205                 :             : /*
+     206                 :             :  * File Download (Open)
+     207                 :             :  */
+     208                 :             : static void
+     209                 :           1 : valent_share_download_open_notification (ValentSharePlugin *self,
+     210                 :             :                                          ValentTransfer    *transfer)
+     211                 :             : {
+     212                 :           1 :   g_autoptr (ValentDevice) device = NULL;
+     213   [ +  -  -  - ]:           1 :   g_autoptr (GFile) file = NULL;
+     214   [ +  -  -  - ]:           1 :   g_autoptr (GNotification) notification = NULL;
+     215   [ +  -  -  - ]:           1 :   g_autoptr (GIcon) icon = NULL;
+     216                 :           1 :   const char *title = NULL;
+     217   [ +  -  -  - ]:           1 :   g_autofree char *body = NULL;
+     218                 :           1 :   g_autofree char *id = NULL;
+     219                 :           1 :   g_autofree char *filename = NULL;
+     220                 :           1 :   const char *device_name;
+     221                 :           1 :   ValentTransferState state = VALENT_TRANSFER_STATE_PENDING;
+     222                 :             : 
+     223         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+     224         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_DEVICE_TRANSFER (transfer));
+     225                 :             : 
+     226                 :           1 :   g_object_get (transfer,
+     227                 :             :                 "device", &device,
+     228                 :             :                 "file",   &file,
+     229                 :             :                 "id",     &id,
+     230                 :             :                 "state",  &state,
+     231                 :             :                 NULL);
+     232                 :           1 :   device_name = valent_device_get_name (device);
+     233                 :           1 :   filename = g_file_get_basename (file);
+     234                 :             : 
+     235   [ +  -  -  - ]:           1 :   switch (state)
+     236                 :             :     {
+     237                 :           1 :     case VALENT_TRANSFER_STATE_PENDING:
+     238                 :             :     case VALENT_TRANSFER_STATE_ACTIVE:
+     239                 :           1 :       icon = g_themed_icon_new ("document-save-symbolic");
+     240                 :           1 :       title = _("Transferring File");
+     241                 :           1 :       body = g_strdup_printf (_("Opening “%s” from %s"), filename, device_name);
+     242                 :           1 :       break;
+     243                 :             : 
+     244                 :           0 :     case VALENT_TRANSFER_STATE_COMPLETE:
+     245                 :           0 :       valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self), id);
+     246                 :           0 :       return;
+     247                 :             : 
+     248                 :           0 :     case VALENT_TRANSFER_STATE_FAILED:
+     249                 :           0 :       icon = g_themed_icon_new ("dialog-warning-symbolic");
+     250                 :           0 :       title = _("Transfer Failed");
+     251                 :           0 :       body = g_strdup_printf (_("Opening “%s” from %s"), filename, device_name);
+     252                 :           0 :       break;
+     253                 :             :     }
+     254                 :             : 
+     255                 :           1 :   notification = g_notification_new (title);
+     256                 :           1 :   g_notification_set_body (notification, body);
+     257                 :           1 :   g_notification_set_icon (notification, icon);
+     258                 :             : 
+     259         [ +  - ]:           1 :   if (state == VALENT_TRANSFER_STATE_ACTIVE)
+     260                 :             :     {
+     261                 :           1 :       valent_notification_add_device_button (notification,
+     262                 :             :                                              device,
+     263                 :           1 :                                              _("Cancel"),
+     264                 :             :                                              "share.cancel",
+     265                 :             :                                              g_variant_new_string (id));
+     266                 :             :     }
+     267                 :             : 
+     268                 :           1 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     269                 :             :                                           id,
+     270                 :             :                                           notification);
+     271                 :             : }
+     272                 :             : 
+     273                 :             : static void
+     274                 :           1 : valent_share_download_open_cb (ValentTransfer *transfer,
+     275                 :             :                                GAsyncResult   *result,
+     276                 :             :                                gpointer        user_data)
+     277                 :             : {
+     278                 :           2 :   g_autoptr (ValentSharePlugin) self = VALENT_SHARE_PLUGIN (user_data);
+     279                 :           1 :   g_autofree char *id = NULL;
+     280                 :           1 :   g_autoptr (GError) error = NULL;
+     281                 :             : 
+     282         [ +  - ]:           1 :   g_assert (VALENT_IS_TRANSFER (transfer));
+     283                 :             : 
+     284                 :           1 :   id = valent_transfer_dup_id (transfer);
+     285                 :             : 
+     286         [ +  - ]:           1 :   if (valent_transfer_execute_finish (transfer, result, &error))
+     287                 :             :     {
+     288                 :           2 :       g_autoptr (GFile) file = NULL;
+     289         [ +  - ]:           1 :       g_autofree char *uri = NULL;
+     290                 :             : 
+     291                 :           1 :       file = valent_device_transfer_ref_file (VALENT_DEVICE_TRANSFER (transfer));
+     292                 :           1 :       uri = g_file_get_uri (file);
+     293                 :             : 
+     294                 :           1 :       g_app_info_launch_default_for_uri_async (uri, NULL, NULL, NULL, NULL);
+     295                 :           1 :       valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self), id);
+     296                 :             :     }
+     297         [ #  # ]:           0 :   else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     298                 :             :     {
+     299                 :           0 :       valent_share_download_open_notification (self, transfer);
+     300                 :             :     }
+     301                 :             : 
+     302         [ -  + ]:           1 :   g_hash_table_remove (self->transfers, id);
+     303                 :           1 : }
+     304                 :             : 
+     305                 :             : /*
+     306                 :             :  * File Upload (Open)
+     307                 :             :  */
+     308                 :             : static void
+     309                 :           2 : valent_share_upload_open_notification (ValentSharePlugin *self,
+     310                 :             :                                        ValentTransfer    *transfer)
+     311                 :             : {
+     312                 :           2 :   g_autoptr (ValentDevice) device = NULL;
+     313   [ +  -  -  - ]:           2 :   g_autoptr (GFile) file = NULL;
+     314   [ +  -  -  - ]:           2 :   g_autoptr (GNotification) notification = NULL;
+     315   [ +  -  -  - ]:           2 :   g_autoptr (GIcon) icon = NULL;
+     316                 :           2 :   const char *title = NULL;
+     317   [ +  -  -  - ]:           2 :   g_autofree char *body = NULL;
+     318                 :           2 :   g_autofree char *id = NULL;
+     319                 :           2 :   g_autofree char *filename = NULL;
+     320                 :           2 :   const char *device_name;
+     321                 :           2 :   ValentTransferState state = VALENT_TRANSFER_STATE_PENDING;
+     322                 :             : 
+     323         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+     324         [ -  + ]:           2 :   g_return_if_fail (VALENT_IS_DEVICE_TRANSFER (transfer));
+     325                 :             : 
+     326                 :           2 :   g_object_get (transfer,
+     327                 :             :                 "device", &device,
+     328                 :             :                 "file",   &file,
+     329                 :             :                 "id",     &id,
+     330                 :             :                 "state",  &state,
+     331                 :             :                 NULL);
+     332                 :           2 :   device_name = valent_device_get_name (device);
+     333                 :           2 :   filename = g_file_get_basename (file);
+     334                 :             : 
+     335   [ +  +  -  - ]:           2 :   switch (state)
+     336                 :             :     {
+     337                 :           1 :     case VALENT_TRANSFER_STATE_PENDING:
+     338                 :             :     case VALENT_TRANSFER_STATE_ACTIVE:
+     339                 :           1 :       icon = g_themed_icon_new ("document-send-symbolic");
+     340                 :           1 :       title = _("Transferring File");
+     341                 :           1 :       body = g_strdup_printf (_("Opening “%s” on %s"), filename, device_name);
+     342                 :           1 :       break;
+     343                 :             : 
+     344                 :           1 :     case VALENT_TRANSFER_STATE_COMPLETE:
+     345                 :           1 :       icon = g_themed_icon_new ("document-send-symbolic");
+     346                 :           1 :       title = _("Transfer Complete");
+     347                 :           1 :       body = g_strdup_printf (_("Opened “%s” on %s"), filename, device_name);
+     348                 :           1 :       break;
+     349                 :             : 
+     350                 :           0 :     case VALENT_TRANSFER_STATE_FAILED:
+     351                 :           0 :       icon = g_themed_icon_new ("dialog-warning-symbolic");
+     352                 :           0 :       title = _("Transfer Failed");
+     353                 :           0 :       body = g_strdup_printf (_("Opening “%s” on %s"), filename, device_name);
+     354                 :           0 :       break;
+     355                 :             :     }
+     356                 :             : 
+     357                 :           2 :   notification = g_notification_new (title);
+     358                 :           2 :   g_notification_set_body (notification, body);
+     359                 :           2 :   g_notification_set_icon (notification, icon);
+     360                 :             : 
+     361         [ +  + ]:           2 :   if (state == VALENT_TRANSFER_STATE_ACTIVE)
+     362                 :             :     {
+     363                 :           1 :       valent_notification_add_device_button (notification,
+     364                 :             :                                              device,
+     365                 :           1 :                                              _("Cancel"),
+     366                 :             :                                              "share.cancel",
+     367                 :             :                                              g_variant_new_string (id));
+     368                 :             :     }
+     369                 :             : 
+     370                 :           2 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     371                 :             :                                           id,
+     372                 :             :                                           notification);
+     373                 :             : }
+     374                 :             : 
+     375                 :             : static void
+     376                 :           1 : valent_share_upload_open_cb (ValentTransfer *transfer,
+     377                 :             :                              GAsyncResult   *result,
+     378                 :             :                              gpointer        user_data)
+     379                 :             : {
+     380                 :           2 :   g_autoptr (ValentSharePlugin) self = VALENT_SHARE_PLUGIN (user_data);
+     381                 :           1 :   g_autofree char *id = NULL;
+     382                 :           1 :   g_autoptr (GError) error = NULL;
+     383                 :             : 
+     384         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE_TRANSFER (transfer));
+     385         [ -  + ]:           1 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     386                 :             : 
+     387                 :           1 :   id = valent_transfer_dup_id (transfer);
+     388                 :             : 
+     389   [ -  +  -  - ]:           1 :   if (valent_transfer_execute_finish (transfer, result, &error) ||
+     390                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     391                 :           1 :     valent_share_upload_open_notification (self, transfer);
+     392                 :             :   else
+     393                 :           0 :     valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self), id);
+     394                 :             : 
+     395         [ -  + ]:           1 :   g_hash_table_remove (self->transfers, id);
+     396                 :           1 : }
+     397                 :             : 
+     398                 :             : static void
+     399                 :           1 : valent_share_plugin_open_file (ValentSharePlugin *self,
+     400                 :             :                                GFile             *file)
+     401                 :             : {
+     402                 :           1 :   ValentDevice *device = NULL;
+     403                 :           2 :   g_autoptr (ValentTransfer) transfer = NULL;
+     404         [ +  - ]:           1 :   g_autofree char *filename = NULL;
+     405                 :           1 :   g_autoptr (JsonBuilder) builder = NULL;
+     406         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     407                 :             : 
+     408                 :           1 :   filename = g_file_get_basename (file);
+     409                 :             : 
+     410                 :           1 :   valent_packet_init (&builder, "kdeconnect.share.request");
+     411                 :           1 :   json_builder_set_member_name (builder, "filename");
+     412                 :           1 :   json_builder_add_string_value (builder, filename);
+     413                 :           1 :   json_builder_set_member_name (builder, "open");
+     414                 :           1 :   json_builder_add_boolean_value (builder, TRUE);
+     415                 :           1 :   packet = valent_packet_end (&builder);
+     416                 :             : 
+     417                 :             :   /* File uploads that request to be opened are sent as discrete transfers
+     418                 :             :    * because the remote client (i.e. kdeconnect-android) may download them
+     419                 :             :    * discretely. Otherwise the remote client may get confused by the
+     420                 :             :    * `numberOfFiles` field and consider a concurrent multi-file transfer as
+     421                 :             :    * incomplete.
+     422                 :             :    */
+     423                 :           1 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     424                 :           1 :   transfer = valent_device_transfer_new (device, packet, file);
+     425                 :           2 :   g_hash_table_insert (self->transfers,
+     426                 :           1 :                        valent_transfer_dup_id (transfer),
+     427                 :             :                        g_object_ref (transfer));
+     428                 :             : 
+     429                 :           1 :   valent_transfer_execute (transfer,
+     430                 :             :                            NULL,
+     431                 :             :                            (GAsyncReadyCallback)valent_share_upload_open_cb,
+     432                 :             :                            g_object_ref (self));
+     433         [ +  - ]:           1 :   valent_share_upload_open_notification (self, transfer);
+     434                 :           1 : }
+     435                 :             : 
+     436                 :             : /*
+     437                 :             :  * File Uploads
+     438                 :             :  */
+     439                 :             : static void
+     440                 :           7 : valent_share_upload_file_notification (ValentSharePlugin *self,
+     441                 :             :                                        ValentTransfer    *transfer)
+     442                 :             : {
+     443                 :           7 :   g_autoptr (ValentDevice) device = NULL;
+     444   [ +  -  -  - ]:           7 :   g_autoptr (GNotification) notification = NULL;
+     445   [ +  -  -  - ]:           7 :   g_autoptr (GIcon) icon = NULL;
+     446                 :           7 :   const char *title = NULL;
+     447   [ +  -  -  - ]:           7 :   g_autofree char *body = NULL;
+     448                 :           7 :   g_autofree char *id = NULL;
+     449                 :           7 :   unsigned int n_files = 0;
+     450                 :           7 :   const char *device_name;
+     451                 :           7 :   ValentTransferState state = VALENT_TRANSFER_STATE_PENDING;
+     452                 :             : 
+     453         [ +  - ]:           7 :   g_return_if_fail (VALENT_IS_TRANSFER (transfer));
+     454         [ -  + ]:           7 :   g_return_if_fail (VALENT_IS_SHARE_UPLOAD (transfer));
+     455                 :             : 
+     456         [ +  - ]:           7 :   if ((n_files = g_list_model_get_n_items (G_LIST_MODEL (transfer))) == 0)
+     457                 :             :     return;
+     458                 :             : 
+     459                 :           7 :   g_object_get (transfer,
+     460                 :             :                 "device", &device,
+     461                 :             :                 "id",     &id,
+     462                 :             :                 "state",  &state,
+     463                 :             :                 NULL);
+     464                 :           7 :   device_name = valent_device_get_name (device);
+     465                 :             : 
+     466   [ +  +  -  - ]:           7 :   switch (state)
+     467                 :             :     {
+     468                 :           5 :     case VALENT_TRANSFER_STATE_PENDING:
+     469                 :             :     case VALENT_TRANSFER_STATE_ACTIVE:
+     470                 :           5 :       icon = g_themed_icon_new ("document-send-symbolic");
+     471                 :           5 :       title = _("Transferring Files");
+     472                 :           5 :       body = g_strdup_printf (ngettext ("Sending one file to %1$s",
+     473                 :             :                                         "Sending %2$d files to %1$s",
+     474                 :             :                                         n_files),
+     475                 :             :                               device_name, n_files);
+     476                 :           5 :       break;
+     477                 :             : 
+     478                 :           2 :     case VALENT_TRANSFER_STATE_COMPLETE:
+     479                 :           2 :       icon = g_themed_icon_new ("document-send-symbolic");
+     480                 :           2 :       title = _("Transfer Complete");
+     481                 :           2 :       body = g_strdup_printf (ngettext ("Sent one file to %1$s",
+     482                 :             :                                         "Sent %2$d files to %1$s",
+     483                 :             :                                         n_files),
+     484                 :             :                               device_name, n_files);
+     485                 :           2 :       break;
+     486                 :             : 
+     487                 :           0 :     case VALENT_TRANSFER_STATE_FAILED:
+     488                 :           0 :       icon = g_themed_icon_new ("dialog-warning-symbolic");
+     489                 :           0 :       title = _("Transfer Failed");
+     490                 :           0 :       body = g_strdup_printf (ngettext ("Sending one file to %1$s",
+     491                 :             :                                         "Sending %2$d files to %1$s",
+     492                 :             :                                         n_files),
+     493                 :             :                               device_name, n_files);
+     494                 :           0 :       break;
+     495                 :             :     }
+     496                 :             : 
+     497                 :           7 :   notification = g_notification_new (title);
+     498                 :           7 :   g_notification_set_body (notification, body);
+     499                 :           7 :   g_notification_set_icon (notification, icon);
+     500                 :             : 
+     501         [ +  + ]:           7 :   if (state == VALENT_TRANSFER_STATE_ACTIVE)
+     502                 :             :     {
+     503                 :           5 :       valent_notification_add_device_button (notification,
+     504                 :             :                                              device,
+     505                 :           5 :                                              _("Cancel"),
+     506                 :             :                                              "share.cancel",
+     507                 :             :                                              g_variant_new_string (id));
+     508                 :             :     }
+     509                 :             : 
+     510                 :           7 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     511                 :             :                                           id,
+     512                 :             :                                           notification);
+     513                 :             : }
+     514                 :             : 
+     515                 :             : static void
+     516                 :           2 : valent_share_upload_file_cb (ValentTransfer *transfer,
+     517                 :             :                              GAsyncResult   *result,
+     518                 :             :                              gpointer        user_data)
+     519                 :             : {
+     520                 :           4 :   g_autoptr (ValentSharePlugin) self = VALENT_SHARE_PLUGIN (user_data);
+     521                 :           2 :   g_autofree char *id = NULL;
+     522                 :           2 :   g_autoptr (GError) error = NULL;
+     523                 :             : 
+     524         [ +  - ]:           2 :   g_assert (VALENT_IS_SHARE_UPLOAD (transfer));
+     525         [ -  + ]:           2 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     526                 :             : 
+     527                 :           2 :   id = valent_transfer_dup_id (transfer);
+     528                 :             : 
+     529   [ -  +  -  - ]:           2 :   if (valent_transfer_execute_finish (transfer, result, &error) ||
+     530                 :           0 :       !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     531                 :           2 :     valent_share_upload_file_notification (self, transfer);
+     532                 :             :   else
+     533                 :           0 :     valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self), id);
+     534                 :             : 
+     535         [ +  - ]:           2 :   if (self->upload == transfer)
+     536         [ +  - ]:           2 :     g_clear_object (&self->upload);
+     537                 :             : 
+     538         [ -  + ]:           2 :   g_hash_table_remove (self->transfers, id);
+     539                 :           2 : }
+     540                 :             : 
+     541                 :             : static void
+     542                 :           5 : valent_share_upload_files_added (ValentTransfer    *transfer,
+     543                 :             :                                  unsigned int       position,
+     544                 :             :                                  unsigned int       removed,
+     545                 :             :                                  unsigned int       added,
+     546                 :             :                                  ValentSharePlugin *self)
+     547                 :             : {
+     548         [ +  - ]:           5 :   g_assert (VALENT_IS_SHARE_UPLOAD (transfer));
+     549         [ -  + ]:           5 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     550                 :             : 
+     551                 :             :   /* If no files were added, something went wrong */
+     552         [ -  + ]:           5 :   g_return_if_fail (added > 0);
+     553                 :             : 
+     554                 :             :   /* Start the transfer, if necessary */
+     555         [ +  + ]:           5 :   if (valent_transfer_get_state (transfer) == VALENT_TRANSFER_STATE_PENDING)
+     556                 :             :     {
+     557                 :           2 :       valent_transfer_execute (transfer,
+     558                 :             :                                NULL,
+     559                 :             :                                (GAsyncReadyCallback)valent_share_upload_file_cb,
+     560                 :             :                                g_object_ref (self));
+     561                 :             :     }
+     562                 :             : 
+     563                 :           5 :   valent_share_upload_file_notification (self, transfer);
+     564                 :             : }
+     565                 :             : 
+     566                 :             : static void
+     567                 :           5 : valent_share_plugin_upload_file (ValentSharePlugin *self,
+     568                 :             :                                  GFile             *file)
+     569                 :             : {
+     570         [ +  - ]:           5 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     571   [ +  -  +  -  :           5 :   g_assert (G_IS_FILE (file));
+             +  -  -  + ]
+     572                 :             : 
+     573                 :             :   /* Create a new transfer, if necessary */
+     574         [ +  + ]:           5 :   if (self->upload == NULL)
+     575                 :             :     {
+     576                 :           2 :       ValentDevice *device;
+     577                 :             : 
+     578                 :           2 :       device = valent_extension_get_object (VALENT_EXTENSION (self));
+     579                 :             : 
+     580                 :           2 :       self->upload = valent_share_upload_new (device);
+     581                 :           2 :       g_signal_connect_object (self->upload,
+     582                 :             :                                "items-changed",
+     583                 :             :                                G_CALLBACK (valent_share_upload_files_added),
+     584                 :             :                                self, 0);
+     585                 :           2 :       g_hash_table_replace (self->transfers,
+     586                 :           2 :                             valent_transfer_dup_id (self->upload),
+     587                 :           2 :                             g_object_ref (self->upload));
+     588                 :             :     }
+     589                 :             : 
+     590                 :           5 :   valent_share_upload_add_file (VALENT_SHARE_UPLOAD (self->upload), file);
+     591                 :           5 : }
+     592                 :             : 
+     593                 :             : static void
+     594                 :           0 : valent_share_plugin_upload_files (ValentSharePlugin *self,
+     595                 :             :                                   GListModel        *files)
+     596                 :             : {
+     597         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     598         [ #  # ]:           0 :   g_assert (G_IS_LIST_MODEL (files));
+     599         [ #  # ]:           0 :   g_assert (g_list_model_get_item_type (files) == G_TYPE_FILE);
+     600                 :             : 
+     601                 :             :   /* Create a new transfer, if necessary */
+     602         [ #  # ]:           0 :   if (self->upload == NULL)
+     603                 :             :     {
+     604                 :           0 :       ValentDevice *device;
+     605                 :             : 
+     606                 :           0 :       device = valent_extension_get_object (VALENT_EXTENSION (self));
+     607                 :             : 
+     608                 :           0 :       self->upload = valent_share_upload_new (device);
+     609                 :           0 :       g_signal_connect_object (self->upload,
+     610                 :             :                                "items-changed",
+     611                 :             :                                G_CALLBACK (valent_share_upload_files_added),
+     612                 :             :                                self, 0);
+     613                 :           0 :       g_hash_table_replace (self->transfers,
+     614                 :           0 :                             valent_transfer_dup_id (self->upload),
+     615                 :           0 :                             g_object_ref (self->upload));
+     616                 :             :     }
+     617                 :             : 
+     618                 :           0 :   valent_share_upload_add_files (VALENT_SHARE_UPLOAD (self->upload), files);
+     619                 :           0 : }
+     620                 :             : 
+     621                 :             : /*
+     622                 :             :  * GActions
+     623                 :             :  */
+     624                 :             : static void
+     625                 :           0 : gtk_file_dialog_open_multiple_cb (GtkFileDialog     *dialog,
+     626                 :             :                                   GAsyncResult      *result,
+     627                 :             :                                   ValentSharePlugin *self)
+     628                 :             : {
+     629                 :           0 :   g_autoptr (GListModel) files = NULL;
+     630                 :           0 :   g_autoptr (GError) error = NULL;
+     631                 :             : 
+     632                 :           0 :   files = gtk_file_dialog_open_multiple_finish (dialog, result, &error);
+     633                 :             : 
+     634         [ #  # ]:           0 :   if (files == NULL)
+     635                 :             :     {
+     636   [ #  #  #  # ]:           0 :       if (!g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED) &&
+     637                 :           0 :           !g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_DISMISSED))
+     638                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+     639                 :             : 
+     640         [ #  # ]:           0 :       return;
+     641                 :             :     }
+     642                 :             : 
+     643         [ #  # ]:           0 :   valent_share_plugin_upload_files (self, files);
+     644                 :             : }
+     645                 :             : 
+     646                 :             : /**
+     647                 :             :  * ValentSharePlugin|share.chooser:
+     648                 :             :  * @parameter: %NULL
+     649                 :             :  *
+     650                 :             :  * The default share action opens the platform-specific dialog for selecting
+     651                 :             :  * files, typically a `GtkFileChooserDialog`.
+     652                 :             :  */
+     653                 :             : static void
+     654                 :           0 : share_chooser_action (GSimpleAction *action,
+     655                 :             :                       GVariant      *parameter,
+     656                 :             :                       gpointer       user_data)
+     657                 :             : {
+     658                 :           0 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (user_data);
+     659                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     660                 :           0 :   GtkFileDialog *dialog;
+     661                 :             : 
+     662         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     663                 :             : 
+     664         [ #  # ]:           0 :   if (!gtk_is_initialized ())
+     665                 :             :     {
+     666                 :           0 :       g_warning ("%s: No display available", G_OBJECT_TYPE_NAME (self));
+     667                 :           0 :       return;
+     668                 :             :     }
+     669                 :             : 
+     670                 :           0 :   dialog = g_object_new (GTK_TYPE_FILE_DIALOG,
+     671                 :             :                          "title",           _("Share Files"),
+     672                 :             :                          "accept-label",    _("Share"),
+     673                 :             :                          "select-multiple", TRUE,
+     674                 :             :                          NULL);
+     675                 :             : 
+     676                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+     677         [ #  # ]:           0 :   gtk_file_dialog_open_multiple (dialog,
+     678                 :             :                                  NULL,
+     679                 :             :                                  destroy,
+     680                 :             :                                  (GAsyncReadyCallback)gtk_file_dialog_open_multiple_cb,
+     681                 :             :                                  self);
+     682                 :             : }
+     683                 :             : 
+     684                 :             : /**
+     685                 :             :  * ValentSharePlugin|share.cancel:
+     686                 :             :  * @parameter: "s"
+     687                 :             :  * @id: The transfer ID
+     688                 :             :  *
+     689                 :             :  * Each transfer is given a UUID for the purposes of cancelling it. Usually this
+     690                 :             :  * action will only be activated from the transfer notification as sent by
+     691                 :             :  * upload_operation() or the incoming file handler.
+     692                 :             :  */
+     693                 :             : static void
+     694                 :           0 : share_cancel_action (GSimpleAction *action,
+     695                 :             :                      GVariant      *parameter,
+     696                 :             :                      gpointer       user_data)
+     697                 :             : {
+     698                 :           0 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (user_data);
+     699                 :           0 :   ValentTransfer *transfer;
+     700                 :           0 :   const char *id;
+     701                 :             : 
+     702         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     703                 :             : 
+     704                 :           0 :   id = g_variant_get_string (parameter, NULL);
+     705                 :           0 :   transfer = g_hash_table_lookup (self->transfers, id);
+     706                 :             : 
+     707         [ #  # ]:           0 :   if (transfer != NULL)
+     708                 :           0 :     valent_transfer_cancel (transfer);
+     709                 :           0 : }
+     710                 :             : 
+     711                 :             : /**
+     712                 :             :  * ValentSharePlugin|share.open:
+     713                 :             :  * @parameter: "s"
+     714                 :             :  * @uri: File URI to open
+     715                 :             :  *
+     716                 :             :  * This action is used to open a URI.
+     717                 :             :  *
+     718                 :             :  * By convention, the remote device will open the URI with the default handler
+     719                 :             :  * for that type.
+     720                 :             :  *
+     721                 :             :  * If the URI scheme is `file://`, it will be converted to a file upload,
+     722                 :             :  * requesting it be opened after transfer.
+     723                 :             :  */
+     724                 :             : static void
+     725                 :           2 : share_open_action (GSimpleAction *action,
+     726                 :             :                    GVariant      *parameter,
+     727                 :             :                    gpointer       user_data)
+     728                 :             : {
+     729                 :           2 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (user_data);
+     730                 :           2 :   const char *uri_string = NULL;
+     731                 :           2 :   g_autoptr (GUri) uri = NULL;
+     732                 :           2 :   g_autoptr (GError) error = NULL;
+     733                 :             : 
+     734         [ +  - ]:           2 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     735         [ -  + ]:           2 :   g_assert (g_variant_is_of_type (parameter, G_VARIANT_TYPE_STRING));
+     736                 :             : 
+     737                 :           2 :   uri_string = g_variant_get_string (parameter, NULL);
+     738                 :             : 
+     739         [ -  + ]:           2 :   if ((uri = g_uri_parse (uri_string, G_URI_FLAGS_NONE, &error)) == NULL)
+     740                 :             :     {
+     741                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     742         [ #  # ]:           0 :       return;
+     743                 :             :     }
+     744                 :             : 
+     745         [ +  - ]:           2 :   if (g_str_equal ("file", g_uri_get_scheme (uri)) ||
+     746         [ +  + ]:           2 :       g_str_equal ("resource", g_uri_get_scheme (uri)))
+     747                 :             :     {
+     748         [ -  + ]:           2 :       g_autoptr (GFile) file = NULL;
+     749                 :             : 
+     750                 :           1 :       file = g_file_new_for_uri (uri_string);
+     751         [ +  - ]:           1 :       valent_share_plugin_open_file (self, file);
+     752                 :             :     }
+     753                 :             :   else
+     754                 :             :     {
+     755                 :           1 :       g_autoptr (JsonBuilder) builder = NULL;
+     756         [ -  + ]:           1 :       g_autoptr (JsonNode) packet = NULL;
+     757                 :             : 
+     758                 :           1 :       valent_packet_init (&builder, "kdeconnect.share.request");
+     759                 :           1 :       json_builder_set_member_name (builder, "url");
+     760                 :           1 :       json_builder_add_string_value (builder, uri_string);
+     761                 :           1 :       packet = valent_packet_end (&builder);
+     762                 :             : 
+     763         [ +  - ]:           1 :       valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     764                 :             :     }
+     765                 :             : }
+     766                 :             : 
+     767                 :             : /**
+     768                 :             :  * ValentSharePlugin|share.text:
+     769                 :             :  * @parameter: "s"
+     770                 :             :  * @text: text to share
+     771                 :             :  *
+     772                 :             :  * This action simply sends a chunk of text to the remote device. Ultimately,
+     773                 :             :  * how the remote device handles the text is undefined. It may be copied to the
+     774                 :             :  * clipboard, stored as a temporary file or just displayed.
+     775                 :             :  */
+     776                 :             : static void
+     777                 :           1 : share_text_action (GSimpleAction *action,
+     778                 :             :                    GVariant      *parameter,
+     779                 :             :                    gpointer       user_data)
+     780                 :             : {
+     781                 :           1 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (user_data);
+     782                 :           1 :   const char *text;
+     783                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     784         [ -  + ]:           1 :   g_autoptr (JsonNode) packet = NULL;
+     785                 :             : 
+     786         [ +  - ]:           1 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     787         [ -  + ]:           1 :   g_assert (g_variant_is_of_type (parameter, G_VARIANT_TYPE_STRING));
+     788                 :             : 
+     789                 :           1 :   text = g_variant_get_string (parameter, NULL);
+     790                 :             : 
+     791                 :           1 :   valent_packet_init (&builder, "kdeconnect.share.request");
+     792                 :           1 :   json_builder_set_member_name (builder, "text");
+     793                 :           1 :   json_builder_add_string_value (builder, text);
+     794                 :           1 :   packet = valent_packet_end (&builder);
+     795                 :             : 
+     796         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     797                 :           1 : }
+     798                 :             : 
+     799                 :             : /**
+     800                 :             :  * ValentSharePlugin|share.uri:
+     801                 :             :  * @parameter: "s"
+     802                 :             :  * @uri: URI to share
+     803                 :             :  *
+     804                 :             :  * This action is used to share a URI.
+     805                 :             :  *
+     806                 :             :  * By convention, the remote device will open the URI with the default handler
+     807                 :             :  * for that type.
+     808                 :             :  *
+     809                 :             :  * If the URI scheme is `file://`, it will be converted to a file upload.
+     810                 :             :  */
+     811                 :             : static void
+     812                 :           9 : share_uri_action (GSimpleAction *action,
+     813                 :             :                   GVariant      *parameter,
+     814                 :             :                   gpointer       user_data)
+     815                 :             : {
+     816                 :           9 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (user_data);
+     817                 :           9 :   const char *uri_string = NULL;
+     818                 :           9 :   g_autoptr (GUri) uri = NULL;
+     819                 :           9 :   g_autoptr (GError) error = NULL;
+     820                 :             : 
+     821         [ +  - ]:           9 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     822         [ -  + ]:           9 :   g_assert (g_variant_is_of_type (parameter, G_VARIANT_TYPE_STRING));
+     823                 :             : 
+     824                 :           9 :   uri_string = g_variant_get_string (parameter, NULL);
+     825                 :             : 
+     826         [ -  + ]:           9 :   if ((uri = g_uri_parse (uri_string, G_URI_FLAGS_NONE, &error)) == NULL)
+     827                 :             :     {
+     828                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     829         [ #  # ]:           0 :       return;
+     830                 :             :     }
+     831                 :             : 
+     832         [ +  - ]:           9 :   if (g_str_equal ("file", g_uri_get_scheme (uri)) ||
+     833         [ +  + ]:           9 :       g_str_equal ("resource", g_uri_get_scheme (uri)))
+     834                 :             :     {
+     835         [ -  + ]:           9 :       g_autoptr (GFile) file = NULL;
+     836                 :             : 
+     837                 :           5 :       file = g_file_new_for_uri (uri_string);
+     838         [ +  - ]:           5 :       valent_share_plugin_upload_file (self, file);
+     839                 :             :     }
+     840                 :             :   else
+     841                 :             :     {
+     842                 :           4 :       g_autoptr (JsonBuilder) builder = NULL;
+     843         [ -  + ]:           4 :       g_autoptr (JsonNode) packet = NULL;
+     844                 :             : 
+     845                 :           4 :       valent_packet_init (&builder, "kdeconnect.share.request");
+     846                 :           4 :       json_builder_set_member_name (builder, "url");
+     847                 :           4 :       json_builder_add_string_value (builder, uri_string);
+     848                 :           4 :       packet = valent_packet_end (&builder);
+     849                 :             : 
+     850         [ +  - ]:           4 :       valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     851                 :             :     }
+     852                 :             : }
+     853                 :             : 
+     854                 :             : /**
+     855                 :             :  * ValentSharePlugin|share.uris:
+     856                 :             :  * @parameter: "as"
+     857                 :             :  * @uris: a list of URIs
+     858                 :             :  *
+     859                 :             :  * This action is a convenience for sending multiple URIs, as with the
+     860                 :             :  * `ValentSharePlugin|share.uri` `GAction`.
+     861                 :             :  */
+     862                 :             : static void
+     863                 :           1 : share_uris_action (GSimpleAction *action,
+     864                 :             :                    GVariant      *parameter,
+     865                 :             :                    gpointer       user_data)
+     866                 :             : {
+     867                 :           1 :   GVariantIter iter;
+     868                 :           1 :   GVariant *child;
+     869                 :             : 
+     870         [ +  - ]:           1 :   g_assert (VALENT_IS_SHARE_PLUGIN (user_data));
+     871         [ -  + ]:           1 :   g_assert (g_variant_is_of_type (parameter, G_VARIANT_TYPE_STRING_ARRAY));
+     872                 :             : 
+     873                 :           1 :   g_variant_iter_init (&iter, parameter);
+     874                 :             : 
+     875         [ +  + ]:           9 :   while ((child = g_variant_iter_next_value (&iter)) != NULL)
+     876                 :             :     {
+     877                 :           7 :       share_uri_action (action, child, user_data);
+     878                 :           8 :       g_clear_pointer (&child, g_variant_unref);
+     879                 :             :     }
+     880                 :           1 : }
+     881                 :             : 
+     882                 :             : /**
+     883                 :             :  * ValentSharePlugin|share.view:
+     884                 :             :  * @parameter: "s"
+     885                 :             :  * @uri: File or directory URI to view
+     886                 :             :  *
+     887                 :             :  * This action opens a file or directory.
+     888                 :             :  */
+     889                 :             : static void
+     890                 :           0 : share_view_action (GSimpleAction *action,
+     891                 :             :                    GVariant      *parameter,
+     892                 :             :                    gpointer       user_data)
+     893                 :             : {
+     894                 :           0 :   const char *uri;
+     895                 :             : 
+     896         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_PLUGIN (user_data));
+     897         [ #  # ]:           0 :   g_assert (g_variant_is_of_type (parameter, G_VARIANT_TYPE_STRING));
+     898                 :             : 
+     899                 :           0 :   uri = g_variant_get_string (parameter, NULL);
+     900                 :           0 :   g_app_info_launch_default_for_uri_async (uri, NULL, NULL, NULL, NULL);
+     901                 :           0 : }
+     902                 :             : 
+     903                 :             : static GActionEntry actions[] = {
+     904                 :             :     {"chooser", share_chooser_action, NULL, NULL, NULL},
+     905                 :             :     {"cancel",  share_cancel_action,  "s",  NULL, NULL},
+     906                 :             :     {"open",    share_open_action,    "s",  NULL, NULL},
+     907                 :             :     {"text",    share_text_action,    "s",  NULL, NULL},
+     908                 :             :     {"uri",     share_uri_action,     "s",  NULL, NULL},
+     909                 :             :     {"uris",    share_uris_action,    "as", NULL, NULL},
+     910                 :             :     {"view",    share_view_action,    "s",  NULL, NULL}
+     911                 :             : };
+     912                 :             : 
+     913                 :             : /*
+     914                 :             :  * Packet Handlers
+     915                 :             :  */
+     916                 :             : static void
+     917                 :           7 : valent_share_plugin_handle_file (ValentSharePlugin *self,
+     918                 :             :                                  JsonNode          *packet)
+     919                 :             : {
+     920                 :           7 :   g_autoptr (ValentTransfer) transfer = NULL;
+     921                 :           7 :   ValentDevice *device;
+     922                 :           7 :   const char *filename;
+     923   [ +  -  +  - ]:           7 :   g_autoptr (GFile) file = NULL;
+     924                 :           7 :   int64_t number_of_files = 0;
+     925                 :             : 
+     926         [ +  - ]:           7 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+     927         [ -  + ]:           7 :   g_assert (VALENT_IS_PACKET (packet));
+     928                 :             : 
+     929                 :             :   /* Common packet fields */
+     930         [ -  + ]:           7 :   if (!valent_packet_has_payload (packet))
+     931                 :             :     {
+     932                 :           0 :       g_warning ("%s(): missing payload info", G_STRFUNC);
+     933                 :           0 :       return;
+     934                 :             :     }
+     935                 :             : 
+     936         [ -  + ]:           7 :   if (!valent_packet_get_string (packet, "filename", &filename))
+     937                 :             :     {
+     938                 :           0 :       g_debug ("%s(): expected \"filename\" field holding a string",
+     939                 :             :                G_STRFUNC);
+     940                 :           0 :       return;
+     941                 :             :     }
+     942                 :             : 
+     943                 :             :   /* Newer implementations support sequential multi-file transfers */
+     944         [ +  + ]:           7 :   if (!valent_packet_get_int (packet, "numberOfFiles", &number_of_files))
+     945                 :             :     {
+     946                 :           2 :       json_object_set_int_member (valent_packet_get_body (packet),
+     947                 :             :                                   "numberOfFiles",
+     948                 :             :                                   1);
+     949                 :             :     }
+     950                 :             : 
+     951         [ +  + ]:           7 :   if (!valent_packet_get_int (packet, "totalPayloadSize", NULL))
+     952                 :             :     {
+     953                 :           2 :       json_object_set_int_member (valent_packet_get_body (packet),
+     954                 :             :                                   "totalPayloadSize",
+     955                 :             :                                   valent_packet_get_payload_size (packet));
+     956                 :             :     }
+     957                 :             : 
+     958                 :           7 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     959                 :           7 :   file = valent_share_plugin_create_download_file (self, filename, TRUE);
+     960                 :             : 
+     961                 :             :   /* If the packet includes a request to open the file when the transfer
+     962                 :             :    * completes, use a separate routine for success/failure. */
+     963         [ +  + ]:           7 :   if (valent_packet_check_field (packet, "open"))
+     964                 :             :     {
+     965                 :           1 :       transfer = valent_device_transfer_new (device, packet, file);
+     966                 :           2 :       g_hash_table_replace (self->transfers,
+     967                 :           1 :                             valent_transfer_dup_id (transfer),
+     968                 :             :                             g_object_ref (transfer));
+     969                 :             : 
+     970                 :           1 :       valent_transfer_execute (transfer,
+     971                 :             :                                NULL,
+     972                 :             :                                (GAsyncReadyCallback)valent_share_download_open_cb,
+     973                 :             :                                g_object_ref (self));
+     974                 :           1 :       valent_share_download_open_notification (self, transfer);
+     975                 :           1 :       return;
+     976                 :             :     }
+     977                 :             : 
+     978                 :             :   /* If the packet is missing the `numberOfFiles` field it is a legacy transfer
+     979                 :             :    * transfer; use a discrete transfer with standard success/failure handling. */
+     980         [ +  + ]:           6 :   if (!number_of_files)
+     981                 :             :     {
+     982                 :           1 :       transfer = valent_share_download_new (device);
+     983                 :           2 :       g_hash_table_replace (self->transfers,
+     984                 :           1 :                             valent_transfer_dup_id (transfer),
+     985                 :             :                             g_object_ref (transfer));
+     986                 :             : 
+     987                 :           1 :       valent_share_download_add_file (VALENT_SHARE_DOWNLOAD (transfer),
+     988                 :             :                                       file,
+     989                 :             :                                       packet);
+     990                 :             : 
+     991                 :           1 :       valent_transfer_execute (transfer,
+     992                 :             :                                NULL,
+     993                 :             :                                (GAsyncReadyCallback)valent_share_download_file_cb,
+     994                 :             :                                g_object_ref (self));
+     995                 :           1 :       valent_share_download_file_notification (self, transfer);
+     996                 :           1 :       return;
+     997                 :             :     }
+     998                 :             : 
+     999                 :             :   /* Otherwise the file will appended to a multi-file transfer */
+    1000         [ +  + ]:           5 :   if (self->download != NULL)
+    1001                 :             :     {
+    1002                 :           1 :       transfer = g_object_ref (self->download);
+    1003                 :             :     }
+    1004                 :             :   else
+    1005                 :             :     {
+    1006                 :           4 :       transfer = valent_share_download_new (device);
+    1007                 :           8 :       g_hash_table_replace (self->transfers,
+    1008                 :           4 :                             valent_transfer_dup_id (transfer),
+    1009                 :             :                             g_object_ref (transfer));
+    1010                 :             :     }
+    1011                 :             : 
+    1012                 :           5 :   valent_share_download_add_file (VALENT_SHARE_DOWNLOAD (transfer),
+    1013                 :             :                                   file,
+    1014                 :             :                                   packet);
+    1015                 :             : 
+    1016         [ +  + ]:           5 :   if (self->download != transfer)
+    1017                 :           4 :     g_set_object (&self->download, transfer);
+    1018                 :             : 
+    1019         [ +  + ]:           5 :   if (valent_transfer_get_state (transfer) == VALENT_TRANSFER_STATE_PENDING)
+    1020                 :             :     {
+    1021                 :           4 :       valent_transfer_execute (transfer,
+    1022                 :             :                                NULL,
+    1023                 :             :                                (GAsyncReadyCallback)valent_share_download_file_cb,
+    1024                 :             :                                g_object_ref (self));
+    1025                 :             :     }
+    1026                 :             : 
+    1027         [ +  - ]:           5 :   valent_share_download_file_notification (self, transfer);
+    1028                 :             : }
+    1029                 :             : 
+    1030                 :             : static void
+    1031                 :           1 : valent_share_plugin_handle_file_update (ValentSharePlugin *self,
+    1032                 :             :                                         JsonNode          *packet)
+    1033                 :             : {
+    1034         [ +  - ]:           1 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+    1035         [ -  + ]:           1 :   g_assert (VALENT_IS_PACKET (packet));
+    1036                 :             : 
+    1037         [ -  + ]:           1 :   if (self->download == NULL)
+    1038                 :             :     return;
+    1039                 :             : 
+    1040         [ #  # ]:           0 :   if (!valent_packet_check_field (packet, "numberOfFiles"))
+    1041                 :             :     {
+    1042                 :           0 :       g_debug ("%s(): expected \"numberOfFiles\" field holding an integer",
+    1043                 :             :                G_STRFUNC);
+    1044                 :           0 :       return;
+    1045                 :             :     }
+    1046                 :             : 
+    1047         [ #  # ]:           0 :   if (!valent_packet_check_field (packet, "totalPayloadSize"))
+    1048                 :             :     {
+    1049                 :           0 :       g_debug ("%s(): expected \"totalPayloadSize\" field holding an integer",
+    1050                 :             :                G_STRFUNC);
+    1051                 :           0 :       return;
+    1052                 :             :     }
+    1053                 :             : 
+    1054                 :           0 :   valent_share_download_update (VALENT_SHARE_DOWNLOAD (self->download), packet);
+    1055                 :           0 :   valent_share_download_file_notification (self, self->download);
+    1056                 :             : }
+    1057                 :             : 
+    1058                 :             : static void
+    1059                 :           0 : valent_share_plugin_handle_text_cb (GFile        *file,
+    1060                 :             :                                     GAsyncResult *result,
+    1061                 :             :                                     gpointer      user_data)
+    1062                 :             : {
+    1063                 :           0 :   g_autoptr (GError) error = NULL;
+    1064                 :             : 
+    1065         [ #  # ]:           0 :   if (!g_file_replace_contents_finish (file, result, NULL, &error))
+    1066                 :           0 :     g_warning ("Saving \"%s\": %s", g_file_peek_path (file), error->message);
+    1067                 :           0 : }
+    1068                 :             : 
+    1069                 :             : static void
+    1070                 :           1 : valent_share_plugin_handle_text (ValentSharePlugin *self,
+    1071                 :             :                                  const char        *text)
+    1072                 :             : {
+    1073                 :           1 :   ValentExtension *extension = VALENT_EXTENSION (self);
+    1074                 :           1 :   const char *name = NULL;
+    1075                 :           1 :   GtkWindow *window;
+    1076                 :             : 
+    1077         [ +  - ]:           1 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+    1078         [ -  + ]:           1 :   g_assert (text != NULL);
+    1079                 :             : 
+    1080                 :           1 :   name = valent_device_get_name (valent_extension_get_object (extension));
+    1081                 :             : 
+    1082         [ -  + ]:           1 :   if (!gtk_is_initialized ())
+    1083                 :             :     {
+    1084                 :           1 :       g_autoptr (GBytes) bytes = NULL;
+    1085         [ #  # ]:           0 :       g_autoptr (GDateTime) date = NULL;
+    1086         [ #  # ]:           0 :       g_autofree char *date_str = NULL;
+    1087                 :           0 :       g_autoptr (GFile) file = NULL;
+    1088         [ #  # ]:           0 :       g_autofree char *filename = NULL;
+    1089                 :             : 
+    1090                 :           0 :       bytes = g_bytes_new (text, strlen (text));
+    1091                 :           0 :       date = g_date_time_new_now_local ();
+    1092                 :           0 :       date_str = g_date_time_format (date, "%F %T");
+    1093                 :           0 :       filename = g_strdup_printf ("Text from %s (%s).txt", date_str, name);
+    1094                 :           0 :       file = valent_share_plugin_create_download_file (self, filename, TRUE);
+    1095                 :             : 
+    1096                 :           0 :       g_file_replace_contents_bytes_async (file,
+    1097                 :             :                                            bytes,
+    1098                 :             :                                            NULL,
+    1099                 :             :                                            FALSE,
+    1100                 :             :                                            G_FILE_CREATE_REPLACE_DESTINATION,
+    1101                 :             :                                            NULL,
+    1102                 :             :                                            (GAsyncReadyCallback)valent_share_plugin_handle_text_cb,
+    1103                 :             :                                            NULL);
+    1104                 :             :     }
+    1105                 :             :   else
+    1106                 :             :     {
+    1107                 :           1 :       window = g_object_new (VALENT_TYPE_SHARE_TEXT_DIALOG,
+    1108                 :             :                              "body", name,
+    1109                 :             :                              "text", text,
+    1110                 :             :                              NULL);
+    1111                 :           1 :       g_signal_connect_data (window,
+    1112                 :             :                              "destroy",
+    1113                 :             :                              G_CALLBACK (g_ptr_array_remove),
+    1114                 :           1 :                              g_ptr_array_ref (self->windows),
+    1115                 :             :                              (void *)g_ptr_array_unref,
+    1116                 :             :                              G_CONNECT_SWAPPED);
+    1117                 :           1 :       g_ptr_array_add (self->windows, window);
+    1118                 :             : 
+    1119                 :           1 :       gtk_window_present_with_time (window, GDK_CURRENT_TIME);
+    1120                 :             :     }
+    1121                 :           1 : }
+    1122                 :             : 
+    1123                 :             : static void
+    1124                 :           1 : valent_share_plugin_handle_url (ValentSharePlugin *self,
+    1125                 :             :                                 const char        *url)
+    1126                 :             : {
+    1127         [ +  - ]:           1 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+    1128         [ -  + ]:           1 :   g_assert (url != NULL);
+    1129                 :             : 
+    1130                 :           1 :   g_app_info_launch_default_for_uri_async (url, NULL, NULL, NULL, NULL);
+    1131                 :           1 : }
+    1132                 :             : 
+    1133                 :             : /*
+    1134                 :             :  * ValentDevicePlugin
+    1135                 :             :  */
+    1136                 :             : static void
+    1137                 :          36 : valent_share_plugin_update_state (ValentDevicePlugin *plugin,
+    1138                 :             :                                   ValentDeviceState   state)
+    1139                 :             : {
+    1140                 :          36 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (plugin);
+    1141                 :          36 :   gboolean available;
+    1142                 :             : 
+    1143         [ +  - ]:          36 :   g_assert (VALENT_IS_SHARE_PLUGIN (plugin));
+    1144                 :             : 
+    1145                 :          36 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+    1146                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+    1147                 :             : 
+    1148                 :             :   /* If the device has been unpaired it should be considered untrusted, so
+    1149                 :             :    * cancel any ongoing transfers. */
+    1150         [ +  + ]:          36 :   if ((state & VALENT_DEVICE_STATE_PAIRED) == 0)
+    1151                 :             :     {
+    1152                 :           3 :       GHashTableIter iter;
+    1153                 :           3 :       ValentTransfer *transfer;
+    1154                 :             : 
+    1155                 :           3 :       g_hash_table_iter_init (&iter, self->transfers);
+    1156                 :             : 
+    1157         [ -  + ]:           3 :       while (g_hash_table_iter_next (&iter, NULL, (void **)&transfer))
+    1158                 :             :         {
+    1159                 :           0 :           valent_transfer_cancel (transfer);
+    1160                 :           0 :           g_hash_table_iter_remove (&iter);
+    1161                 :             :         }
+    1162                 :             : 
+    1163         [ -  + ]:           3 :       g_clear_object (&self->download);
+    1164         [ -  + ]:           3 :       g_clear_object (&self->upload);
+    1165                 :             :     }
+    1166                 :             : 
+    1167                 :          36 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+    1168                 :          36 : }
+    1169                 :             : 
+    1170                 :             : static void
+    1171                 :          10 : valent_share_plugin_handle_packet (ValentDevicePlugin *plugin,
+    1172                 :             :                                    const char         *type,
+    1173                 :             :                                    JsonNode           *packet)
+    1174                 :             : {
+    1175                 :          10 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (plugin);
+    1176                 :          10 :   const char *text;
+    1177                 :          10 :   const char *url;
+    1178                 :             : 
+    1179         [ +  - ]:          10 :   g_assert (VALENT_IS_SHARE_PLUGIN (self));
+    1180         [ -  + ]:          10 :   g_assert (type != NULL);
+    1181         [ -  + ]:          10 :   g_assert (VALENT_IS_PACKET (packet));
+    1182                 :             : 
+    1183         [ +  + ]:          10 :   if (g_str_equal (type, "kdeconnect.share.request"))
+    1184                 :             :     {
+    1185         [ +  + ]:           9 :       if (valent_packet_check_field (packet, "filename"))
+    1186                 :           7 :         valent_share_plugin_handle_file (self, packet);
+    1187                 :             : 
+    1188         [ +  + ]:           2 :       else if (valent_packet_get_string (packet, "text", &text))
+    1189                 :           1 :         valent_share_plugin_handle_text (self, text);
+    1190                 :             : 
+    1191         [ +  - ]:           1 :       else if (valent_packet_get_string (packet, "url", &url))
+    1192                 :           1 :         valent_share_plugin_handle_url (self, url);
+    1193                 :             : 
+    1194                 :             :       else
+    1195                 :           0 :         g_warning ("%s(): unsupported share request", G_STRFUNC);
+    1196                 :             :     }
+    1197         [ +  - ]:           1 :   else if (g_str_equal (type, "kdeconnect.share.request.update"))
+    1198                 :             :     {
+    1199                 :           1 :       valent_share_plugin_handle_file_update (self, packet);
+    1200                 :             :     }
+    1201                 :             :   else
+    1202                 :           0 :     g_assert_not_reached ();
+    1203                 :          10 : }
+    1204                 :             : 
+    1205                 :             : /*
+    1206                 :             :  * ValentObject
+    1207                 :             :  */
+    1208                 :             : static void
+    1209                 :          20 : valent_share_plugin_destroy (ValentObject *object)
+    1210                 :             : {
+    1211                 :          20 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (object);
+    1212                 :          20 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+    1213                 :          20 :   GHashTableIter iter;
+    1214                 :          20 :   ValentTransfer *transfer;
+    1215                 :             : 
+    1216                 :             :   /* Cancel active transfers */
+    1217                 :          20 :   g_hash_table_iter_init (&iter, self->transfers);
+    1218                 :             : 
+    1219         [ -  + ]:          20 :   while (g_hash_table_iter_next (&iter, NULL, (void **)&transfer))
+    1220                 :             :     {
+    1221                 :           0 :       valent_transfer_cancel (transfer);
+    1222                 :           0 :       g_hash_table_iter_remove (&iter);
+    1223                 :             :     }
+    1224                 :             : 
+    1225         [ -  + ]:          20 :   g_clear_object (&self->download);
+    1226         [ -  + ]:          20 :   g_clear_object (&self->upload);
+    1227                 :             : 
+    1228                 :             :   /* Close open windows */
+    1229                 :          20 :   g_ptr_array_foreach (self->windows, (void *)gtk_window_destroy, NULL);
+    1230                 :          20 :   g_ptr_array_remove_range (self->windows, 0, self->windows->len);
+    1231                 :             : 
+    1232                 :          20 :   valent_device_plugin_set_menu_item (plugin, "device.share.chooser", NULL);
+    1233                 :             : 
+    1234                 :          20 :   VALENT_OBJECT_CLASS (valent_share_plugin_parent_class)->destroy (object);
+    1235                 :          20 : }
+    1236                 :             : 
+    1237                 :             : /*
+    1238                 :             :  * GObject
+    1239                 :             :  */
+    1240                 :             : static void
+    1241                 :          11 : valent_share_plugin_constructed (GObject *object)
+    1242                 :             : {
+    1243                 :          11 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+    1244                 :             : 
+    1245                 :          11 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+    1246                 :             :                                    actions,
+    1247                 :             :                                    G_N_ELEMENTS (actions),
+    1248                 :             :                                    plugin);
+    1249                 :          11 :   valent_device_plugin_set_menu_action (plugin,
+    1250                 :             :                                         "device.share.chooser",
+    1251                 :          11 :                                         _("Send Files"),
+    1252                 :             :                                         "document-send-symbolic");
+    1253                 :             : 
+    1254                 :          11 :   G_OBJECT_CLASS (valent_share_plugin_parent_class)->constructed (object);
+    1255                 :          11 : }
+    1256                 :             : 
+    1257                 :             : static void
+    1258                 :          10 : valent_share_plugin_finalize (GObject *object)
+    1259                 :             : {
+    1260                 :          10 :   ValentSharePlugin *self = VALENT_SHARE_PLUGIN (object);
+    1261                 :             : 
+    1262         [ +  - ]:          10 :   g_clear_pointer (&self->transfers, g_hash_table_unref);
+    1263         [ +  - ]:          10 :   g_clear_pointer (&self->windows, g_ptr_array_unref);
+    1264                 :             : 
+    1265                 :          10 :   G_OBJECT_CLASS (valent_share_plugin_parent_class)->finalize (object);
+    1266                 :          10 : }
+    1267                 :             : 
+    1268                 :             : static void
+    1269                 :           6 : valent_share_plugin_class_init (ValentSharePluginClass *klass)
+    1270                 :             : {
+    1271                 :           6 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    1272                 :           6 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+    1273                 :           6 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+    1274                 :             : 
+    1275                 :           6 :   object_class->constructed = valent_share_plugin_constructed;
+    1276                 :           6 :   object_class->finalize = valent_share_plugin_finalize;
+    1277                 :             : 
+    1278                 :           6 :   vobject_class->destroy = valent_share_plugin_destroy;
+    1279                 :             : 
+    1280                 :           6 :   plugin_class->handle_packet = valent_share_plugin_handle_packet;
+    1281                 :           6 :   plugin_class->update_state = valent_share_plugin_update_state;
+    1282                 :             : }
+    1283                 :             : 
+    1284                 :             : static void
+    1285                 :          11 : valent_share_plugin_init (ValentSharePlugin *self)
+    1286                 :             : {
+    1287                 :          11 :   self->transfers = g_hash_table_new_full (g_str_hash,
+    1288                 :             :                                            g_str_equal,
+    1289                 :             :                                            g_free,
+    1290                 :             :                                            g_object_unref);
+    1291                 :          11 :   self->windows = g_ptr_array_new ();
+    1292                 :          11 : }
+    1293                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-plugin.h.func-c.html b/coverage/src/plugins/share/valent-share-plugin.h.func-c.html new file mode 100644 index 00000000000..3c6365572b8 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_PLUGIN89
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-plugin.h.func.html b/coverage/src/plugins/share/valent-share-plugin.h.func.html new file mode 100644 index 00000000000..f4ea74e834e --- /dev/null +++ b/coverage/src/plugins/share/valent-share-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_PLUGIN89
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-plugin.h.gcov.html b/coverage/src/plugins/share/valent-share-plugin.h.gcov.html new file mode 100644 index 00000000000..67f1593b3f1 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SHARE_PLUGIN (valent_share_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          97 : G_DECLARE_FINAL_TYPE (ValentSharePlugin, valent_share_plugin, VALENT, SHARE_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-preferences.c.func-c.html b/coverage/src/plugins/share/valent-share-preferences.c.func-c.html new file mode 100644 index 00000000000..ac603b6a4e5 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-preferences.c.func-c.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:57.3 %7543
Test Date:2024-03-31 18:46:36Functions:80.0 %108
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:17.9 %285
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_file_dialog_select_folder_cb0
select_download_folder_action0
on_download_folder_changed1
valent_share_preferences_constructed1
valent_share_preferences_dispose1
valent_share_preferences_init1
valent_share_preferences_class_init6
valent_share_preferences_get_type19
valent_share_preferences_class_intern_init6
valent_share_preferences_get_type_once6
valent_share_preferences_get_type7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-preferences.c.func.html b/coverage/src/plugins/share/valent-share-preferences.c.func.html new file mode 100644 index 00000000000..2afa4b3aeaf --- /dev/null +++ b/coverage/src/plugins/share/valent-share-preferences.c.func.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:57.3 %7543
Test Date:2024-03-31 18:46:36Functions:80.0 %108
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:17.9 %285
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
gtk_file_dialog_select_folder_cb0
on_download_folder_changed1
select_download_folder_action0
valent_share_preferences_class_init6
valent_share_preferences_constructed1
valent_share_preferences_dispose1
valent_share_preferences_get_type19
valent_share_preferences_class_intern_init6
valent_share_preferences_get_type7
valent_share_preferences_get_type_once6
valent_share_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-preferences.c.gcov.html b/coverage/src/plugins/share/valent-share-preferences.c.gcov.html new file mode 100644 index 00000000000..a7950ce7155 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-preferences.c.gcov.html @@ -0,0 +1,270 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:57.3 %7543
Test Date:2024-03-31 18:46:36Functions:80.0 %108
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:17.9 %285
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-share-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentSharePreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   GtkLabel                     *download_folder_label;
+      22                 :             : };
+      23                 :             : 
+      24   [ +  +  +  - ]:          19 : G_DEFINE_FINAL_TYPE (ValentSharePreferences, valent_share_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      25                 :             : 
+      26                 :             : 
+      27                 :             : /*
+      28                 :             :  * Download Folder
+      29                 :             :  */
+      30                 :             : static gboolean
+      31                 :           1 : on_download_folder_changed (GValue   *value,
+      32                 :             :                             GVariant *variant,
+      33                 :             :                             gpointer  user_data)
+      34                 :             : {
+      35                 :           1 :   const char *label;
+      36                 :           2 :   g_autofree char *basename = NULL;
+      37                 :           1 :   g_autofree char *result = NULL;
+      38                 :             : 
+      39                 :           1 :   label = g_variant_get_string (variant, NULL);
+      40                 :           1 :   basename = g_path_get_basename (label);
+      41                 :           1 :   result = g_strdup_printf ("…/%s", basename);
+      42                 :             : 
+      43                 :           1 :   g_value_set_string (value, result);
+      44                 :             : 
+      45                 :           1 :   return TRUE;
+      46                 :             : }
+      47                 :             : 
+      48                 :             : static void
+      49                 :           0 : gtk_file_dialog_select_folder_cb (GtkFileDialog                *dialog,
+      50                 :             :                                   GAsyncResult                 *result,
+      51                 :             :                                   ValentDevicePreferencesGroup *group)
+      52                 :             : {
+      53                 :           0 :   g_autoptr (GFile) file = NULL;
+      54                 :           0 :   g_autoptr (GError) error = NULL;
+      55                 :           0 :   GSettings *settings;
+      56                 :           0 :   const char *path;
+      57                 :             : 
+      58         [ #  # ]:           0 :   g_assert (VALENT_IS_DEVICE_PREFERENCES_GROUP (group));
+      59                 :             : 
+      60                 :           0 :   file = gtk_file_dialog_select_folder_finish (dialog, result, &error);
+      61                 :             : 
+      62         [ #  # ]:           0 :   if (file == NULL)
+      63                 :             :     {
+      64   [ #  #  #  # ]:           0 :       if (!g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED) &&
+      65                 :           0 :           !g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_DISMISSED))
+      66                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+      67                 :             : 
+      68         [ #  # ]:           0 :       return;
+      69                 :             :     }
+      70                 :             : 
+      71                 :           0 :   path = g_file_peek_path (file);
+      72                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+      73         [ #  # ]:           0 :   g_settings_set_string (settings, "download-folder", path);
+      74                 :             : }
+      75                 :             : 
+      76                 :             : /*
+      77                 :             :  * GActions
+      78                 :             :  */
+      79                 :             : static void
+      80                 :           0 : select_download_folder_action (GtkWidget  *widget,
+      81                 :             :                                const char *action_name,
+      82                 :             :                                GVariant   *parameter)
+      83                 :             : {
+      84                 :           0 :   ValentSharePreferences *self = VALENT_SHARE_PREFERENCES (widget);
+      85                 :           0 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+      86                 :           0 :   g_autoptr (GtkFileDialog) dialog = NULL;
+      87                 :           0 :   GSettings *settings;
+      88         [ #  # ]:           0 :   g_autofree char *path = NULL;
+      89                 :             : 
+      90         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_PREFERENCES (self));
+      91                 :             : 
+      92                 :           0 :   dialog = g_object_new (GTK_TYPE_FILE_DIALOG,
+      93                 :             :                          "title",        _("Select download folder"),
+      94                 :             :                          "accept-label", _("Open"),
+      95                 :             :                          "modal",        TRUE,
+      96                 :             :                          NULL);
+      97                 :             : 
+      98                 :           0 :   settings = valent_device_preferences_group_get_settings (group);
+      99                 :           0 :   path = g_settings_get_string (settings, "download-folder");
+     100                 :             : 
+     101         [ #  # ]:           0 :   if (strlen (path) > 0)
+     102                 :             :     {
+     103                 :           0 :       g_autoptr (GFile) file = NULL;
+     104                 :             : 
+     105                 :           0 :       file = g_file_new_for_path (path);
+     106         [ #  # ]:           0 :       gtk_file_dialog_set_initial_folder (dialog, file);
+     107                 :             :     }
+     108                 :             : 
+     109                 :           0 :   gtk_file_dialog_select_folder (dialog,
+     110                 :           0 :                                  GTK_WINDOW (gtk_widget_get_root (widget)),
+     111                 :             :                                  NULL,
+     112                 :             :                                  (GAsyncReadyCallback)gtk_file_dialog_select_folder_cb,
+     113                 :             :                                  self);
+     114                 :           0 : }
+     115                 :             : 
+     116                 :             : /*
+     117                 :             :  * GObject
+     118                 :             :  */
+     119                 :             : static void
+     120                 :           1 : valent_share_preferences_constructed (GObject *object)
+     121                 :             : {
+     122                 :           1 :   ValentSharePreferences *self = VALENT_SHARE_PREFERENCES (object);
+     123                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     124                 :           2 :   g_autofree char *download_folder = NULL;
+     125                 :           1 :   GSettings *settings;
+     126                 :             : 
+     127                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     128                 :           1 :   download_folder = g_settings_get_string (settings, "download-folder");
+     129                 :             : 
+     130   [ +  -  +  - ]:           1 :   if (download_folder == NULL || *download_folder == '\0')
+     131                 :             :     {
+     132                 :           1 :       const char *user_download = NULL;
+     133                 :             : 
+     134                 :           1 :       user_download = valent_get_user_directory (G_USER_DIRECTORY_DOWNLOAD);
+     135                 :           1 :       g_set_str (&download_folder, user_download);
+     136                 :           1 :       g_settings_set_string (settings, "download-folder", download_folder);
+     137                 :             :     }
+     138                 :             : 
+     139                 :           1 :   g_settings_bind_with_mapping (settings,                    "download-folder",
+     140                 :           1 :                                 self->download_folder_label, "label",
+     141                 :             :                                 G_SETTINGS_BIND_GET,
+     142                 :             :                                 on_download_folder_changed,
+     143                 :             :                                 NULL,
+     144                 :             :                                 NULL, NULL);
+     145                 :             : 
+     146                 :           1 :   G_OBJECT_CLASS (valent_share_preferences_parent_class)->constructed (object);
+     147                 :           1 : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :           1 : valent_share_preferences_dispose (GObject *object)
+     151                 :             : {
+     152                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     153                 :             : 
+     154                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_SHARE_PREFERENCES);
+     155                 :             : 
+     156                 :           1 :   G_OBJECT_CLASS (valent_share_preferences_parent_class)->dispose (object);
+     157                 :           1 : }
+     158                 :             : 
+     159                 :             : static void
+     160                 :           6 : valent_share_preferences_class_init (ValentSharePreferencesClass *klass)
+     161                 :             : {
+     162                 :           6 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     163                 :           6 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     164                 :             : 
+     165                 :           6 :   object_class->constructed = valent_share_preferences_constructed;
+     166                 :           6 :   object_class->dispose = valent_share_preferences_dispose;
+     167                 :             : 
+     168                 :           6 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/share/valent-share-preferences.ui");
+     169                 :           6 :   gtk_widget_class_bind_template_child (widget_class, ValentSharePreferences, download_folder_label);
+     170                 :           6 :   gtk_widget_class_install_action (widget_class, "preferences.select-download-folder", NULL, select_download_folder_action);
+     171                 :           6 : }
+     172                 :             : 
+     173                 :             : static void
+     174                 :           1 : valent_share_preferences_init (ValentSharePreferences *self)
+     175                 :             : {
+     176                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     177                 :           1 : }
+     178                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-preferences.h.func-c.html b/coverage/src/plugins/share/valent-share-preferences.h.func-c.html new file mode 100644 index 00000000000..53fd0d1ec6c --- /dev/null +++ b/coverage/src/plugins/share/valent-share-preferences.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_PREFERENCES0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-preferences.h.func.html b/coverage/src/plugins/share/valent-share-preferences.h.func.html new file mode 100644 index 00000000000..5f544a522da --- /dev/null +++ b/coverage/src/plugins/share/valent-share-preferences.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-preferences.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_PREFERENCES0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-preferences.h.gcov.html b/coverage/src/plugins/share/valent-share-preferences.h.gcov.html new file mode 100644 index 00000000000..168b35540f3 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-preferences.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-preferences.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-preferences.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SHARE_PREFERENCES (valent_share_preferences_get_type())
+      11                 :             : 
+      12   [ #  #  #  #  :           0 : G_DECLARE_FINAL_TYPE (ValentSharePreferences, valent_share_preferences, VALENT, SHARE_PREFERENCES, ValentDevicePreferencesGroup)
+                   #  # ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target-chooser.c.func-c.html b/coverage/src/plugins/share/valent-share-target-chooser.c.func-c.html new file mode 100644 index 00000000000..20e4c58655b --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target-chooser.c.func-c.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target-chooser.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target-chooser.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:65.3 %173113
Test Date:2024-03-31 18:46:36Functions:66.7 %2114
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:31.7 %8226
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
chooser_cancel_action0
chooser_open_action0
chooser_share_action0
on_action_enabled_changed0
on_action_removed0
on_row_activated0
valent_share_target_chooser_refresh0
on_action_added1
on_selected_rows_changed1
valent_share_target_chooser_class_init1
valent_share_target_chooser_constructed1
valent_share_target_chooser_create_row1
valent_share_target_chooser_dispose1
valent_share_target_chooser_finalize1
valent_share_target_chooser_get_property1
valent_share_target_chooser_init1
valent_share_target_chooser_set_property1
on_items_changed4
valent_share_target_chooser_get_type9
valent_share_target_chooser_class_intern_init1
valent_share_target_chooser_get_type_once1
valent_share_target_chooser_get_type7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target-chooser.c.func.html b/coverage/src/plugins/share/valent-share-target-chooser.c.func.html new file mode 100644 index 00000000000..f3e072dc6e5 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target-chooser.c.func.html @@ -0,0 +1,245 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target-chooser.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target-chooser.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:65.3 %173113
Test Date:2024-03-31 18:46:36Functions:66.7 %2114
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:31.7 %8226
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
chooser_cancel_action0
chooser_open_action0
chooser_share_action0
on_action_added1
on_action_enabled_changed0
on_action_removed0
on_items_changed4
on_row_activated0
on_selected_rows_changed1
valent_share_target_chooser_class_init1
valent_share_target_chooser_constructed1
valent_share_target_chooser_create_row1
valent_share_target_chooser_dispose1
valent_share_target_chooser_finalize1
valent_share_target_chooser_get_property1
valent_share_target_chooser_get_type9
valent_share_target_chooser_class_intern_init1
valent_share_target_chooser_get_type7
valent_share_target_chooser_get_type_once1
valent_share_target_chooser_init1
valent_share_target_chooser_refresh0
valent_share_target_chooser_set_property1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target-chooser.c.gcov.html b/coverage/src/plugins/share/valent-share-target-chooser.c.gcov.html new file mode 100644 index 00000000000..7cd2f26d371 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target-chooser.c.gcov.html @@ -0,0 +1,504 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target-chooser.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target-chooser.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:65.3 %173113
Test Date:2024-03-31 18:46:36Functions:66.7 %2114
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:31.7 %8226
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-target-chooser"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-share-target-chooser.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentShareTargetChooser
+      17                 :             : {
+      18                 :             :   GtkWindow            parent_instance;
+      19                 :             : 
+      20                 :             :   ValentDeviceManager *manager;
+      21                 :             :   GListModel          *files;
+      22                 :             :   unsigned int         refresh_id;
+      23                 :             : 
+      24                 :             :   /* template */
+      25                 :             :   GtkListBox          *device_list;
+      26                 :             : };
+      27                 :             : 
+      28   [ +  +  +  - ]:           9 : G_DEFINE_FINAL_TYPE (ValentShareTargetChooser, valent_share_target_chooser, GTK_TYPE_WINDOW)
+      29                 :             : 
+      30                 :             : enum {
+      31                 :             :   PROP_0,
+      32                 :             :   PROP_FILES,
+      33                 :             :   N_PROPERTIES
+      34                 :             : };
+      35                 :             : 
+      36                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      37                 :             : 
+      38                 :             : 
+      39                 :             : static void
+      40                 :           1 : on_action_added (GActionGroup *action_group,
+      41                 :             :                  const char   *action_name,
+      42                 :             :                  GtkWidget    *widget)
+      43                 :             : {
+      44                 :           1 :   gboolean visible = FALSE;
+      45                 :             : 
+      46         [ -  + ]:           1 :   if (g_action_group_get_action_enabled (action_group, action_name))
+      47                 :           0 :     visible = TRUE;
+      48                 :             : 
+      49                 :           1 :   gtk_widget_set_visible (widget, visible);
+      50                 :           1 : }
+      51                 :             : 
+      52                 :             : static void
+      53                 :           0 : on_action_removed (GActionGroup *action_group,
+      54                 :             :                    const char   *action_name,
+      55                 :             :                    GtkWidget    *widget)
+      56                 :             : {
+      57                 :           0 :   gtk_widget_set_visible (widget, FALSE);
+      58                 :           0 : }
+      59                 :             : 
+      60                 :             : static void
+      61                 :           0 : on_action_enabled_changed (GActionGroup *action_group,
+      62                 :             :                            const char   *action_name,
+      63                 :             :                            gboolean      enabled,
+      64                 :             :                            GtkWidget    *widget)
+      65                 :             : {
+      66                 :           0 :   gtk_widget_set_visible (widget, enabled);
+      67                 :           0 : }
+      68                 :             : 
+      69                 :             : static GtkWidget *
+      70                 :           1 : valent_share_target_chooser_create_row (gpointer item,
+      71                 :             :                                         gpointer user_data)
+      72                 :             : {
+      73                 :           1 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (user_data);
+      74                 :           1 :   ValentDevice *device = VALENT_DEVICE (item);
+      75                 :           1 :   GtkWidget *row;
+      76                 :             : 
+      77         [ +  - ]:           1 :   g_assert (VALENT_IS_DEVICE (device));
+      78                 :             : 
+      79                 :           1 :   row = g_object_new (ADW_TYPE_ACTION_ROW,
+      80                 :             :                       "activatable",  TRUE,
+      81                 :             :                       "selectable",   FALSE,
+      82                 :             :                       NULL);
+      83                 :             : 
+      84                 :           1 :   g_object_bind_property (self->device_list, "activate-on-single-click",
+      85                 :             :                           row,               "selectable",
+      86                 :             :                           G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE);
+      87                 :           1 :   g_object_bind_property (device, "icon-name",
+      88                 :             :                           row,    "icon-name",
+      89                 :             :                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+      90                 :           1 :   g_object_bind_property (device, "name",
+      91                 :             :                           row,    "title",
+      92                 :             :                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+      93                 :           1 :   g_object_set_data_full (G_OBJECT (row),
+      94                 :             :                           "device",
+      95                 :             :                           g_object_ref (device),
+      96                 :             :                           g_object_unref);
+      97                 :             : 
+      98                 :           1 :   g_signal_connect_object (device,
+      99                 :             :                            "action-added::share.uris",
+     100                 :             :                            G_CALLBACK (on_action_added),
+     101                 :             :                            row, 0);
+     102                 :           1 :   g_signal_connect_object (device,
+     103                 :             :                            "action-removed::share.uris",
+     104                 :             :                            G_CALLBACK (on_action_removed),
+     105                 :             :                            row, 0);
+     106                 :           1 :   g_signal_connect_object (device,
+     107                 :             :                            "action-enabled-changed::share.uris",
+     108                 :             :                            G_CALLBACK (on_action_enabled_changed),
+     109                 :             :                            row, 0);
+     110                 :           1 :   on_action_added (G_ACTION_GROUP (device), "share.uris", row);
+     111                 :             : 
+     112                 :           1 :   return row;
+     113                 :             : }
+     114                 :             : 
+     115                 :             : static void
+     116                 :           4 : on_items_changed (GListModel               *list,
+     117                 :             :                   unsigned int              position,
+     118                 :             :                   unsigned int              removed,
+     119                 :             :                   unsigned int              added,
+     120                 :             :                   ValentShareTargetChooser *self)
+     121                 :             : {
+     122         [ +  - ]:           4 :   g_assert (VALENT_IS_SHARE_TARGET_CHOOSER (self));
+     123                 :             : 
+     124         [ +  + ]:           5 :   while (removed--)
+     125                 :             :     {
+     126                 :           1 :       GtkListBoxRow *row;
+     127                 :             : 
+     128                 :           1 :       row = gtk_list_box_get_row_at_index (self->device_list, position);
+     129                 :           1 :       gtk_list_box_remove (self->device_list, GTK_WIDGET (row));
+     130                 :             :     }
+     131                 :             : 
+     132         [ +  + ]:           5 :   for (unsigned int i = 0; i < added; i++)
+     133                 :             :     {
+     134                 :           1 :       g_autoptr (GObject) item = NULL;
+     135         [ +  - ]:           1 :       g_autoptr (GtkWidget) widget = NULL;
+     136                 :             : 
+     137                 :           1 :       item = g_list_model_get_item (list, position + i);
+     138                 :           1 :       widget = valent_share_target_chooser_create_row (item, self);
+     139                 :             : 
+     140         [ +  - ]:           1 :       if (g_object_is_floating (widget))
+     141                 :           1 :         g_object_ref_sink (widget);
+     142                 :             : 
+     143         [ +  - ]:           1 :       gtk_list_box_insert (self->device_list, widget, position + i);
+     144                 :             :     }
+     145                 :           4 : }
+     146                 :             : 
+     147                 :             : static void
+     148                 :           0 : on_row_activated (GtkListBox               *box,
+     149                 :             :                   GtkListBoxRow            *row,
+     150                 :             :                   ValentShareTargetChooser *self)
+     151                 :             : {
+     152                 :           0 :   ValentDevice *device = NULL;
+     153                 :           0 :   GVariantBuilder builder;
+     154                 :           0 :   unsigned int n_files = 0;
+     155                 :             : 
+     156   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX (box));
+             #  #  #  # ]
+     157   [ #  #  #  #  :           0 :   g_assert (GTK_IS_LIST_BOX_ROW (row));
+             #  #  #  # ]
+     158         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_TARGET_CHOOSER (self));
+     159                 :             : 
+     160                 :           0 :   g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+     161                 :           0 :   n_files = g_list_model_get_n_items (self->files);
+     162                 :             : 
+     163         [ #  # ]:           0 :   for (unsigned int i = 0; i < n_files; i++)
+     164                 :             :     {
+     165                 :           0 :       g_autoptr (GFile) file = g_list_model_get_item (self->files, i);
+     166                 :           0 :       GVariant *uri = g_variant_new_take_string (g_file_get_uri (file));
+     167                 :             : 
+     168         [ #  # ]:           0 :       g_variant_builder_add_value (&builder, uri);
+     169                 :             :     }
+     170                 :             : 
+     171                 :           0 :   device = g_object_get_data (G_OBJECT (row), "device");
+     172                 :           0 :   g_action_group_activate_action (G_ACTION_GROUP (device),
+     173                 :             :                                   "share.uris",
+     174                 :             :                                   g_variant_builder_end (&builder));
+     175                 :             : 
+     176                 :           0 :   gtk_window_close (GTK_WINDOW (self));
+     177                 :           0 : }
+     178                 :             : 
+     179                 :             : static void
+     180                 :           1 : on_selected_rows_changed (GtkListBox               *box,
+     181                 :             :                           ValentShareTargetChooser *self)
+     182                 :             : {
+     183                 :           2 :   g_autoptr (GList) rows = NULL;
+     184                 :           1 :   unsigned int n_rows = 0;
+     185                 :           1 :   unsigned int n_files = 0;
+     186                 :             : 
+     187   [ +  -  +  -  :           1 :   g_assert (GTK_IS_LIST_BOX (box));
+             -  +  -  - ]
+     188         [ -  + ]:           1 :   g_assert (VALENT_IS_SHARE_TARGET_CHOOSER (self));
+     189                 :             : 
+     190         [ -  + ]:           1 :   if ((rows = gtk_list_box_get_selected_rows (box)) != NULL)
+     191                 :           0 :     n_rows = g_list_length (rows);
+     192                 :             : 
+     193         [ +  - ]:           1 :   if (self->files != NULL)
+     194                 :           1 :     n_files = g_list_model_get_n_items (self->files);
+     195                 :             : 
+     196                 :           1 :   gtk_widget_action_set_enabled (GTK_WIDGET (self), "chooser.open",
+     197                 :           1 :                                  (n_rows > 0 && n_files == 1));
+     198         [ -  + ]:           1 :   gtk_widget_action_set_enabled (GTK_WIDGET (self), "chooser.share",
+     199                 :           1 :                                  (n_rows > 0 && n_files >= 1));
+     200                 :           1 : }
+     201                 :             : 
+     202                 :             : static gboolean
+     203                 :           0 : valent_share_target_chooser_refresh (gpointer data)
+     204                 :             : {
+     205                 :           0 :   ValentDeviceManager *manager = VALENT_DEVICE_MANAGER (data);
+     206                 :             : 
+     207         [ #  # ]:           0 :   g_assert (VALENT_IS_DEVICE_MANAGER (manager));
+     208                 :             : 
+     209                 :           0 :   valent_device_manager_refresh (manager);
+     210                 :             : 
+     211                 :           0 :   return G_SOURCE_CONTINUE;
+     212                 :             : }
+     213                 :             : 
+     214                 :             : /*
+     215                 :             :  * GAction
+     216                 :             :  */
+     217                 :             : static void
+     218                 :           0 : chooser_cancel_action (GtkWidget  *widget,
+     219                 :             :                        const char *action_name,
+     220                 :             :                        GVariant   *parameter)
+     221                 :             : {
+     222                 :           0 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (widget);
+     223                 :             : 
+     224         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_TARGET_CHOOSER (self));
+     225                 :             : 
+     226                 :           0 :   gtk_window_destroy (GTK_WINDOW (self));
+     227                 :           0 : }
+     228                 :             : 
+     229                 :             : static void
+     230                 :           0 : chooser_open_action (GtkWidget  *widget,
+     231                 :             :                      const char *action_name,
+     232                 :             :                      GVariant   *parameter)
+     233                 :             : {
+     234                 :           0 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (widget);
+     235                 :           0 :   GtkListBoxRow *row;
+     236                 :           0 :   ValentDevice *device = NULL;
+     237                 :           0 :   g_autoptr (GFile) file = NULL;
+     238                 :           0 :   GVariant *target = NULL;
+     239                 :             : 
+     240         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_TARGET_CHOOSER (self));
+     241                 :             : 
+     242   [ #  #  #  # ]:           0 :   if ((row = gtk_list_box_get_selected_row (self->device_list)) == NULL ||
+     243                 :           0 :       g_list_model_get_n_items (self->files) == 0)
+     244                 :           0 :     return;
+     245                 :             : 
+     246                 :           0 :   device = g_object_get_data (G_OBJECT (row), "device");
+     247                 :           0 :   file = g_list_model_get_item (self->files, 0);
+     248                 :           0 :   target = g_variant_new_take_string (g_file_get_uri (file));
+     249                 :             : 
+     250                 :           0 :   g_action_group_activate_action (G_ACTION_GROUP (device), "share.open", target);
+     251                 :             : 
+     252         [ #  # ]:           0 :   gtk_window_close (GTK_WINDOW (self));
+     253                 :             : }
+     254                 :             : 
+     255                 :             : static void
+     256                 :           0 : chooser_share_action (GtkWidget  *widget,
+     257                 :             :                       const char *action_name,
+     258                 :             :                       GVariant   *parameter)
+     259                 :             : {
+     260                 :           0 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (widget);
+     261                 :           0 :   GtkListBoxRow *row;
+     262                 :             : 
+     263                 :           0 :   row = gtk_list_box_get_selected_row (self->device_list);
+     264                 :           0 :   on_row_activated (self->device_list, row, self);
+     265                 :           0 : }
+     266                 :             : 
+     267                 :             : /*
+     268                 :             :  * GObject
+     269                 :             :  */
+     270                 :             : static void
+     271                 :           1 : valent_share_target_chooser_constructed (GObject *object)
+     272                 :             : {
+     273                 :           1 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (object);
+     274                 :             : 
+     275         [ +  - ]:           1 :   g_assert (G_IS_LIST_MODEL (self->files));
+     276                 :             : 
+     277                 :           1 :   self->manager = valent_device_manager_get_default ();
+     278                 :           1 :   g_signal_connect_object (self->manager,
+     279                 :             :                            "items-changed",
+     280                 :             :                            G_CALLBACK (on_items_changed),
+     281                 :             :                            self, 0);
+     282                 :           1 :   on_items_changed (G_LIST_MODEL (self->manager),
+     283                 :             :                     0,
+     284                 :             :                     0,
+     285                 :           1 :                     g_list_model_get_n_items (G_LIST_MODEL (self->manager)),
+     286                 :             :                     self);
+     287                 :           1 :   on_selected_rows_changed (self->device_list, self);
+     288                 :             : 
+     289                 :             :   /* Broadcast every 5 seconds to re-connect devices that may have gone idle */
+     290                 :           1 :   valent_device_manager_refresh (self->manager);
+     291                 :           1 :   self->refresh_id = g_timeout_add_seconds_full (G_PRIORITY_LOW,
+     292                 :             :                                                  5,
+     293                 :             :                                                  valent_share_target_chooser_refresh,
+     294                 :           1 :                                                  g_object_ref (self->manager),
+     295                 :             :                                                  g_object_unref);
+     296                 :             : 
+     297                 :           1 :   G_OBJECT_CLASS (valent_share_target_chooser_parent_class)->constructed (object);
+     298                 :           1 : }
+     299                 :             : 
+     300                 :             : static void
+     301                 :           1 : valent_share_target_chooser_dispose (GObject *object)
+     302                 :             : {
+     303                 :           1 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (object);
+     304                 :             : 
+     305         [ +  - ]:           1 :   g_clear_handle_id (&self->refresh_id, g_source_remove);
+     306                 :             : 
+     307         [ +  - ]:           1 :   if (self->manager != NULL)
+     308                 :             :     {
+     309                 :           1 :       g_signal_handlers_disconnect_by_data (self->manager, self);
+     310                 :           1 :       self->manager = NULL;
+     311                 :             :     }
+     312                 :             : 
+     313                 :           1 :   gtk_widget_dispose_template (GTK_WIDGET (object),
+     314                 :             :                                VALENT_TYPE_SHARE_TARGET_CHOOSER);
+     315                 :             : 
+     316                 :           1 :   G_OBJECT_CLASS (valent_share_target_chooser_parent_class)->dispose (object);
+     317                 :           1 : }
+     318                 :             : 
+     319                 :             : static void
+     320                 :           1 : valent_share_target_chooser_finalize (GObject *object)
+     321                 :             : {
+     322                 :           1 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (object);
+     323                 :             : 
+     324         [ +  - ]:           1 :   g_clear_object (&self->files);
+     325                 :             : 
+     326                 :           1 :   G_OBJECT_CLASS (valent_share_target_chooser_parent_class)->finalize (object);
+     327                 :           1 : }
+     328                 :             : 
+     329                 :             : static void
+     330                 :           1 : valent_share_target_chooser_get_property (GObject    *object,
+     331                 :             :                                           guint       prop_id,
+     332                 :             :                                           GValue     *value,
+     333                 :             :                                           GParamSpec *pspec)
+     334                 :             : {
+     335                 :           1 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (object);
+     336                 :             : 
+     337         [ +  - ]:           1 :   switch (prop_id)
+     338                 :             :     {
+     339                 :           1 :     case PROP_FILES:
+     340                 :           1 :       g_value_set_object (value, self->files);
+     341                 :           1 :       break;
+     342                 :             : 
+     343                 :           0 :     default:
+     344                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     345                 :             :     }
+     346                 :           1 : }
+     347                 :             : 
+     348                 :             : static void
+     349                 :           1 : valent_share_target_chooser_set_property (GObject      *object,
+     350                 :             :                                           guint         prop_id,
+     351                 :             :                                           const GValue *value,
+     352                 :             :                                           GParamSpec   *pspec)
+     353                 :             : {
+     354                 :           1 :   ValentShareTargetChooser *self = VALENT_SHARE_TARGET_CHOOSER (object);
+     355                 :             : 
+     356         [ +  - ]:           1 :   switch (prop_id)
+     357                 :             :     {
+     358                 :           1 :     case PROP_FILES:
+     359                 :           1 :       self->files = g_value_dup_object (value);
+     360                 :           1 :       break;
+     361                 :             : 
+     362                 :           0 :     default:
+     363                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     364                 :             :     }
+     365                 :           1 : }
+     366                 :             : 
+     367                 :             : static void
+     368                 :           1 : valent_share_target_chooser_class_init (ValentShareTargetChooserClass *klass)
+     369                 :             : {
+     370                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     371                 :           1 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     372                 :             : 
+     373                 :           1 :   object_class->constructed = valent_share_target_chooser_constructed;
+     374                 :           1 :   object_class->dispose = valent_share_target_chooser_dispose;
+     375                 :           1 :   object_class->finalize = valent_share_target_chooser_finalize;
+     376                 :           1 :   object_class->get_property = valent_share_target_chooser_get_property;
+     377                 :           1 :   object_class->set_property = valent_share_target_chooser_set_property;
+     378                 :             : 
+     379                 :           1 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/share/valent-share-target-chooser.ui");
+     380                 :           1 :   gtk_widget_class_bind_template_child (widget_class, ValentShareTargetChooser, device_list);
+     381                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_row_activated);
+     382                 :           1 :   gtk_widget_class_bind_template_callback (widget_class, on_selected_rows_changed);
+     383                 :             : 
+     384                 :           1 :   gtk_widget_class_install_action (widget_class, "chooser.cancel", NULL, chooser_cancel_action);
+     385                 :           1 :   gtk_widget_class_install_action (widget_class, "chooser.open", NULL, chooser_open_action);
+     386                 :           1 :   gtk_widget_class_install_action (widget_class, "chooser.share", NULL, chooser_share_action);
+     387                 :             : 
+     388                 :             :   /**
+     389                 :             :    * ValentShareTargetChooser:files:
+     390                 :             :    *
+     391                 :             :    * The URIs to pass to the selected [class@Valent.Device].
+     392                 :             :    */
+     393                 :           2 :   properties [PROP_FILES] =
+     394                 :           1 :     g_param_spec_object ("files", NULL, NULL,
+     395                 :             :                          G_TYPE_LIST_MODEL,
+     396                 :             :                          (G_PARAM_READWRITE |
+     397                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     398                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     399                 :             :                           G_PARAM_STATIC_STRINGS));
+     400                 :             : 
+     401                 :           1 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     402                 :           1 : }
+     403                 :             : 
+     404                 :             : static void
+     405                 :           1 : valent_share_target_chooser_init (ValentShareTargetChooser *self)
+     406                 :             : {
+     407                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     408                 :           1 : }
+     409                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target-chooser.h.func-c.html b/coverage/src/plugins/share/valent-share-target-chooser.h.func-c.html new file mode 100644 index 00000000000..28bb69f5d0b --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target-chooser.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target-chooser.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target-chooser.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_TARGET_CHOOSER5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target-chooser.h.func.html b/coverage/src/plugins/share/valent-share-target-chooser.h.func.html new file mode 100644 index 00000000000..cff964a27b7 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target-chooser.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target-chooser.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target-chooser.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_TARGET_CHOOSER5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target-chooser.h.gcov.html b/coverage/src/plugins/share/valent-share-target-chooser.h.gcov.html new file mode 100644 index 00000000000..a5dd2f69ecc --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target-chooser.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target-chooser.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target-chooser.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SHARE_TARGET_CHOOSER (valent_share_target_chooser_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :           5 : G_DECLARE_FINAL_TYPE (ValentShareTargetChooser, valent_share_target_chooser, VALENT, SHARE_TARGET_CHOOSER, GtkWindow)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target.c.func-c.html b/coverage/src/plugins/share/valent-share-target.c.func-c.html new file mode 100644 index 00000000000..3493a710b55 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target.c.func-c.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:36.8 %3814
Test Date:2024-03-31 18:46:36Functions:71.4 %75
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.5 %324
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_destroy0
valent_share_target_open0
valent_share_target_destroy1
valent_share_target_init1
valent_share_target_get_type18
valent_share_target_class_intern_init6
valent_share_target_get_type6
valent_share_target_get_type_once6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target.c.func.html b/coverage/src/plugins/share/valent-share-target.c.func.html new file mode 100644 index 00000000000..09d4e1ddf85 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target.c.func.html @@ -0,0 +1,147 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:36.8 %3814
Test Date:2024-03-31 18:46:36Functions:71.4 %75
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.5 %324
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_destroy0
valent_share_target_destroy1
valent_share_target_get_type18
valent_share_target_class_intern_init6
valent_share_target_get_type6
valent_share_target_get_type_once6
valent_share_target_init1
valent_share_target_open0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target.c.gcov.html b/coverage/src/plugins/share/valent-share-target.c.gcov.html new file mode 100644 index 00000000000..f77cf69c8ae --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target.c.gcov.html @@ -0,0 +1,204 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:36.8 %3814
Test Date:2024-03-31 18:46:36Functions:71.4 %75
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:12.5 %324
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-target"
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : #include <gtk/gtk.h>
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : #include "valent-share-target.h"
+      11                 :             : #include "valent-share-target-chooser.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : struct _ValentShareTarget
+      15                 :             : {
+      16                 :             :   ValentApplicationPlugin  parent_instance;
+      17                 :             : 
+      18                 :             :   GPtrArray               *windows;
+      19                 :             : };
+      20                 :             : 
+      21   [ +  +  +  - ]:          18 : G_DEFINE_FINAL_TYPE (ValentShareTarget, valent_share_target, VALENT_TYPE_APPLICATION_PLUGIN)
+      22                 :             : 
+      23                 :             : 
+      24                 :             : static void
+      25                 :           0 : on_destroy (GtkWindow         *window,
+      26                 :             :             ValentShareTarget *self)
+      27                 :             : {
+      28                 :           0 :   unsigned int index;
+      29                 :             : 
+      30   [ #  #  #  #  :           0 :   g_assert (GTK_IS_WINDOW (window));
+             #  #  #  # ]
+      31         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_TARGET (self));
+      32                 :             : 
+      33                 :             :   /* The signal was emitted because we're disposing or being disabled */
+      34         [ #  # ]:           0 :   if (self->windows == NULL)
+      35                 :           0 :     return;
+      36                 :             : 
+      37         [ #  # ]:           0 :   if (g_ptr_array_find (self->windows, window, &index))
+      38                 :           0 :     g_ptr_array_steal_index (self->windows, index);
+      39                 :             : }
+      40                 :             : 
+      41                 :             : /*
+      42                 :             :  * ValentApplicationPlugin
+      43                 :             :  */
+      44                 :             : static gboolean
+      45                 :           0 : valent_share_target_open (ValentApplicationPlugin  *plugin,
+      46                 :             :                           GFile                   **files,
+      47                 :             :                           int                       n_files,
+      48                 :             :                           const char               *hint)
+      49                 :             : {
+      50                 :           0 :   ValentShareTarget *self = VALENT_SHARE_TARGET (plugin);
+      51                 :           0 :   g_autoptr (GListStore) list = NULL;
+      52                 :           0 :   GtkWindow *window = NULL;
+      53                 :             : 
+      54         [ #  # ]:           0 :   g_assert (VALENT_IS_SHARE_TARGET (plugin));
+      55         [ #  # ]:           0 :   g_assert (files != NULL);
+      56         [ #  # ]:           0 :   g_assert (n_files > 0);
+      57         [ #  # ]:           0 :   g_assert (hint != NULL);
+      58                 :             : 
+      59                 :           0 :   list = g_list_store_new (G_TYPE_FILE);
+      60                 :             : 
+      61         [ #  # ]:           0 :   for (int i = 0; i < n_files; i++)
+      62                 :           0 :     g_list_store_append (list, files[i]);
+      63                 :             : 
+      64                 :           0 :   window = g_object_new (VALENT_TYPE_SHARE_TARGET_CHOOSER,
+      65                 :             :                          "files",          list,
+      66                 :             :                          NULL);
+      67                 :             : 
+      68                 :           0 :   g_signal_connect_object (G_OBJECT (window),
+      69                 :             :                            "destroy",
+      70                 :             :                            G_CALLBACK (on_destroy),
+      71                 :             :                            self, 0);
+      72                 :           0 :   g_ptr_array_add (self->windows, window);
+      73                 :             : 
+      74                 :           0 :   gtk_window_present (window);
+      75                 :             : 
+      76         [ #  # ]:           0 :   return TRUE;
+      77                 :             : }
+      78                 :             : 
+      79                 :             : /*
+      80                 :             :  * ValentObject
+      81                 :             :  */
+      82                 :             : static void
+      83                 :           1 : valent_share_target_destroy (ValentObject *object)
+      84                 :             : {
+      85                 :           1 :   ValentShareTarget *self = VALENT_SHARE_TARGET (object);
+      86                 :             : 
+      87         [ +  - ]:           1 :   g_clear_pointer (&self->windows, g_ptr_array_unref);
+      88                 :             : 
+      89                 :           1 :   VALENT_OBJECT_CLASS (valent_share_target_parent_class)->destroy (object);
+      90                 :           1 : }
+      91                 :             : 
+      92                 :             : /*
+      93                 :             :  * GObject
+      94                 :             :  */
+      95                 :             : static void
+      96                 :           6 : valent_share_target_class_init (ValentShareTargetClass *klass)
+      97                 :             : {
+      98                 :           6 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+      99                 :           6 :   ValentApplicationPluginClass *plugin_class = VALENT_APPLICATION_PLUGIN_CLASS (klass);
+     100                 :             : 
+     101                 :           6 :   vobject_class->destroy = valent_share_target_destroy;
+     102                 :             : 
+     103                 :           6 :   plugin_class->open = valent_share_target_open;
+     104                 :             : }
+     105                 :             : 
+     106                 :             : static void
+     107                 :           1 : valent_share_target_init (ValentShareTarget *self)
+     108                 :             : {
+     109                 :           1 :   self->windows = g_ptr_array_new_with_free_func ((GDestroyNotify)gtk_window_destroy);
+     110                 :           1 : }
+     111                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target.h.func-c.html b/coverage/src/plugins/share/valent-share-target.h.func-c.html new file mode 100644 index 00000000000..70f224365ef --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_TARGET0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target.h.func.html b/coverage/src/plugins/share/valent-share-target.h.func.html new file mode 100644 index 00000000000..b7dfac9beb4 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_TARGET0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-target.h.gcov.html b/coverage/src/plugins/share/valent-share-target.h.gcov.html new file mode 100644 index 00000000000..4113290bc17 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-target.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-target.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-target.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:0.0 %60
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SHARE_TARGET (valent_share_target_get_type())
+      11                 :             : 
+      12   [ #  #  #  #  :           0 : G_DECLARE_FINAL_TYPE (ValentShareTarget, valent_share_target, VALENT, SHARE_TARGET, ValentApplicationPlugin)
+                   #  # ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-text-dialog.c.func-c.html b/coverage/src/plugins/share/valent-share-text-dialog.c.func-c.html new file mode 100644 index 00000000000..66109c950da --- /dev/null +++ b/coverage/src/plugins/share/valent-share-text-dialog.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-text-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-text-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:72.3 %9468
Test Date:2024-03-31 18:46:36Functions:80.0 %1512
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:35.0 %4014
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_file_replace_contents_cb0
gtk_file_dialog_save_cb0
valent_share_text_dialog_close_request0
valent_share_text_dialog_get_property1
valent_share_text_dialog_get_text1
valent_share_text_dialog_class_init2
valent_share_text_dialog_response2
valent_share_text_dialog_dispose4
valent_share_text_dialog_finalize4
valent_share_text_dialog_init4
valent_share_text_dialog_set_property4
valent_share_text_dialog_set_text4
valent_share_text_dialog_get_type19
valent_share_text_dialog_class_intern_init2
valent_share_text_dialog_get_type_once2
valent_share_text_dialog_get_type15
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-text-dialog.c.func.html b/coverage/src/plugins/share/valent-share-text-dialog.c.func.html new file mode 100644 index 00000000000..0d83e1506eb --- /dev/null +++ b/coverage/src/plugins/share/valent-share-text-dialog.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-text-dialog.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-text-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:72.3 %9468
Test Date:2024-03-31 18:46:36Functions:80.0 %1512
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:35.0 %4014
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_file_replace_contents_cb0
gtk_file_dialog_save_cb0
valent_share_text_dialog_class_init2
valent_share_text_dialog_close_request0
valent_share_text_dialog_dispose4
valent_share_text_dialog_finalize4
valent_share_text_dialog_get_property1
valent_share_text_dialog_get_text1
valent_share_text_dialog_get_type19
valent_share_text_dialog_class_intern_init2
valent_share_text_dialog_get_type15
valent_share_text_dialog_get_type_once2
valent_share_text_dialog_init4
valent_share_text_dialog_response2
valent_share_text_dialog_set_property4
valent_share_text_dialog_set_text4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-text-dialog.c.gcov.html b/coverage/src/plugins/share/valent-share-text-dialog.c.gcov.html new file mode 100644 index 00000000000..fa6416a697c --- /dev/null +++ b/coverage/src/plugins/share/valent-share-text-dialog.c.gcov.html @@ -0,0 +1,358 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-text-dialog.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-text-dialog.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:72.3 %9468
Test Date:2024-03-31 18:46:36Functions:80.0 %1512
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:35.0 %4014
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-text-dialog"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-share-text-dialog.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentShareTextDialog
+      17                 :             : {
+      18                 :             :   AdwMessageDialog  parent_instance;
+      19                 :             : 
+      20                 :             :   char             *text;
+      21                 :             :   GtkLabel         *text_label;
+      22                 :             : };
+      23                 :             : 
+      24   [ +  +  +  - ]:          19 : G_DEFINE_FINAL_TYPE (ValentShareTextDialog, valent_share_text_dialog, ADW_TYPE_MESSAGE_DIALOG)
+      25                 :             : 
+      26                 :             : enum {
+      27                 :             :   PROP_0,
+      28                 :             :   PROP_TEXT,
+      29                 :             :   N_PROPERTIES
+      30                 :             : };
+      31                 :             : 
+      32                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      33                 :             : 
+      34                 :             : 
+      35                 :             : static void
+      36                 :           0 : g_file_replace_contents_cb (GFile        *file,
+      37                 :             :                             GAsyncResult *result,
+      38                 :             :                             gpointer      user_data)
+      39                 :             : {
+      40                 :           0 :   g_autoptr (GError) error = NULL;
+      41                 :             : 
+      42         [ #  # ]:           0 :   if (!g_file_replace_contents_finish (file, result, NULL, &error))
+      43                 :           0 :     g_warning ("\"%s\": %s", g_file_peek_path (file), error->message);
+      44                 :           0 : }
+      45                 :             : 
+      46                 :             : static void
+      47                 :           0 : gtk_file_dialog_save_cb (GtkFileDialog         *dialog,
+      48                 :             :                          GAsyncResult          *result,
+      49                 :             :                          ValentShareTextDialog *self)
+      50                 :             : {
+      51                 :           0 :   g_autoptr (GBytes) bytes = NULL;
+      52         [ #  # ]:           0 :   g_autoptr (GFile) file = NULL;
+      53                 :           0 :   g_autoptr (GError) error = NULL;
+      54                 :             : 
+      55         [ #  # ]:           0 :   if ((file = gtk_file_dialog_save_finish (dialog, result, &error)) == NULL)
+      56                 :             :     {
+      57   [ #  #  #  # ]:           0 :       if (!g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED) &&
+      58                 :           0 :           !g_error_matches (error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_DISMISSED))
+      59                 :           0 :         g_warning ("%s(): %s", G_STRFUNC, error->message);
+      60                 :             : 
+      61         [ #  # ]:           0 :       return;
+      62                 :             :     }
+      63                 :             : 
+      64                 :           0 :   bytes = g_bytes_new (self->text, strlen (self->text));
+      65                 :           0 :   g_file_replace_contents_bytes_async (file,
+      66                 :             :                                        bytes,
+      67                 :             :                                        NULL,
+      68                 :             :                                        FALSE,
+      69                 :             :                                        G_FILE_CREATE_REPLACE_DESTINATION,
+      70                 :             :                                        NULL,
+      71                 :             :                                        (GAsyncReadyCallback)g_file_replace_contents_cb,
+      72                 :             :                                        NULL);
+      73         [ #  # ]:           0 :   gtk_window_destroy (GTK_WINDOW (self));
+      74                 :             : }
+      75                 :             : 
+      76                 :             : /*
+      77                 :             :  * AdwMessageDialog
+      78                 :             :  */
+      79                 :             : static void
+      80                 :           2 : valent_share_text_dialog_response (AdwMessageDialog *dialog,
+      81                 :             :                                    const char       *response)
+      82                 :             : {
+      83                 :           2 :   ValentShareTextDialog *self = VALENT_SHARE_TEXT_DIALOG (dialog);
+      84                 :             : 
+      85         [ +  - ]:           2 :   g_assert (VALENT_IS_SHARE_TEXT_DIALOG (self));
+      86                 :             : 
+      87         [ +  + ]:           2 :   if (g_strcmp0 (response, "copy") == 0)
+      88                 :             :     {
+      89                 :           1 :       gdk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (dialog)),
+      90                 :           1 :                               self->text);
+      91                 :           1 :       gtk_window_destroy (GTK_WINDOW (dialog));
+      92                 :             :     }
+      93         [ +  - ]:           1 :   else if (g_strcmp0 (response, "save") == 0)
+      94                 :             :     {
+      95                 :           3 :       g_autoptr (GtkFileDialog) chooser = NULL;
+      96                 :             : 
+      97                 :           1 :       chooser = g_object_new (GTK_TYPE_FILE_DIALOG,
+      98                 :             :                               "accept-label", _("Save"),
+      99                 :             :                               "modal",        TRUE,
+     100                 :             :                               NULL);
+     101         [ +  - ]:           1 :       gtk_file_dialog_save (chooser,
+     102                 :             :                             GTK_WINDOW (dialog),
+     103                 :             :                             NULL,
+     104                 :             :                             (GAsyncReadyCallback)gtk_file_dialog_save_cb,
+     105                 :             :                             self);
+     106                 :             :     }
+     107         [ #  # ]:           0 :   else if (g_strcmp0 (response, "close") == 0)
+     108                 :             :     {
+     109                 :           0 :       gtk_window_destroy (GTK_WINDOW (dialog));
+     110                 :             :     }
+     111                 :           2 : }
+     112                 :             : 
+     113                 :             : /*
+     114                 :             :  * GtkWindow
+     115                 :             :  */
+     116                 :             : static gboolean
+     117                 :           0 : valent_share_text_dialog_close_request (GtkWindow *window)
+     118                 :             : {
+     119                 :             :   /* Chain-up to AdwMessageDialog to avoid re-entrancy with `response` */
+     120                 :           0 :   GTK_WINDOW_CLASS (valent_share_text_dialog_parent_class)->close_request (window);
+     121                 :             : 
+     122                 :             :   /* Unconditionally block `close-request` */
+     123                 :           0 :   return TRUE;
+     124                 :             : }
+     125                 :             : 
+     126                 :             : /*
+     127                 :             :  * GObject
+     128                 :             :  */
+     129                 :             : static void
+     130                 :           4 : valent_share_text_dialog_dispose (GObject *object)
+     131                 :             : {
+     132                 :           4 :   GtkWidget *widget = GTK_WIDGET (object);
+     133                 :             : 
+     134                 :           4 :   gtk_widget_dispose_template (widget, VALENT_TYPE_SHARE_TEXT_DIALOG);
+     135                 :             : 
+     136                 :           4 :   G_OBJECT_CLASS (valent_share_text_dialog_parent_class)->dispose (object);
+     137                 :           4 : }
+     138                 :             : 
+     139                 :             : static void
+     140                 :           4 : valent_share_text_dialog_finalize (GObject *object)
+     141                 :             : {
+     142                 :           4 :   ValentShareTextDialog *self = VALENT_SHARE_TEXT_DIALOG (object);
+     143                 :             : 
+     144         [ +  - ]:           4 :   g_clear_pointer (&self->text, g_free);
+     145                 :             : 
+     146                 :           4 :   G_OBJECT_CLASS (valent_share_text_dialog_parent_class)->finalize (object);
+     147                 :           4 : }
+     148                 :             : 
+     149                 :             : static void
+     150                 :           1 : valent_share_text_dialog_get_property (GObject    *object,
+     151                 :             :                                        guint       prop_id,
+     152                 :             :                                        GValue     *value,
+     153                 :             :                                        GParamSpec *pspec)
+     154                 :             : {
+     155                 :           1 :   ValentShareTextDialog *self = VALENT_SHARE_TEXT_DIALOG (object);
+     156                 :             : 
+     157         [ +  - ]:           1 :   switch (prop_id)
+     158                 :             :     {
+     159                 :           1 :     case PROP_TEXT:
+     160                 :           1 :       g_value_set_string (value, valent_share_text_dialog_get_text (self));
+     161                 :           1 :       break;
+     162                 :             : 
+     163                 :           0 :     default:
+     164                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     165                 :             :     }
+     166                 :           1 : }
+     167                 :             : 
+     168                 :             : static void
+     169                 :           4 : valent_share_text_dialog_set_property (GObject      *object,
+     170                 :             :                                        guint         prop_id,
+     171                 :             :                                        const GValue *value,
+     172                 :             :                                        GParamSpec   *pspec)
+     173                 :             : {
+     174                 :           4 :   ValentShareTextDialog *self = VALENT_SHARE_TEXT_DIALOG (object);
+     175                 :             : 
+     176         [ +  - ]:           4 :   switch (prop_id)
+     177                 :             :     {
+     178                 :           4 :     case PROP_TEXT:
+     179                 :           4 :       valent_share_text_dialog_set_text (self, g_value_get_string (value));
+     180                 :           4 :       break;
+     181                 :             : 
+     182                 :           0 :     default:
+     183                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     184                 :             :     }
+     185                 :           4 : }
+     186                 :             : 
+     187                 :             : static void
+     188                 :           2 : valent_share_text_dialog_class_init (ValentShareTextDialogClass *klass)
+     189                 :             : {
+     190                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     191                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     192                 :           2 :   GtkWindowClass *window_class = GTK_WINDOW_CLASS (klass);
+     193                 :           2 :   AdwMessageDialogClass *dialog_class = ADW_MESSAGE_DIALOG_CLASS (klass);
+     194                 :             : 
+     195                 :           2 :   object_class->finalize = valent_share_text_dialog_finalize;
+     196                 :           2 :   object_class->dispose = valent_share_text_dialog_dispose;
+     197                 :           2 :   object_class->get_property = valent_share_text_dialog_get_property;
+     198                 :           2 :   object_class->set_property = valent_share_text_dialog_set_property;
+     199                 :             : 
+     200                 :           2 :   window_class->close_request = valent_share_text_dialog_close_request;
+     201                 :             : 
+     202                 :           2 :   dialog_class->response = valent_share_text_dialog_response;
+     203                 :             : 
+     204                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/share/valent-share-text-dialog.ui");
+     205                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentShareTextDialog, text_label);
+     206                 :             : 
+     207                 :             :   /**
+     208                 :             :    * ValentShareTextDialog:text:
+     209                 :             :    *
+     210                 :             :    * The text content shared from the remote [class@Valent.Device].
+     211                 :             :    */
+     212                 :           4 :   properties [PROP_TEXT] =
+     213                 :           2 :     g_param_spec_string ("text", NULL, NULL,
+     214                 :             :                          NULL,
+     215                 :             :                          (G_PARAM_READWRITE |
+     216                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     217                 :             :                           G_PARAM_STATIC_STRINGS));
+     218                 :             : 
+     219                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     220                 :           2 : }
+     221                 :             : 
+     222                 :             : static void
+     223                 :           4 : valent_share_text_dialog_init (ValentShareTextDialog *self)
+     224                 :             : {
+     225                 :           4 :   gtk_widget_init_template (GTK_WIDGET (self));
+     226                 :           4 : }
+     227                 :             : 
+     228                 :             : /**
+     229                 :             :  * valent_share_text_dialog_get_text:
+     230                 :             :  * @dialog: a `ValentShareTextDialog`
+     231                 :             :  *
+     232                 :             :  * Get the text content shared by the remote [class@Valent.Device].
+     233                 :             :  *
+     234                 :             :  * Returns: (transfer none) (nullable): the text content
+     235                 :             :  */
+     236                 :             : const char *
+     237                 :           1 : valent_share_text_dialog_get_text (ValentShareTextDialog *dialog)
+     238                 :             : {
+     239         [ +  - ]:           1 :   g_assert (VALENT_IS_SHARE_TEXT_DIALOG (dialog));
+     240                 :             : 
+     241                 :           1 :   return dialog->text;
+     242                 :             : }
+     243                 :             : 
+     244                 :             : /**
+     245                 :             :  * valent_share_text_dialog_set_text:
+     246                 :             :  * @self: a `ValentShareTextDialog`
+     247                 :             :  * @text: (nullable): text content
+     248                 :             :  *
+     249                 :             :  * Set the text content shared by the remote [class@Valent.Device].
+     250                 :             :  */
+     251                 :             : void
+     252                 :           4 : valent_share_text_dialog_set_text (ValentShareTextDialog *dialog,
+     253                 :             :                                    const char            *text)
+     254                 :             : {
+     255         [ +  - ]:           4 :   g_assert (VALENT_IS_SHARE_TEXT_DIALOG (dialog));
+     256                 :             : 
+     257         [ +  - ]:           4 :   if (g_set_str (&dialog->text, text))
+     258                 :             :     {
+     259                 :           4 :       g_autofree char *markup = NULL;
+     260                 :             : 
+     261                 :           4 :       markup = valent_string_to_markup (dialog->text);
+     262                 :           4 :       gtk_label_set_markup (dialog->text_label, markup);
+     263                 :           4 :       g_object_notify_by_pspec (G_OBJECT (dialog), properties [PROP_TEXT]);
+     264                 :             :     }
+     265                 :           4 : }
+     266                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-text-dialog.h.func-c.html b/coverage/src/plugins/share/valent-share-text-dialog.h.func-c.html new file mode 100644 index 00000000000..e30391d2caa --- /dev/null +++ b/coverage/src/plugins/share/valent-share-text-dialog.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-text-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-text-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_TEXT_DIALOG7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-text-dialog.h.func.html b/coverage/src/plugins/share/valent-share-text-dialog.h.func.html new file mode 100644 index 00000000000..cfa9c017930 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-text-dialog.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-text-dialog.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-text-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_TEXT_DIALOG7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-text-dialog.h.gcov.html b/coverage/src/plugins/share/valent-share-text-dialog.h.gcov.html new file mode 100644 index 00000000000..0d914588ec5 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-text-dialog.h.gcov.html @@ -0,0 +1,113 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-text-dialog.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-text-dialog.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : #include <gtk/gtk.h>
+       8                 :             : 
+       9                 :             : G_BEGIN_DECLS
+      10                 :             : 
+      11                 :             : #define VALENT_TYPE_SHARE_TEXT_DIALOG (valent_share_text_dialog_get_type())
+      12                 :             : 
+      13   [ +  -  +  -  :           7 : G_DECLARE_FINAL_TYPE (ValentShareTextDialog, valent_share_text_dialog, VALENT, SHARE_TEXT_DIALOG, AdwMessageDialog)
+                   -  + ]
+      14                 :             : 
+      15                 :             : const char * valent_share_text_dialog_get_text (ValentShareTextDialog *dialog);
+      16                 :             : void         valent_share_text_dialog_set_text (ValentShareTextDialog *dialog,
+      17                 :             :                                                 const char            *text);
+      18                 :             : 
+      19                 :             : G_END_DECLS
+      20                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-upload.c.func-c.html b/coverage/src/plugins/share/valent-share-upload.c.func-c.html new file mode 100644 index 00000000000..f0a8f353e79 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-upload.c.func-c.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-upload.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-upload.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.5 %214200
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:45.5 %15470
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_share_upload_add_files1
valent_share_upload_get_item1
valent_share_upload_get_item_type1
g_list_model_iface_init2
valent_share_upload_class_init2
valent_share_upload_execute4
valent_share_upload_finalize4
valent_share_upload_init4
valent_share_upload_new4
valent_share_upload_set_property4
valent_share_upload_add_file6
valent_share_upload_add_files_cb7
valent_share_upload_add_files_task7
valent_share_upload_get_property7
valent_share_upload_update7
valent_share_upload_get_n_items8
valent_share_upload_update_transfer10
valent_transfer_execute_cb10
valent_share_upload_get_type64
valent_share_upload_class_intern_init2
valent_share_upload_get_type_once2
valent_share_upload_get_type60
valent_share_upload_idle155
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-upload.c.func.html b/coverage/src/plugins/share/valent-share-upload.c.func.html new file mode 100644 index 00000000000..a602b228468 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-upload.c.func.html @@ -0,0 +1,252 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-upload.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-upload.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.5 %214200
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:45.5 %15470
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init2
valent_share_upload_add_file6
valent_share_upload_add_files1
valent_share_upload_add_files_cb7
valent_share_upload_add_files_task7
valent_share_upload_class_init2
valent_share_upload_execute4
valent_share_upload_finalize4
valent_share_upload_get_item1
valent_share_upload_get_item_type1
valent_share_upload_get_n_items8
valent_share_upload_get_property7
valent_share_upload_get_type64
valent_share_upload_class_intern_init2
valent_share_upload_get_type60
valent_share_upload_get_type_once2
valent_share_upload_idle155
valent_share_upload_init4
valent_share_upload_new4
valent_share_upload_set_property4
valent_share_upload_update7
valent_share_upload_update_transfer10
valent_transfer_execute_cb10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-upload.c.gcov.html b/coverage/src/plugins/share/valent-share-upload.c.gcov.html new file mode 100644 index 00000000000..d4d61007f14 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-upload.c.gcov.html @@ -0,0 +1,592 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-upload.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-upload.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.5 %214200
Test Date:2024-03-31 18:46:36Functions:100.0 %2222
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:45.5 %15470
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-share-upload"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-share-upload.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : /**
+      15                 :             :  * ValentShareUpload:
+      16                 :             :  *
+      17                 :             :  * A class for multi-file uploads.
+      18                 :             :  *
+      19                 :             :  * `ValentShareUpload` is a class that supports multi-file uploads for
+      20                 :             :  * `ValentSharePlugin`.
+      21                 :             :  */
+      22                 :             : 
+      23                 :             : struct _ValentShareUpload
+      24                 :             : {
+      25                 :             :   ValentTransfer  parent_instance;
+      26                 :             : 
+      27                 :             :   ValentDevice   *device;
+      28                 :             :   GPtrArray      *items;
+      29                 :             : 
+      30                 :             :   unsigned int    position;
+      31                 :             :   unsigned int    processing_files;
+      32                 :             :   goffset         payload_size;
+      33                 :             : };
+      34                 :             : 
+      35                 :             : static void       g_list_model_iface_init  (GListModelInterface *iface);
+      36                 :             : static gboolean   valent_share_upload_idle (gpointer             data);
+      37                 :             : 
+      38   [ +  +  +  - ]:          64 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentShareUpload, valent_share_upload, VALENT_TYPE_TRANSFER,
+      39                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      40                 :             : 
+      41                 :             : enum {
+      42                 :             :   PROP_0,
+      43                 :             :   PROP_DEVICE,
+      44                 :             :   N_PROPERTIES,
+      45                 :             : };
+      46                 :             : 
+      47                 :             : static GParamSpec *properties[N_PROPERTIES] = { 0, };
+      48                 :             : 
+      49                 :             : 
+      50                 :             : static void
+      51                 :           7 : valent_share_upload_update (ValentShareUpload *self)
+      52                 :             : {
+      53                 :          14 :   g_autoptr (JsonNode) packet = NULL;
+      54         [ +  - ]:           7 :   g_autoptr (JsonBuilder) builder = NULL;
+      55                 :             : 
+      56         [ +  - ]:           7 :   g_assert (VALENT_IS_SHARE_UPLOAD (self));
+      57                 :             : 
+      58                 :           7 :   valent_packet_init (&builder, "kdeconnect.share.request.update");
+      59                 :           7 :   json_builder_set_member_name (builder, "numberOfFiles");
+      60                 :           7 :   json_builder_add_int_value (builder, self->items->len);
+      61                 :           7 :   json_builder_set_member_name (builder, "totalPayloadSize");
+      62                 :           7 :   json_builder_add_int_value (builder, self->payload_size);
+      63                 :           7 :   packet = valent_packet_end (&builder);
+      64                 :             : 
+      65         [ -  + ]:           7 :   valent_device_send_packet (self->device, packet, NULL, NULL, NULL);
+      66                 :           7 : }
+      67                 :             : 
+      68                 :             : static inline void
+      69                 :          10 : valent_share_upload_update_transfer (ValentShareUpload *self,
+      70                 :             :                                      ValentTransfer    *transfer)
+      71                 :             : {
+      72                 :          20 :   g_autoptr (JsonNode) packet = NULL;
+      73                 :          10 :   JsonObject *body;
+      74                 :             : 
+      75         [ +  - ]:          10 :   g_assert (VALENT_IS_SHARE_UPLOAD (self));
+      76         [ -  + ]:          10 :   g_assert (VALENT_IS_TRANSFER (transfer));
+      77                 :             : 
+      78                 :          10 :   packet = valent_device_transfer_ref_packet (VALENT_DEVICE_TRANSFER (transfer));
+      79                 :          10 :   body = valent_packet_get_body (packet);
+      80                 :          10 :   json_object_set_int_member (body, "numberOfFiles", self->items->len);
+      81         [ +  - ]:          10 :   json_object_set_int_member (body, "totalPayloadSize", self->payload_size);
+      82                 :          10 : }
+      83                 :             : 
+      84                 :             : static void
+      85                 :          10 : valent_transfer_execute_cb (GObject      *object,
+      86                 :             :                             GAsyncResult *result,
+      87                 :             :                             gpointer      user_data)
+      88                 :             : {
+      89                 :          10 :   ValentTransfer *transfer = VALENT_TRANSFER (object);
+      90                 :          10 :   ValentShareUpload *self = g_task_get_source_object (G_TASK (user_data));
+      91                 :          10 :   g_autoptr (GTask) task = G_TASK (user_data);
+      92   [ -  -  +  - ]:          10 :   g_autoptr (GError) error = NULL;
+      93                 :             : 
+      94         [ -  + ]:          10 :   if (!valent_transfer_execute_finish (transfer, result, &error))
+      95         [ #  # ]:           0 :     return g_task_return_error (task, g_steal_pointer (&error));
+      96                 :             : 
+      97         [ +  + ]:          10 :   if (self->position < self->items->len)
+      98                 :             :     {
+      99                 :           6 :       ValentTransfer *item = g_ptr_array_index (self->items, self->position++);
+     100                 :             : 
+     101                 :           6 :       valent_share_upload_update_transfer (self, item);
+     102                 :           6 :       valent_transfer_execute (item,
+     103                 :             :                                g_task_get_cancellable (task),
+     104                 :             :                                valent_transfer_execute_cb,
+     105                 :             :                                g_object_ref (task));
+     106                 :             :     }
+     107         [ -  + ]:           4 :   else if (self->processing_files)
+     108                 :             :     {
+     109         [ -  + ]:          10 :       g_autoptr (GSource) source = NULL;
+     110                 :             : 
+     111                 :           0 :       source = g_idle_source_new ();
+     112         [ #  # ]:           0 :       g_task_attach_source (task, source, valent_share_upload_idle);
+     113                 :             :     }
+     114                 :             :   else
+     115                 :             :     {
+     116                 :           4 :       g_task_return_boolean (task, TRUE);
+     117                 :             :     }
+     118                 :             : }
+     119                 :             : 
+     120                 :             : static gboolean
+     121                 :         155 : valent_share_upload_idle (gpointer data)
+     122                 :             : {
+     123                 :         155 :   ValentShareUpload *self = g_task_get_source_object (G_TASK (data));
+     124                 :         155 :   GTask *task = G_TASK (data);
+     125                 :             : 
+     126         [ -  + ]:         155 :   if (g_task_return_error_if_cancelled (task))
+     127                 :             :     return G_SOURCE_REMOVE;
+     128                 :             : 
+     129         [ +  + ]:         155 :   if (self->position < self->items->len)
+     130                 :             :     {
+     131                 :           4 :       ValentTransfer *item = g_ptr_array_index (self->items, self->position++);
+     132                 :             : 
+     133                 :           4 :       valent_share_upload_update_transfer (self, item);
+     134                 :           4 :       valent_transfer_execute (item,
+     135                 :             :                                g_task_get_cancellable (task),
+     136                 :             :                                valent_transfer_execute_cb,
+     137                 :             :                                g_object_ref (task));
+     138                 :             : 
+     139                 :           4 :       return G_SOURCE_REMOVE;
+     140                 :             :     }
+     141         [ -  + ]:         151 :   else if (self->processing_files)
+     142                 :             :     {
+     143                 :             :       return G_SOURCE_CONTINUE;
+     144                 :             :     }
+     145                 :             : 
+     146                 :           0 :   g_task_return_boolean (task, TRUE);
+     147                 :           0 :   return G_SOURCE_REMOVE;
+     148                 :             : }
+     149                 :             : 
+     150                 :             : static void
+     151                 :           4 : valent_share_upload_execute (ValentTransfer      *transfer,
+     152                 :             :                              GCancellable        *cancellable,
+     153                 :             :                              GAsyncReadyCallback  callback,
+     154                 :             :                              gpointer             user_data)
+     155                 :             : {
+     156                 :           4 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (transfer);
+     157                 :           8 :   g_autoptr (GTask) task = NULL;
+     158         [ +  - ]:           4 :   g_autoptr (GSource) source = NULL;
+     159                 :             : 
+     160         [ +  - ]:           4 :   g_assert (VALENT_IS_SHARE_UPLOAD (self));
+     161   [ +  -  +  -  :           4 :   g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+     162                 :             : 
+     163                 :           4 :   source = g_idle_source_new ();
+     164                 :             : 
+     165                 :           4 :   task = g_task_new (self, cancellable, callback, user_data);
+     166         [ +  - ]:           4 :   g_task_set_source_tag (task, valent_share_upload_execute);
+     167         [ +  - ]:           4 :   g_task_attach_source (task, source, valent_share_upload_idle);
+     168                 :           4 : }
+     169                 :             : 
+     170                 :             : /*
+     171                 :             :  * GListModel
+     172                 :             :  */
+     173                 :             : static gpointer
+     174                 :           1 : valent_share_upload_get_item (GListModel   *model,
+     175                 :             :                               unsigned int  position)
+     176                 :             : {
+     177                 :           1 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (model);
+     178                 :             : 
+     179         [ +  - ]:           1 :   g_assert (VALENT_SHARE_UPLOAD (self));
+     180                 :             : 
+     181         [ +  - ]:           1 :   if G_UNLIKELY (position >= self->items->len)
+     182                 :             :     return NULL;
+     183                 :             : 
+     184                 :           1 :   return g_object_ref (g_ptr_array_index (self->items, position));
+     185                 :             : }
+     186                 :             : 
+     187                 :             : static GType
+     188                 :           1 : valent_share_upload_get_item_type (GListModel *model)
+     189                 :             : {
+     190                 :           1 :   return VALENT_TYPE_TRANSFER;
+     191                 :             : }
+     192                 :             : 
+     193                 :             : static unsigned int
+     194                 :           8 : valent_share_upload_get_n_items (GListModel *model)
+     195                 :             : {
+     196                 :           8 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (model);
+     197                 :             : 
+     198         [ +  - ]:           8 :   g_assert (VALENT_SHARE_UPLOAD (self));
+     199                 :             : 
+     200                 :           8 :   return self->items->len;
+     201                 :             : }
+     202                 :             : 
+     203                 :             : static void
+     204                 :           2 : g_list_model_iface_init (GListModelInterface *iface)
+     205                 :             : {
+     206                 :           2 :   iface->get_item = valent_share_upload_get_item;
+     207                 :           2 :   iface->get_item_type = valent_share_upload_get_item_type;
+     208                 :           2 :   iface->get_n_items = valent_share_upload_get_n_items;
+     209                 :           2 : }
+     210                 :             : 
+     211                 :             : /*
+     212                 :             :  * GObject
+     213                 :             :  */
+     214                 :             : static void
+     215                 :           4 : valent_share_upload_finalize (GObject *object)
+     216                 :             : {
+     217                 :           4 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (object);
+     218                 :             : 
+     219                 :           4 :   valent_object_lock (VALENT_OBJECT (self));
+     220         [ +  - ]:           4 :   g_clear_object (&self->device);
+     221         [ +  - ]:           4 :   g_clear_pointer (&self->items, g_ptr_array_unref);
+     222                 :           4 :   valent_object_unlock (VALENT_OBJECT (self));
+     223                 :             : 
+     224                 :           4 :   G_OBJECT_CLASS (valent_share_upload_parent_class)->finalize (object);
+     225                 :           4 : }
+     226                 :             : 
+     227                 :             : static void
+     228                 :           7 : valent_share_upload_get_property (GObject    *object,
+     229                 :             :                                   guint       prop_id,
+     230                 :             :                                   GValue     *value,
+     231                 :             :                                   GParamSpec *pspec)
+     232                 :             : {
+     233                 :           7 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (object);
+     234                 :             : 
+     235         [ +  - ]:           7 :   switch (prop_id)
+     236                 :             :     {
+     237                 :             :     case PROP_DEVICE:
+     238                 :           7 :       valent_object_lock (VALENT_OBJECT (self));
+     239                 :           7 :       g_value_set_object (value, self->device);
+     240                 :           7 :       valent_object_unlock (VALENT_OBJECT (self));
+     241                 :           7 :       break;
+     242                 :             : 
+     243                 :           0 :     default:
+     244                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     245                 :             :     }
+     246                 :           7 : }
+     247                 :             : 
+     248                 :             : static void
+     249                 :           4 : valent_share_upload_set_property (GObject      *object,
+     250                 :             :                                   guint         prop_id,
+     251                 :             :                                   const GValue *value,
+     252                 :             :                                   GParamSpec   *pspec)
+     253                 :             : {
+     254                 :           4 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (object);
+     255                 :             : 
+     256         [ +  - ]:           4 :   switch (prop_id)
+     257                 :             :     {
+     258                 :             :     case PROP_DEVICE:
+     259                 :           4 :       valent_object_lock (VALENT_OBJECT (self));
+     260                 :           4 :       self->device = g_value_dup_object (value);
+     261                 :           4 :       valent_object_unlock (VALENT_OBJECT (self));
+     262                 :           4 :       break;
+     263                 :             : 
+     264                 :           0 :     default:
+     265                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     266                 :             :     }
+     267                 :           4 : }
+     268                 :             : 
+     269                 :             : static void
+     270                 :           2 : valent_share_upload_class_init (ValentShareUploadClass *klass)
+     271                 :             : {
+     272                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     273                 :           2 :   ValentTransferClass *transfer_class = VALENT_TRANSFER_CLASS (klass);
+     274                 :             : 
+     275                 :           2 :   object_class->finalize = valent_share_upload_finalize;
+     276                 :           2 :   object_class->get_property = valent_share_upload_get_property;
+     277                 :           2 :   object_class->set_property = valent_share_upload_set_property;
+     278                 :             : 
+     279                 :           2 :   transfer_class->execute = valent_share_upload_execute;
+     280                 :             : 
+     281                 :             :   /**
+     282                 :             :    * ValentShareUpload:device:
+     283                 :             :    *
+     284                 :             :    * The [class@Valent.Device] this transfer is for.
+     285                 :             :    */
+     286                 :           4 :   properties [PROP_DEVICE] =
+     287                 :           2 :     g_param_spec_object ("device", NULL, NULL,
+     288                 :             :                          VALENT_TYPE_DEVICE,
+     289                 :             :                          (G_PARAM_READWRITE |
+     290                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     291                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     292                 :             :                           G_PARAM_STATIC_STRINGS));
+     293                 :             : 
+     294                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     295                 :           2 : }
+     296                 :             : 
+     297                 :             : static void
+     298                 :           4 : valent_share_upload_init (ValentShareUpload *self)
+     299                 :             : {
+     300                 :           4 :   self->items = g_ptr_array_new_with_free_func (g_object_unref);
+     301                 :           4 : }
+     302                 :             : 
+     303                 :             : /**
+     304                 :             :  * valent_share_upload_new:
+     305                 :             :  * @device: a `ValentDevice`
+     306                 :             :  *
+     307                 :             :  * Create a new `ValentShareUpload`.
+     308                 :             :  *
+     309                 :             :  * Returns: (transfer full): a new `ValentShareUpload`
+     310                 :             :  */
+     311                 :             : ValentTransfer *
+     312                 :           4 : valent_share_upload_new (ValentDevice *device)
+     313                 :             : {
+     314         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_DEVICE (device), NULL);
+     315                 :             : 
+     316                 :           4 :   return g_object_new (VALENT_TYPE_SHARE_UPLOAD,
+     317                 :             :                        "device", device,
+     318                 :             :                        NULL);
+     319                 :             : }
+     320                 :             : 
+     321                 :             : static void
+     322                 :           7 : valent_share_upload_add_files_cb (GObject      *object,
+     323                 :             :                                   GAsyncResult *result,
+     324                 :             :                                   gpointer      user_data)
+     325                 :             : {
+     326                 :           7 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (object);
+     327                 :           7 :   g_autoptr (GPtrArray) items = NULL;
+     328                 :           7 :   unsigned int position, added;
+     329                 :           7 :   g_autoptr (GError) error = NULL;
+     330                 :             : 
+     331         [ +  - ]:           7 :   g_assert (VALENT_IS_SHARE_UPLOAD (self));
+     332         [ -  + ]:           7 :   g_assert (g_task_is_valid (result, self));
+     333                 :             : 
+     334         [ -  + ]:           7 :   if ((items = g_task_propagate_pointer (G_TASK (result), &error)) == NULL)
+     335                 :             :     {
+     336         [ #  # ]:           0 :       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+     337                 :           0 :         g_warning ("%s: %s", G_OBJECT_TYPE_NAME (self), error->message);
+     338                 :             : 
+     339                 :           0 :       self->processing_files--;
+     340         [ #  # ]:           0 :       return;
+     341                 :             :     }
+     342                 :             : 
+     343                 :           7 :   position = self->items->len;
+     344                 :           7 :   added = items->len;
+     345                 :             : 
+     346         [ +  + ]:          17 :   for (unsigned int i = 0; i < items->len; i++)
+     347                 :             :     {
+     348                 :          10 :       ValentDeviceTransfer *transfer = g_ptr_array_index (items, i);
+     349                 :          10 :       g_autoptr (JsonNode) packet = NULL;
+     350                 :             : 
+     351                 :          10 :       packet = valent_device_transfer_ref_packet (transfer);
+     352         [ +  - ]:          10 :       self->payload_size += valent_packet_get_payload_size (packet);
+     353                 :             :     }
+     354                 :             : 
+     355                 :           7 :   g_ptr_array_extend_and_steal (self->items, g_steal_pointer (&items));
+     356                 :           7 :   self->processing_files--;
+     357                 :             : 
+     358                 :           7 :   g_list_model_items_changed (G_LIST_MODEL (self), position, 0, added);
+     359         [ -  + ]:           7 :   valent_share_upload_update (self);
+     360                 :             : }
+     361                 :             : 
+     362                 :             : static void
+     363                 :           7 : valent_share_upload_add_files_task (GTask        *task,
+     364                 :             :                                     gpointer      source_object,
+     365                 :             :                                     gpointer      task_data,
+     366                 :             :                                     GCancellable *cancellable)
+     367                 :             : {
+     368                 :           7 :   ValentShareUpload *self = VALENT_SHARE_UPLOAD (source_object);
+     369                 :           7 :   GPtrArray *files = task_data;
+     370                 :          14 :   g_autoptr (ValentDevice) device = NULL;
+     371   [ +  -  -  - ]:           7 :   g_autoptr (GPtrArray) items = NULL;
+     372                 :             : 
+     373         [ +  - ]:           7 :   g_assert (VALENT_IS_SHARE_UPLOAD (self));
+     374         [ -  + ]:           7 :   g_assert (files != NULL);
+     375                 :             : 
+     376         [ +  - ]:           7 :   if (g_task_return_error_if_cancelled (task))
+     377                 :             :     return;
+     378                 :             : 
+     379                 :           7 :   valent_object_lock (VALENT_OBJECT (self));
+     380                 :           7 :   device = g_object_ref (self->device);
+     381                 :           7 :   valent_object_unlock (VALENT_OBJECT (self));
+     382                 :             : 
+     383                 :           7 :   items = g_ptr_array_new_with_free_func (g_object_unref);
+     384                 :             : 
+     385         [ +  + ]:          17 :   for (unsigned int i = 0; i < files->len; i++)
+     386                 :             :     {
+     387                 :          10 :       GFile *file = g_ptr_array_index (files, i);
+     388         [ -  - ]:          10 :       g_autoptr (ValentTransfer) transfer = NULL;
+     389         [ -  - ]:          10 :       g_autoptr (GFileInfo) info = NULL;
+     390         [ -  - ]:          10 :       g_autoptr (JsonNode) packet = NULL;
+     391   [ -  -  +  - ]:          10 :       g_autoptr (JsonBuilder) builder = NULL;
+     392                 :          10 :       const char *filename;
+     393                 :          10 :       goffset payload_size;
+     394   [ -  -  -  + ]:          10 :       g_autoptr (GError) error = NULL;
+     395                 :             : 
+     396                 :          10 :       info = g_file_query_info (file,
+     397                 :             :                                 G_FILE_ATTRIBUTE_STANDARD_NAME","
+     398                 :             :                                 G_FILE_ATTRIBUTE_STANDARD_SIZE,
+     399                 :             :                                 G_FILE_QUERY_INFO_NONE,
+     400                 :             :                                 cancellable,
+     401                 :             :                                 &error);
+     402                 :             : 
+     403         [ -  + ]:          10 :       if (info == NULL)
+     404         [ #  # ]:           0 :         return g_task_return_error (task, g_steal_pointer (&error));
+     405                 :             : 
+     406                 :          10 :       filename = g_file_info_get_name (info);
+     407                 :          10 :       payload_size = g_file_info_get_size (info);
+     408                 :             : 
+     409                 :          10 :       valent_packet_init (&builder, "kdeconnect.share.request");
+     410                 :          10 :       json_builder_set_member_name (builder, "filename");
+     411                 :          10 :       json_builder_add_string_value (builder, filename);
+     412                 :          10 :       json_builder_set_member_name (builder, "open");
+     413                 :          10 :       json_builder_add_boolean_value (builder, FALSE);
+     414                 :          10 :       packet = valent_packet_end (&builder);
+     415                 :             : 
+     416                 :          10 :       valent_packet_set_payload_size (packet, payload_size);
+     417                 :             : 
+     418                 :          10 :       transfer = valent_device_transfer_new (device, packet, file);
+     419         [ -  + ]:          10 :       g_ptr_array_add (items, g_steal_pointer (&transfer));
+     420                 :             :     }
+     421                 :             : 
+     422         [ +  - ]:           7 :   g_task_return_pointer (task, g_steal_pointer (&items),
+     423                 :             :                          (GDestroyNotify)g_ptr_array_unref);
+     424                 :             : }
+     425                 :             : 
+     426                 :             : /**
+     427                 :             :  * valent_share_upload_add_file:
+     428                 :             :  * @group: a `ValentShareUpload`
+     429                 :             :  * @file: a `GFile`
+     430                 :             :  *
+     431                 :             :  * Add @file to the transfer operation.
+     432                 :             :  */
+     433                 :             : void
+     434                 :           6 : valent_share_upload_add_file (ValentShareUpload *upload,
+     435                 :             :                               GFile             *file)
+     436                 :             : {
+     437                 :          12 :   g_autoptr (GTask) task = NULL;
+     438         [ +  - ]:           6 :   g_autoptr (GCancellable) destroy = NULL;
+     439         [ +  - ]:           6 :   g_autoptr (GPtrArray) items = NULL;
+     440                 :             : 
+     441         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_SHARE_UPLOAD (upload));
+     442   [ +  -  +  -  :           6 :   g_return_if_fail (G_IS_FILE (file));
+             +  -  -  + ]
+     443                 :             : 
+     444                 :           6 :   upload->processing_files++;
+     445                 :             : 
+     446                 :           6 :   items = g_ptr_array_new_full (1, g_object_unref);
+     447                 :           6 :   g_ptr_array_add (items, g_object_ref (file));
+     448                 :             : 
+     449                 :           6 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (upload));
+     450                 :           6 :   task = g_task_new (upload, destroy, valent_share_upload_add_files_cb, NULL);
+     451         [ +  - ]:           6 :   g_task_set_source_tag (task, valent_share_upload_add_file);
+     452                 :           6 :   g_task_set_task_data (task,
+     453                 :             :                         g_steal_pointer (&items),
+     454                 :             :                         (GDestroyNotify)g_ptr_array_unref);
+     455         [ +  - ]:           6 :   g_task_run_in_thread (task, valent_share_upload_add_files_task);
+     456                 :             : }
+     457                 :             : 
+     458                 :             : /**
+     459                 :             :  * valent_share_upload_add_files:
+     460                 :             :  * @group: a `ValentShareUpload`
+     461                 :             :  * @files: a `GListModel`
+     462                 :             :  *
+     463                 :             :  * Add @files to the transfer operation.
+     464                 :             :  *
+     465                 :             :  * The [property@Gio.ListModel:item-type] of @files must be [type@Gio.File].
+     466                 :             :  *
+     467                 :             :  * Call [method@Valent.ShareUpload.add_files_finish] to get the result.
+     468                 :             :  */
+     469                 :             : void
+     470                 :           1 : valent_share_upload_add_files (ValentShareUpload *upload,
+     471                 :             :                                GListModel        *files)
+     472                 :             : {
+     473                 :           2 :   g_autoptr (GTask) task = NULL;
+     474         [ +  - ]:           1 :   g_autoptr (GCancellable) destroy = NULL;
+     475         [ +  - ]:           1 :   g_autoptr (GPtrArray) items = NULL;
+     476                 :           1 :   unsigned int n_files = 0;
+     477                 :             : 
+     478         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SHARE_UPLOAD (upload));
+     479         [ -  + ]:           1 :   g_return_if_fail (G_IS_LIST_MODEL (files));
+     480         [ -  + ]:           1 :   g_return_if_fail (g_list_model_get_item_type (files) == G_TYPE_FILE);
+     481                 :             : 
+     482                 :           1 :   upload->processing_files++;
+     483                 :             : 
+     484                 :           1 :   n_files = g_list_model_get_n_items (files);
+     485                 :           1 :   items = g_ptr_array_new_full (n_files, g_object_unref);
+     486                 :             : 
+     487         [ +  + ]:           5 :   for (unsigned int i = 0; i < n_files; i++)
+     488                 :           4 :     g_ptr_array_add (items, g_list_model_get_item (files, i));
+     489                 :             : 
+     490                 :           1 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (upload));
+     491                 :           1 :   task = g_task_new (upload, destroy, valent_share_upload_add_files_cb, NULL);
+     492         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_share_upload_add_files);
+     493                 :           1 :   g_task_set_task_data (task,
+     494                 :             :                         g_steal_pointer (&items),
+     495                 :             :                         (GDestroyNotify)g_ptr_array_unref);
+     496         [ +  - ]:           1 :   g_task_run_in_thread (task, valent_share_upload_add_files_task);
+     497                 :             : }
+     498                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-upload.h.func-c.html b/coverage/src/plugins/share/valent-share-upload.h.func-c.html new file mode 100644 index 00000000000..09da411f3de --- /dev/null +++ b/coverage/src/plugins/share/valent-share-upload.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-upload.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-upload.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_UPLOAD56
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-upload.h.func.html b/coverage/src/plugins/share/valent-share-upload.h.func.html new file mode 100644 index 00000000000..4b65adf8e27 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-upload.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-upload.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-upload.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SHARE_UPLOAD56
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/share/valent-share-upload.h.gcov.html b/coverage/src/plugins/share/valent-share-upload.h.gcov.html new file mode 100644 index 00000000000..176a0876827 --- /dev/null +++ b/coverage/src/plugins/share/valent-share-upload.h.gcov.html @@ -0,0 +1,114 @@ + + + + + + + LCOV - Code Coverage - src/plugins/share/valent-share-upload.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/share - valent-share-upload.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SHARE_UPLOAD (valent_share_upload_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          56 : G_DECLARE_FINAL_TYPE (ValentShareUpload, valent_share_upload, VALENT, SHARE_UPLOAD, ValentTransfer)
+                   -  + ]
+      13                 :             : 
+      14                 :             : ValentTransfer * valent_share_upload_new       (ValentDevice      *device);
+      15                 :             : void             valent_share_upload_add_file  (ValentShareUpload *upload,
+      16                 :             :                                                 GFile             *file);
+      17                 :             : void             valent_share_upload_add_files (ValentShareUpload *upload,
+      18                 :             :                                                 GListModel        *files);
+      19                 :             : 
+      20                 :             : G_END_DECLS
+      21                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-detail-sort-b.html b/coverage/src/plugins/sms/index-detail-sort-b.html new file mode 100644 index 00000000000..b4bca28dcf2 --- /dev/null +++ b/coverage/src/plugins/sms/index-detail-sort-b.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-detail-sort-f.html b/coverage/src/plugins/sms/index-detail-sort-f.html new file mode 100644 index 00000000000..020356370f9 --- /dev/null +++ b/coverage/src/plugins/sms/index-detail-sort-f.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-detail-sort-l.html b/coverage/src/plugins/sms/index-detail-sort-l.html new file mode 100644 index 00000000000..de087268b53 --- /dev/null +++ b/coverage/src/plugins/sms/index-detail-sort-l.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-detail.html b/coverage/src/plugins/sms/index-detail.html new file mode 100644 index 00000000000..c9ce9d8e2dd --- /dev/null +++ b/coverage/src/plugins/sms/index-detail.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-sort-b.html b/coverage/src/plugins/sms/index-sort-b.html new file mode 100644 index 00000000000..b4bca28dcf2 --- /dev/null +++ b/coverage/src/plugins/sms/index-sort-b.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-sort-f.html b/coverage/src/plugins/sms/index-sort-f.html new file mode 100644 index 00000000000..020356370f9 --- /dev/null +++ b/coverage/src/plugins/sms/index-sort-f.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index-sort-l.html b/coverage/src/plugins/sms/index-sort-l.html new file mode 100644 index 00000000000..de087268b53 --- /dev/null +++ b/coverage/src/plugins/sms/index-sort-l.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/index.html b/coverage/src/plugins/sms/index.html new file mode 100644 index 00000000000..c9ce9d8e2dd --- /dev/null +++ b/coverage/src/plugins/sms/index.html @@ -0,0 +1,443 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/smsCoverageTotalHit
Test:Code CoverageLines:81.3 %24812016
Test Date:2024-03-31 18:46:36Functions:90.4 %270244
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:48.0 %1524732
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
sms-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-contact-row.c +
90.5%90.5%
+
90.5 %14713350.0 %8442100.0 %1818
valent-contact-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-date-label.c +
79.8%79.8%
+
79.8 %12910353.1 %643494.1 %1716
valent-date-label.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-row.c +
94.2%94.2%
+
94.2 %12011357.5 %7342100.0 %1515
valent-message-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-message-thread.c +
91.1%91.1%
+
91.1 %12311250.0 %6432100.0 %1919
valent-message-thread.h +
100.0%
+
100.0 %1162.5 %85100.0 %11
valent-message.c +
93.8%93.8%
+
93.8 %14513667.6 %6846100.0 %1818
valent-message.h +
100.0%
+
100.0 %1175.0 %129100.0 %11
valent-sms-conversation-row.c +
95.6%95.6%
+
95.6 %13613060.0 %7545100.0 %1818
valent-sms-conversation-row.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-conversation.c +
64.7%64.7%
+
64.7 %35723138.2 %2047871.4 %3525
valent-sms-conversation.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-plugin.c +
81.5%81.5%
+
81.5 %23819446.9 %1306190.0 %2018
valent-sms-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-sms-store.c +
91.2%91.2%
+
91.2 %55951050.3 %38019198.0 %4948
valent-sms-store.h +
100.0%
+
100.0 %1170.0 %107100.0 %11
valent-sms-utils.c +
86.1%86.1%
+
86.1 %15113043.8 %16070100.0 %1212
valent-sms-window.c +
58.1%58.1%
+
58.1 %36321132.7 %1504968.4 %3826
valent-sms-window.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/sms-plugin.c.func-c.html b/coverage/src/plugins/sms/sms-plugin.c.func-c.html new file mode 100644 index 00000000000..132ba774ca2 --- /dev/null +++ b/coverage/src/plugins/sms/sms-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/sms-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - sms-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_sms_plugin_register_types4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/sms-plugin.c.func.html b/coverage/src/plugins/sms/sms-plugin.c.func.html new file mode 100644 index 00000000000..20fbafefc8a --- /dev/null +++ b/coverage/src/plugins/sms/sms-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/sms-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - sms-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_sms_plugin_register_types4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/sms-plugin.c.gcov.html b/coverage/src/plugins/sms/sms-plugin.c.gcov.html new file mode 100644 index 00000000000..a6a5082bbf8 --- /dev/null +++ b/coverage/src/plugins/sms/sms-plugin.c.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/sms-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - sms-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-sms-plugin.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           4 : valent_sms_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           4 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_SMS_PLUGIN);
+      18                 :           4 : }
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-contact-row.c.func-c.html b/coverage/src/plugins/sms/valent-contact-row.c.func-c.html new file mode 100644 index 00000000000..45bc32cb63a --- /dev/null +++ b/coverage/src/plugins/sms/valent-contact-row.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-contact-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-contact-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.5 %147133
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %8442
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contact_row_get_contact_address1
valent_contact_row_new1
valent_contact_row_set_contact_address1
valent_contact_row_class_init2
valent_contact_row_get_property3
valent_list_add_contact4
valent_contact_row_finalize9
valent_contact_row_init9
valent_contact_row_set_contact9
valent_contact_row_set_contact_name10
valent_contact_row_set_property11
valent_contact_row_header_func36
valent_contact_row_get_contact_name37
valent_contact_row_set_compact45
valent_contact_row_get_contact49
valent_contact_row_get_type225
valent_contact_row_class_intern_init2
valent_contact_row_get_type_once2
valent_contact_row_get_type221
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-contact-row.c.func.html b/coverage/src/plugins/sms/valent-contact-row.c.func.html new file mode 100644 index 00000000000..96655c455d6 --- /dev/null +++ b/coverage/src/plugins/sms/valent-contact-row.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-contact-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-contact-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.5 %147133
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %8442
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_contact_row_class_init2
valent_contact_row_finalize9
valent_contact_row_get_contact49
valent_contact_row_get_contact_address1
valent_contact_row_get_contact_name37
valent_contact_row_get_property3
valent_contact_row_get_type225
valent_contact_row_class_intern_init2
valent_contact_row_get_type221
valent_contact_row_get_type_once2
valent_contact_row_header_func36
valent_contact_row_init9
valent_contact_row_new1
valent_contact_row_set_compact45
valent_contact_row_set_contact9
valent_contact_row_set_contact_address1
valent_contact_row_set_contact_name10
valent_contact_row_set_property11
valent_list_add_contact4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-contact-row.c.gcov.html b/coverage/src/plugins/sms/valent-contact-row.c.gcov.html new file mode 100644 index 00000000000..356662543a9 --- /dev/null +++ b/coverage/src/plugins/sms/valent-contact-row.c.gcov.html @@ -0,0 +1,589 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-contact-row.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-contact-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:90.5 %147133
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %8442
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-contact-row"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <glib/gi18n.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <pango/pango.h>
+      12                 :             : #include <valent.h>
+      13                 :             : 
+      14                 :             : #include "valent-contact-row.h"
+      15                 :             : #include "valent-sms-utils.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : struct _ValentContactRow
+      19                 :             : {
+      20                 :             :   GtkListBoxRow  parent_instance;
+      21                 :             : 
+      22                 :             :   EContact      *contact;
+      23                 :             : 
+      24                 :             :   GtkWidget     *grid;
+      25                 :             :   GtkWidget     *avatar;
+      26                 :             :   GtkWidget     *name_label;
+      27                 :             :   GtkWidget     *address_label;
+      28                 :             :   GtkWidget     *address_type_label;
+      29                 :             : };
+      30                 :             : 
+      31   [ +  +  +  - ]:         225 : G_DEFINE_FINAL_TYPE (ValentContactRow, valent_contact_row, GTK_TYPE_LIST_BOX_ROW)
+      32                 :             : 
+      33                 :             : enum {
+      34                 :             :   PROP_0,
+      35                 :             :   PROP_CONTACT,
+      36                 :             :   PROP_CONTACT_ADDRESS,
+      37                 :             :   PROP_CONTACT_NAME,
+      38                 :             :   N_PROPERTIES
+      39                 :             : };
+      40                 :             : 
+      41                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      42                 :             : 
+      43                 :             : 
+      44                 :             : /*
+      45                 :             :  * GObject
+      46                 :             :  */
+      47                 :             : static void
+      48                 :           9 : valent_contact_row_finalize (GObject *object)
+      49                 :             : {
+      50                 :           9 :   ValentContactRow *self = VALENT_CONTACT_ROW (object);
+      51                 :             : 
+      52         [ +  - ]:           9 :   g_clear_object (&self->contact);
+      53                 :             : 
+      54                 :           9 :   G_OBJECT_CLASS (valent_contact_row_parent_class)->finalize (object);
+      55                 :           9 : }
+      56                 :             : 
+      57                 :             : static void
+      58                 :           3 : valent_contact_row_get_property (GObject    *object,
+      59                 :             :                                  guint       prop_id,
+      60                 :             :                                  GValue     *value,
+      61                 :             :                                  GParamSpec *pspec)
+      62                 :             : {
+      63                 :           3 :   ValentContactRow *self = VALENT_CONTACT_ROW (object);
+      64                 :             : 
+      65   [ +  +  +  - ]:           3 :   switch (prop_id)
+      66                 :             :     {
+      67                 :           1 :     case PROP_CONTACT:
+      68                 :           1 :       g_value_set_object (value, valent_contact_row_get_contact (self));
+      69                 :           1 :       break;
+      70                 :             : 
+      71                 :           1 :     case PROP_CONTACT_ADDRESS:
+      72                 :           1 :       g_value_set_string (value, valent_contact_row_get_contact_address (self));
+      73                 :           1 :       break;
+      74                 :             : 
+      75                 :           1 :     case PROP_CONTACT_NAME:
+      76                 :           1 :       g_value_set_string (value, valent_contact_row_get_contact_name (self));
+      77                 :           1 :       break;
+      78                 :             : 
+      79                 :           0 :     default:
+      80                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      81                 :             :     }
+      82                 :           3 : }
+      83                 :             : 
+      84                 :             : static void
+      85                 :          11 : valent_contact_row_set_property (GObject      *object,
+      86                 :             :                                  guint         prop_id,
+      87                 :             :                                  const GValue *value,
+      88                 :             :                                  GParamSpec   *pspec)
+      89                 :             : {
+      90                 :          11 :   ValentContactRow *self = VALENT_CONTACT_ROW (object);
+      91                 :             : 
+      92   [ +  +  +  - ]:          11 :   switch (prop_id)
+      93                 :             :     {
+      94                 :           9 :     case PROP_CONTACT:
+      95                 :           9 :       valent_contact_row_set_contact (self, g_value_get_object (value));
+      96                 :           9 :       break;
+      97                 :             : 
+      98                 :           1 :     case PROP_CONTACT_ADDRESS:
+      99                 :           1 :       valent_contact_row_set_contact_address (self, g_value_get_string (value));
+     100                 :           1 :       break;
+     101                 :             : 
+     102                 :           1 :     case PROP_CONTACT_NAME:
+     103                 :           1 :       valent_contact_row_set_contact_name (self, g_value_get_string (value));
+     104                 :           1 :       break;
+     105                 :             : 
+     106                 :           0 :     default:
+     107                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     108                 :             :     }
+     109                 :          11 : }
+     110                 :             : 
+     111                 :             : static void
+     112                 :           2 : valent_contact_row_class_init (ValentContactRowClass *klass)
+     113                 :             : {
+     114                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     115                 :             : 
+     116                 :           2 :   object_class->finalize = valent_contact_row_finalize;
+     117                 :           2 :   object_class->get_property = valent_contact_row_get_property;
+     118                 :           2 :   object_class->set_property = valent_contact_row_set_property;
+     119                 :             : 
+     120                 :             :   /**
+     121                 :             :    * ValentContactRow:contact
+     122                 :             :    *
+     123                 :             :    * The `EContact` for this row.
+     124                 :             :    */
+     125                 :           4 :   properties [PROP_CONTACT] =
+     126                 :           2 :     g_param_spec_object ("contact", NULL, NULL,
+     127                 :             :                          E_TYPE_CONTACT,
+     128                 :             :                          (G_PARAM_READWRITE |
+     129                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     130                 :             :                           G_PARAM_STATIC_STRINGS));
+     131                 :             : 
+     132                 :             :   /**
+     133                 :             :    * ValentContactRow:contact-address
+     134                 :             :    *
+     135                 :             :    * The phone number, e-mail or other address format for the contact.
+     136                 :             :    *
+     137                 :             :    * Usually this will be a phone number, however SMS messages may originate
+     138                 :             :    * from an SMS gateway service. In this case the address may be in another
+     139                 :             :    * format.
+     140                 :             :    */
+     141                 :           4 :   properties [PROP_CONTACT_ADDRESS] =
+     142                 :           2 :     g_param_spec_string ("contact-address", NULL, NULL,
+     143                 :             :                          NULL,
+     144                 :             :                          (G_PARAM_READWRITE |
+     145                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     146                 :             :                           G_PARAM_STATIC_STRINGS));
+     147                 :             : 
+     148                 :             :   /**
+     149                 :             :    * ValentContactRow:contact-name
+     150                 :             :    *
+     151                 :             :    * The contact name displayed in the row, by default the full name of
+     152                 :             :    * `ValentContactRow`:contact.
+     153                 :             :    */
+     154                 :           4 :   properties [PROP_CONTACT_NAME] =
+     155                 :           2 :     g_param_spec_string ("contact-name", NULL, NULL,
+     156                 :             :                          NULL,
+     157                 :             :                          (G_PARAM_READWRITE |
+     158                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     159                 :             :                           G_PARAM_STATIC_STRINGS));
+     160                 :             : 
+     161                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     162                 :           2 : }
+     163                 :             : 
+     164                 :             : static void
+     165                 :           9 : valent_contact_row_init (ValentContactRow *self)
+     166                 :             : {
+     167                 :           9 :   gtk_widget_add_css_class (GTK_WIDGET (self), "valent-contact-row");
+     168                 :             : 
+     169                 :           9 :   self->grid = g_object_new (GTK_TYPE_GRID,
+     170                 :             :                              "column-spacing", 8,
+     171                 :             :                              "margin-start",   8,
+     172                 :             :                              "margin-end",     8,
+     173                 :             :                              "margin-top",     6,
+     174                 :             :                              "margin-bottom",  6,
+     175                 :             :                              NULL);
+     176                 :           9 :   gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (self), self->grid);
+     177                 :             : 
+     178                 :           9 :   self->avatar = g_object_new (ADW_TYPE_AVATAR,
+     179                 :             :                                "size",    32,
+     180                 :             :                                "halign",  GTK_ALIGN_START,
+     181                 :             :                                "valign",  GTK_ALIGN_CENTER,
+     182                 :             :                                "vexpand", TRUE,
+     183                 :             :                                NULL);
+     184                 :           9 :   gtk_grid_attach (GTK_GRID (self->grid), self->avatar, 0, 0, 1, 2);
+     185                 :             : 
+     186                 :           9 :   self->name_label = g_object_new (GTK_TYPE_LABEL,
+     187                 :             :                                    "halign",  GTK_ALIGN_START,
+     188                 :             :                                    "hexpand", TRUE,
+     189                 :             :                                    "valign",  GTK_ALIGN_CENTER,
+     190                 :             :                                    "vexpand", TRUE,
+     191                 :             :                                    "xalign",  0.0,
+     192                 :             :                                    NULL);
+     193                 :           9 :   gtk_grid_attach (GTK_GRID (self->grid), self->name_label, 1, 0, 2, 1);
+     194                 :             : 
+     195                 :           9 :   self->address_label = g_object_new (GTK_TYPE_LABEL,
+     196                 :             :                                       "ellipsize", PANGO_ELLIPSIZE_END,
+     197                 :             :                                       "halign",    GTK_ALIGN_START,
+     198                 :             :                                       "hexpand",   TRUE,
+     199                 :             :                                       "valign",    GTK_ALIGN_CENTER,
+     200                 :             :                                       "vexpand",   TRUE,
+     201                 :             :                                       "xalign",    0.0,
+     202                 :             :                                       NULL);
+     203                 :           9 :   gtk_widget_add_css_class (self->address_label, "dim-label");
+     204                 :           9 :   gtk_grid_attach (GTK_GRID (self->grid), self->address_label, 1, 1, 1, 1);
+     205                 :             : 
+     206                 :           9 :   self->address_type_label = g_object_new (GTK_TYPE_LABEL,
+     207                 :             :                                    "label",     _("Other"),
+     208                 :             :                                    "ellipsize", PANGO_ELLIPSIZE_END,
+     209                 :             :                                    "halign",    GTK_ALIGN_END,
+     210                 :             :                                    "hexpand",   FALSE,
+     211                 :             :                                    "valign",    GTK_ALIGN_CENTER,
+     212                 :             :                                    "vexpand",   TRUE,
+     213                 :             :                                    "xalign",    0.0,
+     214                 :             :                                    NULL);
+     215                 :           9 :   gtk_widget_add_css_class (self->address_type_label, "dim-label");
+     216                 :           9 :   gtk_grid_attach (GTK_GRID (self->grid), self->address_type_label, 2, 1, 1, 1);
+     217                 :           9 : }
+     218                 :             : 
+     219                 :             : /**
+     220                 :             :  * valent_contact_row_header_func:
+     221                 :             :  * @row: a `GtkListBoxRow`
+     222                 :             :  * @before: (nullable): a `GtkListBoxRow`
+     223                 :             :  * @user_data: (closure): user supplied data
+     224                 :             :  *
+     225                 :             :  * A `GtkListBoxHeaderFunc` for `ValentContactRow` widgets that takes care of
+     226                 :             :  * hiding or showing the avatar and name depending on whether the row is
+     227                 :             :  * grouped with other rows for the same contact.
+     228                 :             :  *
+     229                 :             :  * For example, if @before is not a `ValentContactRow` or for a different `EContact`
+     230                 :             :  * the avatar and name will be shown, otherwise it's considered a secondary row.
+     231                 :             :  */
+     232                 :             : void
+     233                 :          36 : valent_contact_row_header_func (GtkListBoxRow *row,
+     234                 :             :                                 GtkListBoxRow *before,
+     235                 :             :                                 gpointer       user_data)
+     236                 :             : {
+     237                 :          36 :   ValentContactRow *contact_row;
+     238                 :             : 
+     239         [ +  - ]:          36 :   if G_UNLIKELY (!VALENT_IS_CONTACT_ROW (row))
+     240                 :             :     return;
+     241                 :             : 
+     242                 :          36 :   contact_row = VALENT_CONTACT_ROW (row);
+     243                 :             : 
+     244         [ +  + ]:          36 :   if (before == NULL)
+     245                 :             :     {
+     246                 :          12 :       valent_contact_row_set_compact (contact_row, FALSE);
+     247                 :             :     }
+     248         [ -  + ]:          24 :   else if (!VALENT_IS_CONTACT_ROW (before))
+     249                 :             :     {
+     250                 :           0 :       GtkWidget *label;
+     251                 :             : 
+     252                 :           0 :       label = g_object_new (GTK_TYPE_LABEL,
+     253                 :             :                             "label",        _("Contacts"),
+     254                 :             :                             "halign",       GTK_ALIGN_START,
+     255                 :             :                             "margin-end",   6,
+     256                 :             :                             "margin-start", 6,
+     257                 :             :                             "margin-top",   6,
+     258                 :             :                             NULL);
+     259                 :           0 :       gtk_widget_add_css_class (label, "dim-label");
+     260                 :           0 :       gtk_widget_add_css_class (label, "list-header-title");
+     261                 :           0 :       gtk_list_box_row_set_header (row, label);
+     262                 :             : 
+     263                 :           0 :       valent_contact_row_set_compact (contact_row, FALSE);
+     264                 :             :     }
+     265                 :             :   else
+     266                 :             :     {
+     267                 :          24 :       EContact *row_contact;
+     268                 :          24 :       EContact *before_contact;
+     269                 :             : 
+     270                 :          24 :       row_contact = valent_contact_row_get_contact (contact_row);
+     271                 :          24 :       before_contact = valent_contact_row_get_contact (VALENT_CONTACT_ROW (before));
+     272                 :             : 
+     273         [ +  + ]:          24 :       if (g_strcmp0 (e_contact_get_const (row_contact, E_CONTACT_UID),
+     274                 :          24 :                      e_contact_get_const (before_contact, E_CONTACT_UID)) == 0)
+     275                 :          13 :         valent_contact_row_set_compact (contact_row, TRUE);
+     276                 :             :       else
+     277                 :          11 :         valent_contact_row_set_compact (contact_row, FALSE);
+     278                 :             :     }
+     279                 :             : }
+     280                 :             : 
+     281                 :             : /**
+     282                 :             :  * valent_list_add_contact:
+     283                 :             :  * @list: a `GtkListBox`
+     284                 :             :  * @contact: an `EContact`
+     285                 :             :  *
+     286                 :             :  * A convenience for adding a `ValentContactRow` to @list for each @contact
+     287                 :             :  * number.
+     288                 :             :  */
+     289                 :             : void
+     290                 :           4 : valent_list_add_contact (GtkListBox *list,
+     291                 :             :                          EContact   *contact)
+     292                 :             : {
+     293                 :           4 :   g_autolist (EVCardAttribute) attrs = NULL;
+     294                 :             : 
+     295   [ +  -  +  -  :           4 :   g_return_if_fail (GTK_IS_LIST_BOX (list));
+             -  +  -  - ]
+     296   [ +  -  +  -  :           4 :   g_return_if_fail (E_IS_CONTACT (contact));
+             -  +  -  - ]
+     297                 :             : 
+     298                 :           4 :   attrs = e_contact_get_attributes (contact, E_CONTACT_TEL);
+     299                 :             : 
+     300         [ +  + ]:          12 :   for (const GList *iter = attrs; iter; iter = iter->next)
+     301                 :             :     {
+     302                 :           8 :       EVCardAttribute *attr = iter->data;
+     303                 :           8 :       ValentContactRow *row;
+     304                 :           8 :       g_autofree char *number = NULL;
+     305                 :           8 :       const char *type = NULL;
+     306                 :             : 
+     307                 :           8 :       number = e_vcard_attribute_get_value (attr);
+     308                 :             : 
+     309                 :           8 :       row = g_object_new (VALENT_TYPE_CONTACT_ROW,
+     310                 :             :                           "contact", contact,
+     311                 :             :                           NULL);
+     312                 :             : 
+     313                 :             :       /* NOTE: the ordering below results in a preference of Work, Mobile, Home.
+     314                 :             :        * Justification being that Work is more important context than mobility,
+     315                 :             :        * while mobility is more relevant than Home if the number is personal. */
+     316         [ +  + ]:           8 :       if (e_vcard_attribute_has_type (attr, "WORK"))
+     317                 :           4 :         type = _("Work");
+     318                 :             : 
+     319         [ +  - ]:           4 :       else if (e_vcard_attribute_has_type (attr, "CELL"))
+     320                 :           4 :         type = _("Mobile");
+     321                 :             : 
+     322         [ #  # ]:           0 :       else if (e_vcard_attribute_has_type (attr, "HOME"))
+     323                 :           0 :         type = _("Home");
+     324                 :             : 
+     325                 :             :       else
+     326                 :           0 :         type = _("Other");
+     327                 :             : 
+     328                 :           8 :       gtk_label_set_label (GTK_LABEL (row->address_label), number);
+     329                 :           8 :       gtk_label_set_label (GTK_LABEL (row->address_type_label), type);
+     330                 :             : 
+     331                 :           8 :       gtk_list_box_insert (list, GTK_WIDGET (row), -1);
+     332                 :             :     }
+     333                 :             : }
+     334                 :             : 
+     335                 :             : /**
+     336                 :             :  * valent_contact_row_new:
+     337                 :             :  * @contact: an `EContact`
+     338                 :             :  *
+     339                 :             :  * Create a new `ValentContactRow` for @contact.
+     340                 :             :  *
+     341                 :             :  * Returns: (transfer full): a new `ValentContactRow`
+     342                 :             :  */
+     343                 :             : GtkWidget *
+     344                 :           1 : valent_contact_row_new (EContact *contact)
+     345                 :             : {
+     346                 :           1 :   return g_object_new (VALENT_TYPE_CONTACT_ROW,
+     347                 :             :                        "contact", contact,
+     348                 :             :                        NULL);
+     349                 :             : }
+     350                 :             : 
+     351                 :             : /**
+     352                 :             :  * valent_contact_row_set_compact:
+     353                 :             :  * @row: a `ValentContactRow`
+     354                 :             :  * @compact: %TRUE or %FALSE
+     355                 :             :  *
+     356                 :             :  * Set whether @row should display the name and avatar (%FALSE) or not (%TRUE).
+     357                 :             :  */
+     358                 :             : void
+     359                 :          45 : valent_contact_row_set_compact (ValentContactRow *row,
+     360                 :             :                                 gboolean          compact)
+     361                 :             : {
+     362         [ +  - ]:          45 :   g_return_if_fail (VALENT_IS_CONTACT_ROW (row));
+     363                 :             : 
+     364         [ +  + ]:          45 :   if (compact)
+     365                 :             :     {
+     366                 :          13 :       gtk_widget_set_visible (row->name_label, FALSE);
+     367                 :          13 :       gtk_widget_set_visible (row->avatar, FALSE);
+     368                 :             :       // avatar (32px) + column spacing (8px)
+     369                 :          13 :       gtk_widget_set_margin_start (row->grid, 48);
+     370                 :             :     }
+     371                 :             :   else
+     372                 :             :     {
+     373                 :          32 :       gtk_widget_set_visible (row->name_label, TRUE);
+     374                 :          32 :       gtk_widget_set_visible (row->avatar, TRUE);
+     375                 :          32 :       gtk_widget_set_margin_start (row->grid, 8);
+     376                 :             :     }
+     377                 :             : }
+     378                 :             : 
+     379                 :             : /**
+     380                 :             :  * valent_contact_row_get_contact:
+     381                 :             :  * @row: a `ValentContactRow`
+     382                 :             :  *
+     383                 :             :  * Get the `EContact` for @row.
+     384                 :             :  *
+     385                 :             :  * Returns: (transfer none): a `EContact`
+     386                 :             :  */
+     387                 :             : EContact *
+     388                 :          49 : valent_contact_row_get_contact (ValentContactRow *row)
+     389                 :             : {
+     390         [ +  - ]:          49 :   g_return_val_if_fail (VALENT_IS_CONTACT_ROW (row), NULL);
+     391                 :             : 
+     392                 :          49 :   return row->contact;
+     393                 :             : }
+     394                 :             : 
+     395                 :             : /**
+     396                 :             :  * valent_contact_row_set_contact:
+     397                 :             :  * @row: a `ValentContactRow`
+     398                 :             :  * @contact: a `ValentContact`
+     399                 :             :  *
+     400                 :             :  * Set the `ValentContact` for @row.
+     401                 :             :  */
+     402                 :             : void
+     403                 :           9 : valent_contact_row_set_contact (ValentContactRow *row,
+     404                 :             :                                 EContact         *contact)
+     405                 :             : {
+     406                 :           9 :   const char *name = NULL;
+     407                 :             : 
+     408         [ +  - ]:           9 :   g_return_if_fail (VALENT_IS_CONTACT_ROW (row));
+     409   [ +  -  +  -  :           9 :   g_return_if_fail (contact == NULL || E_IS_CONTACT (contact));
+             -  +  -  - ]
+     410                 :             : 
+     411         [ +  - ]:           9 :   if (!g_set_object (&row->contact, contact))
+     412                 :             :     return;
+     413                 :             : 
+     414         [ +  - ]:           9 :   if (row->contact != NULL)
+     415                 :             :     {
+     416                 :           9 :       name = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
+     417                 :           9 :       valent_sms_avatar_from_contact (ADW_AVATAR (row->avatar), contact);
+     418                 :             :     }
+     419                 :             : 
+     420                 :           9 :   valent_contact_row_set_compact (row, FALSE);
+     421                 :           9 :   valent_contact_row_set_contact_name (row, name);
+     422                 :           9 :   g_object_notify_by_pspec (G_OBJECT (row), properties [PROP_CONTACT]);
+     423                 :             : }
+     424                 :             : 
+     425                 :             : /**
+     426                 :             :  * valent_contact_row_get_contact_address:
+     427                 :             :  * @row: a `ValentContactRow`
+     428                 :             :  *
+     429                 :             :  * Get the contact address displayed in @row.
+     430                 :             :  *
+     431                 :             :  * Returns: (transfer none): a phone number string
+     432                 :             :  */
+     433                 :             : const char *
+     434                 :           1 : valent_contact_row_get_contact_address (ValentContactRow *row)
+     435                 :             : {
+     436         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_CONTACT_ROW (row), NULL);
+     437                 :             : 
+     438                 :           1 :   return gtk_label_get_text (GTK_LABEL (row->address_label));
+     439                 :             : }
+     440                 :             : 
+     441                 :             : /**
+     442                 :             :  * valent_contact_row_set_contact_address:
+     443                 :             :  * @row: a `ValentContactRow`
+     444                 :             :  * @address: a phone number or other address
+     445                 :             :  *
+     446                 :             :  * Set the contact address displayed in @row.
+     447                 :             :  */
+     448                 :             : void
+     449                 :           1 : valent_contact_row_set_contact_address (ValentContactRow *row,
+     450                 :             :                                         const char       *address)
+     451                 :             : {
+     452         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_CONTACT_ROW (row));
+     453                 :             : 
+     454                 :           1 :   gtk_label_set_text (GTK_LABEL (row->address_label), address);
+     455                 :           1 :   gtk_label_set_text (GTK_LABEL (row->address_type_label), _("Other"));
+     456                 :             : }
+     457                 :             : 
+     458                 :             : /**
+     459                 :             :  * valent_contact_row_get_contact_name:
+     460                 :             :  * @row: a `ValentContactRow`
+     461                 :             :  *
+     462                 :             :  * Get the contact name displayed in @row.
+     463                 :             :  *
+     464                 :             :  * Returns: (transfer none): a contact name
+     465                 :             :  */
+     466                 :             : const char *
+     467                 :          37 : valent_contact_row_get_contact_name (ValentContactRow *row)
+     468                 :             : {
+     469         [ +  - ]:          37 :   g_return_val_if_fail (VALENT_IS_CONTACT_ROW (row), NULL);
+     470                 :             : 
+     471                 :          37 :   return gtk_label_get_text (GTK_LABEL (row->name_label));
+     472                 :             : }
+     473                 :             : 
+     474                 :             : /**
+     475                 :             :  * valent_contact_row_set_contact_name:
+     476                 :             :  * @row: a `ValentContactRow`
+     477                 :             :  * @name: a contact name
+     478                 :             :  *
+     479                 :             :  * Set the contact name displayed in @row.
+     480                 :             :  */
+     481                 :             : void
+     482                 :          10 : valent_contact_row_set_contact_name (ValentContactRow *row,
+     483                 :             :                                      const char       *name)
+     484                 :             : {
+     485         [ +  - ]:          10 :   g_return_if_fail (VALENT_IS_CONTACT_ROW (row));
+     486                 :             : 
+     487   [ -  +  -  -  :          10 :   if (name == NULL && E_IS_CONTACT (row->contact))
+          -  -  -  -  -  
+                      - ]
+     488                 :           0 :     name = e_contact_get_const (row->contact, E_CONTACT_FULL_NAME);
+     489                 :             : 
+     490                 :          10 :   gtk_label_set_text (GTK_LABEL (row->name_label), name);
+     491                 :             : }
+     492                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-contact-row.h.func-c.html b/coverage/src/plugins/sms/valent-contact-row.h.func-c.html new file mode 100644 index 00000000000..3b70455d5d9 --- /dev/null +++ b/coverage/src/plugins/sms/valent-contact-row.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-contact-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-contact-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACT_ROW212
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-contact-row.h.func.html b/coverage/src/plugins/sms/valent-contact-row.h.func.html new file mode 100644 index 00000000000..83e9b09d007 --- /dev/null +++ b/coverage/src/plugins/sms/valent-contact-row.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-contact-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-contact-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_CONTACT_ROW212
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-contact-row.h.gcov.html b/coverage/src/plugins/sms/valent-contact-row.h.gcov.html new file mode 100644 index 00000000000..da3d7298be8 --- /dev/null +++ b/coverage/src/plugins/sms/valent-contact-row.h.gcov.html @@ -0,0 +1,129 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-contact-row.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-contact-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : G_BEGIN_DECLS
+      10                 :             : 
+      11                 :             : #define VALENT_TYPE_CONTACT_ROW (valent_contact_row_get_type())
+      12                 :             : 
+      13   [ +  -  +  -  :         212 : G_DECLARE_FINAL_TYPE (ValentContactRow, valent_contact_row, VALENT, CONTACT_ROW, GtkListBoxRow)
+                   -  + ]
+      14                 :             : 
+      15                 :             : void         valent_list_add_contact                (GtkListBox             *list,
+      16                 :             :                                                      EContact               *contact);
+      17                 :             : 
+      18                 :             : void         valent_contact_row_header_func         (GtkListBoxRow          *row,
+      19                 :             :                                                      GtkListBoxRow          *before,
+      20                 :             :                                                      gpointer                user_data);
+      21                 :             : 
+      22                 :             : GtkWidget  * valent_contact_row_new                 (EContact               *contact);
+      23                 :             : 
+      24                 :             : void         valent_contact_row_set_compact         (ValentContactRow       *row,
+      25                 :             :                                                      gboolean                compact);
+      26                 :             : EContact   * valent_contact_row_get_contact         (ValentContactRow       *row);
+      27                 :             : void         valent_contact_row_set_contact         (ValentContactRow       *row,
+      28                 :             :                                                      EContact               *contact);
+      29                 :             : const char * valent_contact_row_get_contact_name    (ValentContactRow       *row);
+      30                 :             : void         valent_contact_row_set_contact_name    (ValentContactRow       *row,
+      31                 :             :                                                      const char             *name);
+      32                 :             : const char * valent_contact_row_get_contact_address (ValentContactRow       *row);
+      33                 :             : void         valent_contact_row_set_contact_address (ValentContactRow       *row,
+      34                 :             :                                                      const char             *address);
+      35                 :             : 
+      36                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-date-label.c.func-c.html b/coverage/src/plugins/sms/valent-date-label.c.func-c.html new file mode 100644 index 00000000000..94a0c1169f6 --- /dev/null +++ b/coverage/src/plugins/sms/valent-date-label.c.func-c.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-date-label.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-date-label.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.8 %129103
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:53.1 %6434
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_date_label_update_func0
valent_date_label_get_date1
valent_date_label_get_mode1
valent_date_label_new1
valent_date_label_set_mode1
valent_date_label_string1
valent_date_label_get_property2
valent_date_label_set_property2
valent_date_label_class_init3
valent_date_label_finalize4
valent_date_label_init4
valent_date_label_string_short4
valent_date_label_update5
valent_date_label_set_date6
valent_date_label_get_type24
valent_date_label_class_intern_init3
valent_date_label_get_type_once3
valent_date_label_get_type18
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-date-label.c.func.html b/coverage/src/plugins/sms/valent-date-label.c.func.html new file mode 100644 index 00000000000..b516d262c3a --- /dev/null +++ b/coverage/src/plugins/sms/valent-date-label.c.func.html @@ -0,0 +1,217 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-date-label.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-date-label.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.8 %129103
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:53.1 %6434
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_date_label_class_init3
valent_date_label_finalize4
valent_date_label_get_date1
valent_date_label_get_mode1
valent_date_label_get_property2
valent_date_label_get_type24
valent_date_label_class_intern_init3
valent_date_label_get_type18
valent_date_label_get_type_once3
valent_date_label_init4
valent_date_label_new1
valent_date_label_set_date6
valent_date_label_set_mode1
valent_date_label_set_property2
valent_date_label_string1
valent_date_label_string_short4
valent_date_label_update5
valent_date_label_update_func0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-date-label.c.gcov.html b/coverage/src/plugins/sms/valent-date-label.c.gcov.html new file mode 100644 index 00000000000..fdf37860f5e --- /dev/null +++ b/coverage/src/plugins/sms/valent-date-label.c.gcov.html @@ -0,0 +1,499 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-date-label.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-date-label.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:79.8 %129103
Test Date:2024-03-31 18:46:36Functions:94.1 %1716
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:53.1 %6434
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-date-label"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-date-label.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentDateLabel
+      16                 :             : {
+      17                 :             :   GtkWidget     parent_instance;
+      18                 :             : 
+      19                 :             :   GtkWidget    *label;
+      20                 :             :   int64_t       date;
+      21                 :             :   unsigned int  mode;
+      22                 :             : };
+      23                 :             : 
+      24   [ +  +  +  - ]:          24 : G_DEFINE_FINAL_TYPE (ValentDateLabel, valent_date_label, GTK_TYPE_WIDGET)
+      25                 :             : 
+      26                 :             : enum {
+      27                 :             :   PROP_0,
+      28                 :             :   PROP_DATE,
+      29                 :             :   PROP_MODE,
+      30                 :             :   N_PROPERTIES
+      31                 :             : };
+      32                 :             : 
+      33                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      34                 :             : 
+      35                 :             : static GPtrArray *label_cache = NULL;
+      36                 :             : static unsigned int label_source = 0;
+      37                 :             : 
+      38                 :             : 
+      39                 :             : /**
+      40                 :             :  * valent_date_label_string:
+      41                 :             :  * @timestamp: a UNIX epoch timestamp (ms)
+      42                 :             :  *
+      43                 :             :  * Create a user friendly date-time string for @timestamp, in a relative format.
+      44                 :             :  *
+      45                 :             :  * Examples:
+      46                 :             :  *     - "Just now"
+      47                 :             :  *     - "15 minutes"
+      48                 :             :  *     - "11:45 PM"
+      49                 :             :  *     - "Yesterday · 11:45 PM"
+      50                 :             :  *     - "Tuesday"
+      51                 :             :  *     - "February 29"
+      52                 :             :  *
+      53                 :             :  * Returns: (transfer full): a new string
+      54                 :             :  */
+      55                 :             : static char *
+      56                 :           1 : valent_date_label_string (int64_t timestamp)
+      57                 :             : {
+      58                 :           2 :   g_autoptr (GDateTime) dt = NULL;
+      59         [ +  - ]:           1 :   g_autoptr (GDateTime) now = NULL;
+      60                 :           1 :   GTimeSpan diff;
+      61                 :             : 
+      62                 :           1 :   dt = g_date_time_new_from_unix_local (timestamp / 1000);
+      63                 :           1 :   now = g_date_time_new_now_local ();
+      64                 :           1 :   diff = g_date_time_difference (now, dt);
+      65                 :             : 
+      66                 :             :   /* TRANSLATORS: Less than a minute ago */
+      67         [ -  + ]:           1 :   if (diff < G_TIME_SPAN_MINUTE)
+      68         [ #  # ]:           0 :       return g_strdup (_("Just now"));
+      69                 :             : 
+      70                 :             :   /* TRANSLATORS: Time duration in minutes (eg. 15 minutes) */
+      71         [ -  + ]:           1 :   if (diff < G_TIME_SPAN_HOUR)
+      72                 :             :     {
+      73                 :           0 :       unsigned int n_minutes;
+      74                 :             : 
+      75                 :           0 :       n_minutes = (diff / G_TIME_SPAN_MINUTE);
+      76                 :           0 :       return g_strdup_printf (ngettext("%d minute", "%d minutes", n_minutes),
+      77                 :             :                               n_minutes);
+      78                 :             :     }
+      79                 :             : 
+      80                 :             :   /* TRANSLATORS: Yesterday, but less than 24 hours (eg. Yesterday · 11:45 PM) */
+      81         [ -  + ]:           1 :   if (diff < G_TIME_SPAN_DAY)
+      82                 :             :     {
+      83                 :           0 :       g_autofree char *time_str = NULL;
+      84                 :           0 :       int today, day;
+      85                 :             : 
+      86                 :           0 :       today = g_date_time_get_day_of_month(now);
+      87                 :           0 :       day = g_date_time_get_day_of_month(dt);
+      88                 :           0 :       time_str = g_date_time_format(dt, "%l:%M %p");
+      89                 :             : 
+      90         [ #  # ]:           0 :       if (today == day)
+      91                 :             :         return g_steal_pointer (&time_str);
+      92                 :             :       else
+      93                 :           0 :         return g_strdup_printf (_("Yesterday · %s"), time_str);
+      94                 :             :     }
+      95                 :             : 
+      96                 :             :   /* Less than a week ago (eg. Tuesday) */
+      97         [ -  + ]:           1 :   if (diff < G_TIME_SPAN_DAY * 7)
+      98                 :           0 :     return g_date_time_format(dt, "%A");
+      99                 :             : 
+     100                 :             :   /* More than a week ago (eg. February 29) */
+     101                 :           1 :   return g_date_time_format(dt, "%B %e");
+     102                 :             : }
+     103                 :             : 
+     104                 :             : /**
+     105                 :             :  * valent_date_label_string_short:
+     106                 :             :  * @timestamp: a UNIX epoch timestamp (ms)
+     107                 :             :  *
+     108                 :             :  * Create a user friendly date-time string for @timestamp, in a relative format.
+     109                 :             :  * This is like valent_date_label_string() but abbreviated.
+     110                 :             :  *
+     111                 :             :  * Examples:
+     112                 :             :  *     - "Just now"
+     113                 :             :  *     - "15 mins"
+     114                 :             :  *     - "11:45 PM"
+     115                 :             :  *     - "Tue"
+     116                 :             :  *     - "Feb 29"
+     117                 :             :  *
+     118                 :             :  * Returns: (transfer full): a new string
+     119                 :             :  */
+     120                 :             : static char *
+     121                 :           4 : valent_date_label_string_short (int64_t timestamp)
+     122                 :             : {
+     123                 :           8 :   g_autoptr (GDateTime) dt = NULL;
+     124         [ +  - ]:           4 :   g_autoptr (GDateTime) now = NULL;
+     125                 :           4 :   GTimeSpan diff;
+     126                 :             : 
+     127                 :           4 :   dt = g_date_time_new_from_unix_local (timestamp / 1000);
+     128                 :           4 :   now = g_date_time_new_now_local ();
+     129                 :           4 :   diff = g_date_time_difference (now, dt);
+     130                 :             : 
+     131                 :             :   /* TRANSLATORS: Less than a minute ago */
+     132         [ -  + ]:           4 :   if (diff < G_TIME_SPAN_MINUTE)
+     133         [ #  # ]:           0 :       return g_strdup (_("Just now"));
+     134                 :             : 
+     135                 :             :   /* TRANSLATORS: Time duration in minutes, abbreviated (eg. 15 mins) */
+     136         [ -  + ]:           4 :   if (diff < G_TIME_SPAN_HOUR)
+     137                 :             :     {
+     138                 :           0 :       unsigned int n_minutes;
+     139                 :             : 
+     140                 :           0 :       n_minutes = (diff / G_TIME_SPAN_MINUTE);
+     141                 :           0 :       return g_strdup_printf (ngettext ("%d min", "%d mins", n_minutes),
+     142                 :             :                               n_minutes);
+     143                 :             :     }
+     144                 :             : 
+     145                 :             : 
+     146                 :             :   /* Less than a day ago (eg. 11:45 PM) */
+     147         [ -  + ]:           4 :   if (diff < G_TIME_SPAN_DAY)
+     148                 :           0 :     return g_date_time_format (dt, "%l:%M %p");
+     149                 :             : 
+     150                 :             :   /* Less than a week ago (eg. Tue) */
+     151         [ -  + ]:           4 :   if (diff < G_TIME_SPAN_DAY * 7)
+     152                 :           0 :     return g_date_time_format (dt, "%a");
+     153                 :             : 
+     154                 :             :   /* More than a week ago (eg. Feb 29) */
+     155                 :           4 :   return g_date_time_format (dt, "%b %e");
+     156                 :             : }
+     157                 :             : 
+     158                 :             : static gboolean
+     159                 :           0 : valent_date_label_update_func (gpointer user_data)
+     160                 :             : {
+     161         [ #  # ]:           0 :   for (unsigned int i = 0; i < label_cache->len; i++)
+     162                 :           0 :     valent_date_label_update (g_ptr_array_index (label_cache, i));
+     163                 :             : 
+     164                 :           0 :   return G_SOURCE_CONTINUE;
+     165                 :             : }
+     166                 :             : 
+     167                 :             : /*
+     168                 :             :  * GObject
+     169                 :             :  */
+     170                 :             : static void
+     171                 :           4 : valent_date_label_finalize (GObject *object)
+     172                 :             : {
+     173                 :           4 :   ValentDateLabel *self = VALENT_DATE_LABEL (object);
+     174                 :             : 
+     175                 :             :   /* Remove from update list */
+     176                 :           4 :   g_ptr_array_remove (label_cache, self);
+     177                 :             : 
+     178         [ +  + ]:           4 :   if (label_cache->len == 0)
+     179                 :             :     {
+     180         [ +  - ]:           3 :       g_clear_handle_id (&label_source, g_source_remove);
+     181         [ +  - ]:           3 :       g_clear_pointer (&label_cache, g_ptr_array_unref);
+     182                 :             :     }
+     183                 :             : 
+     184         [ +  - ]:           4 :   g_clear_pointer (&self->label, gtk_widget_unparent);
+     185                 :             : 
+     186                 :           4 :   G_OBJECT_CLASS (valent_date_label_parent_class)->finalize (object);
+     187                 :           4 : }
+     188                 :             : 
+     189                 :             : static void
+     190                 :           2 : valent_date_label_get_property (GObject    *object,
+     191                 :             :                                 guint       prop_id,
+     192                 :             :                                 GValue     *value,
+     193                 :             :                                 GParamSpec *pspec)
+     194                 :             : {
+     195                 :           2 :   ValentDateLabel *self = VALENT_DATE_LABEL (object);
+     196                 :             : 
+     197      [ +  +  - ]:           2 :   switch (prop_id)
+     198                 :             :     {
+     199                 :           1 :     case PROP_DATE:
+     200                 :           1 :       g_value_set_int64 (value, valent_date_label_get_date (self));
+     201                 :           1 :       break;
+     202                 :             : 
+     203                 :           1 :     case PROP_MODE:
+     204                 :           1 :       g_value_set_uint (value, valent_date_label_get_mode (self));
+     205                 :           1 :       break;
+     206                 :             : 
+     207                 :           0 :     default:
+     208                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     209                 :             :     }
+     210                 :           2 : }
+     211                 :             : 
+     212                 :             : static void
+     213                 :           2 : valent_date_label_set_property (GObject      *object,
+     214                 :             :                                 guint         prop_id,
+     215                 :             :                                 const GValue *value,
+     216                 :             :                                 GParamSpec   *pspec)
+     217                 :             : {
+     218                 :           2 :   ValentDateLabel *self = VALENT_DATE_LABEL (object);
+     219                 :             : 
+     220      [ +  +  - ]:           2 :   switch (prop_id)
+     221                 :             :     {
+     222                 :           1 :     case PROP_DATE:
+     223                 :           1 :       valent_date_label_set_date (self, g_value_get_int64 (value));
+     224                 :           1 :       break;
+     225                 :             : 
+     226                 :           1 :     case PROP_MODE:
+     227                 :           1 :       valent_date_label_set_mode (self, g_value_get_uint (value));
+     228                 :           1 :       break;
+     229                 :             : 
+     230                 :           0 :     default:
+     231                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     232                 :             :     }
+     233                 :           2 : }
+     234                 :             : 
+     235                 :             : static void
+     236                 :           3 : valent_date_label_class_init (ValentDateLabelClass *klass)
+     237                 :             : {
+     238                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     239                 :           3 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     240                 :             : 
+     241                 :           3 :   object_class->finalize = valent_date_label_finalize;
+     242                 :           3 :   object_class->get_property = valent_date_label_get_property;
+     243                 :           3 :   object_class->set_property = valent_date_label_set_property;
+     244                 :             : 
+     245                 :           3 :   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+     246                 :           3 :   gtk_widget_class_set_css_name (widget_class, "date-label");
+     247                 :             : 
+     248                 :             :   /**
+     249                 :             :    * ValentDateLabel:date
+     250                 :             :    *
+     251                 :             :    * The timestamp this label represents.
+     252                 :             :    */
+     253                 :           6 :   properties [PROP_DATE] =
+     254                 :           3 :     g_param_spec_int64 ("date", NULL, NULL,
+     255                 :             :                         0, G_MAXINT64,
+     256                 :             :                         0,
+     257                 :             :                         (G_PARAM_READWRITE |
+     258                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     259                 :             :                          G_PARAM_STATIC_STRINGS));
+     260                 :             : 
+     261                 :             :   /**
+     262                 :             :    * ValentDateLabel:mode
+     263                 :             :    *
+     264                 :             :    * The brevity of the label.
+     265                 :             :    */
+     266                 :           6 :   properties [PROP_MODE] =
+     267                 :           3 :     g_param_spec_uint ("mode", NULL, NULL,
+     268                 :             :                        0, G_MAXUINT32,
+     269                 :             :                        0,
+     270                 :             :                        (G_PARAM_READWRITE |
+     271                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     272                 :             :                         G_PARAM_STATIC_STRINGS));
+     273                 :             : 
+     274                 :           3 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     275                 :           3 : }
+     276                 :             : 
+     277                 :             : static void
+     278                 :           4 : valent_date_label_init (ValentDateLabel *self)
+     279                 :             : {
+     280                 :           4 :   self->label = gtk_label_new (NULL);
+     281                 :           4 :   gtk_widget_insert_after (self->label, GTK_WIDGET (self), NULL);
+     282                 :             : 
+     283                 :             :   /* Prepare the update list */
+     284         [ +  + ]:           4 :   if (label_cache == NULL)
+     285                 :             :     {
+     286                 :           3 :       label_cache = g_ptr_array_new ();
+     287                 :           3 :       label_source = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE,
+     288                 :             :                                                  60,
+     289                 :             :                                                  valent_date_label_update_func,
+     290                 :             :                                                  NULL,
+     291                 :             :                                                  NULL);
+     292                 :             :     }
+     293                 :             : 
+     294                 :           4 :   g_ptr_array_add (label_cache, self);
+     295                 :           4 : }
+     296                 :             : 
+     297                 :             : /**
+     298                 :             :  * valent_date_label_new:
+     299                 :             :  * @date: a UNIX epoch timestamp
+     300                 :             :  *
+     301                 :             :  * Create a new `ValentDateLabel` for @timestamp.
+     302                 :             :  *
+     303                 :             :  * Returns: (transfer full): a `GtkWidget`
+     304                 :             :  */
+     305                 :             : GtkWidget *
+     306                 :           1 : valent_date_label_new (int64_t date)
+     307                 :             : {
+     308                 :           1 :   return g_object_new (VALENT_TYPE_DATE_LABEL,
+     309                 :             :                        "date", date,
+     310                 :             :                        NULL);
+     311                 :             : }
+     312                 :             : 
+     313                 :             : /**
+     314                 :             :  * valent_date_label_get_date:
+     315                 :             :  * @label: a `ValentDateLabel`
+     316                 :             :  *
+     317                 :             :  * Get the UNIX epoch timestamp (ms) for @label.
+     318                 :             :  *
+     319                 :             :  * Returns: the timestamp
+     320                 :             :  */
+     321                 :             : int64_t
+     322                 :           1 : valent_date_label_get_date (ValentDateLabel *label)
+     323                 :             : {
+     324         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_DATE_LABEL (label), 0);
+     325                 :             : 
+     326                 :           1 :   return label->date;
+     327                 :             : }
+     328                 :             : 
+     329                 :             : /**
+     330                 :             :  * valent_date_label_set_date:
+     331                 :             :  * @label: a `ValentDateLabel`
+     332                 :             :  * @date: a UNIX epoch timestamp
+     333                 :             :  *
+     334                 :             :  * Set the timestamp for @label to @date.
+     335                 :             :  */
+     336                 :             : void
+     337                 :           6 : valent_date_label_set_date (ValentDateLabel *label,
+     338                 :             :                             int64_t          date)
+     339                 :             : {
+     340         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_DATE_LABEL (label));
+     341                 :             : 
+     342         [ +  + ]:           6 :   if (label->date == date)
+     343                 :             :     return;
+     344                 :             : 
+     345                 :           4 :   label->date = date;
+     346                 :           4 :   valent_date_label_update (label);
+     347                 :           4 :   g_object_notify_by_pspec (G_OBJECT (label), properties [PROP_DATE]);
+     348                 :             : }
+     349                 :             : 
+     350                 :             : /**
+     351                 :             :  * valent_date_label_get_mode:
+     352                 :             :  * @label: a `ValentDateLabel`
+     353                 :             :  *
+     354                 :             :  * Get the display mode @label.
+     355                 :             :  *
+     356                 :             :  * Returns: the display mode
+     357                 :             :  */
+     358                 :             : unsigned int
+     359                 :           1 : valent_date_label_get_mode (ValentDateLabel *label)
+     360                 :             : {
+     361         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_DATE_LABEL (label), 0);
+     362                 :             : 
+     363                 :           1 :   return label->mode;
+     364                 :             : }
+     365                 :             : 
+     366                 :             : /**
+     367                 :             :  * valent_date_label_set_mode:
+     368                 :             :  * @label: a `ValentDateLabel`
+     369                 :             :  * @mode: a mode
+     370                 :             :  *
+     371                 :             :  * Set the mode of @label to @mode. Currently the options are `0` and `1`.
+     372                 :             :  */
+     373                 :             : void
+     374                 :           1 : valent_date_label_set_mode (ValentDateLabel *label,
+     375                 :             :                             unsigned int     mode)
+     376                 :             : {
+     377         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_DATE_LABEL (label));
+     378                 :             : 
+     379         [ +  - ]:           1 :   if (label->mode == mode)
+     380                 :             :     return;
+     381                 :             : 
+     382                 :           1 :   label->mode = mode;
+     383                 :           1 :   valent_date_label_update (label);
+     384                 :           1 :   g_object_notify_by_pspec (G_OBJECT (label), properties [PROP_MODE]);
+     385                 :             : }
+     386                 :             : 
+     387                 :             : /**
+     388                 :             :  * valent_date_label_update:
+     389                 :             :  * @label: a `ValentDateLabel`
+     390                 :             :  *
+     391                 :             :  * Update the displayed text of @label.
+     392                 :             :  */
+     393                 :             : void
+     394                 :           5 : valent_date_label_update (ValentDateLabel *label)
+     395                 :             : {
+     396                 :           5 :   g_autofree char *text = NULL;
+     397                 :             : 
+     398         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_DATE_LABEL (label));
+     399                 :             : 
+     400         [ +  + ]:           5 :   if (label->mode == 0)
+     401                 :           4 :     text = valent_date_label_string_short (label->date);
+     402                 :             :   else
+     403                 :           1 :     text = valent_date_label_string (label->date);
+     404                 :             : 
+     405                 :           5 :   gtk_label_set_label (GTK_LABEL (label->label), text);
+     406                 :             : }
+     407                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-date-label.h.func-c.html b/coverage/src/plugins/sms/valent-date-label.h.func-c.html new file mode 100644 index 00000000000..d81b94326ff --- /dev/null +++ b/coverage/src/plugins/sms/valent-date-label.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-date-label.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-date-label.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DATE_LABEL14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-date-label.h.func.html b/coverage/src/plugins/sms/valent-date-label.h.func.html new file mode 100644 index 00000000000..bb0c0625915 --- /dev/null +++ b/coverage/src/plugins/sms/valent-date-label.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-date-label.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-date-label.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_DATE_LABEL14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-date-label.h.gcov.html b/coverage/src/plugins/sms/valent-date-label.h.gcov.html new file mode 100644 index 00000000000..9a6f3cd3bfc --- /dev/null +++ b/coverage/src/plugins/sms/valent-date-label.h.gcov.html @@ -0,0 +1,120 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-date-label.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-date-label.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_DATE_LABEL (valent_date_label_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          14 : G_DECLARE_FINAL_TYPE (ValentDateLabel, valent_date_label, VALENT, DATE_LABEL, GtkWidget)
+                   -  + ]
+      13                 :             : 
+      14                 :             : GtkWidget    * valent_date_label_new      (int64_t          date);
+      15                 :             : 
+      16                 :             : int64_t        valent_date_label_get_date (ValentDateLabel *label);
+      17                 :             : void           valent_date_label_set_date (ValentDateLabel *label,
+      18                 :             :                                            int64_t          date);
+      19                 :             : unsigned int   valent_date_label_get_mode (ValentDateLabel *label);
+      20                 :             : void           valent_date_label_set_mode (ValentDateLabel *label,
+      21                 :             :                                            unsigned int     mode);
+      22                 :             : void           valent_date_label_update   (ValentDateLabel *label);
+      23                 :             : 
+      24                 :             : char         * valent_date_label_long     (int64_t          date);
+      25                 :             : char         * valent_date_label_short    (int64_t          date);
+      26                 :             : 
+      27                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-row.c.func-c.html b/coverage/src/plugins/sms/valent-message-row.c.func-c.html new file mode 100644 index 00000000000..47dfe20fc0a --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-row.c.func-c.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.2 %120113
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.5 %7342
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_message_row_get_contact1
valent_message_row_get_message1
valent_message_row_new1
valent_message_row_class_init2
valent_message_row_get_thread_id2
valent_message_row_finalize3
valent_message_row_get_property3
valent_message_row_init3
valent_message_row_set_message3
valent_message_row_set_contact5
valent_message_row_set_property6
valent_message_row_update6
valent_message_row_get_type25
valent_message_row_class_intern_init2
valent_message_row_get_type_once2
valent_message_row_get_type21
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-row.c.func.html b/coverage/src/plugins/sms/valent-message-row.c.func.html new file mode 100644 index 00000000000..8270bf3ec65 --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-row.c.func.html @@ -0,0 +1,203 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.2 %120113
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.5 %7342
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_message_row_class_init2
valent_message_row_finalize3
valent_message_row_get_contact1
valent_message_row_get_message1
valent_message_row_get_property3
valent_message_row_get_thread_id2
valent_message_row_get_type25
valent_message_row_class_intern_init2
valent_message_row_get_type21
valent_message_row_get_type_once2
valent_message_row_init3
valent_message_row_new1
valent_message_row_set_contact5
valent_message_row_set_message3
valent_message_row_set_property6
valent_message_row_update6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-row.c.gcov.html b/coverage/src/plugins/sms/valent-message-row.c.gcov.html new file mode 100644 index 00000000000..a7d4c9546de --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-row.c.gcov.html @@ -0,0 +1,495 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-row.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:94.2 %120113
Test Date:2024-03-31 18:46:36Functions:100.0 %1515
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:57.5 %7342
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-message-row"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <pango/pango.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-date-label.h"
+      14                 :             : #include "valent-message-row.h"
+      15                 :             : #include "valent-message.h"
+      16                 :             : #include "valent-sms-utils.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : struct _ValentMessageRow
+      20                 :             : {
+      21                 :             :   GtkListBoxRow  parent_instance;
+      22                 :             : 
+      23                 :             :   ValentMessage *message;
+      24                 :             :   EContact      *contact;
+      25                 :             : 
+      26                 :             :   GtkWidget     *grid;
+      27                 :             :   GtkWidget     *avatar;
+      28                 :             :   GtkWidget     *name_label;
+      29                 :             :   GtkWidget     *date_label;
+      30                 :             :   GtkWidget     *body_label;
+      31                 :             : };
+      32                 :             : 
+      33   [ +  +  +  - ]:          25 : G_DEFINE_FINAL_TYPE (ValentMessageRow, valent_message_row, GTK_TYPE_LIST_BOX_ROW)
+      34                 :             : 
+      35                 :             : 
+      36                 :             : enum {
+      37                 :             :   PROP_0,
+      38                 :             :   PROP_CONTACT,
+      39                 :             :   PROP_MESSAGE,
+      40                 :             :   PROP_THREAD_ID,
+      41                 :             :   N_PROPERTIES
+      42                 :             : };
+      43                 :             : 
+      44                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      45                 :             : 
+      46                 :             : 
+      47                 :             : /*
+      48                 :             :  * GObject
+      49                 :             :  */
+      50                 :             : static void
+      51                 :           3 : valent_message_row_finalize (GObject *object)
+      52                 :             : {
+      53                 :           3 :   ValentMessageRow *self = VALENT_MESSAGE_ROW (object);
+      54                 :             : 
+      55         [ +  - ]:           3 :   g_clear_object (&self->contact);
+      56         [ +  - ]:           3 :   g_clear_object (&self->message);
+      57                 :             : 
+      58                 :           3 :   G_OBJECT_CLASS (valent_message_row_parent_class)->finalize (object);
+      59                 :           3 : }
+      60                 :             : 
+      61                 :             : static void
+      62                 :           3 : valent_message_row_get_property (GObject    *object,
+      63                 :             :                                  guint       prop_id,
+      64                 :             :                                  GValue     *value,
+      65                 :             :                                  GParamSpec *pspec)
+      66                 :             : {
+      67                 :           3 :   ValentMessageRow *self = VALENT_MESSAGE_ROW (object);
+      68                 :             : 
+      69   [ +  +  +  - ]:           3 :   switch (prop_id)
+      70                 :             :     {
+      71                 :           1 :     case PROP_CONTACT:
+      72                 :           1 :       g_value_set_object (value, self->contact);
+      73                 :           1 :       break;
+      74                 :             : 
+      75                 :           1 :     case PROP_MESSAGE:
+      76                 :           1 :       g_value_set_object (value, self->message);
+      77                 :           1 :       break;
+      78                 :             : 
+      79                 :           1 :     case PROP_THREAD_ID:
+      80                 :           1 :       g_value_set_int64 (value, valent_message_row_get_thread_id (self));
+      81                 :           1 :       break;
+      82                 :             : 
+      83                 :           0 :     default:
+      84                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      85                 :             :     }
+      86                 :           3 : }
+      87                 :             : 
+      88                 :             : static void
+      89                 :           6 : valent_message_row_set_property (GObject      *object,
+      90                 :             :                                  guint         prop_id,
+      91                 :             :                                  const GValue *value,
+      92                 :             :                                  GParamSpec   *pspec)
+      93                 :             : {
+      94                 :           6 :   ValentMessageRow *self = VALENT_MESSAGE_ROW (object);
+      95                 :             : 
+      96      [ +  +  - ]:           6 :   switch (prop_id)
+      97                 :             :     {
+      98                 :           3 :     case PROP_CONTACT:
+      99                 :           3 :       valent_message_row_set_contact (self, g_value_get_object (value));
+     100                 :           3 :       break;
+     101                 :             : 
+     102                 :           3 :     case PROP_MESSAGE:
+     103                 :           3 :       valent_message_row_set_message (self, g_value_get_object (value));
+     104                 :           3 :       break;
+     105                 :             : 
+     106                 :           0 :     default:
+     107                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     108                 :             :     }
+     109                 :           6 : }
+     110                 :             : 
+     111                 :             : static void
+     112                 :           2 : valent_message_row_class_init (ValentMessageRowClass *klass)
+     113                 :             : {
+     114                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     115                 :             : 
+     116                 :           2 :   object_class->finalize = valent_message_row_finalize;
+     117                 :           2 :   object_class->get_property = valent_message_row_get_property;
+     118                 :           2 :   object_class->set_property = valent_message_row_set_property;
+     119                 :             : 
+     120                 :             :   /**
+     121                 :             :    * ValentMessageRow:contact
+     122                 :             :    *
+     123                 :             :    * The `EContact` that sent this message.
+     124                 :             :    */
+     125                 :           4 :   properties [PROP_CONTACT] =
+     126                 :           2 :     g_param_spec_object ("contact", NULL, NULL,
+     127                 :             :                          E_TYPE_CONTACT,
+     128                 :             :                          (G_PARAM_READWRITE |
+     129                 :             :                           G_PARAM_CONSTRUCT |
+     130                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     131                 :             :                           G_PARAM_STATIC_STRINGS));
+     132                 :             : 
+     133                 :             :   /**
+     134                 :             :    * ValentMessageRow:message
+     135                 :             :    *
+     136                 :             :    * The message this row displays.
+     137                 :             :    */
+     138                 :           4 :   properties [PROP_MESSAGE] =
+     139                 :           2 :     g_param_spec_object ("message", NULL, NULL,
+     140                 :             :                           VALENT_TYPE_MESSAGE,
+     141                 :             :                           (G_PARAM_READWRITE |
+     142                 :             :                            G_PARAM_CONSTRUCT |
+     143                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     144                 :             :                            G_PARAM_STATIC_STRINGS));
+     145                 :             : 
+     146                 :             :   /**
+     147                 :             :    * ValentMessageRow:thread-id
+     148                 :             :    *
+     149                 :             :    * The thread id this message belongs to.
+     150                 :             :    */
+     151                 :           4 :   properties [PROP_THREAD_ID] =
+     152                 :           2 :     g_param_spec_int64 ("thread-id", NULL, NULL,
+     153                 :             :                         G_MININT64, G_MAXINT64,
+     154                 :             :                         0,
+     155                 :             :                         (G_PARAM_READABLE |
+     156                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     157                 :             :                          G_PARAM_STATIC_STRINGS));
+     158                 :             : 
+     159                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     160                 :           2 : }
+     161                 :             : 
+     162                 :             : static void
+     163                 :           3 : valent_message_row_init (ValentMessageRow *self)
+     164                 :             : {
+     165                 :           3 :   gtk_widget_add_css_class (GTK_WIDGET (self), "valent-message-row");
+     166                 :             : 
+     167                 :           3 :   self->grid = g_object_new (GTK_TYPE_GRID,
+     168                 :             :                              "column-spacing", 8,
+     169                 :             :                              "margin-start",   8,
+     170                 :             :                              "margin-end",     8,
+     171                 :             :                              "margin-top",     6,
+     172                 :             :                              "margin-bottom",  6,
+     173                 :             :                              NULL);
+     174                 :           3 :   gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (self), self->grid);
+     175                 :             : 
+     176                 :           3 :   self->avatar = g_object_new (ADW_TYPE_AVATAR,
+     177                 :             :                                "size",    32,
+     178                 :             :                                "halign",  GTK_ALIGN_START,
+     179                 :             :                                "valign",  GTK_ALIGN_CENTER,
+     180                 :             :                                "vexpand", TRUE,
+     181                 :             :                                NULL);
+     182                 :           3 :   gtk_grid_attach (GTK_GRID (self->grid), self->avatar, 0, 0, 1, 2);
+     183                 :             : 
+     184                 :           3 :   self->name_label = g_object_new (GTK_TYPE_LABEL,
+     185                 :             :                                    "ellipsize",  PANGO_ELLIPSIZE_END,
+     186                 :             :                                    "halign",     GTK_ALIGN_START,
+     187                 :             :                                    "hexpand",    TRUE,
+     188                 :             :                                    "valign",     GTK_ALIGN_START,
+     189                 :             :                                    "vexpand",    TRUE,
+     190                 :             :                                    "use-markup", TRUE,
+     191                 :             :                                    "xalign",     0.0,
+     192                 :             :                                    NULL);
+     193                 :           3 :   gtk_grid_attach (GTK_GRID (self->grid), self->name_label, 1, 0, 1, 1);
+     194                 :             : 
+     195                 :           3 :   self->date_label = g_object_new (VALENT_TYPE_DATE_LABEL,
+     196                 :             :                                    "halign",     GTK_ALIGN_END,
+     197                 :             :                                    NULL);
+     198                 :           3 :   gtk_widget_add_css_class (self->date_label, "dim-label");
+     199                 :           3 :   gtk_grid_attach (GTK_GRID (self->grid), self->date_label, 2, 0, 1, 1);
+     200                 :             : 
+     201                 :           3 :   self->body_label = g_object_new (GTK_TYPE_LABEL,
+     202                 :             :                                    "ellipsize",        PANGO_ELLIPSIZE_END,
+     203                 :             :                                    "halign",           GTK_ALIGN_START,
+     204                 :             :                                    "hexpand",          TRUE,
+     205                 :             :                                    "valign",           GTK_ALIGN_END,
+     206                 :             :                                    "vexpand",          TRUE,
+     207                 :             :                                    "single-line-mode", TRUE,
+     208                 :             :                                    "use-markup",       TRUE,
+     209                 :             :                                    "xalign",           0.0,
+     210                 :             :                                    NULL);
+     211                 :           3 :   gtk_grid_attach (GTK_GRID (self->grid), self->body_label, 1, 1, 2, 1);
+     212                 :           3 : }
+     213                 :             : 
+     214                 :             : /**
+     215                 :             :  * valent_message_row_new:
+     216                 :             :  * @message: (nullable): a `ValentMessage`
+     217                 :             :  * @contact: (nullable): a `EContact`
+     218                 :             :  *
+     219                 :             :  * Create a new message row for @contact and @message.
+     220                 :             :  *
+     221                 :             :  * Returns: a `ValentMessageRow`
+     222                 :             :  */
+     223                 :             : GtkWidget *
+     224                 :           1 : valent_message_row_new (ValentMessage *message,
+     225                 :             :                         EContact      *contact)
+     226                 :             : {
+     227                 :           1 :   return g_object_new (VALENT_TYPE_MESSAGE_ROW,
+     228                 :             :                        "contact", contact,
+     229                 :             :                        "message", message,
+     230                 :             :                        NULL);
+     231                 :             : }
+     232                 :             : 
+     233                 :             : /**
+     234                 :             :  * valent_message_row_get_contact:
+     235                 :             :  * @row: a `ValentMessageRow`
+     236                 :             :  *
+     237                 :             :  * Get the contact.
+     238                 :             :  *
+     239                 :             :  * Returns: (transfer none) (nullable): a `ValentContact`
+     240                 :             :  */
+     241                 :             : EContact *
+     242                 :           1 : valent_message_row_get_contact (ValentMessageRow *row)
+     243                 :             : {
+     244         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_MESSAGE_ROW (row), NULL);
+     245                 :             : 
+     246                 :           1 :   return row->contact;
+     247                 :             : }
+     248                 :             : 
+     249                 :             : /**
+     250                 :             :  * valent_message_row_set_contact:
+     251                 :             :  * @row: a `ValentMessageRow`
+     252                 :             :  * @contact: a `ValentContact`
+     253                 :             :  *
+     254                 :             :  * Set or update the contact.
+     255                 :             :  */
+     256                 :             : void
+     257                 :           5 : valent_message_row_set_contact (ValentMessageRow *row,
+     258                 :             :                                 EContact         *contact)
+     259                 :             : {
+     260         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_MESSAGE_ROW (row));
+     261   [ +  +  +  -  :           5 :   g_return_if_fail (contact == NULL || E_IS_CONTACT (contact));
+             -  +  -  - ]
+     262                 :             : 
+     263         [ +  + ]:           5 :   if (!g_set_object (&row->contact, contact))
+     264                 :             :     return;
+     265                 :             : 
+     266         [ +  - ]:           3 :   if (row->contact != NULL)
+     267                 :           3 :     valent_sms_avatar_from_contact (ADW_AVATAR (row->avatar), contact);
+     268                 :             : 
+     269                 :           3 :   valent_message_row_update (row);
+     270                 :           3 :   g_object_notify_by_pspec (G_OBJECT (row), properties [PROP_CONTACT]);
+     271                 :             : }
+     272                 :             : 
+     273                 :             : /**
+     274                 :             :  * valent_message_row_get_thread_id:
+     275                 :             :  * @row: a `ValentMessageRow`
+     276                 :             :  *
+     277                 :             :  * Get the thread_id of the message.
+     278                 :             :  *
+     279                 :             :  * Returns: a thread id
+     280                 :             :  */
+     281                 :             : int64_t
+     282                 :           2 : valent_message_row_get_thread_id (ValentMessageRow *row)
+     283                 :             : {
+     284         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_MESSAGE_ROW (row), 0);
+     285                 :             : 
+     286         [ -  + ]:           2 :   if G_UNLIKELY (row->message == NULL)
+     287                 :             :     return 0;
+     288                 :             : 
+     289                 :           2 :   return valent_message_get_thread_id (row->message);
+     290                 :             : }
+     291                 :             : 
+     292                 :             : /**
+     293                 :             :  * valent_message_row_get_message:
+     294                 :             :  * @row: a `ValentMessageRow`
+     295                 :             :  *
+     296                 :             :  * Get the message.
+     297                 :             :  *
+     298                 :             :  * Returns: (transfer none): a `ValentMessage`
+     299                 :             :  */
+     300                 :             : ValentMessage *
+     301                 :           1 : valent_message_row_get_message (ValentMessageRow *row)
+     302                 :             : {
+     303         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_MESSAGE_ROW (row), NULL);
+     304                 :             : 
+     305                 :           1 :   return row->message;
+     306                 :             : }
+     307                 :             : 
+     308                 :             : /**
+     309                 :             :  * valent_message_row_set_message:
+     310                 :             :  * @row: a `ValentMessageRow`
+     311                 :             :  * @message: a `ValentMessage`
+     312                 :             :  *
+     313                 :             :  * Set or update the message.
+     314                 :             :  */
+     315                 :             : void
+     316                 :           3 : valent_message_row_set_message (ValentMessageRow *row,
+     317                 :             :                                 ValentMessage    *message)
+     318                 :             : {
+     319         [ +  - ]:           3 :   g_return_if_fail (VALENT_IS_MESSAGE_ROW (row));
+     320   [ +  -  -  + ]:           3 :   g_return_if_fail (message == NULL || VALENT_IS_MESSAGE (message));
+     321                 :             : 
+     322         [ +  - ]:           3 :   if (row->message == message)
+     323                 :             :     return;
+     324                 :             : 
+     325         [ -  + ]:           3 :   if (row->message != NULL)
+     326                 :             :     {
+     327                 :           0 :       g_signal_handlers_disconnect_by_data (row->message, row);
+     328         [ #  # ]:           0 :       g_clear_object (&row->message);
+     329                 :             :     }
+     330                 :             : 
+     331         [ +  - ]:           3 :   if (message != NULL)
+     332                 :             :     {
+     333                 :           3 :       row->message = g_object_ref (message);
+     334                 :           3 :       g_signal_connect_swapped (row->message,
+     335                 :             :                                 "notify",
+     336                 :             :                                 G_CALLBACK (valent_message_row_update),
+     337                 :             :                                 row);
+     338                 :             : 
+     339                 :           3 :       valent_message_row_update (row);
+     340                 :           3 :       g_object_notify_by_pspec (G_OBJECT (row), properties [PROP_MESSAGE]);
+     341                 :             :     }
+     342                 :             : }
+     343                 :             : 
+     344                 :             : /**
+     345                 :             :  * valent_message_row_update:
+     346                 :             :  * @row: a `ValentMessageRow`
+     347                 :             :  *
+     348                 :             :  * Update the conversation row with data from `ValentMessageRow`:contact
+     349                 :             :  * and `ValentMessageRow`:message properties.
+     350                 :             :  */
+     351                 :             : void
+     352                 :           6 : valent_message_row_update (ValentMessageRow *row)
+     353                 :             : {
+     354                 :           6 :   gboolean read;
+     355                 :           6 :   const char *body;
+     356                 :           6 :   const char *name;
+     357                 :           6 :   int64_t date;
+     358                 :           6 :   g_autofree char *body_label = NULL;
+     359                 :           6 :   g_autofree char *name_label = NULL;
+     360                 :             : 
+     361         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_MESSAGE_ROW (row));
+     362                 :             : 
+     363         [ +  + ]:           6 :   if (row->message == NULL)
+     364                 :             :     return;
+     365                 :             : 
+     366                 :             :   /* Message Sender/Name */
+     367   [ +  +  +  -  :           5 :   if (E_IS_CONTACT (row->contact))
+             -  +  -  - ]
+     368                 :           3 :     name = e_contact_get_const (row->contact, E_CONTACT_FULL_NAME);
+     369                 :             :   else
+     370                 :           2 :     name = valent_message_get_sender (row->message);
+     371                 :             : 
+     372                 :             :   /* Message Read/Unread */
+     373         [ +  + ]:           5 :   if ((read = valent_message_get_read (row->message)))
+     374         [ -  + ]:           1 :     name_label = g_strdup (name);
+     375                 :             :   else
+     376                 :           4 :     name_label = g_strdup_printf ("<b>%s</b>", name);
+     377                 :             : 
+     378                 :           5 :   gtk_label_set_label (GTK_LABEL (row->name_label), name_label);
+     379                 :             : 
+     380                 :             :   /* Message Body */
+     381         [ +  - ]:           5 :   if ((body = valent_message_get_text (row->message)) != NULL)
+     382                 :             :     {
+     383                 :           5 :       g_autofree char *text = NULL;
+     384                 :             : 
+     385                 :           5 :       text = g_markup_escape_text (body, -1);
+     386                 :             : 
+     387         [ +  + ]:           5 :       if (valent_message_get_box (row->message) == VALENT_MESSAGE_BOX_SENT)
+     388                 :           4 :         body_label = g_strdup_printf ("<small>You: %s</small>", text);
+     389         [ +  - ]:           1 :       else if (read)
+     390                 :           1 :         body_label = g_strdup_printf ("<small>%s</small>", text);
+     391                 :             :       else
+     392                 :           0 :         body_label = g_strdup_printf ("<b><small>%s</small></b>", text);
+     393                 :             :     }
+     394                 :             : 
+     395                 :           5 :   gtk_label_set_label (GTK_LABEL (row->body_label), body_label);
+     396                 :             : 
+     397                 :             :   /* Message Date */
+     398                 :           5 :   date = valent_message_get_date (row->message);
+     399                 :           5 :   valent_date_label_set_date (VALENT_DATE_LABEL (row->date_label), date);
+     400                 :             : }
+     401                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-row.h.func-c.html b/coverage/src/plugins/sms/valent-message-row.h.func-c.html new file mode 100644 index 00000000000..fa5436b44df --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-row.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MESSAGE_ROW18
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-row.h.func.html b/coverage/src/plugins/sms/valent-message-row.h.func.html new file mode 100644 index 00000000000..87b11d16adf --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-row.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MESSAGE_ROW18
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-row.h.gcov.html b/coverage/src/plugins/sms/valent-message-row.h.gcov.html new file mode 100644 index 00000000000..530359f8e96 --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-row.h.gcov.html @@ -0,0 +1,121 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-row.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-message.h"
+      10                 :             : 
+      11                 :             : G_BEGIN_DECLS
+      12                 :             : 
+      13                 :             : #define VALENT_TYPE_MESSAGE_ROW (valent_message_row_get_type())
+      14                 :             : 
+      15   [ +  -  +  -  :          18 : G_DECLARE_FINAL_TYPE (ValentMessageRow, valent_message_row, VALENT, MESSAGE_ROW, GtkListBoxRow)
+                   -  + ]
+      16                 :             : 
+      17                 :             : GtkWidget     * valent_message_row_new           (ValentMessage    *message,
+      18                 :             :                                                   EContact         *contact);
+      19                 :             : EContact      * valent_message_row_get_contact   (ValentMessageRow *row);
+      20                 :             : void            valent_message_row_set_contact   (ValentMessageRow *row,
+      21                 :             :                                                   EContact         *contact);
+      22                 :             : ValentMessage * valent_message_row_get_message   (ValentMessageRow *row);
+      23                 :             : void            valent_message_row_set_message   (ValentMessageRow *row,
+      24                 :             :                                                   ValentMessage    *message);
+      25                 :             : int64_t         valent_message_row_get_thread_id (ValentMessageRow *row);
+      26                 :             : void            valent_message_row_update        (ValentMessageRow *row);
+      27                 :             : 
+      28                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-thread.c.func-c.html b/coverage/src/plugins/sms/valent-message-thread.c.func-c.html new file mode 100644 index 00000000000..6b41893a52c --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-thread.c.func-c.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-thread.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-thread.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.1 %123112
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %6432
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_message_thread_get_id1
valent_message_thread_get_item_type1
valent_message_thread_get_store1
valent_message_thread_get_property2
valent_message_thread_get_n_items3
g_list_model_iface_init4
get_thread_items_cb4
valent_message_thread_class_init4
valent_message_thread_dispose4
valent_message_thread_finalize4
valent_message_thread_init4
valent_message_thread_new4
valent_message_thread_set_id4
get_message_cb5
valent_message_thread_get_item5
valent_message_thread_set_property8
valent_message_thread_get_type20
valent_message_thread_class_intern_init4
valent_message_thread_get_type_once4
valent_message_thread_get_type12
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-thread.c.func.html b/coverage/src/plugins/sms/valent-message-thread.c.func.html new file mode 100644 index 00000000000..2b21250bcde --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-thread.c.func.html @@ -0,0 +1,231 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-thread.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-thread.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.1 %123112
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %6432
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_list_model_iface_init4
get_message_cb5
get_thread_items_cb4
valent_message_thread_class_init4
valent_message_thread_dispose4
valent_message_thread_finalize4
valent_message_thread_get_id1
valent_message_thread_get_item5
valent_message_thread_get_item_type1
valent_message_thread_get_n_items3
valent_message_thread_get_property2
valent_message_thread_get_store1
valent_message_thread_get_type20
valent_message_thread_class_intern_init4
valent_message_thread_get_type12
valent_message_thread_get_type_once4
valent_message_thread_init4
valent_message_thread_new4
valent_message_thread_set_id4
valent_message_thread_set_property8
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-thread.c.gcov.html b/coverage/src/plugins/sms/valent-message-thread.c.gcov.html new file mode 100644 index 00000000000..71baecf7663 --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-thread.c.gcov.html @@ -0,0 +1,541 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-thread.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-thread.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.1 %123112
Test Date:2024-03-31 18:46:36Functions:100.0 %1919
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %6432
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : // SPDX-FileCopyrightText: Copyright 2015 Lars Uebernickel
+       4                 :             : // SPDX-FileCopyrightText: Copyright 2015 Ryan Lortie
+       5                 :             : 
+       6                 :             : #define G_LOG_DOMAIN "valent-sms-store"
+       7                 :             : 
+       8                 :             : #include "config.h"
+       9                 :             : 
+      10                 :             : #include <gio/gio.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-message-thread.h"
+      14                 :             : #include "valent-sms-store.h"
+      15                 :             : #include "valent-sms-store-private.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : struct _ValentMessageThread
+      19                 :             : {
+      20                 :             :   GObject         parent_instance;
+      21                 :             : 
+      22                 :             :   ValentSmsStore *store;
+      23                 :             :   int64_t         id;
+      24                 :             :   GCancellable   *cancellable;
+      25                 :             :   GSequence      *items;
+      26                 :             : 
+      27                 :             :   /* cache */
+      28                 :             :   unsigned int    last_position;
+      29                 :             :   GSequenceIter  *last_iter;
+      30                 :             :   gboolean        last_position_valid;
+      31                 :             : };
+      32                 :             : 
+      33                 :             : static void   g_list_model_iface_init (GListModelInterface *iface);
+      34                 :             : 
+      35   [ +  +  +  - ]:          20 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentMessageThread, valent_message_thread, G_TYPE_OBJECT,
+      36                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, g_list_model_iface_init))
+      37                 :             : 
+      38                 :             : enum {
+      39                 :             :   PROP_0,
+      40                 :             :   PROP_STORE,
+      41                 :             :   PROP_ID,
+      42                 :             :   N_PROPERTIES
+      43                 :             : };
+      44                 :             : 
+      45                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      46                 :             : 
+      47                 :             : 
+      48                 :             : #if 0
+      49                 :             : static inline int
+      50                 :             : valent_message_thread_lookup_func (gconstpointer a,
+      51                 :             :                                    gconstpointer b,
+      52                 :             :                                    gpointer      user_data)
+      53                 :             : {
+      54                 :             :   int64_t *id = user_data;
+      55                 :             : 
+      56                 :             :   return valent_message_get_id ((ValentMessage *)a) == *id ? 0 : 1;
+      57                 :             : }
+      58                 :             : 
+      59                 :             : static inline int
+      60                 :             : valent_message_thread_sort_func (gconstpointer a,
+      61                 :             :                                  gconstpointer b,
+      62                 :             :                                  gpointer      user_data)
+      63                 :             : {
+      64                 :             :   int64_t date1 = valent_message_get_date ((ValentMessage *)a);
+      65                 :             :   int64_t date2 = valent_message_get_date ((ValentMessage *)b);
+      66                 :             : 
+      67                 :             :   return (date1 < date2) ? -1 : (date1 > date2);
+      68                 :             : }
+      69                 :             : 
+      70                 :             : static void
+      71                 :             : on_message_added (ValentSmsStore      *store,
+      72                 :             :                   ValentMessage       *message,
+      73                 :             :                   ValentMessageThread *self)
+      74                 :             : {
+      75                 :             :   // FIXME
+      76                 :             :   if (self->id == 0)
+      77                 :             :     {
+      78                 :             : 
+      79                 :             :     }
+      80                 :             : 
+      81                 :             :   if (self->id == valent_message_get_thread_id (message))
+      82                 :             :     {
+      83                 :             :       // TODO: search for a matching id, then insert
+      84                 :             :     }
+      85                 :             : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :             : on_message_removed (ValentSmsStore      *store,
+      89                 :             :                     ValentMessage       *message,
+      90                 :             :                     ValentMessageThread *self)
+      91                 :             : {
+      92                 :             :   GSequenceIter *it;
+      93                 :             :   unsigned int position;
+      94                 :             :   int64_t id;
+      95                 :             : 
+      96                 :             :   if (self->id != valent_message_get_thread_id (message))
+      97                 :             :     return;
+      98                 :             : 
+      99                 :             :   id = valent_message_get_id (message);
+     100                 :             :   it = g_sequence_lookup (self->items,
+     101                 :             :                           &id,
+     102                 :             :                           valent_message_thread_lookup_func,
+     103                 :             :                           NULL);
+     104                 :             :   position = g_sequence_iter_get_position (it);
+     105                 :             : 
+     106                 :             :   g_list_model_items_changed (G_LIST_MODEL (self), position, 1, 0);
+     107                 :             : }
+     108                 :             : 
+     109                 :             : static unsigned int
+     110                 :             : valent_message_thread_add_message (ValentMessageThread *self,
+     111                 :             :                                    ValentMessage       *message)
+     112                 :             : {
+     113                 :             :   GSequenceIter *it;
+     114                 :             :   unsigned int position;
+     115                 :             : 
+     116                 :             :   g_assert (VALENT_IS_MESSAGE_THREAD (self));
+     117                 :             :   g_assert (VALENT_IS_MESSAGE (message));
+     118                 :             : 
+     119                 :             :   it = g_sequence_insert_sorted (self->items,
+     120                 :             :                                  g_object_ref (message),
+     121                 :             :                                  valent_message_thread_sort_func, NULL);
+     122                 :             :   position = g_sequence_iter_get_position (it);
+     123                 :             : 
+     124                 :             :   g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
+     125                 :             : 
+     126                 :             :   return position;
+     127                 :             : }
+     128                 :             : #endif
+     129                 :             : 
+     130                 :             : static void
+     131                 :           5 : get_message_cb (ValentSmsStore *store,
+     132                 :             :                 GAsyncResult   *result,
+     133                 :             :                 gpointer        user_data)
+     134                 :             : {
+     135                 :          10 :   g_autoptr (ValentMessage) message = VALENT_MESSAGE (user_data);
+     136         [ +  - ]:           5 :   g_autoptr (ValentMessage) update = NULL;
+     137         [ +  - ]:           5 :   g_autoptr (GError) error = NULL;
+     138                 :             : 
+     139                 :           5 :   update = valent_sms_store_get_message_finish (store, result, &error);
+     140                 :             : 
+     141         [ -  + ]:           5 :   if (update == NULL)
+     142                 :           0 :     g_warning ("%s: %s", G_STRFUNC, error->message);
+     143                 :             :   else
+     144                 :           5 :     valent_message_update (message, g_steal_pointer (&update));
+     145                 :           5 : }
+     146                 :             : 
+     147                 :             : static void
+     148                 :           4 : get_thread_items_cb (ValentSmsStore *store,
+     149                 :             :                      GAsyncResult   *result,
+     150                 :             :                      gpointer        user_data)
+     151                 :             : {
+     152                 :           4 :   g_autoptr (ValentMessageThread) self = VALENT_MESSAGE_THREAD (user_data);
+     153         [ +  - ]:           4 :   g_autoptr (GPtrArray) messages = NULL;
+     154                 :           4 :   g_autoptr (GError) error = NULL;
+     155                 :           4 :   unsigned int n_items;
+     156                 :             : 
+     157         [ -  + ]:           4 :   if ((messages = g_task_propagate_pointer (G_TASK (result), &error)) == NULL)
+     158                 :             :     {
+     159                 :           0 :       g_warning ("%s(): loading thread %"G_GINT64_FORMAT": %s",
+     160                 :             :                  G_STRFUNC,
+     161                 :             :                  self->id,
+     162                 :             :                  error->message);
+     163         [ #  # ]:           0 :       return;
+     164                 :             :     }
+     165                 :             : 
+     166                 :             :   /* Update the model */
+     167                 :           4 :   n_items = messages->len;
+     168                 :             : 
+     169         [ +  + ]:          12 :   for (unsigned int i = 0; i < n_items; i++)
+     170                 :             :     {
+     171                 :           8 :       ValentMessage *message;
+     172                 :             : 
+     173                 :           8 :       message = g_ptr_array_index (messages, i);
+     174                 :           8 :       g_sequence_append (self->items, g_object_ref (message));
+     175                 :             :     }
+     176                 :             : 
+     177         [ -  + ]:           4 :   g_list_model_items_changed (G_LIST_MODEL (self), 0, 0, n_items);
+     178                 :             : }
+     179                 :             : 
+     180                 :             : 
+     181                 :             : /*
+     182                 :             :  * GListModel
+     183                 :             :  */
+     184                 :             : static GType
+     185                 :           1 : valent_message_thread_get_item_type (GListModel *model)
+     186                 :             : {
+     187                 :           1 :   return VALENT_TYPE_MESSAGE;
+     188                 :             : }
+     189                 :             : 
+     190                 :             : static unsigned int
+     191                 :           3 : valent_message_thread_get_n_items (GListModel *model)
+     192                 :             : {
+     193                 :           3 :   ValentMessageThread *self = VALENT_MESSAGE_THREAD (model);
+     194                 :             : 
+     195                 :           3 :   return g_sequence_get_length (self->items);
+     196                 :             : }
+     197                 :             : 
+     198                 :             : static gpointer
+     199                 :           5 : valent_message_thread_get_item (GListModel   *model,
+     200                 :             :                                 unsigned int  position)
+     201                 :             : {
+     202                 :           5 :   ValentMessageThread *self = VALENT_MESSAGE_THREAD (model);
+     203                 :           5 :   ValentMessage *message = NULL;
+     204                 :           5 :   GSequenceIter *it = NULL;
+     205                 :             : 
+     206         [ +  + ]:           5 :   if (self->last_position_valid)
+     207                 :             :     {
+     208   [ +  -  +  - ]:           2 :       if (position < G_MAXUINT && self->last_position == position + 1)
+     209                 :           2 :         it = g_sequence_iter_prev (self->last_iter);
+     210   [ #  #  #  # ]:           0 :       else if (position > 0 && self->last_position == position - 1)
+     211                 :           0 :         it = g_sequence_iter_next (self->last_iter);
+     212         [ #  # ]:           0 :       else if (self->last_position == position)
+     213                 :           0 :         it = self->last_iter;
+     214                 :             :     }
+     215                 :             : 
+     216         [ -  + ]:           2 :   if (it == NULL)
+     217                 :           3 :     it = g_sequence_get_iter_at_pos (self->items, position);
+     218                 :             : 
+     219                 :           5 :   self->last_iter = it;
+     220                 :           5 :   self->last_position = position;
+     221                 :           5 :   self->last_position_valid = TRUE;
+     222                 :             : 
+     223         [ +  - ]:           5 :   if (g_sequence_iter_is_end (it))
+     224                 :             :     return NULL;
+     225                 :             : 
+     226                 :           5 :   message = g_object_ref (g_sequence_get (it));
+     227                 :             : 
+     228                 :             :   /* Lazy fetch */
+     229         [ +  - ]:           5 :   if (valent_message_get_box (message) == 0)
+     230                 :             :     {
+     231                 :           5 :       valent_sms_store_get_message (self->store,
+     232                 :             :                                     valent_message_get_id (message),
+     233                 :             :                                     self->cancellable,
+     234                 :             :                                     (GAsyncReadyCallback)get_message_cb,
+     235                 :             :                                     g_object_ref (message));
+     236                 :             :     }
+     237                 :             : 
+     238                 :             :   return message;
+     239                 :             : }
+     240                 :             : 
+     241                 :             : static void
+     242                 :           4 : g_list_model_iface_init (GListModelInterface *iface)
+     243                 :             : {
+     244                 :           4 :   iface->get_item = valent_message_thread_get_item;
+     245                 :           4 :   iface->get_item_type = valent_message_thread_get_item_type;
+     246                 :           4 :   iface->get_n_items = valent_message_thread_get_n_items;
+     247                 :           4 : }
+     248                 :             : 
+     249                 :             : 
+     250                 :             : /*
+     251                 :             :  * GObject
+     252                 :             :  */
+     253                 :             : static void
+     254                 :           4 : valent_message_thread_dispose (GObject *object)
+     255                 :             : {
+     256                 :           4 :   ValentMessageThread *self = VALENT_MESSAGE_THREAD (object);
+     257                 :             : 
+     258                 :           4 :   g_cancellable_cancel (self->cancellable);
+     259                 :             : 
+     260                 :           4 :   G_OBJECT_CLASS (valent_message_thread_parent_class)->dispose (object);
+     261                 :           4 : }
+     262                 :             : 
+     263                 :             : static void
+     264                 :           4 : valent_message_thread_finalize (GObject *object)
+     265                 :             : {
+     266                 :           4 :   ValentMessageThread *self = VALENT_MESSAGE_THREAD (object);
+     267                 :             : 
+     268         [ +  - ]:           4 :   g_clear_object (&self->store);
+     269         [ +  - ]:           4 :   g_clear_pointer (&self->items, g_sequence_free);
+     270         [ +  - ]:           4 :   g_clear_object (&self->cancellable);
+     271                 :             : 
+     272                 :           4 :   G_OBJECT_CLASS (valent_message_thread_parent_class)->finalize (object);
+     273                 :           4 : }
+     274                 :             : 
+     275                 :             : static void
+     276                 :           2 : valent_message_thread_get_property (GObject    *object,
+     277                 :             :                                     guint       prop_id,
+     278                 :             :                                     GValue     *value,
+     279                 :             :                                     GParamSpec *pspec)
+     280                 :             : {
+     281                 :           2 :   ValentMessageThread *self = VALENT_MESSAGE_THREAD (object);
+     282                 :             : 
+     283      [ +  +  - ]:           2 :   switch (prop_id)
+     284                 :             :     {
+     285                 :           1 :     case PROP_ID:
+     286                 :           1 :       g_value_set_int64 (value, self->id);
+     287                 :           1 :       break;
+     288                 :             : 
+     289                 :           1 :     case PROP_STORE:
+     290                 :           1 :       g_value_set_object (value, self->store);
+     291                 :           1 :       break;
+     292                 :             : 
+     293                 :           0 :     default:
+     294                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     295                 :             :     }
+     296                 :           2 : }
+     297                 :             : 
+     298                 :             : static void
+     299                 :           8 : valent_message_thread_set_property (GObject      *object,
+     300                 :             :                                     guint         prop_id,
+     301                 :             :                                     const GValue *value,
+     302                 :             :                                     GParamSpec   *pspec)
+     303                 :             : {
+     304                 :           8 :   ValentMessageThread *self = VALENT_MESSAGE_THREAD (object);
+     305                 :             : 
+     306      [ +  +  - ]:           8 :   switch (prop_id)
+     307                 :             :     {
+     308                 :           4 :     case PROP_ID:
+     309                 :           4 :       valent_message_thread_set_id (self, g_value_get_int64 (value));
+     310                 :           4 :       break;
+     311                 :             : 
+     312                 :           4 :     case PROP_STORE:
+     313                 :           4 :       self->store = g_value_dup_object (value);
+     314                 :           4 :       break;
+     315                 :             : 
+     316                 :           0 :     default:
+     317                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     318                 :             :     }
+     319                 :           8 : }
+     320                 :             : 
+     321                 :             : static void
+     322                 :           4 : valent_message_thread_class_init (ValentMessageThreadClass *klass)
+     323                 :             : {
+     324                 :           4 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     325                 :             : 
+     326                 :           4 :   object_class->dispose = valent_message_thread_dispose;
+     327                 :           4 :   object_class->finalize = valent_message_thread_finalize;
+     328                 :           4 :   object_class->get_property = valent_message_thread_get_property;
+     329                 :           4 :   object_class->set_property = valent_message_thread_set_property;
+     330                 :             : 
+     331                 :             :   /**
+     332                 :             :    * ValentMessageThread:id:
+     333                 :             :    *
+     334                 :             :    * The ID of the thread.
+     335                 :             :    */
+     336                 :           8 :   properties [PROP_ID] =
+     337                 :           4 :     g_param_spec_int64 ("id", NULL, NULL,
+     338                 :             :                         G_MININT64, G_MAXINT64,
+     339                 :             :                         0,
+     340                 :             :                         (G_PARAM_READWRITE |
+     341                 :             :                          G_PARAM_CONSTRUCT |
+     342                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     343                 :             :                          G_PARAM_STATIC_STRINGS));
+     344                 :             : 
+     345                 :             :   /**
+     346                 :             :    * ValentMessageThread:message-store:
+     347                 :             :    *
+     348                 :             :    * The `ValentSmsStore` providing `ValentMessage` objects for the thread.
+     349                 :             :    */
+     350                 :           8 :   properties [PROP_STORE] =
+     351                 :           4 :     g_param_spec_object ("store", NULL, NULL,
+     352                 :             :                          VALENT_TYPE_SMS_STORE,
+     353                 :             :                          (G_PARAM_READWRITE |
+     354                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     355                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     356                 :             :                           G_PARAM_STATIC_STRINGS));
+     357                 :             : 
+     358                 :           4 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     359                 :           4 : }
+     360                 :             : 
+     361                 :             : static void
+     362                 :           4 : valent_message_thread_init (ValentMessageThread *self)
+     363                 :             : {
+     364                 :           4 :   self->cancellable = g_cancellable_new ();
+     365                 :           4 :   self->items = g_sequence_new (g_object_unref);
+     366                 :           4 : }
+     367                 :             : 
+     368                 :             : /**
+     369                 :             :  * valent_message_thread_new:
+     370                 :             :  * @store: a @ValentSmsStore
+     371                 :             :  * @id: a thread ID
+     372                 :             :  *
+     373                 :             :  * Create a new `ValentMessageThread`.
+     374                 :             :  *
+     375                 :             :  * Returns: (transfer full): a `GListModel`
+     376                 :             :  */
+     377                 :             : GListModel *
+     378                 :           4 : valent_message_thread_new (ValentSmsStore *store,
+     379                 :             :                            int64_t         id)
+     380                 :             : {
+     381         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), NULL);
+     382         [ -  + ]:           4 :   g_return_val_if_fail (id >= 0, NULL);
+     383                 :             : 
+     384                 :           4 :   return g_object_new (VALENT_TYPE_MESSAGE_THREAD,
+     385                 :             :                        "id",    id,
+     386                 :             :                        "store", store,
+     387                 :             :                        NULL);
+     388                 :             : }
+     389                 :             : 
+     390                 :             : /**
+     391                 :             :  * valent_message_thread_get_id:
+     392                 :             :  * @thread: a `ValentMessageThread`
+     393                 :             :  *
+     394                 :             :  * Get the thread ID for @thread.
+     395                 :             :  *
+     396                 :             :  * Returns: an ID
+     397                 :             :  */
+     398                 :             : int64_t
+     399                 :           1 : valent_message_thread_get_id (ValentMessageThread *thread)
+     400                 :             : {
+     401         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_MESSAGE_THREAD (thread), 0);
+     402                 :             : 
+     403                 :           1 :   return thread->id;
+     404                 :             : }
+     405                 :             : 
+     406                 :             : /**
+     407                 :             :  * valent_message_thread_set_id:
+     408                 :             :  * @thread: a `ValentMessageThread`
+     409                 :             :  * @id: a thread ID
+     410                 :             :  *
+     411                 :             :  * Set the thread ID for @thread to @id.
+     412                 :             :  */
+     413                 :             : void
+     414                 :           4 : valent_message_thread_set_id (ValentMessageThread *thread,
+     415                 :             :                               int64_t              id)
+     416                 :             : {
+     417         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_MESSAGE_THREAD (thread));
+     418         [ -  + ]:           4 :   g_return_if_fail (id >= 0);
+     419                 :             : 
+     420         [ +  - ]:           4 :   if (thread->id == id)
+     421                 :             :     return;
+     422                 :             : 
+     423                 :           4 :   thread->id = id;
+     424                 :           4 :   g_object_notify_by_pspec (G_OBJECT (thread), properties [PROP_ID]);
+     425                 :             : 
+     426                 :             :   /* Load the thread items, while holding a reference to the thread */
+     427                 :           4 :   valent_sms_store_get_thread_items (thread->store,
+     428                 :             :                                      thread->id,
+     429                 :             :                                      thread->cancellable,
+     430                 :             :                                      (GAsyncReadyCallback)get_thread_items_cb,
+     431                 :             :                                      g_object_ref (thread));
+     432                 :             : }
+     433                 :             : 
+     434                 :             : /**
+     435                 :             :  * valent_message_thread_get_db:
+     436                 :             :  * @thread: a `ValentMessageThread`
+     437                 :             :  *
+     438                 :             :  * Get the thread ID for @thread.
+     439                 :             :  *
+     440                 :             :  * Returns: a `ValentSmsStore`
+     441                 :             :  */
+     442                 :             : ValentSmsStore *
+     443                 :           1 : valent_message_thread_get_store (ValentMessageThread *thread)
+     444                 :             : {
+     445         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_MESSAGE_THREAD (thread), NULL);
+     446                 :             : 
+     447                 :           1 :   return thread->store;
+     448                 :             : }
+     449                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-thread.h.func-c.html b/coverage/src/plugins/sms/valent-message-thread.h.func-c.html new file mode 100644 index 00000000000..5bc72e96e0f --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-thread.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-thread.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-thread.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MESSAGE_THREAD8
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-thread.h.func.html b/coverage/src/plugins/sms/valent-message-thread.h.func.html new file mode 100644 index 00000000000..53224ec8caa --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-thread.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-thread.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-thread.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MESSAGE_THREAD8
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message-thread.h.gcov.html b/coverage/src/plugins/sms/valent-message-thread.h.gcov.html new file mode 100644 index 00000000000..e53728fe57b --- /dev/null +++ b/coverage/src/plugins/sms/valent-message-thread.h.gcov.html @@ -0,0 +1,118 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message-thread.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message-thread.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:62.5 %85
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : 
+       8                 :             : #include "valent-message.h"
+       9                 :             : #include "valent-sms-store.h"
+      10                 :             : 
+      11                 :             : G_BEGIN_DECLS
+      12                 :             : 
+      13                 :             : #define VALENT_TYPE_MESSAGE_THREAD (valent_message_thread_get_type())
+      14                 :             : 
+      15   [ +  -  +  -  :          12 : G_DECLARE_FINAL_TYPE (ValentMessageThread, valent_message_thread, VALENT, MESSAGE_THREAD, GObject)
+             +  +  -  + ]
+      16                 :             : 
+      17                 :             : GListModel     * valent_message_thread_new       (ValentSmsStore      *store,
+      18                 :             :                                                   int64_t              id);
+      19                 :             : 
+      20                 :             : ValentSmsStore * valent_message_thread_get_store (ValentMessageThread *thread);
+      21                 :             : int64_t          valent_message_thread_get_id    (ValentMessageThread *thread);
+      22                 :             : void             valent_message_thread_set_id    (ValentMessageThread *thread,
+      23                 :             :                                                   int64_t              id);
+      24                 :             : 
+      25                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message.c.func-c.html b/coverage/src/plugins/sms/valent-message.c.func-c.html new file mode 100644 index 00000000000..17c4259f405 --- /dev/null +++ b/coverage/src/plugins/sms/valent-message.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %145136
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:67.6 %6846
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_message_update5
valent_message_class_init8
valent_message_get_property8
valent_message_get_thread_id17
valent_message_get_metadata18
valent_message_get_read20
valent_message_get_sender22
valent_message_get_id23
valent_message_get_date30
valent_message_get_text35
valent_message_get_box39
valent_message_finalize42
valent_message_set_read43
valent_message_init55
valent_message_get_type389
valent_message_class_intern_init8
valent_message_get_type_once8
valent_message_get_type373
valent_message_set_property428
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message.c.func.html b/coverage/src/plugins/sms/valent-message.c.func.html new file mode 100644 index 00000000000..e32fe945ae8 --- /dev/null +++ b/coverage/src/plugins/sms/valent-message.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %145136
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:67.6 %6846
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_message_class_init8
valent_message_finalize42
valent_message_get_box39
valent_message_get_date30
valent_message_get_id23
valent_message_get_metadata18
valent_message_get_property8
valent_message_get_read20
valent_message_get_sender22
valent_message_get_text35
valent_message_get_thread_id17
valent_message_get_type389
valent_message_class_intern_init8
valent_message_get_type373
valent_message_get_type_once8
valent_message_init55
valent_message_set_property428
valent_message_set_read43
valent_message_update5
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message.c.gcov.html b/coverage/src/plugins/sms/valent-message.c.gcov.html new file mode 100644 index 00000000000..57c7c45df1f --- /dev/null +++ b/coverage/src/plugins/sms/valent-message.c.gcov.html @@ -0,0 +1,579 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:93.8 %145136
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:67.6 %6846
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-message"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-message.h"
+      12                 :             : 
+      13                 :             : 
+      14                 :             : struct _ValentMessage
+      15                 :             : {
+      16                 :             :   GObject           parent_instance;
+      17                 :             : 
+      18                 :             :   ValentMessageBox  box;
+      19                 :             :   int64_t           date;
+      20                 :             :   int64_t           id;
+      21                 :             :   GVariant         *metadata;
+      22                 :             :   unsigned int      read : 1;
+      23                 :             :   char             *sender;
+      24                 :             :   char             *text;
+      25                 :             :   int64_t           thread_id;
+      26                 :             : };
+      27                 :             : 
+      28   [ +  +  +  - ]:         389 : G_DEFINE_FINAL_TYPE (ValentMessage, valent_message, G_TYPE_OBJECT)
+      29                 :             : 
+      30                 :             : enum {
+      31                 :             :   PROP_0,
+      32                 :             :   PROP_BOX,
+      33                 :             :   PROP_DATE,
+      34                 :             :   PROP_ID,
+      35                 :             :   PROP_METADATA,
+      36                 :             :   PROP_READ,
+      37                 :             :   PROP_SENDER,
+      38                 :             :   PROP_TEXT,
+      39                 :             :   PROP_THREAD_ID,
+      40                 :             :   N_PROPERTIES
+      41                 :             : };
+      42                 :             : 
+      43                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      44                 :             : 
+      45                 :             : 
+      46                 :             : /*
+      47                 :             :  * GObject
+      48                 :             :  */
+      49                 :             : static void
+      50                 :          42 : valent_message_finalize (GObject *object)
+      51                 :             : {
+      52                 :          42 :   ValentMessage *self = VALENT_MESSAGE (object);
+      53                 :             : 
+      54         [ +  + ]:          42 :   g_clear_pointer (&self->sender, g_free);
+      55         [ +  + ]:          42 :   g_clear_pointer (&self->text, g_free);
+      56         [ +  + ]:          42 :   g_clear_pointer (&self->metadata, g_variant_unref);
+      57                 :             : 
+      58                 :          42 :   G_OBJECT_CLASS (valent_message_parent_class)->finalize (object);
+      59                 :          42 : }
+      60                 :             : 
+      61                 :             : static void
+      62                 :           8 : valent_message_get_property (GObject    *object,
+      63                 :             :                              guint       prop_id,
+      64                 :             :                              GValue     *value,
+      65                 :             :                              GParamSpec *pspec)
+      66                 :             : {
+      67                 :           8 :   ValentMessage *self = VALENT_MESSAGE (object);
+      68                 :             : 
+      69   [ +  +  +  +  :           8 :   switch (prop_id)
+             +  +  +  +  
+                      - ]
+      70                 :             :     {
+      71                 :           1 :     case PROP_BOX:
+      72                 :           1 :       g_value_set_uint (value, self->box);
+      73                 :           1 :       break;
+      74                 :             : 
+      75                 :           1 :     case PROP_DATE:
+      76                 :           1 :       g_value_set_int64 (value, self->date);
+      77                 :           1 :       break;
+      78                 :             : 
+      79                 :           1 :     case PROP_ID:
+      80                 :           1 :       g_value_set_int64 (value, self->id);
+      81                 :           1 :       break;
+      82                 :             : 
+      83                 :           1 :     case PROP_METADATA:
+      84                 :           1 :       g_value_set_variant (value, valent_message_get_metadata (self));
+      85                 :           1 :       break;
+      86                 :             : 
+      87                 :           1 :     case PROP_READ:
+      88                 :           1 :       g_value_set_boolean (value, self->read);
+      89                 :           1 :       break;
+      90                 :             : 
+      91                 :           1 :     case PROP_SENDER:
+      92                 :           1 :       g_value_set_string (value, self->sender);
+      93                 :           1 :       break;
+      94                 :             : 
+      95                 :           1 :     case PROP_TEXT:
+      96                 :           1 :       g_value_set_string (value, self->text);
+      97                 :           1 :       break;
+      98                 :             : 
+      99                 :           1 :     case PROP_THREAD_ID:
+     100                 :           1 :       g_value_set_int64 (value, self->thread_id);
+     101                 :           1 :       break;
+     102                 :             : 
+     103                 :           0 :     default:
+     104                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     105                 :             :     }
+     106                 :           8 : }
+     107                 :             : 
+     108                 :             : static void
+     109                 :         428 : valent_message_set_property (GObject      *object,
+     110                 :             :                              guint         prop_id,
+     111                 :             :                              const GValue *value,
+     112                 :             :                              GParamSpec   *pspec)
+     113                 :             : {
+     114                 :         428 :   ValentMessage *self = VALENT_MESSAGE (object);
+     115                 :             : 
+     116   [ +  +  +  +  :         428 :   switch (prop_id)
+             +  +  +  +  
+                      - ]
+     117                 :             :     {
+     118                 :          55 :     case PROP_BOX:
+     119                 :          55 :       self->box = g_value_get_uint (value);
+     120                 :          55 :       break;
+     121                 :             : 
+     122                 :          55 :     case PROP_DATE:
+     123                 :          55 :       self->date = g_value_get_int64 (value);
+     124                 :          55 :       break;
+     125                 :             : 
+     126                 :          55 :     case PROP_ID:
+     127                 :          55 :       self->id = g_value_get_int64 (value);
+     128                 :          55 :       break;
+     129                 :             : 
+     130                 :          55 :     case PROP_METADATA:
+     131                 :          55 :       self->metadata = g_value_dup_variant (value);
+     132                 :          55 :       break;
+     133                 :             : 
+     134                 :          43 :     case PROP_READ:
+     135                 :          43 :       valent_message_set_read (self, g_value_get_boolean (value));
+     136                 :          43 :       break;
+     137                 :             : 
+     138                 :          55 :     case PROP_SENDER:
+     139                 :          55 :       self->sender = g_value_dup_string (value);
+     140                 :          55 :       break;
+     141                 :             : 
+     142                 :          55 :     case PROP_TEXT:
+     143                 :          55 :       self->text = g_value_dup_string (value);
+     144                 :          55 :       break;
+     145                 :             : 
+     146                 :          55 :     case PROP_THREAD_ID:
+     147                 :          55 :       self->thread_id = g_value_get_int64 (value);
+     148                 :          55 :       break;
+     149                 :             : 
+     150                 :           0 :     default:
+     151                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     152                 :             :     }
+     153                 :         428 : }
+     154                 :             : 
+     155                 :             : static void
+     156                 :           8 : valent_message_class_init (ValentMessageClass *klass)
+     157                 :             : {
+     158                 :           8 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     159                 :             : 
+     160                 :           8 :   object_class->finalize = valent_message_finalize;
+     161                 :           8 :   object_class->get_property = valent_message_get_property;
+     162                 :           8 :   object_class->set_property = valent_message_set_property;
+     163                 :             : 
+     164                 :             :   /**
+     165                 :             :    * ValentMessage:box:
+     166                 :             :    *
+     167                 :             :    * The `ValentMessageBox` of the message.
+     168                 :             :    */
+     169                 :          16 :   properties [PROP_BOX] =
+     170                 :           8 :     g_param_spec_uint ("box", NULL, NULL,
+     171                 :             :                        VALENT_MESSAGE_BOX_ALL, VALENT_MESSAGE_BOX_FAILED,
+     172                 :             :                        VALENT_MESSAGE_BOX_ALL,
+     173                 :             :                        (G_PARAM_READWRITE |
+     174                 :             :                         G_PARAM_CONSTRUCT_ONLY |
+     175                 :             :                         G_PARAM_EXPLICIT_NOTIFY |
+     176                 :             :                         G_PARAM_STATIC_STRINGS));
+     177                 :             : 
+     178                 :             :   /**
+     179                 :             :    * ValentMessage:date:
+     180                 :             :    *
+     181                 :             :    * A UNIX epoch timestamp for the message.
+     182                 :             :    */
+     183                 :          16 :   properties [PROP_DATE] =
+     184                 :           8 :     g_param_spec_int64 ("date", NULL, NULL,
+     185                 :             :                         G_MININT64, G_MAXINT64,
+     186                 :             :                         0,
+     187                 :             :                         (G_PARAM_READWRITE |
+     188                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     189                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     190                 :             :                          G_PARAM_STATIC_STRINGS));
+     191                 :             : 
+     192                 :             :   /**
+     193                 :             :    * ValentMessage:id:
+     194                 :             :    *
+     195                 :             :    * The unique ID for this message.
+     196                 :             :    */
+     197                 :          16 :   properties [PROP_ID] =
+     198                 :           8 :     g_param_spec_int64 ("id", NULL, NULL,
+     199                 :             :                         G_MININT64, G_MAXINT64,
+     200                 :             :                         0,
+     201                 :             :                         (G_PARAM_READWRITE |
+     202                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     203                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     204                 :             :                          G_PARAM_STATIC_STRINGS));
+     205                 :             : 
+     206                 :             :   /**
+     207                 :             :    * ValentMessage:metadata:
+     208                 :             :    *
+     209                 :             :    * Ancillary data for the message, such as media.
+     210                 :             :    */
+     211                 :          16 :   properties [PROP_METADATA] =
+     212                 :           8 :     g_param_spec_variant ("metadata", NULL, NULL,
+     213                 :             :                           G_VARIANT_TYPE_VARDICT,
+     214                 :             :                           NULL,
+     215                 :             :                           (G_PARAM_READWRITE |
+     216                 :             :                            G_PARAM_CONSTRUCT_ONLY |
+     217                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     218                 :             :                            G_PARAM_STATIC_STRINGS));
+     219                 :             : 
+     220                 :             :   /**
+     221                 :             :    * ValentMessage:read:
+     222                 :             :    *
+     223                 :             :    * Whether the message has been read.
+     224                 :             :    */
+     225                 :          16 :   properties [PROP_READ] =
+     226                 :           8 :     g_param_spec_boolean ("read", NULL, NULL,
+     227                 :             :                           FALSE,
+     228                 :             :                           (G_PARAM_READWRITE |
+     229                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     230                 :             :                            G_PARAM_STATIC_STRINGS));
+     231                 :             : 
+     232                 :             :   /**
+     233                 :             :    * ValentMessage:sender:
+     234                 :             :    *
+     235                 :             :    * The sender of the message. This will usually be a phone number or other
+     236                 :             :    * address form.
+     237                 :             :    */
+     238                 :          16 :   properties [PROP_SENDER] =
+     239                 :           8 :     g_param_spec_string ("sender", NULL, NULL,
+     240                 :             :                          NULL,
+     241                 :             :                          (G_PARAM_READWRITE |
+     242                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     243                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     244                 :             :                           G_PARAM_STATIC_STRINGS));
+     245                 :             : 
+     246                 :             :   /**
+     247                 :             :    * ValentMessage:text:
+     248                 :             :    *
+     249                 :             :    * The text content of the message.
+     250                 :             :    */
+     251                 :          16 :   properties [PROP_TEXT] =
+     252                 :           8 :     g_param_spec_string ("text", NULL, NULL,
+     253                 :             :                          NULL,
+     254                 :             :                          (G_PARAM_READWRITE |
+     255                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     256                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     257                 :             :                           G_PARAM_STATIC_STRINGS));
+     258                 :             : 
+     259                 :             :   /**
+     260                 :             :    * ValentMessage:thread-id:
+     261                 :             :    *
+     262                 :             :    * The thread this message belongs to.
+     263                 :             :    */
+     264                 :          16 :   properties [PROP_THREAD_ID] =
+     265                 :           8 :     g_param_spec_int64 ("thread-id", NULL, NULL,
+     266                 :             :                         G_MININT64, G_MAXINT64,
+     267                 :             :                         0,
+     268                 :             :                         (G_PARAM_READWRITE |
+     269                 :             :                          G_PARAM_CONSTRUCT_ONLY |
+     270                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     271                 :             :                          G_PARAM_STATIC_STRINGS));
+     272                 :             : 
+     273                 :           8 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     274                 :           8 : }
+     275                 :             : 
+     276                 :             : static void
+     277                 :          55 : valent_message_init (ValentMessage *message)
+     278                 :             : {
+     279                 :          55 : }
+     280                 :             : 
+     281                 :             : /**
+     282                 :             :  * valent_message_get_box:
+     283                 :             :  * @message: a `ValentMessage`
+     284                 :             :  *
+     285                 :             :  * Get the `ValentMessageBox` of @message.
+     286                 :             :  *
+     287                 :             :  * Returns: a `ValentMessageBox`
+     288                 :             :  */
+     289                 :             : ValentMessageBox
+     290                 :          39 : valent_message_get_box (ValentMessage *message)
+     291                 :             : {
+     292         [ +  - ]:          39 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), VALENT_MESSAGE_BOX_ALL);
+     293                 :             : 
+     294                 :          39 :   return message->box;
+     295                 :             : }
+     296                 :             : 
+     297                 :             : /**
+     298                 :             :  * valent_message_get_date:
+     299                 :             :  * @message: a `ValentMessage`
+     300                 :             :  *
+     301                 :             :  * Get the timestamp for @message.
+     302                 :             :  *
+     303                 :             :  * Returns: the message timestamp
+     304                 :             :  */
+     305                 :             : int64_t
+     306                 :          30 : valent_message_get_date (ValentMessage *message)
+     307                 :             : {
+     308         [ +  - ]:          30 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), 0);
+     309                 :             : 
+     310                 :          30 :   return message->date;
+     311                 :             : }
+     312                 :             : 
+     313                 :             : /**
+     314                 :             :  * valent_message_get_id:
+     315                 :             :  * @message: a `ValentMessage`
+     316                 :             :  *
+     317                 :             :  * Get the unique ID for @message.
+     318                 :             :  *
+     319                 :             :  * Returns: the message ID
+     320                 :             :  */
+     321                 :             : int64_t
+     322                 :          23 : valent_message_get_id (ValentMessage *message)
+     323                 :             : {
+     324         [ +  - ]:          23 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), 0);
+     325                 :             : 
+     326                 :          23 :   return message->id;
+     327                 :             : }
+     328                 :             : 
+     329                 :             : /**
+     330                 :             :  * valent_message_get_metadata:
+     331                 :             :  * @message: a `ValentMessage`
+     332                 :             :  *
+     333                 :             :  * Get the `GVariant` dictionary of metadata.
+     334                 :             :  *
+     335                 :             :  * Returns: (transfer none) (nullable): the metadata
+     336                 :             :  */
+     337                 :             : GVariant *
+     338                 :          18 : valent_message_get_metadata (ValentMessage *message)
+     339                 :             : {
+     340         [ +  - ]:          18 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), NULL);
+     341                 :             : 
+     342                 :          18 :   return message->metadata;
+     343                 :             : }
+     344                 :             : 
+     345                 :             : /**
+     346                 :             :  * valent_message_get_read:
+     347                 :             :  * @message: a `ValentMessage`
+     348                 :             :  *
+     349                 :             :  * Get the read status of @message.
+     350                 :             :  *
+     351                 :             :  * Returns: %TRUE if the message has been read
+     352                 :             :  */
+     353                 :             : gboolean
+     354                 :          20 : valent_message_get_read (ValentMessage *message)
+     355                 :             : {
+     356         [ +  - ]:          20 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), FALSE);
+     357                 :             : 
+     358                 :          20 :   return message->read;
+     359                 :             : }
+     360                 :             : 
+     361                 :             : /**
+     362                 :             :  * valent_message_set_read:
+     363                 :             :  * @message: a `ValentMessage`
+     364                 :             :  * @read: whether the message is read
+     365                 :             :  *
+     366                 :             :  * Set the read status of @message to @read.
+     367                 :             :  */
+     368                 :             : void
+     369                 :          43 : valent_message_set_read (ValentMessage *message,
+     370                 :             :                          gboolean       read)
+     371                 :             : {
+     372         [ +  - ]:          43 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+     373                 :             : 
+     374         [ +  + ]:          43 :   if (message->read == read)
+     375                 :             :     return;
+     376                 :             : 
+     377                 :           6 :   message->read = read;
+     378                 :           6 :   g_object_notify_by_pspec (G_OBJECT (message), properties [PROP_READ]);
+     379                 :             : }
+     380                 :             : 
+     381                 :             : /**
+     382                 :             :  * valent_message_get_sender:
+     383                 :             :  * @message: a `ValentMessage`
+     384                 :             :  *
+     385                 :             :  * Get the sender of @message.
+     386                 :             :  *
+     387                 :             :  * Returns: (transfer none) (nullable): the message sender
+     388                 :             :  */
+     389                 :             : const char *
+     390                 :          22 : valent_message_get_sender (ValentMessage *message)
+     391                 :             : {
+     392         [ +  - ]:          22 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), NULL);
+     393                 :             : 
+     394                 :          22 :   return message->sender;
+     395                 :             : }
+     396                 :             : 
+     397                 :             : /**
+     398                 :             :  * valent_message_get_text:
+     399                 :             :  * @message: a `ValentMessage`
+     400                 :             :  *
+     401                 :             :  * Get the text content of @message.
+     402                 :             :  *
+     403                 :             :  * Returns: (transfer none) (nullable): the message text
+     404                 :             :  */
+     405                 :             : const char *
+     406                 :          35 : valent_message_get_text (ValentMessage *message)
+     407                 :             : {
+     408         [ +  - ]:          35 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), NULL);
+     409                 :             : 
+     410                 :          35 :   return message->text;
+     411                 :             : }
+     412                 :             : 
+     413                 :             : /**
+     414                 :             :  * valent_message_get_thread_id:
+     415                 :             :  * @message: a `ValentMessage`
+     416                 :             :  *
+     417                 :             :  * Get the thread ID @message belongs to.
+     418                 :             :  *
+     419                 :             :  * Returns: the thread ID
+     420                 :             :  */
+     421                 :             : int64_t
+     422                 :          17 : valent_message_get_thread_id (ValentMessage *message)
+     423                 :             : {
+     424         [ +  - ]:          17 :   g_return_val_if_fail (VALENT_IS_MESSAGE (message), 0);
+     425                 :             : 
+     426                 :          17 :   return message->thread_id;
+     427                 :             : }
+     428                 :             : 
+     429                 :             : /**
+     430                 :             :  * valent_message_update:
+     431                 :             :  * @message: a `ValentMessage`
+     432                 :             :  * @update: (transfer full): a `ValentMessage`
+     433                 :             :  *
+     434                 :             :  * Update @message with data from @update. The `ValentMessage`:id property
+     435                 :             :  * must match on both objects.
+     436                 :             :  *
+     437                 :             :  * This function consumes @update and all its memory, so it should not be used
+     438                 :             :  * after calling this.
+     439                 :             :  */
+     440                 :             : void
+     441                 :           5 : valent_message_update (ValentMessage *message,
+     442                 :             :                        ValentMessage *update)
+     443                 :             : {
+     444         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+     445         [ -  + ]:           5 :   g_return_if_fail (VALENT_IS_MESSAGE (update));
+     446         [ -  + ]:           5 :   g_return_if_fail (message->id == update->id);
+     447                 :             : 
+     448                 :           5 :   g_object_freeze_notify (G_OBJECT (message));
+     449                 :             : 
+     450         [ +  - ]:           5 :   if (message->box != update->box)
+     451                 :             :     {
+     452                 :           5 :       message->box = update->box;
+     453                 :           5 :       g_object_notify_by_pspec (G_OBJECT (message), properties [PROP_BOX]);
+     454                 :             :     }
+     455                 :             : 
+     456         [ -  + ]:           5 :   if (message->date != update->date)
+     457                 :             :     {
+     458                 :           0 :       message->date = update->date;
+     459                 :           0 :       g_object_notify_by_pspec (G_OBJECT (message), properties [PROP_DATE]);
+     460                 :             :     }
+     461                 :             : 
+     462         [ +  - ]:           5 :   if (message->metadata != update->metadata)
+     463                 :             :     {
+     464         [ -  + ]:           5 :       g_clear_pointer (&message->metadata, g_variant_unref);
+     465                 :           5 :       message->metadata = g_steal_pointer (&update->metadata);
+     466                 :             :     }
+     467                 :             : 
+     468         [ -  + ]:           5 :   if (message->read != update->read)
+     469                 :             :     {
+     470                 :           0 :       message->read = update->read;
+     471                 :           0 :       g_object_notify_by_pspec (G_OBJECT (message), properties [PROP_READ]);
+     472                 :             :     }
+     473                 :             : 
+     474         [ -  + ]:           5 :   if (g_set_str (&message->sender, update->sender))
+     475                 :           0 :     g_object_notify_by_pspec (G_OBJECT (message), properties [PROP_SENDER]);
+     476                 :             : 
+     477         [ +  - ]:           5 :   if (g_set_str (&message->text, update->text))
+     478                 :           5 :     g_object_notify_by_pspec (G_OBJECT (message), properties [PROP_TEXT]);
+     479                 :             : 
+     480                 :           5 :   g_object_thaw_notify (G_OBJECT (message));
+     481                 :           5 :   g_object_unref (update);
+     482                 :             : }
+     483                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message.h.func-c.html b/coverage/src/plugins/sms/valent-message.h.func-c.html new file mode 100644 index 00000000000..76f22cc87ce --- /dev/null +++ b/coverage/src/plugins/sms/valent-message.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %129
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MESSAGE289
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message.h.func.html b/coverage/src/plugins/sms/valent-message.h.func.html new file mode 100644 index 00000000000..4caad3d383e --- /dev/null +++ b/coverage/src/plugins/sms/valent-message.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %129
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_MESSAGE289
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-message.h.gcov.html b/coverage/src/plugins/sms/valent-message.h.gcov.html new file mode 100644 index 00000000000..ed25fc23831 --- /dev/null +++ b/coverage/src/plugins/sms/valent-message.h.gcov.html @@ -0,0 +1,168 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-message.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-message.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:75.0 %129
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : /**
+      11                 :             :  * ValentMessageBox:
+      12                 :             :  * @VALENT_MESSAGE_BOX_ALL: All messages
+      13                 :             :  * @VALENT_MESSAGE_BOX_INBOX: Received incoming messages
+      14                 :             :  * @VALENT_MESSAGE_BOX_SENT: Sent outgoing messages
+      15                 :             :  * @VALENT_MESSAGE_BOX_DRAFTS: Unfinished outgoing messages
+      16                 :             :  * @VALENT_MESSAGE_BOX_OUTBOX: Pending outgoing messages
+      17                 :             :  * @VALENT_MESSAGE_BOX_FAILED: Failed outgoing messages
+      18                 :             :  *
+      19                 :             :  * Enumeration of message types. These are the same as those used in Android,
+      20                 :             :  * however only @VALENT_MESSAGE_BOX_SENT and @VALENT_MESSAGE_BOX_INBOX are used
+      21                 :             :  * currently.
+      22                 :             :  *
+      23                 :             :  * See also:
+      24                 :             :  * - https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html
+      25                 :             :  * - https://developer.android.com/reference/android/provider/Telephony.BaseMmsColumns.html
+      26                 :             :  */
+      27                 :             : typedef enum
+      28                 :             : {
+      29                 :             :   VALENT_MESSAGE_BOX_ALL,
+      30                 :             :   VALENT_MESSAGE_BOX_INBOX,
+      31                 :             :   VALENT_MESSAGE_BOX_SENT,
+      32                 :             :   VALENT_MESSAGE_BOX_DRAFTS,
+      33                 :             :   VALENT_MESSAGE_BOX_OUTBOX,
+      34                 :             :   VALENT_MESSAGE_BOX_FAILED
+      35                 :             : } ValentMessageBox;
+      36                 :             : 
+      37                 :             : /**
+      38                 :             :  * ValentMessageFlags:
+      39                 :             :  * @VALENT_MESSAGE_FLAGS_NONE: The message has no content
+      40                 :             :  * @VALENT_MESSAGE_FLAGS_TEXT: The message has text content
+      41                 :             :  * @VALENT_MESSAGE_FLAGS_MULTI: The message has multiple recipients
+      42                 :             :  *
+      43                 :             :  * Flags for message events.
+      44                 :             :  *
+      45                 :             :  * See also:
+      46                 :             :  * - https://invent.kde.org/network/kdeconnect-android/-/blob/master/src/org/kde/kdeconnect/Helpers/SMSHelper.java
+      47                 :             :  * - https://invent.kde.org/network/kdeconnect-android/-/blob/master/src/org/kde/kdeconnect/Plugins/SMSPlugin/SMSPlugin.java
+      48                 :             :  */
+      49                 :             : typedef enum
+      50                 :             : {
+      51                 :             :   VALENT_MESSAGE_FLAGS_UNKNOWN,
+      52                 :             :   VALENT_MESSAGE_FLAGS_TEXT = 1 << 0,
+      53                 :             :   VALENT_MESSAGE_FLAGS_MULTI = 1 << 1,
+      54                 :             : } ValentMessageFlags;
+      55                 :             : 
+      56                 :             : 
+      57                 :             : #define VALENT_TYPE_MESSAGE (valent_message_get_type())
+      58                 :             : 
+      59   [ +  -  +  -  :         326 : G_DECLARE_FINAL_TYPE (ValentMessage, valent_message, VALENT, MESSAGE, GObject)
+          +  +  +  +  +  
+                +  -  + ]
+      60                 :             : 
+      61                 :             : ValentMessageBox   valent_message_get_box       (ValentMessage *message);
+      62                 :             : int64_t            valent_message_get_date      (ValentMessage *message);
+      63                 :             : int64_t            valent_message_get_id        (ValentMessage *message);
+      64                 :             : GVariant         * valent_message_get_metadata  (ValentMessage *message);
+      65                 :             : gboolean           valent_message_get_read      (ValentMessage *message);
+      66                 :             : void               valent_message_set_read      (ValentMessage *message,
+      67                 :             :                                                  gboolean       read);
+      68                 :             : const char       * valent_message_get_sender    (ValentMessage *message);
+      69                 :             : const char       * valent_message_get_text      (ValentMessage *message);
+      70                 :             : int64_t            valent_message_get_thread_id (ValentMessage *message);
+      71                 :             : void               valent_message_update        (ValentMessage *message,
+      72                 :             :                                                  ValentMessage *update);
+      73                 :             : 
+      74                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation-row.c.func-c.html b/coverage/src/plugins/sms/valent-sms-conversation-row.c.func-c.html new file mode 100644 index 00000000000..e85b20f8bee --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation-row.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.6 %136130
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %7545
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_sms_conversation_row_get_contact1
valent_sms_conversation_row_get_id1
valent_sms_conversation_row_new1
valent_sms_conversation_row_get_message2
valent_sms_conversation_row_show_avatar2
valent_sms_conversation_row_class_init3
valent_sms_conversation_row_get_property3
valent_sms_conversation_row_finalize4
valent_sms_conversation_row_init5
valent_sms_conversation_row_set_message5
valent_sms_conversation_row_set_contact6
valent_sms_conversation_row_get_date10
valent_sms_conversation_row_set_property10
valent_sms_conversation_row_update15
valent_sms_conversation_row_is_incoming17
valent_sms_conversation_row_get_type70
valent_sms_conversation_row_class_intern_init3
valent_sms_conversation_row_get_type_once3
valent_sms_conversation_row_get_type64
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation-row.c.func.html b/coverage/src/plugins/sms/valent-sms-conversation-row.c.func.html new file mode 100644 index 00000000000..377679eb6de --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation-row.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation-row.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.6 %136130
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %7545
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_sms_conversation_row_class_init3
valent_sms_conversation_row_finalize4
valent_sms_conversation_row_get_contact1
valent_sms_conversation_row_get_date10
valent_sms_conversation_row_get_id1
valent_sms_conversation_row_get_message2
valent_sms_conversation_row_get_property3
valent_sms_conversation_row_get_type70
valent_sms_conversation_row_class_intern_init3
valent_sms_conversation_row_get_type64
valent_sms_conversation_row_get_type_once3
valent_sms_conversation_row_init5
valent_sms_conversation_row_is_incoming17
valent_sms_conversation_row_new1
valent_sms_conversation_row_set_contact6
valent_sms_conversation_row_set_message5
valent_sms_conversation_row_set_property10
valent_sms_conversation_row_show_avatar2
valent_sms_conversation_row_update15
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation-row.c.gcov.html b/coverage/src/plugins/sms/valent-sms-conversation-row.c.gcov.html new file mode 100644 index 00000000000..c94dcb053fc --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation-row.c.gcov.html @@ -0,0 +1,590 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation-row.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation-row.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.6 %136130
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:60.0 %7545
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sms-conversation-row"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <pango/pango.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-message.h"
+      14                 :             : #include "valent-sms-conversation-row.h"
+      15                 :             : #include "valent-sms-utils.h"
+      16                 :             : 
+      17                 :             : 
+      18                 :             : struct _ValentSmsConversationRow
+      19                 :             : {
+      20                 :             :   GtkListBoxRow  parent_instance;
+      21                 :             : 
+      22                 :             :   ValentMessage *message;
+      23                 :             :   EContact      *contact;
+      24                 :             :   unsigned int   incoming : 1;
+      25                 :             : 
+      26                 :             :   GtkWidget     *grid;
+      27                 :             :   GtkWidget     *avatar;
+      28                 :             :   GtkWidget     *bubble;
+      29                 :             :   GtkWidget     *text_label;
+      30                 :             : };
+      31                 :             : 
+      32   [ +  +  +  - ]:          70 : G_DEFINE_FINAL_TYPE (ValentSmsConversationRow, valent_sms_conversation_row, GTK_TYPE_LIST_BOX_ROW)
+      33                 :             : 
+      34                 :             : 
+      35                 :             : enum {
+      36                 :             :   PROP_0,
+      37                 :             :   PROP_CONTACT,
+      38                 :             :   PROP_DATE,
+      39                 :             :   PROP_MESSAGE,
+      40                 :             :   N_PROPERTIES
+      41                 :             : };
+      42                 :             : 
+      43                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      44                 :             : 
+      45                 :             : 
+      46                 :             : /* LCOV_EXCL_START */
+      47                 :             : static gboolean
+      48                 :             : valent_sms_conversation_row_activate_link (GtkLabel   *label,
+      49                 :             :                                            const char *uri,
+      50                 :             :                                            gpointer    user_data)
+      51                 :             : {
+      52                 :             :   GtkWidget *widget = GTK_WIDGET (label);
+      53                 :             :   GtkWindow *toplevel = GTK_WINDOW (gtk_widget_get_root (widget));
+      54                 :             :   g_autoptr (GtkUriLauncher) launcher = NULL;
+      55                 :             :   g_autofree char *url = NULL;
+      56                 :             : 
+      57                 :             :   /* Only handle links that need to be amended with a scheme */
+      58                 :             :   if (g_uri_peek_scheme (uri) != NULL)
+      59                 :             :     return FALSE;
+      60                 :             : 
+      61                 :             :   if (!GTK_IS_WINDOW (toplevel))
+      62                 :             :     return FALSE;
+      63                 :             : 
+      64                 :             :   url = g_strdup_printf ("https://%s", uri);
+      65                 :             :   launcher = gtk_uri_launcher_new (url);
+      66                 :             :   gtk_uri_launcher_launch (launcher, toplevel, NULL, NULL, NULL);
+      67                 :             : 
+      68                 :             :   return TRUE;
+      69                 :             : }
+      70                 :             : /* LCOV_EXCL_STOP */
+      71                 :             : 
+      72                 :             : /*
+      73                 :             :  * GObject
+      74                 :             :  */
+      75                 :             : static void
+      76                 :           4 : valent_sms_conversation_row_finalize (GObject *object)
+      77                 :             : {
+      78                 :           4 :   ValentSmsConversationRow *self = VALENT_SMS_CONVERSATION_ROW (object);
+      79                 :             : 
+      80         [ +  + ]:           4 :   g_clear_object (&self->contact);
+      81                 :             : 
+      82         [ +  - ]:           4 :   if (self->message)
+      83                 :             :     {
+      84                 :           4 :       g_signal_handlers_disconnect_by_data (self->message, self);
+      85         [ +  - ]:           4 :       g_clear_object (&self->message);
+      86                 :             :     }
+      87                 :             : 
+      88                 :           4 :   G_OBJECT_CLASS (valent_sms_conversation_row_parent_class)->finalize (object);
+      89                 :           4 : }
+      90                 :             : 
+      91                 :             : static void
+      92                 :           3 : valent_sms_conversation_row_get_property (GObject    *object,
+      93                 :             :                                           guint       prop_id,
+      94                 :             :                                           GValue     *value,
+      95                 :             :                                           GParamSpec *pspec)
+      96                 :             : {
+      97                 :           3 :   ValentSmsConversationRow *self = VALENT_SMS_CONVERSATION_ROW (object);
+      98                 :             : 
+      99   [ +  +  +  - ]:           3 :   switch (prop_id)
+     100                 :             :     {
+     101                 :           1 :     case PROP_CONTACT:
+     102                 :           1 :       g_value_set_object (value, self->contact);
+     103                 :           1 :       break;
+     104                 :             : 
+     105                 :           1 :     case PROP_DATE:
+     106                 :           1 :       g_value_set_int64 (value, valent_sms_conversation_row_get_date (self));
+     107                 :           1 :       break;
+     108                 :             : 
+     109                 :           1 :     case PROP_MESSAGE:
+     110                 :           1 :       g_value_set_object (value, self->message);
+     111                 :           1 :       break;
+     112                 :             : 
+     113                 :           0 :     default:
+     114                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     115                 :             :     }
+     116                 :           3 : }
+     117                 :             : 
+     118                 :             : static void
+     119                 :          10 : valent_sms_conversation_row_set_property (GObject      *object,
+     120                 :             :                                           guint         prop_id,
+     121                 :             :                                           const GValue *value,
+     122                 :             :                                           GParamSpec   *pspec)
+     123                 :             : {
+     124                 :          10 :   ValentSmsConversationRow *self = VALENT_SMS_CONVERSATION_ROW (object);
+     125                 :             : 
+     126      [ +  +  - ]:          10 :   switch (prop_id)
+     127                 :             :     {
+     128                 :           5 :     case PROP_CONTACT:
+     129                 :           5 :       valent_sms_conversation_row_set_contact (self, g_value_get_object (value));
+     130                 :           5 :       break;
+     131                 :             : 
+     132                 :           5 :     case PROP_MESSAGE:
+     133                 :           5 :       valent_sms_conversation_row_set_message (self, g_value_get_object (value));
+     134                 :           5 :       break;
+     135                 :             : 
+     136                 :           0 :     default:
+     137                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     138                 :             :     }
+     139                 :          10 : }
+     140                 :             : 
+     141                 :             : static void
+     142                 :           3 : valent_sms_conversation_row_class_init (ValentSmsConversationRowClass *klass)
+     143                 :             : {
+     144                 :           3 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     145                 :             : 
+     146                 :           3 :   object_class->finalize = valent_sms_conversation_row_finalize;
+     147                 :           3 :   object_class->get_property = valent_sms_conversation_row_get_property;
+     148                 :           3 :   object_class->set_property = valent_sms_conversation_row_set_property;
+     149                 :             : 
+     150                 :             :   /**
+     151                 :             :    * ValentSmsConversationRow:contact
+     152                 :             :    *
+     153                 :             :    * The `EContact` that sent this message.
+     154                 :             :    */
+     155                 :           6 :   properties [PROP_CONTACT] =
+     156                 :           3 :     g_param_spec_object ("contact", NULL, NULL,
+     157                 :             :                          E_TYPE_CONTACT,
+     158                 :             :                          (G_PARAM_READWRITE |
+     159                 :             :                           G_PARAM_CONSTRUCT |
+     160                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     161                 :             :                           G_PARAM_STATIC_STRINGS));
+     162                 :             : 
+     163                 :             :   /**
+     164                 :             :    * ValentSmsConversationRow:date
+     165                 :             :    *
+     166                 :             :    * The timestamp of the message.
+     167                 :             :    */
+     168                 :           6 :   properties [PROP_DATE] =
+     169                 :           3 :     g_param_spec_int64 ("date", NULL, NULL,
+     170                 :             :                         0, G_MAXINT64,
+     171                 :             :                         0,
+     172                 :             :                         (G_PARAM_READABLE |
+     173                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     174                 :             :                          G_PARAM_STATIC_STRINGS));
+     175                 :             : 
+     176                 :             :   /**
+     177                 :             :    * ValentSmsConversationRow:message
+     178                 :             :    *
+     179                 :             :    * The message this row displays.
+     180                 :             :    */
+     181                 :           6 :   properties [PROP_MESSAGE] =
+     182                 :           3 :     g_param_spec_object ("message", NULL, NULL,
+     183                 :             :                           VALENT_TYPE_MESSAGE,
+     184                 :             :                           (G_PARAM_READWRITE |
+     185                 :             :                            G_PARAM_CONSTRUCT |
+     186                 :             :                            G_PARAM_EXPLICIT_NOTIFY |
+     187                 :             :                            G_PARAM_STATIC_STRINGS));
+     188                 :             : 
+     189                 :           3 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     190                 :           3 : }
+     191                 :             : 
+     192                 :             : static void
+     193                 :           5 : valent_sms_conversation_row_init (ValentSmsConversationRow *self)
+     194                 :             : {
+     195                 :           5 :   gtk_widget_add_css_class (GTK_WIDGET (self), "valent-sms-conversation-row");
+     196                 :             : 
+     197                 :           5 :   self->grid = g_object_new (GTK_TYPE_GRID,
+     198                 :             :                              "can-focus",      FALSE,
+     199                 :             :                              "column-spacing", 6,
+     200                 :             :                              "hexpand",        TRUE,
+     201                 :             :                              "margin-start",   6,
+     202                 :             :                              "margin-end",     6,
+     203                 :             :                              "margin-top",     6,
+     204                 :             :                              "margin-bottom",  6,
+     205                 :             :                              NULL);
+     206                 :           5 :   gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (self), self->grid);
+     207                 :             : 
+     208                 :             :   /* Contact Avatar */
+     209                 :           5 :   self->avatar = g_object_new (ADW_TYPE_AVATAR,
+     210                 :             :                                "size",    32,
+     211                 :             :                                "halign",  GTK_ALIGN_START,
+     212                 :             :                                "valign",  GTK_ALIGN_END,
+     213                 :             :                                "vexpand", TRUE,
+     214                 :             :                                "visible", FALSE,
+     215                 :             :                                NULL);
+     216                 :           5 :   gtk_grid_attach (GTK_GRID (self->grid), self->avatar, 0, 0, 1, 1);
+     217                 :             : 
+     218                 :             :   /* Message Layout */
+     219                 :           5 :   self->bubble = g_object_new (GTK_TYPE_GRID, NULL);
+     220                 :           5 :   gtk_grid_attach (GTK_GRID (self->grid), self->bubble, 1, 0, 1, 1);
+     221                 :             : 
+     222                 :             :   /* Message Text */
+     223                 :           5 :   self->text_label = g_object_new (GTK_TYPE_LABEL,
+     224                 :             :                                    "halign",     GTK_ALIGN_START,
+     225                 :             :                                    "use-markup", TRUE,
+     226                 :             :                                    "selectable", TRUE,
+     227                 :             :                                    "wrap",       TRUE,
+     228                 :             :                                    "wrap-mode",  PANGO_WRAP_WORD_CHAR,
+     229                 :             :                                    "xalign",     0.0,
+     230                 :             :                                    NULL);
+     231                 :           5 :   gtk_widget_set_can_focus (self->text_label, FALSE);
+     232                 :           5 :   gtk_grid_attach (GTK_GRID (self->bubble), self->text_label, 0, 0, 1, 1);
+     233                 :             : 
+     234                 :             :   /* Catch activate-link to fixup URIs without a scheme */
+     235                 :           5 :   g_signal_connect (self->text_label,
+     236                 :             :                     "activate-link",
+     237                 :             :                     G_CALLBACK (valent_sms_conversation_row_activate_link),
+     238                 :             :                     NULL);
+     239                 :           5 : }
+     240                 :             : 
+     241                 :             : /**
+     242                 :             :  * valent_sms_conversation_row_new:
+     243                 :             :  * @message: a `ValentMessage`
+     244                 :             :  * @contact: a `EContact`
+     245                 :             :  *
+     246                 :             :  * Create a new conversation message for @contact and @message.
+     247                 :             :  *
+     248                 :             :  * Returns: (transfer full): a `ValentSmsConversationRow`
+     249                 :             :  */
+     250                 :             : GtkWidget *
+     251                 :           1 : valent_sms_conversation_row_new (ValentMessage *message,
+     252                 :             :                                  EContact      *contact)
+     253                 :             : {
+     254                 :           1 :   return g_object_new (VALENT_TYPE_SMS_CONVERSATION_ROW,
+     255                 :             :                        "contact", contact,
+     256                 :             :                        "message", message,
+     257                 :             :                        NULL);
+     258                 :             : }
+     259                 :             : 
+     260                 :             : /**
+     261                 :             :  * valent_sms_conversation_row_get_contact:
+     262                 :             :  * @row: a `ValentSmsConversationRow`
+     263                 :             :  *
+     264                 :             :  * Get the contact.
+     265                 :             :  *
+     266                 :             :  * Returns: (transfer none) (nullable): a `ValentContact`
+     267                 :             :  */
+     268                 :             : EContact *
+     269                 :           1 : valent_sms_conversation_row_get_contact (ValentSmsConversationRow *row)
+     270                 :             : {
+     271         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row), NULL);
+     272                 :             : 
+     273                 :           1 :   return row->contact;
+     274                 :             : }
+     275                 :             : 
+     276                 :             : /**
+     277                 :             :  * valent_sms_conversation_row_set_contact:
+     278                 :             :  * @row: a `ValentSmsConversationRow`
+     279                 :             :  * @contact: a `ValentContact`
+     280                 :             :  *
+     281                 :             :  * Set or update the contact.
+     282                 :             :  */
+     283                 :             : void
+     284                 :           6 : valent_sms_conversation_row_set_contact (ValentSmsConversationRow *row,
+     285                 :             :                                          EContact                 *contact)
+     286                 :             : {
+     287         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row));
+     288   [ +  +  +  -  :           6 :   g_return_if_fail (contact == NULL || E_IS_CONTACT (contact));
+             -  +  -  - ]
+     289                 :             : 
+     290         [ +  + ]:           6 :   if (!g_set_object (&row->contact, contact))
+     291                 :             :     return;
+     292                 :             : 
+     293         [ +  - ]:           2 :   if (row->contact != NULL)
+     294                 :           2 :     valent_sms_avatar_from_contact (ADW_AVATAR (row->avatar), contact);
+     295                 :             : 
+     296                 :           2 :   valent_sms_conversation_row_update (row);
+     297                 :           2 :   g_object_notify_by_pspec (G_OBJECT (row), properties [PROP_CONTACT]);
+     298                 :             : }
+     299                 :             : 
+     300                 :             : /**
+     301                 :             :  * valent_sms_conversation_row_get_date:
+     302                 :             :  * @row: a `ValentSmsConversationRow`
+     303                 :             :  *
+     304                 :             :  * Get the timestamp of the message.
+     305                 :             :  *
+     306                 :             :  * Returns: a UNIX epoch timestamp
+     307                 :             :  */
+     308                 :             : int64_t
+     309                 :          10 : valent_sms_conversation_row_get_date (ValentSmsConversationRow *row)
+     310                 :             : {
+     311         [ +  - ]:          10 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row), 0);
+     312                 :             : 
+     313         [ -  + ]:          10 :   if G_UNLIKELY (row->message == NULL)
+     314                 :             :     return 0;
+     315                 :             : 
+     316                 :          10 :   return valent_message_get_date (row->message);
+     317                 :             : }
+     318                 :             : 
+     319                 :             : /**
+     320                 :             :  * valent_sms_conversation_row_get_id:
+     321                 :             :  * @row: a `ValentSmsConversationRow`
+     322                 :             :  *
+     323                 :             :  * Get the ID of the message.
+     324                 :             :  *
+     325                 :             :  * Returns: a message id
+     326                 :             :  */
+     327                 :             : int64_t
+     328                 :           1 : valent_sms_conversation_row_get_id (ValentSmsConversationRow *row)
+     329                 :             : {
+     330         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row), 0);
+     331                 :             : 
+     332         [ -  + ]:           1 :   if G_UNLIKELY (row->message == NULL)
+     333                 :             :     return 0;
+     334                 :             : 
+     335                 :           1 :   return valent_message_get_id (row->message);
+     336                 :             : }
+     337                 :             : 
+     338                 :             : /**
+     339                 :             :  * valent_sms_conversation_row_get_message:
+     340                 :             :  * @row: a `ValentSmsConversationRow`
+     341                 :             :  *
+     342                 :             :  * Get the message.
+     343                 :             :  *
+     344                 :             :  * Returns: (transfer none): a `ValentMessage`
+     345                 :             :  */
+     346                 :             : ValentMessage *
+     347                 :           2 : valent_sms_conversation_row_get_message (ValentSmsConversationRow *row)
+     348                 :             : {
+     349         [ +  - ]:           2 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row), NULL);
+     350                 :             : 
+     351                 :           2 :   return row->message;
+     352                 :             : }
+     353                 :             : 
+     354                 :             : /**
+     355                 :             :  * valent_sms_conversation_row_set_message:
+     356                 :             :  * @row: a `ValentSmsConversationRow`
+     357                 :             :  * @message: a `ValentMessage`
+     358                 :             :  *
+     359                 :             :  * Set or update the message.
+     360                 :             :  */
+     361                 :             : void
+     362                 :           5 : valent_sms_conversation_row_set_message (ValentSmsConversationRow *row,
+     363                 :             :                                          ValentMessage            *message)
+     364                 :             : {
+     365         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row));
+     366   [ +  -  -  + ]:           5 :   g_return_if_fail (message == NULL || VALENT_IS_MESSAGE (message));
+     367                 :             : 
+     368         [ +  - ]:           5 :   if (row->message == message)
+     369                 :             :     return;
+     370                 :             : 
+     371         [ -  + ]:           5 :   if (row->message != NULL)
+     372                 :             :     {
+     373                 :           0 :       g_signal_handlers_disconnect_by_data (row->message, row);
+     374         [ #  # ]:           0 :       g_clear_object (&row->message);
+     375                 :             :     }
+     376                 :             : 
+     377         [ +  - ]:           5 :   if (message != NULL)
+     378                 :             :     {
+     379                 :           5 :       row->message = g_object_ref (message);
+     380                 :           5 :       g_signal_connect_swapped (row->message,
+     381                 :             :                                 "notify",
+     382                 :             :                                 G_CALLBACK (valent_sms_conversation_row_update),
+     383                 :             :                                 row);
+     384                 :             : 
+     385                 :           5 :       valent_sms_conversation_row_update (row);
+     386                 :           5 :       g_object_notify_by_pspec (G_OBJECT (row), properties [PROP_MESSAGE]);
+     387                 :             :     }
+     388                 :             : }
+     389                 :             : 
+     390                 :             : /**
+     391                 :             :  * valent_sms_conversation_row_is_incoming:
+     392                 :             :  * @row: a `ValentSmsConversationRow`
+     393                 :             :  *
+     394                 :             :  * Update @row based on the current values of `ValentSmsConversation`:message.
+     395                 :             :  */
+     396                 :             : gboolean
+     397                 :          17 : valent_sms_conversation_row_is_incoming (ValentSmsConversationRow *row)
+     398                 :             : {
+     399         [ +  - ]:          17 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row), FALSE);
+     400                 :             : 
+     401         [ -  + ]:          17 :   if (row->message == NULL)
+     402                 :             :       return FALSE;
+     403                 :             : 
+     404                 :          17 :   return row->incoming;
+     405                 :             : }
+     406                 :             : 
+     407                 :             : /**
+     408                 :             :  * valent_sms_conversation_row_show_avatar:
+     409                 :             :  * @row: a `ValentSmsConversationRow`
+     410                 :             :  * @visible: Whether to show the avatar
+     411                 :             :  *
+     412                 :             :  * Show or hide the contact avatar for @row, updating the margins accordingly.
+     413                 :             :  */
+     414                 :             : void
+     415                 :           2 : valent_sms_conversation_row_show_avatar (ValentSmsConversationRow *row,
+     416                 :             :                                          gboolean                  visible)
+     417                 :             : {
+     418         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row));
+     419                 :             : 
+     420         [ +  - ]:           2 :   if G_LIKELY (gtk_widget_get_visible (row->avatar) == visible)
+     421                 :             :     return;
+     422                 :             : 
+     423         [ +  + ]:           2 :   if (visible)
+     424                 :             :     {
+     425                 :           1 :       gtk_widget_set_margin_start (row->bubble, 6);
+     426                 :           1 :       gtk_widget_set_margin_bottom (row->bubble, 6);
+     427                 :             :     }
+     428                 :             :   else
+     429                 :             :     {
+     430                 :           1 :       gtk_widget_set_margin_start (row->bubble, 44);
+     431                 :           1 :       gtk_widget_set_margin_bottom (row->bubble, 0);
+     432                 :             :     }
+     433                 :             : 
+     434                 :           2 :   gtk_widget_set_visible (row->avatar, visible);
+     435                 :             : }
+     436                 :             : 
+     437                 :             : /**
+     438                 :             :  * valent_sms_conversation_row_update:
+     439                 :             :  * @row: a `ValentSmsConversationRow`
+     440                 :             :  *
+     441                 :             :  * Update @row based on the current values of `ValentSmsConversation`:message.
+     442                 :             :  */
+     443                 :             : void
+     444                 :          15 : valent_sms_conversation_row_update (ValentSmsConversationRow *row)
+     445                 :             : {
+     446         [ +  - ]:          15 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION_ROW (row));
+     447                 :             : 
+     448                 :             :   // text
+     449         [ +  + ]:          15 :   if (row->message == NULL)
+     450                 :           1 :     row->incoming = FALSE;
+     451                 :             :   else
+     452                 :          14 :     row->incoming = valent_message_get_box (row->message) == VALENT_MESSAGE_BOX_INBOX;
+     453                 :             : 
+     454                 :          15 :   gtk_widget_set_visible (row->avatar, row->incoming);
+     455                 :             : 
+     456                 :             :   /* Message Body */
+     457         [ +  + ]:          15 :   if (row->message != NULL)
+     458                 :             :     {
+     459                 :          14 :       const char *text;
+     460                 :          14 :       g_autofree char *label = NULL;
+     461                 :             : 
+     462                 :          14 :       text = valent_message_get_text (row->message);
+     463                 :          14 :       label = valent_string_to_markup (text);
+     464                 :          14 :       gtk_label_set_label (GTK_LABEL (row->text_label), label);
+     465                 :             :     }
+     466                 :             : 
+     467                 :             :   /* The row style consists of the alignment and the CSS
+     468                 :             :    *
+     469                 :             :    * The row margin opposite the avatar is chosen to balance the row. Outgoing
+     470                 :             :    * messages don't show avatars, so get double the margin (88px):
+     471                 :             :    *
+     472                 :             :    *     44px (margin) = 6px (margin) + 32px (avatar) + 6px (spacing)
+     473                 :             :    *
+     474                 :             :    * The CSS classes determine the chat bubble style and color.
+     475                 :             :    */
+     476         [ +  + ]:          15 :   if (row->incoming)
+     477                 :             :     {
+     478                 :           5 :       gtk_widget_set_halign (row->grid, GTK_ALIGN_START);
+     479                 :           5 :       gtk_widget_set_margin_end (row->grid, 44);
+     480                 :           5 :       gtk_widget_set_margin_start (row->grid, 6);
+     481                 :             : 
+     482                 :           5 :       gtk_widget_remove_css_class (row->bubble, "valent-sms-outgoing");
+     483                 :           5 :       gtk_widget_add_css_class (row->bubble, "valent-sms-incoming");
+     484                 :           5 :       gtk_widget_set_halign (GTK_WIDGET (row), GTK_ALIGN_START);
+     485                 :             :     }
+     486                 :             :   else
+     487                 :             :     {
+     488                 :          10 :       gtk_widget_set_halign (row->grid, GTK_ALIGN_END);
+     489                 :          10 :       gtk_widget_set_margin_end (row->grid, 6);
+     490                 :          10 :       gtk_widget_set_margin_start (row->grid, 88);
+     491                 :             : 
+     492                 :          10 :       gtk_widget_remove_css_class (row->bubble, "valent-sms-incoming");
+     493                 :          10 :       gtk_widget_add_css_class (row->bubble, "valent-sms-outgoing");
+     494                 :          10 :       gtk_widget_set_halign (GTK_WIDGET (row), GTK_ALIGN_END);
+     495                 :             :     }
+     496                 :             : }
+     497                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation-row.h.func-c.html b/coverage/src/plugins/sms/valent-sms-conversation-row.h.func-c.html new file mode 100644 index 00000000000..a625331a344 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation-row.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_CONVERSATION_ROW59
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation-row.h.func.html b/coverage/src/plugins/sms/valent-sms-conversation-row.h.func.html new file mode 100644 index 00000000000..20959b302b5 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation-row.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation-row.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_CONVERSATION_ROW59
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation-row.h.gcov.html b/coverage/src/plugins/sms/valent-sms-conversation-row.h.gcov.html new file mode 100644 index 00000000000..bf23c2f4016 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation-row.h.gcov.html @@ -0,0 +1,129 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation-row.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation-row.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-message.h"
+      10                 :             : 
+      11                 :             : G_BEGIN_DECLS
+      12                 :             : 
+      13                 :             : #define VALENT_TYPE_SMS_CONVERSATION_ROW (valent_sms_conversation_row_get_type())
+      14                 :             : 
+      15   [ +  -  +  -  :          60 : G_DECLARE_FINAL_TYPE (ValentSmsConversationRow, valent_sms_conversation_row, VALENT, SMS_CONVERSATION_ROW, GtkListBoxRow)
+                   -  + ]
+      16                 :             : 
+      17                 :             : GtkWidget     * valent_sms_conversation_row_new           (ValentMessage            *message,
+      18                 :             :                                                            EContact                 *contact);
+      19                 :             : int             valent_sms_conversation_row_collate       (ValentSmsConversationRow *row1,
+      20                 :             :                                                            ValentSmsConversationRow *row2);
+      21                 :             : 
+      22                 :             : EContact      * valent_sms_conversation_row_get_contact   (ValentSmsConversationRow *row);
+      23                 :             : void            valent_sms_conversation_row_set_contact   (ValentSmsConversationRow *row,
+      24                 :             :                                                            EContact                 *contact);
+      25                 :             : int64_t         valent_sms_conversation_row_get_date      (ValentSmsConversationRow *row);
+      26                 :             : int64_t         valent_sms_conversation_row_get_id        (ValentSmsConversationRow *row);
+      27                 :             : ValentMessage * valent_sms_conversation_row_get_message   (ValentSmsConversationRow *row);
+      28                 :             : void            valent_sms_conversation_row_set_message   (ValentSmsConversationRow *row,
+      29                 :             :                                                            ValentMessage            *message);
+      30                 :             : gboolean        valent_sms_conversation_row_is_incoming   (ValentSmsConversationRow *row);
+      31                 :             : void            valent_sms_conversation_row_update        (ValentSmsConversationRow *row);
+      32                 :             : void            valent_sms_conversation_row_show_avatar   (ValentSmsConversationRow *row,
+      33                 :             :                                                            gboolean                  visible);
+      34                 :             : 
+      35                 :             : G_END_DECLS
+      36                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation.c.func-c.html b/coverage/src/plugins/sms/valent-sms-conversation.c.func-c.html new file mode 100644 index 00000000000..d3e22df975f --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation.c.func-c.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:64.7 %357231
Test Date:2024-03-31 18:46:36Functions:71.4 %3525
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.2 %20478
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_edge_overshot0
on_entry_activated0
on_entry_changed0
on_entry_icon_release0
valent_sms_conversation_get_subtitle0
valent_sms_conversation_new0
valent_sms_conversation_scroll_to_date0
valent_sms_conversation_scroll_to_message0
valent_sms_conversation_scroll_to_row0
valent_sms_conversation_send_message0
on_scroll_notify_upper1
phone_lookup_cb1
valent_sms_conversation_get_thread_id1
valent_sms_conversation_get_title1
valent_sms_conversation_queue_update1
valent_sms_conversation_update1
on_thread_items_changed2
valent_sms_conversation_class_init2
valent_sms_conversation_dispose2
valent_sms_conversation_finalize2
valent_sms_conversation_init2
valent_sms_conversation_map2
valent_sms_conversation_populate2
valent_sms_conversation_populate_reverse2
valent_sms_conversation_queue_populate2
valent_sms_conversation_set_thread_id2
valent_sms_conversation_get_property3
valent_sms_conversation_insert_message4
valent_sms_conversation_load4
valent_sms_conversation_pop_tail6
valent_sms_conversation_set_property6
message_list_header_func12
valent_sms_conversation_get_type19
valent_sms_conversation_class_intern_init2
valent_sms_conversation_get_type_once2
valent_sms_conversation_get_type15
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation.c.func.html b/coverage/src/plugins/sms/valent-sms-conversation.c.func.html new file mode 100644 index 00000000000..13038e6db4e --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation.c.func.html @@ -0,0 +1,343 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:64.7 %357231
Test Date:2024-03-31 18:46:36Functions:71.4 %3525
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.2 %20478
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
message_list_header_func12
on_edge_overshot0
on_entry_activated0
on_entry_changed0
on_entry_icon_release0
on_scroll_notify_upper1
on_thread_items_changed2
phone_lookup_cb1
valent_sms_conversation_class_init2
valent_sms_conversation_dispose2
valent_sms_conversation_finalize2
valent_sms_conversation_get_property3
valent_sms_conversation_get_subtitle0
valent_sms_conversation_get_thread_id1
valent_sms_conversation_get_title1
valent_sms_conversation_get_type19
valent_sms_conversation_class_intern_init2
valent_sms_conversation_get_type15
valent_sms_conversation_get_type_once2
valent_sms_conversation_init2
valent_sms_conversation_insert_message4
valent_sms_conversation_load4
valent_sms_conversation_map2
valent_sms_conversation_new0
valent_sms_conversation_pop_tail6
valent_sms_conversation_populate2
valent_sms_conversation_populate_reverse2
valent_sms_conversation_queue_populate2
valent_sms_conversation_queue_update1
valent_sms_conversation_scroll_to_date0
valent_sms_conversation_scroll_to_message0
valent_sms_conversation_scroll_to_row0
valent_sms_conversation_send_message0
valent_sms_conversation_set_property6
valent_sms_conversation_set_thread_id2
valent_sms_conversation_update1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation.c.gcov.html b/coverage/src/plugins/sms/valent-sms-conversation.c.gcov.html new file mode 100644 index 00000000000..5f4a2042535 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation.c.gcov.html @@ -0,0 +1,1119 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:64.7 %357231
Test Date:2024-03-31 18:46:36Functions:71.4 %3525
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:38.2 %20478
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sms-conversation"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-date-label.h"
+      13                 :             : #include "valent-message.h"
+      14                 :             : #include "valent-message-thread.h"
+      15                 :             : #include "valent-sms-conversation.h"
+      16                 :             : #include "valent-sms-conversation-row.h"
+      17                 :             : #include "valent-sms-store.h"
+      18                 :             : #include "valent-sms-utils.h"
+      19                 :             : 
+      20                 :             : 
+      21                 :             : struct _ValentSmsConversation
+      22                 :             : {
+      23                 :             :   GtkWidget           parent_instance;
+      24                 :             : 
+      25                 :             :   /* template */
+      26                 :             :   GtkWidget          *message_view;
+      27                 :             :   GtkListBox         *message_list;
+      28                 :             :   GtkWidget          *message_entry;
+      29                 :             :   GtkListBoxRow      *pending;
+      30                 :             : 
+      31                 :             :   /* Population */
+      32                 :             :   guint               populate_id;
+      33                 :             :   guint               update_id;
+      34                 :             :   double              offset;
+      35                 :             :   GtkAdjustment      *vadjustment;
+      36                 :             : 
+      37                 :             :   /* Thread Resources */
+      38                 :             :   int64_t             loaded_id;
+      39                 :             :   int64_t             thread_id;
+      40                 :             :   ValentSmsStore     *message_store;
+      41                 :             :   GListModel         *thread;
+      42                 :             :   unsigned int        position_upper;
+      43                 :             :   unsigned int        position_lower;
+      44                 :             :   ValentContactStore *contact_store;
+      45                 :             :   GHashTable         *participants;
+      46                 :             : 
+      47                 :             :   char               *title;
+      48                 :             :   char               *subtitle;
+      49                 :             : };
+      50                 :             : 
+      51                 :             : static void   valent_sms_conversation_send_message (ValentSmsConversation *self);
+      52                 :             : 
+      53   [ +  +  +  - ]:          19 : G_DEFINE_FINAL_TYPE (ValentSmsConversation, valent_sms_conversation, GTK_TYPE_WIDGET)
+      54                 :             : 
+      55                 :             : enum {
+      56                 :             :   PROP_0,
+      57                 :             :   PROP_CONTACT_STORE,
+      58                 :             :   PROP_MESSAGE_STORE,
+      59                 :             :   PROP_THREAD_ID,
+      60                 :             :   N_PROPERTIES
+      61                 :             : };
+      62                 :             : 
+      63                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      64                 :             : 
+      65                 :             : enum {
+      66                 :             :   SEND_MESSAGE,
+      67                 :             :   N_SIGNALS
+      68                 :             : };
+      69                 :             : 
+      70                 :             : static guint signals[N_SIGNALS] = { 0, };
+      71                 :             : 
+      72                 :             : 
+      73                 :             : /* Callbacks */
+      74                 :             : static void
+      75                 :           1 : phone_lookup_cb (ValentContactStore *store,
+      76                 :             :                  GAsyncResult       *result,
+      77                 :             :                  GtkWidget          *widget)
+      78                 :             : {
+      79                 :           1 :   g_autoptr (ValentSmsConversationRow) row = VALENT_SMS_CONVERSATION_ROW (widget);
+      80   [ -  -  +  - ]:           1 :   g_autoptr (EContact) contact = NULL;
+      81         [ -  - ]:           1 :   g_autoptr (GError) error = NULL;
+      82                 :           1 :   GtkWidget *conversation;
+      83                 :             : 
+      84                 :           1 :   contact = valent_sms_contact_from_phone_finish (store, result, &error);
+      85                 :             : 
+      86         [ -  + ]:           1 :   if (contact == NULL)
+      87                 :             :     {
+      88                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+      89         [ #  # ]:           0 :       return;
+      90                 :             :     }
+      91                 :             : 
+      92                 :           1 :   conversation = gtk_widget_get_ancestor (widget, VALENT_TYPE_SMS_CONVERSATION);
+      93                 :             : 
+      94         [ +  - ]:           1 :   if (conversation != NULL)
+      95                 :             :     {
+      96                 :           1 :       ValentSmsConversation *self = VALENT_SMS_CONVERSATION (conversation);
+      97                 :           1 :       ValentMessage *message;
+      98                 :           1 :       const char *sender;
+      99                 :             : 
+     100                 :           1 :       message = valent_sms_conversation_row_get_message (row);
+     101                 :           1 :       sender = valent_message_get_sender (message);
+     102                 :             : 
+     103         [ -  + ]:           1 :       g_hash_table_insert (self->participants,
+     104                 :           1 :                            g_strdup (sender),
+     105                 :             :                            g_object_ref (contact));
+     106                 :             : 
+     107                 :           1 :       valent_sms_conversation_row_set_contact (row, contact);
+     108                 :             :     }
+     109                 :             : }
+     110                 :             : 
+     111                 :             : static void
+     112                 :           0 : valent_sms_conversation_scroll_to_row (ValentSmsConversation *self,
+     113                 :             :                                        GtkWidget             *widget)
+     114                 :             : {
+     115                 :           0 :   GtkScrolledWindow *scrolled = GTK_SCROLLED_WINDOW (self->message_view);
+     116                 :           0 :   GtkWidget *viewport;
+     117                 :           0 :   double upper, page_size;
+     118                 :           0 :   double x, y;
+     119                 :             : 
+     120                 :             :   /* Get the scrolled window state */
+     121                 :           0 :   upper = gtk_adjustment_get_upper (self->vadjustment);
+     122                 :           0 :   page_size = gtk_adjustment_get_page_size (self->vadjustment);
+     123                 :             : 
+     124                 :             :   /* Get the widget's position in the window */
+     125                 :           0 :   viewport = gtk_scrolled_window_get_child (scrolled);
+     126                 :           0 :   gtk_widget_translate_coordinates (widget, viewport, 0, 0, &x, &y);
+     127                 :             : 
+     128                 :             :   /* Scroll to the position */
+     129         [ #  # ]:           0 :   gtk_adjustment_set_value (self->vadjustment, CLAMP (y, page_size, upper));
+     130                 :           0 : }
+     131                 :             : 
+     132                 :             : static void
+     133                 :          12 : message_list_header_func (GtkListBoxRow *row,
+     134                 :             :                           GtkListBoxRow *before,
+     135                 :             :                           gpointer       user_data)
+     136                 :             : {
+     137                 :          12 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (user_data);
+     138                 :          12 :   ValentSmsConversationRow *c_row = VALENT_SMS_CONVERSATION_ROW (row);
+     139                 :          12 :   ValentSmsConversationRow *b_row = VALENT_SMS_CONVERSATION_ROW (before);
+     140                 :          12 :   int64_t row_date, before_date;
+     141                 :          12 :   gboolean row_incoming, before_incoming;
+     142                 :             : 
+     143   [ +  -  +  -  :          12 :   g_assert (GTK_IS_LIST_BOX_ROW (row));
+             +  -  -  + ]
+     144   [ +  +  +  -  :          12 :   g_assert (before == NULL || GTK_IS_LIST_BOX_ROW (before));
+             +  -  -  + ]
+     145                 :             : 
+     146                 :             :   /* TODO Skip pending */
+     147         [ +  - ]:          12 :   if G_UNLIKELY (row == self->pending)
+     148                 :             :     return;
+     149                 :             : 
+     150                 :          12 :   row_incoming = valent_sms_conversation_row_is_incoming (c_row);
+     151                 :             : 
+     152                 :             :   /* If this is the first row and it's incoming, show the avatar */
+     153         [ +  + ]:          12 :   if (before == NULL)
+     154                 :             :     {
+     155         [ -  + ]:           8 :       if (row_incoming)
+     156                 :           0 :         valent_sms_conversation_row_show_avatar (c_row, TRUE);
+     157                 :           8 :       return;
+     158                 :             :     }
+     159                 :             : 
+     160                 :             :   /* Date header */
+     161                 :           4 :   before_incoming = valent_sms_conversation_row_is_incoming (b_row);
+     162                 :           4 :   before_date = valent_sms_conversation_row_get_date (b_row);
+     163                 :           4 :   row_date = valent_sms_conversation_row_get_date (c_row);
+     164                 :             : 
+     165                 :             :   /* If it's been more than an hour between messages, show a date label */
+     166         [ -  + ]:           4 :   if (row_date - before_date > G_TIME_SPAN_HOUR / 1000)
+     167                 :             :     {
+     168                 :             :       /* Show a human-readable time span label */
+     169         [ #  # ]:           0 :       if G_UNLIKELY (gtk_list_box_row_get_header (row) == NULL)
+     170                 :             :         {
+     171                 :           0 :           GtkWidget *header;
+     172                 :             : 
+     173                 :           0 :           header = valent_date_label_new (row_date);
+     174                 :           0 :           gtk_widget_add_css_class (header, "dim-label");
+     175                 :           0 :           gtk_list_box_row_set_header (row, header);
+     176                 :             : 
+     177                 :             :           /* If the row's message is incoming, show the avatar also */
+     178         [ #  # ]:           0 :           if (row_incoming)
+     179                 :           0 :             valent_sms_conversation_row_show_avatar (c_row, row_incoming);
+     180                 :             :         }
+     181                 :             :     }
+     182         [ -  + ]:           4 :   else if (row_incoming)
+     183                 :             :     {
+     184                 :           0 :       valent_sms_conversation_row_show_avatar (c_row, TRUE);
+     185                 :             : 
+     186                 :             :       /* If the previous row was incoming, hide its avatar */
+     187         [ #  # ]:           0 :       if (before_incoming)
+     188                 :           0 :         valent_sms_conversation_row_show_avatar (c_row, FALSE);
+     189                 :             :     }
+     190                 :             : }
+     191                 :             : 
+     192                 :             : /**
+     193                 :             :  * valent_sms_conversation_insert_message:
+     194                 :             :  * @conversation: a `ValentSmsConversation`
+     195                 :             :  * @message: a `ValentMessage`
+     196                 :             :  * @position: position to insert the widget
+     197                 :             :  *
+     198                 :             :  * Create a new message row for @message and insert it into the message list at
+     199                 :             :  * @position.
+     200                 :             :  *
+     201                 :             :  * Returns: (transfer none): a `GtkWidget`
+     202                 :             :  */
+     203                 :             : static GtkWidget *
+     204                 :           4 : valent_sms_conversation_insert_message (ValentSmsConversation *self,
+     205                 :             :                                         ValentMessage         *message,
+     206                 :             :                                         int                    position)
+     207                 :             : {
+     208                 :           4 :   ValentSmsConversationRow *row;
+     209                 :           4 :   const char *sender = NULL;
+     210                 :           4 :   EContact *contact = NULL;
+     211                 :             : 
+     212         [ +  - ]:           4 :   g_assert (VALENT_IS_SMS_CONVERSATION (self));
+     213         [ -  + ]:           4 :   g_assert (VALENT_IS_MESSAGE (message));
+     214                 :             : 
+     215                 :             :   /* Create the row */
+     216                 :           4 :   row = g_object_new (VALENT_TYPE_SMS_CONVERSATION_ROW,
+     217                 :             :                       "message",     message,
+     218                 :             :                       "activatable", FALSE,
+     219                 :             :                       "selectable",  FALSE,
+     220                 :             :                       NULL);
+     221                 :             : 
+     222                 :             :   /* If the message has a sender, try to lookup the contact */
+     223         [ +  + ]:           4 :   if ((sender = valent_message_get_sender (message)) != NULL)
+     224                 :             :     {
+     225                 :           2 :       GHashTableIter iter;
+     226                 :           2 :       const char *address = NULL;
+     227                 :             : 
+     228                 :           2 :       g_hash_table_iter_init (&iter, self->participants);
+     229                 :             : 
+     230         [ -  + ]:           2 :       while (g_hash_table_iter_next (&iter, (void **)&address, (void **)&contact))
+     231                 :             :         {
+     232         [ #  # ]:           0 :           if (valent_phone_number_equal (sender, address))
+     233                 :             :             {
+     234                 :           0 :               valent_sms_conversation_row_set_contact (row, contact);
+     235                 :           0 :               break;
+     236                 :             :             }
+     237                 :             : 
+     238                 :           0 :           contact = NULL;
+     239                 :             :         }
+     240                 :             : 
+     241         [ +  - ]:           2 :       if (contact == NULL)
+     242                 :             :         {
+     243                 :           2 :           valent_sms_contact_from_phone (self->contact_store,
+     244                 :             :                                          sender,
+     245                 :             :                                          NULL,
+     246                 :             :                                          (GAsyncReadyCallback)phone_lookup_cb,
+     247                 :             :                                          g_object_ref_sink (row));
+     248                 :             :         }
+     249                 :             :     }
+     250                 :             : 
+     251                 :             :   /* Insert the row into the message list */
+     252                 :           4 :   gtk_list_box_insert (self->message_list, GTK_WIDGET (row), position);
+     253                 :             : 
+     254                 :           4 :   return GTK_WIDGET (row);
+     255                 :             : }
+     256                 :             : 
+     257                 :             : #if 0
+     258                 :             : /**
+     259                 :             :  * valent_conversation_remove_message:
+     260                 :             :  * @conversation: a `ValentSmsConversation`
+     261                 :             :  * @message: a `ValentMessage`
+     262                 :             :  *
+     263                 :             :  * Remove a message from the conversation.
+     264                 :             :  */
+     265                 :             : static void
+     266                 :             : valent_sms_conversation_remove_message (ValentSmsConversation *conversation,
+     267                 :             :                                         int64_t                message_id)
+     268                 :             : {
+     269                 :             :   GtkWidget *child;
+     270                 :             : 
+     271                 :             :   g_assert (VALENT_IS_SMS_CONVERSATION (conversation));
+     272                 :             :   g_assert (message_id > 0);
+     273                 :             : 
+     274                 :             :   for (child = gtk_widget_get_first_child (GTK_WIDGET (conversation->message_list));
+     275                 :             :        child != NULL;
+     276                 :             :        child = gtk_widget_get_next_sibling (child))
+     277                 :             :     {
+     278                 :             :       ValentSmsConversationRow *row = VALENT_SMS_CONVERSATION_ROW (child);
+     279                 :             : 
+     280                 :             :       if (valent_sms_conversation_row_get_id (row) == message_id)
+     281                 :             :         {
+     282                 :             :           gtk_list_box_remove (conversation->message_list, child);
+     283                 :             :           break;
+     284                 :             :         }
+     285                 :             :     }
+     286                 :             : }
+     287                 :             : #endif
+     288                 :             : 
+     289                 :             : /*
+     290                 :             :  * Message Entry Callbacks
+     291                 :             :  */
+     292                 :             : static void
+     293                 :           0 : on_entry_activated (GtkEntry              *entry,
+     294                 :             :                     ValentSmsConversation *conversation)
+     295                 :             : {
+     296                 :           0 :   valent_sms_conversation_send_message (conversation);
+     297                 :           0 : }
+     298                 :             : 
+     299                 :             : static void
+     300                 :           0 : on_entry_icon_release (GtkEntry              *entry,
+     301                 :             :                        GtkEntryIconPosition   icon_pos,
+     302                 :             :                        ValentSmsConversation *conversation)
+     303                 :             : {
+     304                 :           0 :   valent_sms_conversation_send_message (conversation);
+     305                 :           0 : }
+     306                 :             : 
+     307                 :             : static void
+     308                 :           0 : on_entry_changed (GtkEntry              *entry,
+     309                 :             :                   ValentSmsConversation *conversation)
+     310                 :             : {
+     311                 :           0 :   const char *text;
+     312                 :             : 
+     313                 :           0 :   text = gtk_editable_get_text (GTK_EDITABLE (entry));
+     314                 :             : 
+     315                 :           0 :   gtk_entry_set_icon_sensitive (entry, GTK_ENTRY_ICON_SECONDARY, *text != '\0');
+     316                 :           0 : }
+     317                 :             : 
+     318                 :             : /*
+     319                 :             :  * Auto-scroll
+     320                 :             :  */
+     321                 :             : static inline ValentMessage *
+     322                 :           6 : valent_sms_conversation_pop_tail (ValentSmsConversation *self)
+     323                 :             : {
+     324         [ +  - ]:           6 :   if G_UNLIKELY (self->thread == NULL)
+     325                 :             :     return NULL;
+     326                 :             : 
+     327         [ +  + ]:           6 :   if (self->position_lower == 0)
+     328                 :             :     return NULL;
+     329                 :             : 
+     330                 :           4 :   self->position_lower -= 1;
+     331                 :             : 
+     332                 :           4 :   return g_list_model_get_item (self->thread, self->position_lower);
+     333                 :             : }
+     334                 :             : 
+     335                 :             : #if 0
+     336                 :             : static inline ValentMessage *
+     337                 :             : valent_sms_conversation_pop_head (ValentSmsConversation *self)
+     338                 :             : {
+     339                 :             :   if G_UNLIKELY (self->thread == NULL)
+     340                 :             :     return NULL;
+     341                 :             : 
+     342                 :             :   if (self->position_upper == g_list_model_get_n_items (self->thread) - 1)
+     343                 :             :     return NULL;
+     344                 :             : 
+     345                 :             :   self->position_upper += 1;
+     346                 :             : 
+     347                 :             :   return g_list_model_get_item (self->thread, self->position_upper);
+     348                 :             : }
+     349                 :             : #endif
+     350                 :             : 
+     351                 :             : static void
+     352                 :           2 : valent_sms_conversation_populate_reverse (ValentSmsConversation *self)
+     353                 :             : {
+     354                 :           2 :   unsigned int count = 10;
+     355                 :           2 :   unsigned int n_items;
+     356                 :             : 
+     357         [ +  - ]:           2 :   if G_UNLIKELY (self->thread == NULL)
+     358                 :             :     return;
+     359                 :             : 
+     360         [ +  - ]:           2 :   if ((n_items = g_list_model_get_n_items (self->thread)) == 0)
+     361                 :             :     return;
+     362                 :             : 
+     363         [ +  - ]:           2 :   if (self->position_upper == self->position_lower)
+     364                 :             :     {
+     365                 :           2 :       self->position_lower = n_items;
+     366                 :           2 :       self->position_upper = n_items - 1;
+     367                 :             :     }
+     368                 :             : 
+     369         [ +  - ]:           6 :   for (unsigned int i = 0; i < count; i++)
+     370                 :             :     {
+     371                 :           4 :       g_autoptr (ValentMessage) message = NULL;
+     372                 :             : 
+     373         [ +  + ]:           6 :       if ((message = valent_sms_conversation_pop_tail (self)) == NULL)
+     374                 :             :         break;
+     375                 :             : 
+     376                 :           4 :       valent_sms_conversation_insert_message (self, message, 0);
+     377                 :             :     }
+     378                 :             : 
+     379                 :           2 :   gtk_list_box_invalidate_headers (self->message_list);
+     380                 :             : }
+     381                 :             : 
+     382                 :             : static gboolean
+     383                 :           2 : valent_sms_conversation_populate (gpointer data)
+     384                 :             : {
+     385                 :           2 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (data);
+     386                 :           2 :   double upper, value;
+     387                 :             : 
+     388                 :           2 :   upper = gtk_adjustment_get_upper (self->vadjustment);
+     389                 :           2 :   value = gtk_adjustment_get_value (self->vadjustment);
+     390                 :             : 
+     391                 :           2 :   self->offset = upper - value;
+     392                 :           2 :   valent_sms_conversation_populate_reverse (self);
+     393                 :           2 :   self->populate_id = 0;
+     394                 :             : 
+     395                 :           2 :   return G_SOURCE_REMOVE;
+     396                 :             : }
+     397                 :             : 
+     398                 :             : static inline void
+     399                 :           2 : valent_sms_conversation_queue_populate (ValentSmsConversation *self)
+     400                 :             : {
+     401         [ +  - ]:           2 :   if (self->populate_id > 0)
+     402                 :             :     return;
+     403                 :             : 
+     404                 :           2 :   self->populate_id = g_idle_add_full (G_PRIORITY_LOW,
+     405                 :             :                                        valent_sms_conversation_populate,
+     406                 :             :                                        g_object_ref (self),
+     407                 :             :                                        g_object_unref);
+     408                 :             : }
+     409                 :             : 
+     410                 :             : static gboolean
+     411                 :           1 : valent_sms_conversation_update (gpointer data)
+     412                 :             : {
+     413                 :           1 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (data);
+     414                 :           1 :   double value;
+     415                 :             : 
+     416         [ -  + ]:           1 :   if (self->offset > 0)
+     417                 :             :     {
+     418                 :           0 :       value = gtk_adjustment_get_upper (self->vadjustment) - self->offset;
+     419                 :           0 :       self->offset = 0;
+     420                 :           0 :       gtk_adjustment_set_value (self->vadjustment, value);
+     421                 :             :     }
+     422                 :             : 
+     423                 :           1 :   self->update_id = 0;
+     424                 :             : 
+     425                 :           1 :   return G_SOURCE_REMOVE;
+     426                 :             : }
+     427                 :             : 
+     428                 :             : static inline void
+     429                 :           1 : valent_sms_conversation_queue_update (ValentSmsConversation *self)
+     430                 :             : {
+     431         [ +  - ]:           1 :   if (self->update_id > 0)
+     432                 :             :     return;
+     433                 :             : 
+     434                 :           1 :   self->update_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
+     435                 :             :                                      valent_sms_conversation_update,
+     436                 :             :                                      g_object_ref (self),
+     437                 :             :                                      g_object_unref);
+     438                 :             : }
+     439                 :             : 
+     440                 :             : static void
+     441                 :           0 : on_edge_overshot (GtkScrolledWindow     *scrolled_window,
+     442                 :             :                   GtkPositionType        pos,
+     443                 :             :                   ValentSmsConversation *self)
+     444                 :             : {
+     445         [ #  # ]:           0 :   if (pos == GTK_POS_TOP)
+     446                 :           0 :     valent_sms_conversation_queue_populate (self);
+     447                 :             : 
+     448         [ #  # ]:           0 :   if (pos == GTK_POS_BOTTOM)
+     449                 :           0 :     self->offset = 0;
+     450                 :           0 : }
+     451                 :             : 
+     452                 :             : static void
+     453                 :           1 : on_scroll_notify_upper (GtkAdjustment         *adjustment,
+     454                 :             :                         GParamSpec            *pspec,
+     455                 :             :                         ValentSmsConversation *self)
+     456                 :             : {
+     457         [ +  - ]:           1 :   if G_UNLIKELY (!gtk_widget_get_realized (GTK_WIDGET (self)))
+     458                 :             :     return;
+     459                 :             : 
+     460                 :           1 :   valent_sms_conversation_queue_update (self);
+     461                 :             : }
+     462                 :             : 
+     463                 :             : static void
+     464                 :           2 : on_thread_items_changed (GListModel            *model,
+     465                 :             :                          unsigned int           position,
+     466                 :             :                          unsigned int           removed,
+     467                 :             :                          unsigned int           added,
+     468                 :             :                          ValentSmsConversation *self)
+     469                 :             : {
+     470                 :           2 :   unsigned int position_upper, position_lower;
+     471                 :           2 :   unsigned int position_real;
+     472                 :           2 :   int diff;
+     473                 :             : 
+     474         [ +  - ]:           2 :   g_assert (VALENT_IS_MESSAGE_THREAD (model));
+     475         [ -  + ]:           2 :   g_assert (VALENT_IS_SMS_CONVERSATION (self));
+     476                 :             : 
+     477                 :           2 :   position_upper = self->position_upper;
+     478                 :           2 :   position_lower = self->position_lower;
+     479                 :           2 :   position_real = position_lower + position;
+     480                 :             : 
+     481                 :             :   /* First update the internal pointers */
+     482                 :           2 :   diff = added - removed;
+     483                 :             : 
+     484         [ +  - ]:           2 :   if (position <= position_lower)
+     485                 :           2 :     self->position_lower += diff;
+     486                 :             : 
+     487         [ +  - ]:           2 :   if (position <= position_upper)
+     488                 :           2 :     self->position_upper += diff;
+     489                 :             : 
+     490                 :             :   /* If the upper and lower are equal and we're being notified of additions,
+     491                 :             :    * then this must be the initial load */
+     492   [ +  -  +  - ]:           2 :   if (self->position_lower == self->position_upper && added)
+     493                 :             :     {
+     494                 :           2 :       valent_sms_conversation_queue_populate (self);
+     495                 :           2 :       return;
+     496                 :             :     }
+     497                 :             : 
+     498                 :             :   /* If the position is in between our pointers we have to handle them */
+     499         [ #  # ]:           0 :   if (position >= position_lower && position <= position_upper)
+     500                 :             :     {
+     501                 :             :       /* Removals first */
+     502         [ #  # ]:           0 :       for (unsigned int i = 0; i < removed; i++)
+     503                 :             :         {
+     504                 :           0 :           GtkListBoxRow *row;
+     505                 :             : 
+     506                 :           0 :           row = gtk_list_box_get_row_at_index (self->message_list, position_real);
+     507                 :           0 :           gtk_list_box_remove (self->message_list, GTK_WIDGET (row));
+     508                 :             :         }
+     509                 :             : 
+     510                 :             :       /* Additions */
+     511         [ #  # ]:           0 :       for (unsigned int i = 0; i < added; i++)
+     512                 :             :         {
+     513                 :           0 :           g_autoptr (ValentMessage) message = NULL;
+     514                 :             : 
+     515                 :           0 :           message = g_list_model_get_item (self->thread, position + i);
+     516         [ #  # ]:           0 :           valent_sms_conversation_insert_message (self, message, position_real + i);
+     517                 :             :         }
+     518                 :             :     }
+     519                 :             : }
+     520                 :             : 
+     521                 :             : static void
+     522                 :           4 : valent_sms_conversation_load (ValentSmsConversation *self)
+     523                 :             : {
+     524   [ +  -  +  - ]:           4 :   if (self->message_store == NULL || self->thread_id == self->loaded_id)
+     525                 :             :     return;
+     526                 :             : 
+     527         [ +  + ]:           4 :   if (!gtk_widget_get_mapped (GTK_WIDGET (self)))
+     528                 :             :     return;
+     529                 :             : 
+     530                 :           2 :   self->loaded_id = self->thread_id;
+     531                 :           2 :   self->thread = valent_sms_store_get_thread (self->message_store,
+     532                 :             :                                               self->thread_id);
+     533                 :           2 :   g_signal_connect_object (self->thread,
+     534                 :             :                            "items-changed",
+     535                 :             :                            G_CALLBACK (on_thread_items_changed),
+     536                 :             :                            self, 0);
+     537                 :             : }
+     538                 :             : 
+     539                 :             : static void
+     540                 :           0 : valent_sms_conversation_send_message (ValentSmsConversation *self)
+     541                 :             : {
+     542                 :           0 :   g_autoptr (ValentMessage) message = NULL;
+     543                 :           0 :   GVariantBuilder builder, addresses;
+     544                 :           0 :   GHashTableIter iter;
+     545                 :           0 :   gpointer address;
+     546                 :           0 :   int sub_id = -1;
+     547                 :           0 :   const char *text;
+     548                 :           0 :   gboolean sent;
+     549                 :             : 
+     550         [ #  # ]:           0 :   g_assert (VALENT_IS_SMS_CONVERSATION (self));
+     551                 :             : 
+     552                 :           0 :   text = gtk_editable_get_text (GTK_EDITABLE (self->message_entry));
+     553                 :             : 
+     554   [ #  #  #  # ]:           0 :   if (text == NULL || *text == '\0')
+     555                 :           0 :     return;
+     556                 :             : 
+     557                 :             :   // Metadata
+     558                 :           0 :   g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+     559                 :             : 
+     560                 :             :   // Addresses
+     561                 :           0 :   g_variant_builder_init (&addresses, G_VARIANT_TYPE_ARRAY);
+     562                 :           0 :   g_hash_table_iter_init (&iter, self->participants);
+     563                 :             : 
+     564         [ #  # ]:           0 :   while (g_hash_table_iter_next (&iter, &address, NULL))
+     565                 :           0 :     g_variant_builder_add_parsed (&addresses, "{'address': <%s>}", address);
+     566                 :             : 
+     567                 :           0 :   g_variant_builder_add (&builder, "{sv}", "addresses",
+     568                 :             :                          g_variant_builder_end (&addresses));
+     569                 :             : 
+     570                 :             : 
+     571                 :             :   // TODO: SIM Card
+     572                 :           0 :   g_variant_builder_add (&builder, "{sv}", "sub_id",
+     573                 :             :                          g_variant_new_int64 (sub_id));
+     574                 :             : 
+     575                 :           0 :   message = g_object_new (VALENT_TYPE_MESSAGE,
+     576                 :             :                           "box",       VALENT_MESSAGE_BOX_OUTBOX,
+     577                 :             :                           "date",      0,
+     578                 :             :                           "id",        -1,
+     579                 :             :                           "metadata",  g_variant_builder_end (&builder),
+     580                 :             :                           "read",      FALSE,
+     581                 :             :                           "sender",    NULL,
+     582                 :             :                           "text",      text,
+     583                 :             :                           "thread-id", self->thread_id,
+     584                 :             :                           NULL);
+     585                 :             : 
+     586                 :           0 :   g_signal_emit (G_OBJECT (self), signals [SEND_MESSAGE], 0, message, &sent);
+     587                 :             : 
+     588         [ #  # ]:           0 :   if (sent)
+     589                 :             :     VALENT_NOTE ("TODO: Add pending message to conversation");
+     590                 :             :   else
+     591                 :           0 :     g_warning ("%s(): failed sending message \"%s\"", G_STRFUNC, text);
+     592                 :             : 
+     593                 :             :   /* Clear the entry whether we failed or not */
+     594         [ #  # ]:           0 :   gtk_editable_set_text (GTK_EDITABLE (self->message_entry), "");
+     595                 :             : }
+     596                 :             : 
+     597                 :             : 
+     598                 :             : /*
+     599                 :             :  * GtkWidget
+     600                 :             :  */
+     601                 :             : static void
+     602                 :           2 : valent_sms_conversation_map (GtkWidget *widget)
+     603                 :             : {
+     604                 :           2 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (widget);
+     605                 :             : 
+     606                 :           2 :   GTK_WIDGET_CLASS (valent_sms_conversation_parent_class)->map (widget);
+     607                 :             : 
+     608                 :           2 :   gtk_widget_grab_focus (self->message_entry);
+     609                 :           2 :   valent_sms_conversation_load (self);
+     610                 :           2 : }
+     611                 :             : 
+     612                 :             : 
+     613                 :             : /*
+     614                 :             :  * GObject
+     615                 :             :  */
+     616                 :             : static void
+     617                 :           2 : valent_sms_conversation_dispose (GObject *object)
+     618                 :             : {
+     619                 :           2 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (object);
+     620                 :             : 
+     621         [ +  - ]:           2 :   if (self->thread != NULL)
+     622                 :             :     {
+     623                 :           2 :       g_signal_handlers_disconnect_by_data (self->thread, self);
+     624         [ +  - ]:           2 :       g_clear_object (&self->thread);
+     625                 :             :     }
+     626                 :             : 
+     627                 :           2 :   gtk_widget_dispose_template (GTK_WIDGET (object),
+     628                 :             :                                VALENT_TYPE_SMS_CONVERSATION);
+     629                 :             : 
+     630                 :           2 :   G_OBJECT_CLASS (valent_sms_conversation_parent_class)->dispose (object);
+     631                 :           2 : }
+     632                 :             : 
+     633                 :             : static void
+     634                 :           2 : valent_sms_conversation_finalize (GObject *object)
+     635                 :             : {
+     636                 :           2 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (object);
+     637                 :             : 
+     638         [ +  - ]:           2 :   g_clear_object (&self->message_store);
+     639         [ +  - ]:           2 :   g_clear_object (&self->contact_store);
+     640         [ +  - ]:           2 :   g_clear_pointer (&self->participants, g_hash_table_unref);
+     641         [ +  + ]:           2 :   g_clear_pointer (&self->title, g_free);
+     642         [ -  + ]:           2 :   g_clear_pointer (&self->subtitle, g_free);
+     643                 :             : 
+     644                 :           2 :   G_OBJECT_CLASS (valent_sms_conversation_parent_class)->finalize (object);
+     645                 :           2 : }
+     646                 :             : 
+     647                 :             : static void
+     648                 :           3 : valent_sms_conversation_get_property (GObject    *object,
+     649                 :             :                                       guint       prop_id,
+     650                 :             :                                       GValue     *value,
+     651                 :             :                                       GParamSpec *pspec)
+     652                 :             : {
+     653                 :           3 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (object);
+     654                 :             : 
+     655   [ +  +  +  - ]:           3 :   switch (prop_id)
+     656                 :             :     {
+     657                 :           1 :     case PROP_CONTACT_STORE:
+     658                 :           1 :       g_value_set_object (value, self->contact_store);
+     659                 :           1 :       break;
+     660                 :             : 
+     661                 :           1 :     case PROP_MESSAGE_STORE:
+     662                 :           1 :       g_value_set_object (value, self->message_store);
+     663                 :           1 :       break;
+     664                 :             : 
+     665                 :           1 :     case PROP_THREAD_ID:
+     666                 :           1 :       g_value_set_int64 (value, self->thread_id);
+     667                 :           1 :       break;
+     668                 :             : 
+     669                 :           0 :     default:
+     670                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     671                 :             :     }
+     672                 :           3 : }
+     673                 :             : 
+     674                 :             : static void
+     675                 :           6 : valent_sms_conversation_set_property (GObject      *object,
+     676                 :             :                                       guint         prop_id,
+     677                 :             :                                       const GValue *value,
+     678                 :             :                                       GParamSpec   *pspec)
+     679                 :             : {
+     680                 :           6 :   ValentSmsConversation *self = VALENT_SMS_CONVERSATION (object);
+     681                 :             : 
+     682   [ +  +  +  - ]:           6 :   switch (prop_id)
+     683                 :             :     {
+     684                 :           2 :     case PROP_CONTACT_STORE:
+     685                 :           2 :       self->contact_store = g_value_dup_object (value);
+     686                 :           2 :       break;
+     687                 :             : 
+     688                 :           2 :     case PROP_MESSAGE_STORE:
+     689                 :           2 :       self->message_store = g_value_dup_object (value);
+     690                 :           2 :       break;
+     691                 :             : 
+     692                 :           2 :     case PROP_THREAD_ID:
+     693                 :           2 :       valent_sms_conversation_set_thread_id (self, g_value_get_int64 (value));
+     694                 :           2 :       break;
+     695                 :             : 
+     696                 :           0 :     default:
+     697                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     698                 :             :     }
+     699                 :           6 : }
+     700                 :             : 
+     701                 :             : static void
+     702                 :           2 : valent_sms_conversation_class_init (ValentSmsConversationClass *klass)
+     703                 :             : {
+     704                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     705                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     706                 :             : 
+     707                 :           2 :   object_class->dispose = valent_sms_conversation_dispose;
+     708                 :           2 :   object_class->finalize = valent_sms_conversation_finalize;
+     709                 :           2 :   object_class->get_property = valent_sms_conversation_get_property;
+     710                 :           2 :   object_class->set_property = valent_sms_conversation_set_property;
+     711                 :             : 
+     712                 :           2 :   widget_class->map = valent_sms_conversation_map;
+     713                 :             : 
+     714                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/sms/valent-sms-conversation.ui");
+     715                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsConversation, message_list);
+     716                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsConversation, message_entry);
+     717                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsConversation, message_view);
+     718                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsConversation, pending);
+     719                 :             : 
+     720                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_edge_overshot);
+     721                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_entry_activated);
+     722                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_entry_changed);
+     723                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_entry_icon_release);
+     724                 :             : 
+     725                 :           2 :   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT);
+     726                 :             : 
+     727                 :             :   /**
+     728                 :             :    * ValentSmsConversation:contact-store:
+     729                 :             :    *
+     730                 :             :    * The `ValentContactStore` providing `EContact` objects for the conversation.
+     731                 :             :    */
+     732                 :           4 :   properties [PROP_CONTACT_STORE] =
+     733                 :           2 :     g_param_spec_object ("contact-store", NULL, NULL,
+     734                 :             :                          VALENT_TYPE_CONTACT_STORE,
+     735                 :             :                          (G_PARAM_READWRITE |
+     736                 :             :                           G_PARAM_CONSTRUCT |
+     737                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     738                 :             :                           G_PARAM_STATIC_STRINGS));
+     739                 :             : 
+     740                 :             :   /**
+     741                 :             :    * ValentSmsConversation:message-store:
+     742                 :             :    *
+     743                 :             :    * The `ValentSmsStore` providing `ValentMessage` objects for the
+     744                 :             :    * conversation.
+     745                 :             :    */
+     746                 :           4 :   properties [PROP_MESSAGE_STORE] =
+     747                 :           2 :     g_param_spec_object ("message-store", NULL, NULL,
+     748                 :             :                          VALENT_TYPE_SMS_STORE,
+     749                 :             :                          (G_PARAM_READWRITE |
+     750                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     751                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     752                 :             :                           G_PARAM_STATIC_STRINGS));
+     753                 :             : 
+     754                 :             :   /**
+     755                 :             :    * ValentSmsConversation:thread-id:
+     756                 :             :    *
+     757                 :             :    * The thread ID of the conversation.
+     758                 :             :    */
+     759                 :           4 :   properties [PROP_THREAD_ID] =
+     760                 :           2 :     g_param_spec_int64 ("thread-id", NULL, NULL,
+     761                 :             :                         G_MININT64, G_MAXINT64,
+     762                 :             :                         0,
+     763                 :             :                         (G_PARAM_READWRITE |
+     764                 :             :                          G_PARAM_CONSTRUCT |
+     765                 :             :                          G_PARAM_EXPLICIT_NOTIFY |
+     766                 :             :                          G_PARAM_STATIC_STRINGS));
+     767                 :             : 
+     768                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     769                 :             : 
+     770                 :             :   /**
+     771                 :             :    * ValentSmsConversation::send-message:
+     772                 :             :    * @conversation: a `ValentSmsConversation`
+     773                 :             :    * @message: a message
+     774                 :             :    *
+     775                 :             :    * The `ValentSmsConversation`::send-message signal is emitted when a user is
+     776                 :             :    * sending an outgoing message.
+     777                 :             :    *
+     778                 :             :    * The signal handler should return a boolean indicating success, although
+     779                 :             :    * this only indicates the request was sent to the device.
+     780                 :             :    */
+     781                 :           4 :   signals [SEND_MESSAGE] =
+     782                 :           2 :     g_signal_new ("send-message",
+     783                 :             :                   G_TYPE_FROM_CLASS (klass),
+     784                 :             :                   G_SIGNAL_RUN_LAST,
+     785                 :             :                   0,
+     786                 :             :                   g_signal_accumulator_first_wins, NULL, NULL,
+     787                 :             :                   G_TYPE_BOOLEAN, 1, VALENT_TYPE_MESSAGE);
+     788                 :           2 : }
+     789                 :             : 
+     790                 :             : static void
+     791                 :           2 : valent_sms_conversation_init (ValentSmsConversation *self)
+     792                 :             : {
+     793                 :           2 :   GtkScrolledWindow *scrolled;
+     794                 :             : 
+     795                 :           2 :   gtk_widget_init_template (GTK_WIDGET (self));
+     796                 :             : 
+     797                 :             :   /* Watch the scroll position */
+     798                 :           2 :   scrolled = GTK_SCROLLED_WINDOW (self->message_view);
+     799                 :           2 :   self->vadjustment = gtk_scrolled_window_get_vadjustment (scrolled);
+     800                 :           2 :   g_signal_connect_after (self->vadjustment,
+     801                 :             :                           "notify::upper",
+     802                 :             :                           G_CALLBACK (on_scroll_notify_upper),
+     803                 :             :                           self);
+     804                 :             : 
+     805                 :           2 :   gtk_list_box_set_header_func (self->message_list,
+     806                 :             :                                 message_list_header_func,
+     807                 :             :                                 self, NULL);
+     808                 :             : 
+     809                 :           2 :   self->participants = g_hash_table_new_full (g_str_hash, g_str_equal,
+     810                 :             :                                               g_free,     g_object_unref);
+     811                 :           2 : }
+     812                 :             : 
+     813                 :             : GtkWidget *
+     814                 :           0 : valent_sms_conversation_new (ValentContactStore *contacts,
+     815                 :             :                              ValentSmsStore     *messages)
+     816                 :             : {
+     817                 :           0 :   return g_object_new (VALENT_TYPE_SMS_CONVERSATION,
+     818                 :             :                        "contact-store", contacts,
+     819                 :             :                        "message-store", messages,
+     820                 :             :                        NULL);
+     821                 :             : }
+     822                 :             : 
+     823                 :             : /**
+     824                 :             :  * valent_sms_conversation_get_thread_id:
+     825                 :             :  * @conversation: a `ValentSmsConversation`
+     826                 :             :  *
+     827                 :             :  * Get the thread ID for @conversation.
+     828                 :             :  *
+     829                 :             :  * Returns: the thread ID
+     830                 :             :  */
+     831                 :             : int64_t
+     832                 :           1 : valent_sms_conversation_get_thread_id (ValentSmsConversation *conversation)
+     833                 :             : {
+     834         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION (conversation), 0);
+     835                 :             : 
+     836                 :           1 :   return conversation->thread_id;
+     837                 :             : }
+     838                 :             : 
+     839                 :             : /**
+     840                 :             :  * valent_sms_conversation_set_thread_id:
+     841                 :             :  * @conversation: a `ValentSmsConversation`
+     842                 :             :  * @thread_id: a thread ID
+     843                 :             :  *
+     844                 :             :  * Set the thread ID for @conversation.
+     845                 :             :  */
+     846                 :             : void
+     847                 :           2 : valent_sms_conversation_set_thread_id (ValentSmsConversation *conversation,
+     848                 :             :                                        int64_t                thread_id)
+     849                 :             : {
+     850                 :           2 :   GtkWidget *parent = GTK_WIDGET (conversation->message_list);
+     851                 :           2 :   GtkWidget *child;
+     852                 :             : 
+     853         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION (conversation));
+     854         [ -  + ]:           2 :   g_return_if_fail (thread_id >= 0);
+     855                 :             : 
+     856         [ +  - ]:           2 :   if (conversation->thread_id == thread_id)
+     857                 :             :     return;
+     858                 :             : 
+     859                 :             :   /* Clear the current messages */
+     860         [ -  + ]:           2 :   if (conversation->thread != NULL)
+     861                 :             :     {
+     862                 :           0 :       g_signal_handlers_disconnect_by_data (conversation->thread, conversation);
+     863         [ #  # ]:           0 :       g_clear_object (&conversation->thread);
+     864                 :             :     }
+     865                 :             : 
+     866         [ +  + ]:           4 :   while ((child = gtk_widget_get_first_child (parent)))
+     867                 :           2 :     gtk_list_box_remove (conversation->message_list, child);
+     868                 :             : 
+     869                 :             :   /* Notify before beginning the load task */
+     870                 :           2 :   conversation->thread_id = thread_id;
+     871                 :           2 :   g_object_notify_by_pspec (G_OBJECT (conversation), properties [PROP_THREAD_ID]);
+     872                 :             : 
+     873                 :             :   /* Load the new thread */
+     874                 :           2 :   valent_sms_conversation_load (conversation);
+     875                 :             : }
+     876                 :             : 
+     877                 :             : /**
+     878                 :             :  * valent_sms_conversation_get_title:
+     879                 :             :  * @conversation: a `ValentSmsConversation`
+     880                 :             :  *
+     881                 :             :  * Get the title of the conversation, usually the contact name.
+     882                 :             :  *
+     883                 :             :  * Returns: (transfer none): the conversation title
+     884                 :             :  */
+     885                 :             : const char *
+     886                 :           1 : valent_sms_conversation_get_title (ValentSmsConversation *conversation)
+     887                 :             : {
+     888                 :           2 :   g_autofree char **addresses = NULL;
+     889                 :           1 :   g_autoptr (GList) contacts = NULL;
+     890                 :           1 :   unsigned int n_contacts = 0;
+     891                 :             : 
+     892         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION (conversation), NULL);
+     893                 :             : 
+     894         [ +  - ]:           1 :   if (conversation->title == NULL)
+     895                 :             :     {
+     896         [ -  + ]:           1 :       g_clear_pointer (&conversation->subtitle, g_free);
+     897                 :             : 
+     898                 :           1 :       addresses = (char **)g_hash_table_get_keys_as_array (conversation->participants,
+     899                 :             :                                                            &n_contacts);
+     900                 :           1 :       contacts = g_hash_table_get_values (conversation->participants);
+     901                 :             : 
+     902         [ +  - ]:           1 :       if (n_contacts == 0)
+     903                 :             :         {
+     904         [ -  + ]:           1 :           conversation->title = g_strdup (_("New Conversation"));
+     905                 :           1 :           conversation->subtitle = NULL;
+     906                 :             :         }
+     907                 :             :       else
+     908                 :             :         {
+     909                 :           0 :           conversation->title = e_contact_get (contacts->data,
+     910                 :             :                                                E_CONTACT_FULL_NAME);
+     911                 :             : 
+     912         [ #  # ]:           0 :           if (n_contacts == 1)
+     913                 :             :             {
+     914         [ #  # ]:           0 :               conversation->subtitle = g_strdup ((const char *)addresses[0]);
+     915                 :             :             }
+     916                 :             :           else
+     917                 :             :             {
+     918                 :           0 :               unsigned int remainder;
+     919                 :             : 
+     920                 :           0 :               remainder = n_contacts - 1;
+     921                 :           0 :               conversation->subtitle = g_strdup_printf (ngettext ("%u other contact",
+     922                 :             :                                                                   "%u others",
+     923                 :             :                                                                   remainder),
+     924                 :             :                                                         remainder);
+     925                 :             :             }
+     926                 :             :         }
+     927                 :             :     }
+     928                 :             : 
+     929         [ +  - ]:           1 :   return conversation->title;
+     930                 :             : }
+     931                 :             : 
+     932                 :             : /**
+     933                 :             :  * valent_sms_conversation_get_subtitle:
+     934                 :             :  * @conversation: a `ValentSmsConversation`
+     935                 :             :  *
+     936                 :             :  * Get the subtitle of the conversation. If the conversation has one recipient
+     937                 :             :  * this will be its address (eg. phone number), otherwise it will be a string
+     938                 :             :  * such as "And 2 others".
+     939                 :             :  *
+     940                 :             :  * Returns: (transfer none): the conversation subtitle
+     941                 :             :  */
+     942                 :             : const char *
+     943                 :           0 : valent_sms_conversation_get_subtitle (ValentSmsConversation *conversation)
+     944                 :             : {
+     945         [ #  # ]:           0 :   g_return_val_if_fail (VALENT_IS_SMS_CONVERSATION (conversation), NULL);
+     946                 :             : 
+     947         [ #  # ]:           0 :   if (conversation->title == NULL)
+     948                 :           0 :     valent_sms_conversation_get_title (conversation);
+     949                 :             : 
+     950                 :           0 :   return conversation->subtitle;
+     951                 :             : }
+     952                 :             : 
+     953                 :             : /**
+     954                 :             :  * valent_sms_conversation_scroll_to_date:
+     955                 :             :  * @conversation: a `ValentSmsConversation`
+     956                 :             :  * @date: a UNIX epoch timestamp
+     957                 :             :  *
+     958                 :             :  * Scroll to the message closest to @date.
+     959                 :             :  */
+     960                 :             : void
+     961                 :           0 : valent_sms_conversation_scroll_to_date (ValentSmsConversation *conversation,
+     962                 :             :                                         int64_t                date)
+     963                 :             : {
+     964                 :           0 :   GtkWidget *row;
+     965                 :           0 :   ValentMessage *message;
+     966                 :             : 
+     967         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION (conversation));
+     968         [ #  # ]:           0 :   g_return_if_fail (date > 0);
+     969                 :             : 
+     970                 :             :   /* First look through the list box */
+     971                 :           0 :   for (row = gtk_widget_get_last_child (GTK_WIDGET (conversation->message_list));
+     972         [ #  # ]:           0 :        row != NULL;
+     973                 :           0 :        row = gtk_widget_get_prev_sibling (row))
+     974                 :             :     {
+     975         [ #  # ]:           0 :       if G_UNLIKELY (GTK_LIST_BOX_ROW (row) == conversation->pending)
+     976                 :           0 :         continue;
+     977                 :             : 
+     978                 :             :       /* If this message is equal or older than the target date, we're done */
+     979         [ #  # ]:           0 :       if (valent_sms_conversation_row_get_date (VALENT_SMS_CONVERSATION_ROW (row)) <= date)
+     980                 :             :         {
+     981                 :           0 :           valent_sms_conversation_scroll_to_row (conversation, row);
+     982                 :           0 :           return;
+     983                 :             :         }
+     984                 :             :     }
+     985                 :             : 
+     986                 :             :   /* If there are no more messages, we're done */
+     987         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_MESSAGE_THREAD (conversation->thread));
+     988                 :             : 
+     989                 :             :   /* Populate the list in reverse until we find the message */
+     990         [ #  # ]:           0 :   while ((message = valent_sms_conversation_pop_tail (conversation)) != NULL)
+     991                 :             :     {
+     992                 :             :       /* Prepend the message */
+     993                 :           0 :       row = valent_sms_conversation_insert_message (conversation, message, 0);
+     994                 :           0 :       g_object_unref (message);
+     995                 :             : 
+     996                 :             :       /* If this message is equal or older than the target date, we're done */
+     997         [ #  # ]:           0 :       if (valent_message_get_date (message) <= date)
+     998                 :             :         {
+     999                 :           0 :           valent_sms_conversation_scroll_to_row (conversation, row);
+    1000                 :           0 :           return;
+    1001                 :             :         }
+    1002                 :             :    }
+    1003                 :             : }
+    1004                 :             : 
+    1005                 :             : /**
+    1006                 :             :  * valent_sms_conversation_scroll_to_message:
+    1007                 :             :  * @conversation: a `ValentSmsConversation`
+    1008                 :             :  * @message: a `ValentMessage`
+    1009                 :             :  *
+    1010                 :             :  * A convenience for calling valent_message_get_date() and then
+    1011                 :             :  * valent_sms_conversation_scroll_to_date().
+    1012                 :             :  */
+    1013                 :             : void
+    1014                 :           0 : valent_sms_conversation_scroll_to_message (ValentSmsConversation *conversation,
+    1015                 :             :                                            ValentMessage         *message)
+    1016                 :             : {
+    1017                 :           0 :   int64_t date;
+    1018                 :             : 
+    1019         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_SMS_CONVERSATION (conversation));
+    1020         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+    1021                 :             : 
+    1022                 :           0 :   date = valent_message_get_date (message);
+    1023                 :           0 :   valent_sms_conversation_scroll_to_date (conversation, date);
+    1024                 :             : }
+    1025                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation.h.func-c.html b/coverage/src/plugins/sms/valent-sms-conversation.h.func-c.html new file mode 100644 index 00000000000..f7aa90631df --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_CONVERSATION10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation.h.func.html b/coverage/src/plugins/sms/valent-sms-conversation.h.func.html new file mode 100644 index 00000000000..a6a6d20a84c --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_CONVERSATION10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-conversation.h.gcov.html b/coverage/src/plugins/sms/valent-sms-conversation.h.gcov.html new file mode 100644 index 00000000000..9b2a6a67639 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-conversation.h.gcov.html @@ -0,0 +1,125 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-conversation.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-conversation.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-message.h"
+      10                 :             : #include "valent-sms-store.h"
+      11                 :             : 
+      12                 :             : G_BEGIN_DECLS
+      13                 :             : 
+      14                 :             : #define VALENT_TYPE_SMS_CONVERSATION (valent_sms_conversation_get_type())
+      15                 :             : 
+      16   [ +  -  +  -  :          10 : G_DECLARE_FINAL_TYPE (ValentSmsConversation, valent_sms_conversation, VALENT, SMS_CONVERSATION, GtkWidget)
+                   -  + ]
+      17                 :             : 
+      18                 :             : GtkWidget  * valent_sms_conversation_new               (ValentContactStore    *contacts,
+      19                 :             :                                                         ValentSmsStore        *messages);
+      20                 :             : 
+      21                 :             : int64_t      valent_sms_conversation_get_thread_id     (ValentSmsConversation *conversation);
+      22                 :             : void         valent_sms_conversation_set_thread_id     (ValentSmsConversation *conversation,
+      23                 :             :                                                         int64_t                thread_id);
+      24                 :             : const char * valent_sms_conversation_get_title         (ValentSmsConversation *conversation);
+      25                 :             : const char * valent_sms_conversation_get_subtitle      (ValentSmsConversation *conversation);
+      26                 :             : 
+      27                 :             : void         valent_sms_conversation_scroll_to_date    (ValentSmsConversation *conversation,
+      28                 :             :                                                         int64_t                date);
+      29                 :             : void         valent_sms_conversation_scroll_to_message (ValentSmsConversation *conversation,
+      30                 :             :                                                         ValentMessage         *message);
+      31                 :             : 
+      32                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-plugin.c.func-c.html b/coverage/src/plugins/sms/valent-sms-plugin.c.func-c.html new file mode 100644 index 00000000000..58686cda151 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-plugin.c.func-c.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:81.5 %238194
Test Date:2024-03-31 18:46:36Functions:90.0 %2018
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:46.9 %13061
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_send_message0
valent_sms_plugin_request0
fetch_action1
messaging_action1
valent_sms_plugin_handle_thread2
valent_sms_plugin_request_conversation2
message_hash3
messages_is_thread3
valent_sms_plugin_constructed3
valent_sms_plugin_deserialize_message3
valent_sms_plugin_finalize3
valent_sms_plugin_handle_messages3
valent_sms_plugin_handle_packet3
valent_sms_plugin_init3
valent_sms_plugin_request_conversations4
valent_sms_plugin_destroy6
valent_sms_plugin_update_state10
valent_sms_plugin_get_type41
valent_sms_plugin_class_intern_init4
valent_sms_plugin_get_type_once4
valent_sms_plugin_get_type33
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-plugin.c.func.html b/coverage/src/plugins/sms/valent-sms-plugin.c.func.html new file mode 100644 index 00000000000..d43536f26a4 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-plugin.c.func.html @@ -0,0 +1,238 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:81.5 %238194
Test Date:2024-03-31 18:46:36Functions:90.0 %2018
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:46.9 %13061
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
fetch_action1
message_hash3
messages_is_thread3
messaging_action1
on_send_message0
valent_sms_plugin_constructed3
valent_sms_plugin_deserialize_message3
valent_sms_plugin_destroy6
valent_sms_plugin_finalize3
valent_sms_plugin_get_type41
valent_sms_plugin_class_intern_init4
valent_sms_plugin_get_type33
valent_sms_plugin_get_type_once4
valent_sms_plugin_handle_messages3
valent_sms_plugin_handle_packet3
valent_sms_plugin_handle_thread2
valent_sms_plugin_init3
valent_sms_plugin_request0
valent_sms_plugin_request_conversation2
valent_sms_plugin_request_conversations4
valent_sms_plugin_update_state10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-plugin.c.gcov.html b/coverage/src/plugins/sms/valent-sms-plugin.c.gcov.html new file mode 100644 index 00000000000..9164f87db07 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-plugin.c.gcov.html @@ -0,0 +1,656 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:81.5 %238194
Test Date:2024-03-31 18:46:36Functions:90.0 %2018
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:46.9 %13061
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sms-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-message.h"
+      14                 :             : #include "valent-sms-plugin.h"
+      15                 :             : #include "valent-sms-store.h"
+      16                 :             : #include "valent-sms-window.h"
+      17                 :             : 
+      18                 :             : 
+      19                 :             : struct _ValentSmsPlugin
+      20                 :             : {
+      21                 :             :   ValentDevicePlugin  parent_instance;
+      22                 :             : 
+      23                 :             :   ValentSmsStore    *store;
+      24                 :             :   GtkWindow         *window;
+      25                 :             : };
+      26                 :             : 
+      27                 :             : static ValentMessage * valent_sms_plugin_deserialize_message   (ValentSmsPlugin *self,
+      28                 :             :                                                                 JsonNode        *node);
+      29                 :             : static void            valent_sms_plugin_request               (ValentSmsPlugin *self,
+      30                 :             :                                                                 ValentMessage   *message);
+      31                 :             : static void            valent_sms_plugin_request_conversation  (ValentSmsPlugin *self,
+      32                 :             :                                                                 int64_t          thread_id,
+      33                 :             :                                                                 int64_t          start_date,
+      34                 :             :                                                                 int64_t          max_results);
+      35                 :             : static void            valent_sms_plugin_request_conversations (ValentSmsPlugin *self);
+      36                 :             : 
+      37   [ +  +  +  - ]:          41 : G_DEFINE_FINAL_TYPE (ValentSmsPlugin, valent_sms_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      38                 :             : 
+      39                 :             : 
+      40                 :             : /**
+      41                 :             :  * message_hash:
+      42                 :             :  * @message_id: a message ID
+      43                 :             :  * @message_text: (nullable): a message text
+      44                 :             :  *
+      45                 :             :  * Shift the lower 32-bits of @message_id to the upper 32-bits of a 64-bit
+      46                 :             :  * integer, then set the lower 32-bits to a djb2 hash of @message_text.
+      47                 :             :  *
+      48                 :             :  * This hack is necessary because kdeconnect-android pulls SMS and MMS from
+      49                 :             :  * separate tables so two messages (even in the same thread) may share an ID.
+      50                 :             :  * The timestamp would be an ideal alternative except that it can change,
+      51                 :             :  * possibly when moved between boxes (eg. outbox => sent).
+      52                 :             :  *
+      53                 :             :  * Returns: a unique ID
+      54                 :             :  */
+      55                 :             : static inline int64_t
+      56                 :           3 : message_hash (int64_t     message_id,
+      57                 :             :               const char *message_text)
+      58                 :             : {
+      59                 :           3 :   uint32_t hash = 5381;
+      60                 :             : 
+      61         [ +  - ]:           3 :   if G_UNLIKELY (message_text == NULL)
+      62                 :             :     message_text = "";
+      63                 :             : 
+      64                 :             :   // djb2
+      65         [ +  + ]:          52 :   for (unsigned int i = 0; message_text[i]; i++)
+      66                 :          49 :     hash = ((hash << 5L) + hash) + message_text[i]; /* hash * 33 + c */
+      67                 :             : 
+      68                 :           3 :   return (((uint64_t) message_id) << 32) | hash;
+      69                 :             : }
+      70                 :             : 
+      71                 :             : static ValentMessage *
+      72                 :           3 : valent_sms_plugin_deserialize_message (ValentSmsPlugin *self,
+      73                 :             :                                        JsonNode        *node)
+      74                 :             : {
+      75                 :           3 :   JsonObject *object;
+      76                 :           3 :   JsonNode *addr_node;
+      77                 :           3 :   GVariant *addresses;
+      78                 :           3 :   GVariantDict dict;
+      79                 :             : 
+      80                 :           3 :   ValentMessageBox box;
+      81                 :           3 :   int64_t date;
+      82                 :           3 :   int64_t id;
+      83                 :           3 :   GVariant *metadata;
+      84                 :           3 :   int64_t read;
+      85                 :           3 :   const char *sender = NULL;
+      86                 :           3 :   const char *text = NULL;
+      87                 :           3 :   int64_t thread_id;
+      88                 :           3 :   ValentMessageFlags event = VALENT_MESSAGE_FLAGS_UNKNOWN;
+      89                 :           3 :   int64_t sub_id = -1;
+      90                 :             : 
+      91         [ +  - ]:           3 :   g_assert (VALENT_IS_SMS_PLUGIN (self));
+      92         [ -  + ]:           3 :   g_assert (JSON_NODE_HOLDS_OBJECT (node));
+      93                 :             : 
+      94                 :           3 :   object = json_node_get_object (node);
+      95                 :             : 
+      96                 :             :   /* Check all the required fields exist */
+      97   [ +  -  +  -  :           3 :   if G_UNLIKELY (!json_object_has_member (object, "thread_id") ||
+          +  -  +  -  +  
+             -  +  -  +  
+                      - ]
+      98                 :             :                  !json_object_has_member (object, "_id") ||
+      99                 :             :                  !json_object_has_member (object, "body") ||
+     100                 :             :                  !json_object_has_member (object, "date") ||
+     101                 :             :                  !json_object_has_member (object, "read") ||
+     102                 :             :                  !json_object_has_member (object, "type") ||
+     103                 :             :                  !json_object_has_member (object, "addresses"))
+     104                 :             :     {
+     105                 :           0 :       g_warning ("%s(): missing required message field", G_STRFUNC);
+     106                 :           0 :       return NULL;
+     107                 :             :     }
+     108                 :             : 
+     109                 :             :   /* Basic fields */
+     110                 :           3 :   box = json_object_get_int_member (object, "type");
+     111                 :           3 :   date = json_object_get_int_member (object, "date");
+     112                 :           3 :   id = json_object_get_int_member (object, "_id");
+     113                 :           3 :   read = json_object_get_int_member (object, "read");
+     114                 :           3 :   text = json_object_get_string_member (object, "body");
+     115                 :           3 :   thread_id = json_object_get_int_member (object, "thread_id");
+     116                 :             : 
+     117                 :             :   /* Addresses */
+     118                 :           3 :   addr_node = json_object_get_member (object, "addresses");
+     119                 :           3 :   addresses = json_gvariant_deserialize (addr_node, "aa{sv}", NULL);
+     120                 :             : 
+     121                 :             :   /* If incoming, the first address will be the sender */
+     122         [ +  + ]:           3 :   if (box == VALENT_MESSAGE_BOX_INBOX)
+     123                 :             :     {
+     124                 :           1 :       JsonObject *sender_obj;
+     125                 :           1 :       JsonArray *addr_array;
+     126                 :             : 
+     127                 :           1 :       addr_array = json_node_get_array (addr_node);
+     128                 :             : 
+     129         [ +  - ]:           1 :       if (json_array_get_length (addr_array) > 0)
+     130                 :             :         {
+     131                 :           1 :           sender_obj = json_array_get_object_element (addr_array, 0);
+     132                 :           1 :           sender = json_object_get_string_member (sender_obj, "address");
+     133                 :             :         }
+     134                 :             :       else
+     135                 :           0 :         g_warning ("No address for message %"G_GINT64_FORMAT" in thread %"G_GINT64_FORMAT, id, thread_id);
+     136                 :             :     }
+     137                 :             : 
+     138                 :             :   /* TODO: The `event` and `sub_id` fields are currently not implemented */
+     139         [ +  - ]:           3 :   if (json_object_has_member (object, "event"))
+     140                 :           3 :     event = json_object_get_int_member (object, "event");
+     141                 :             : 
+     142         [ +  - ]:           3 :   if (json_object_has_member (object, "sub_id"))
+     143                 :           3 :     sub_id = json_object_get_int_member (object, "sub_id");
+     144                 :             : 
+     145                 :             :   /* HACK: try to create a truly unique ID from a potentially non-unique ID */
+     146                 :           3 :   id = message_hash (id, text);
+     147                 :             : 
+     148                 :             :   /* Build the metadata dictionary */
+     149                 :           3 :   g_variant_dict_init (&dict, NULL);
+     150                 :           3 :   g_variant_dict_insert_value (&dict, "addresses", addresses);
+     151                 :           3 :   g_variant_dict_insert (&dict, "event", "u", event);
+     152                 :           3 :   g_variant_dict_insert (&dict, "sub_id", "i", sub_id);
+     153                 :           3 :   metadata = g_variant_dict_end (&dict);
+     154                 :             : 
+     155                 :             :   /* Build and return the message object */
+     156                 :           3 :   return g_object_new (VALENT_TYPE_MESSAGE,
+     157                 :             :                        "box",       box,
+     158                 :             :                        "date",      date,
+     159                 :             :                        "id",        id,
+     160                 :             :                        "metadata",  metadata,
+     161                 :             :                        "read",      read,
+     162                 :             :                        "sender",    sender,
+     163                 :             :                        "text",      text,
+     164                 :             :                        "thread-id", thread_id,
+     165                 :             :                        NULL);
+     166                 :             : }
+     167                 :             : 
+     168                 :             : /**
+     169                 :             :  * messages_is_thread:
+     170                 :             :  * @messages: a `JsonArray`
+     171                 :             :  *
+     172                 :             :  * Check if @messages is a thread of messages, or a summary of threads.
+     173                 :             :  *
+     174                 :             :  * Returns: %TRUE if @messages is a conversation thread
+     175                 :             :  */
+     176                 :             : static gboolean
+     177                 :           3 : messages_is_thread (JsonArray *messages)
+     178                 :             : {
+     179                 :           3 :   JsonObject *message;
+     180                 :           3 :   int64_t first, second;
+     181                 :             : 
+     182                 :             :   /* TODO: A thread with a single message can't be distinguished from
+     183                 :             :    *       a summary with a single thread; in fact both could be true.
+     184                 :             :    *       If we assume the latter is true exclusively, we will get
+     185                 :             :    *       caught in a loop requesting the full thread. */
+     186         [ +  + ]:           3 :   if (json_array_get_length (messages) < 2)
+     187                 :             :     return TRUE;
+     188                 :             : 
+     189                 :           2 :   message = json_array_get_object_element (messages, 0);
+     190                 :           2 :   first = json_object_get_int_member (message, "thread_id");
+     191                 :             : 
+     192                 :           2 :   message = json_array_get_object_element (messages, 1);
+     193                 :           2 :   second = json_object_get_int_member (message, "thread_id");
+     194                 :             : 
+     195                 :           2 :   return first == second;
+     196                 :             : }
+     197                 :             : 
+     198                 :             : static void
+     199                 :           2 : valent_sms_plugin_handle_thread (ValentSmsPlugin *self,
+     200                 :             :                                  JsonArray       *messages)
+     201                 :             : {
+     202                 :           4 :   g_autoptr (GPtrArray) results = NULL;
+     203                 :           2 :   unsigned int n_messages;
+     204                 :             : 
+     205         [ +  - ]:           2 :   g_assert (VALENT_IS_SMS_PLUGIN (self));
+     206         [ -  + ]:           2 :   g_assert (messages != NULL);
+     207                 :             : 
+     208                 :             :   /* Handle each message */
+     209                 :           2 :   n_messages = json_array_get_length (messages);
+     210                 :           2 :   results = g_ptr_array_new_with_free_func (g_object_unref);
+     211                 :             : 
+     212         [ +  + ]:           5 :   for (unsigned int i = 0; i < n_messages; i++)
+     213                 :             :     {
+     214                 :           3 :       JsonNode *message_node;
+     215                 :           3 :       ValentMessage *message;
+     216                 :             : 
+     217                 :           3 :       message_node = json_array_get_element (messages, i);
+     218                 :           3 :       message = valent_sms_plugin_deserialize_message (self, message_node);
+     219                 :           3 :       g_ptr_array_add (results, message);
+     220                 :             :     }
+     221                 :             : 
+     222         [ +  - ]:           2 :   valent_sms_store_add_messages (self->store, results, NULL, NULL, NULL);
+     223                 :           2 : }
+     224                 :             : 
+     225                 :             : static void
+     226                 :           3 : valent_sms_plugin_handle_messages (ValentSmsPlugin *self,
+     227                 :             :                                    JsonNode        *packet)
+     228                 :             : {
+     229                 :           3 :   JsonObject *body;
+     230                 :           3 :   JsonArray *messages;
+     231                 :           3 :   unsigned int n_messages;
+     232                 :             : 
+     233         [ +  - ]:           3 :   g_assert (VALENT_IS_SMS_PLUGIN (self));
+     234         [ -  + ]:           3 :   g_assert (VALENT_IS_PACKET (packet));
+     235                 :             : 
+     236                 :           3 :   body = valent_packet_get_body (packet);
+     237                 :           3 :   messages = json_object_get_array_member (body, "messages");
+     238                 :           3 :   n_messages = json_array_get_length (messages);
+     239                 :             : 
+     240                 :             :   /* This would typically mean "all threads have been deleted", but it's more
+     241                 :             :    * reasonable to assume this was the result of an error. */
+     242         [ +  - ]:           3 :   if (n_messages == 0)
+     243                 :             :     return;
+     244                 :             : 
+     245                 :             :   /* If this is a thread of messages we'll add them to the store */
+     246         [ +  + ]:           3 :   if (messages_is_thread (messages))
+     247                 :             :     {
+     248                 :           2 :       valent_sms_plugin_handle_thread (self, messages);
+     249                 :           2 :       return;
+     250                 :             :     }
+     251                 :             : 
+     252                 :             :   /* If this is a summary of threads we'll request each new thread */
+     253         [ +  + ]:           3 :   for (unsigned int i = 0; i < n_messages; i++)
+     254                 :             :     {
+     255                 :           2 :       JsonObject *message;
+     256                 :           2 :       int64_t thread_id;
+     257                 :           2 :       int64_t thread_date;
+     258                 :           2 :       int64_t cache_date;
+     259                 :             : 
+     260                 :           2 :       message = json_array_get_object_element (messages, i);
+     261                 :           2 :       thread_id = json_object_get_int_member (message, "thread_id");
+     262                 :           2 :       thread_date = json_object_get_int_member (message, "date");
+     263                 :             : 
+     264                 :             :       /* Get the last cached date and compare timestamps */
+     265                 :           2 :       cache_date = valent_sms_store_get_thread_date (self->store, thread_id);
+     266                 :             : 
+     267         [ +  - ]:           2 :       if (cache_date < thread_date)
+     268                 :           2 :         valent_sms_plugin_request_conversation (self, thread_id, cache_date, 0);
+     269                 :             :     }
+     270                 :             : }
+     271                 :             : 
+     272                 :             : static void
+     273                 :           2 : valent_sms_plugin_request_conversation (ValentSmsPlugin *self,
+     274                 :             :                                         int64_t          thread_id,
+     275                 :             :                                         int64_t          start_date,
+     276                 :             :                                         int64_t          max_results)
+     277                 :             : {
+     278                 :           2 :   g_autoptr (JsonBuilder) builder = NULL;
+     279   [ -  +  -  - ]:           2 :   g_autoptr (JsonNode) packet = NULL;
+     280                 :             : 
+     281         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_SMS_PLUGIN (self));
+     282         [ -  + ]:           2 :   g_return_if_fail (thread_id >= 0);
+     283                 :             : 
+     284                 :           2 :   valent_packet_init (&builder, "kdeconnect.sms.request_conversation");
+     285                 :           2 :   json_builder_set_member_name (builder, "threadID");
+     286                 :           2 :   json_builder_add_int_value (builder, thread_id);
+     287                 :             : 
+     288         [ -  + ]:           2 :   if (start_date > 0)
+     289                 :             :     {
+     290                 :           0 :       json_builder_set_member_name (builder, "rangeStartTimestamp");
+     291                 :           0 :       json_builder_add_int_value (builder, start_date);
+     292                 :             :     }
+     293                 :             : 
+     294         [ -  + ]:           2 :   if (max_results > 0)
+     295                 :             :     {
+     296                 :           0 :       json_builder_set_member_name (builder, "numberToRequest");
+     297                 :           0 :       json_builder_add_int_value (builder, max_results);
+     298                 :             :     }
+     299                 :             : 
+     300                 :           2 :   packet = valent_packet_end (&builder);
+     301                 :             : 
+     302         [ +  - ]:           2 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     303                 :             : }
+     304                 :             : 
+     305                 :             : static void
+     306                 :           4 : valent_sms_plugin_request_conversations (ValentSmsPlugin *self)
+     307                 :             : {
+     308                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+     309   [ -  -  -  + ]:           4 :   g_autoptr (JsonNode) packet = NULL;
+     310                 :             : 
+     311   [ +  -  -  - ]:           4 :   g_return_if_fail (VALENT_IS_SMS_PLUGIN (self));
+     312                 :             : 
+     313                 :           4 :   valent_packet_init (&builder, "kdeconnect.sms.request_conversations");
+     314                 :           4 :   packet = valent_packet_end (&builder);
+     315                 :             : 
+     316         [ +  - ]:           4 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     317                 :             : }
+     318                 :             : 
+     319                 :             : static void
+     320                 :           0 : valent_sms_plugin_request (ValentSmsPlugin *self,
+     321                 :             :                            ValentMessage   *message)
+     322                 :             : {
+     323                 :           0 :   g_autoptr (JsonBuilder) builder = NULL;
+     324   [ #  #  #  # ]:           0 :   g_autoptr (JsonNode) packet = NULL;
+     325                 :           0 :   GVariant *metadata;
+     326   [ #  #  #  # ]:           0 :   g_autoptr (GVariant) addresses = NULL;
+     327                 :           0 :   JsonNode *addresses_node = NULL;
+     328                 :           0 :   int sub_id = -1;
+     329                 :           0 :   const char *text;
+     330                 :             : 
+     331         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_SMS_PLUGIN (self));
+     332         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+     333                 :             : 
+     334                 :             :   // Get the data
+     335         [ #  # ]:           0 :   if ((metadata = valent_message_get_metadata (message)) == NULL)
+     336                 :           0 :     g_return_if_reached ();
+     337                 :             : 
+     338         [ #  # ]:           0 :   if ((addresses = g_variant_lookup_value (metadata, "addresses", NULL)) == NULL)
+     339                 :           0 :     g_return_if_reached ();
+     340                 :             : 
+     341         [ #  # ]:           0 :   if (!g_variant_lookup (metadata, "sub_id", "i", &sub_id))
+     342                 :           0 :       sub_id = -1;
+     343                 :             : 
+     344                 :             :   // Build the packet
+     345                 :           0 :   valent_packet_init (&builder, "kdeconnect.sms.request");
+     346                 :             : 
+     347                 :           0 :   json_builder_set_member_name (builder, "version");
+     348                 :           0 :   json_builder_add_int_value (builder, 2);
+     349                 :             : 
+     350                 :           0 :   addresses_node = json_gvariant_serialize (addresses);
+     351                 :           0 :   json_builder_set_member_name (builder, "addresses");
+     352                 :           0 :   json_builder_add_value (builder, addresses_node);
+     353                 :             : 
+     354                 :           0 :   text = valent_message_get_text (message);
+     355                 :           0 :   json_builder_set_member_name (builder, "messageBody");
+     356                 :           0 :   json_builder_add_string_value (builder, text);
+     357                 :             : 
+     358                 :           0 :   json_builder_set_member_name (builder, "subID");
+     359                 :           0 :   json_builder_add_int_value (builder, sub_id);
+     360                 :             : 
+     361                 :           0 :   packet = valent_packet_end (&builder);
+     362                 :             : 
+     363                 :           0 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     364                 :             : }
+     365                 :             : 
+     366                 :             : /*
+     367                 :             :  * GActions
+     368                 :             :  */
+     369                 :             : static void
+     370                 :           1 : fetch_action (GSimpleAction *action,
+     371                 :             :               GVariant      *parameter,
+     372                 :             :               gpointer       user_data)
+     373                 :             : {
+     374                 :           1 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (user_data);
+     375                 :             : 
+     376         [ +  - ]:           1 :   g_assert (VALENT_IS_SMS_PLUGIN (self));
+     377                 :             : 
+     378                 :           1 :   valent_sms_plugin_request_conversations (self);
+     379                 :           1 : }
+     380                 :             : 
+     381                 :             : static gboolean
+     382                 :           0 : on_send_message (ValentSmsWindow *window,
+     383                 :             :                  ValentMessage   *message,
+     384                 :             :                  ValentSmsPlugin *self)
+     385                 :             : {
+     386         [ #  # ]:           0 :   g_assert (VALENT_IS_SMS_WINDOW (window));
+     387         [ #  # ]:           0 :   g_assert (VALENT_IS_MESSAGE (message));
+     388                 :             : 
+     389                 :           0 :   valent_sms_plugin_request (self, message);
+     390                 :             : 
+     391                 :           0 :   return TRUE;
+     392                 :             : }
+     393                 :             : 
+     394                 :             : static void
+     395                 :           1 : messaging_action (GSimpleAction *action,
+     396                 :             :                   GVariant      *parameter,
+     397                 :             :                   gpointer       user_data)
+     398                 :             : {
+     399                 :           1 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (user_data);
+     400                 :           1 :   ValentDevice *device;
+     401                 :             : 
+     402         [ +  - ]:           1 :   g_assert (VALENT_IS_SMS_PLUGIN (self));
+     403                 :             : 
+     404         [ -  + ]:           1 :   if (!gtk_is_initialized ())
+     405                 :             :     {
+     406                 :           0 :       g_warning ("%s: No display available", G_STRFUNC);
+     407                 :           0 :       return;
+     408                 :             :     }
+     409                 :             : 
+     410         [ +  - ]:           1 :   if (self->window == NULL)
+     411                 :             :     {
+     412                 :           1 :       ValentContactStore *store;
+     413                 :             : 
+     414                 :           1 :       device = valent_extension_get_object (VALENT_EXTENSION (self));
+     415                 :           1 :       store = valent_contacts_ensure_store (valent_contacts_get_default (),
+     416                 :             :                                             valent_device_get_id (device),
+     417                 :             :                                             valent_device_get_name (device));
+     418                 :             : 
+     419                 :           1 :       self->window = g_object_new (VALENT_TYPE_SMS_WINDOW,
+     420                 :             :                                    "contact-store", store,
+     421                 :             :                                    "message-store", self->store,
+     422                 :             :                                    NULL);
+     423                 :           1 :       g_object_add_weak_pointer (G_OBJECT (self->window),
+     424                 :           1 :                                  (gpointer) &self->window);
+     425                 :             : 
+     426                 :           1 :       g_signal_connect_object (self->window,
+     427                 :             :                                "send-message",
+     428                 :             :                                G_CALLBACK (on_send_message),
+     429                 :             :                                self, 0);
+     430                 :             :     }
+     431                 :             : 
+     432                 :           1 :   gtk_window_present_with_time (GTK_WINDOW (self->window), GDK_CURRENT_TIME);
+     433                 :             : }
+     434                 :             : 
+     435                 :             : static const GActionEntry actions[] = {
+     436                 :             :     {"fetch",     fetch_action,     NULL, NULL, NULL},
+     437                 :             :     {"messaging", messaging_action, NULL, NULL, NULL}
+     438                 :             : };
+     439                 :             : 
+     440                 :             : /*
+     441                 :             :  * ValentDevicePlugin
+     442                 :             :  */
+     443                 :             : static void
+     444                 :          10 : valent_sms_plugin_update_state (ValentDevicePlugin *plugin,
+     445                 :             :                                 ValentDeviceState   state)
+     446                 :             : {
+     447                 :          10 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (plugin);
+     448                 :          10 :   gboolean available;
+     449                 :             : 
+     450         [ +  - ]:          10 :   g_assert (VALENT_IS_SMS_PLUGIN (self));
+     451                 :             : 
+     452                 :          10 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     453                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     454                 :             : 
+     455                 :          10 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     456                 :             : 
+     457                 :             :   /* Request summary of messages */
+     458         [ +  + ]:          10 :   if (available)
+     459                 :           3 :     valent_sms_plugin_request_conversations (self);
+     460                 :          10 : }
+     461                 :             : 
+     462                 :             : static void
+     463                 :           3 : valent_sms_plugin_handle_packet (ValentDevicePlugin *plugin,
+     464                 :             :                                  const char         *type,
+     465                 :             :                                  JsonNode           *packet)
+     466                 :             : {
+     467                 :           3 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (plugin);
+     468                 :             : 
+     469         [ +  - ]:           3 :   g_assert (VALENT_IS_SMS_PLUGIN (plugin));
+     470         [ -  + ]:           3 :   g_assert (type != NULL);
+     471         [ -  + ]:           3 :   g_assert (VALENT_IS_PACKET (packet));
+     472                 :             : 
+     473         [ +  - ]:           3 :   if (g_str_equal (type, "kdeconnect.sms.messages"))
+     474                 :           3 :     valent_sms_plugin_handle_messages (self, packet);
+     475                 :             :   else
+     476                 :           3 :     g_assert_not_reached ();
+     477                 :           3 : }
+     478                 :             : 
+     479                 :             : /*
+     480                 :             :  * ValentObject
+     481                 :             :  */
+     482                 :             : static void
+     483                 :           6 : valent_sms_plugin_destroy (ValentObject *object)
+     484                 :             : {
+     485                 :           6 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (object);
+     486                 :           6 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     487                 :             : 
+     488                 :             :   /* Close message window and drop SMS Store */
+     489         [ +  + ]:           6 :   g_clear_pointer (&self->window, gtk_window_destroy);
+     490         [ +  + ]:           6 :   g_clear_object (&self->store);
+     491                 :             : 
+     492                 :           6 :   valent_device_plugin_set_menu_item (plugin, "device.sms.messaging", NULL);
+     493                 :             : 
+     494                 :           6 :   VALENT_OBJECT_CLASS (valent_sms_plugin_parent_class)->destroy (object);
+     495                 :           6 : }
+     496                 :             : 
+     497                 :             : /*
+     498                 :             :  * GObject
+     499                 :             :  */
+     500                 :             : static void
+     501                 :           3 : valent_sms_plugin_constructed (GObject *object)
+     502                 :             : {
+     503                 :           3 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (object);
+     504                 :           3 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     505                 :           3 :   ValentDevice *device;
+     506                 :           3 :   ValentContext *context = NULL;
+     507                 :             : 
+     508                 :             :   /* Load SMS Store */
+     509                 :           3 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     510                 :           3 :   context = valent_device_get_context (device);
+     511                 :           3 :   self->store = g_object_new (VALENT_TYPE_SMS_STORE,
+     512                 :             :                               "domain", "plugin",
+     513                 :             :                               "id",     "sms",
+     514                 :             :                               "parent", context,
+     515                 :             :                               NULL);
+     516                 :             : 
+     517                 :           3 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     518                 :             :                                    actions,
+     519                 :             :                                    G_N_ELEMENTS (actions),
+     520                 :             :                                    plugin);
+     521                 :           3 :   valent_device_plugin_set_menu_action (plugin,
+     522                 :             :                                         "device.sms.messaging",
+     523                 :           3 :                                         _("Messaging"),
+     524                 :             :                                         "sms-symbolic");
+     525                 :             : 
+     526                 :           3 :   G_OBJECT_CLASS (valent_sms_plugin_parent_class)->constructed (object);
+     527                 :           3 : }
+     528                 :             : 
+     529                 :             : static void
+     530                 :           3 : valent_sms_plugin_finalize (GObject *object)
+     531                 :             : {
+     532                 :           3 :   ValentSmsPlugin *self = VALENT_SMS_PLUGIN (object);
+     533                 :             : 
+     534         [ -  + ]:           3 :   if (self->window)
+     535                 :           0 :     g_clear_pointer (&self->window, gtk_window_destroy);
+     536         [ -  + ]:           3 :   g_clear_object (&self->store);
+     537                 :             : 
+     538                 :           3 :   G_OBJECT_CLASS (valent_sms_plugin_parent_class)->finalize (object);
+     539                 :           3 : }
+     540                 :             : 
+     541                 :             : static void
+     542                 :           4 : valent_sms_plugin_class_init (ValentSmsPluginClass *klass)
+     543                 :             : {
+     544                 :           4 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     545                 :           4 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     546                 :           4 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     547                 :             : 
+     548                 :           4 :   object_class->finalize = valent_sms_plugin_finalize;
+     549                 :             : 
+     550                 :           4 :   object_class->constructed = valent_sms_plugin_constructed;
+     551                 :           4 :   plugin_class->handle_packet = valent_sms_plugin_handle_packet;
+     552                 :           4 :   plugin_class->update_state = valent_sms_plugin_update_state;
+     553                 :             : 
+     554                 :           4 :   vobject_class->destroy = valent_sms_plugin_destroy;
+     555                 :             : }
+     556                 :             : 
+     557                 :             : static void
+     558                 :           3 : valent_sms_plugin_init (ValentSmsPlugin *self)
+     559                 :             : {
+     560                 :           3 : }
+     561                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-plugin.h.func-c.html b/coverage/src/plugins/sms/valent-sms-plugin.h.func-c.html new file mode 100644 index 00000000000..14d71254882 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_PLUGIN29
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-plugin.h.func.html b/coverage/src/plugins/sms/valent-sms-plugin.h.func.html new file mode 100644 index 00000000000..2f5a70d04f8 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_PLUGIN29
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-plugin.h.gcov.html b/coverage/src/plugins/sms/valent-sms-plugin.h.gcov.html new file mode 100644 index 00000000000..893cb1b54ba --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SMS_PLUGIN (valent_sms_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          29 : G_DECLARE_FINAL_TYPE (ValentSmsPlugin, valent_sms_plugin, VALENT, SMS_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-store.c.func-c.html b/coverage/src/plugins/sms/valent-sms-store.c.func-c.html new file mode 100644 index 00000000000..41d36f4cd88 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-store.c.func-c.html @@ -0,0 +1,441 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-store.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.2 %559510
Test Date:2024-03-31 18:46:36Functions:98.0 %4948
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.3 %380191
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
task_closure_cancel0
find_messages_task1
remove_message_task1
remove_thread_task1
valent_sms_store_add_message1
valent_sms_store_find_messages1
valent_sms_store_find_messages_finish1
valent_sms_store_message_changed1
valent_sms_store_remove_message1
valent_sms_store_remove_message_finish1
valent_sms_store_remove_thread1
valent_sms_store_remove_thread_finish1
valent_sms_store_finalize2
get_summary_cb3
get_summary_task3
valent_sms_store_get_summary3
valent_sms_store_message_removed3
get_thread_date_task4
get_thread_items_task4
valent_sms_store_get_thread4
valent_sms_store_get_thread_date4
valent_sms_store_get_thread_items4
valent_sms_store_new4
valent_sms_store_add_messages_finish5
valent_sms_store_class_init5
get_message_task6
valent_sms_store_add_messages6
valent_sms_store_get_message6
valent_sms_store_get_message_finish6
add_messages_task7
valent_sms_store_close7
valent_sms_store_close_task7
valent_sms_store_constructed7
valent_sms_store_init7
valent_sms_store_open7
valent_sms_store_open_task7
valent_sms_store_thread7
valent_sms_store_destroy9
valent_sms_store_message_added13
valent_sms_store_set_message_step15
emit_change_main17
update_hook17
valent_sms_store_return_error_if_closed27
valent_sms_store_get_message_step30
valent_sms_store_push34
task_closure_free37
valent_sms_store_get_type152
valent_sms_store_class_intern_init5
valent_sms_store_get_type_once5
valent_sms_store_get_type142
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-store.c.func.html b/coverage/src/plugins/sms/valent-sms-store.c.func.html new file mode 100644 index 00000000000..273fc9752e3 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-store.c.func.html @@ -0,0 +1,441 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-store.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.2 %559510
Test Date:2024-03-31 18:46:36Functions:98.0 %4948
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.3 %380191
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
add_messages_task7
emit_change_main17
find_messages_task1
get_message_task6
get_summary_cb3
get_summary_task3
get_thread_date_task4
get_thread_items_task4
remove_message_task1
remove_thread_task1
task_closure_cancel0
task_closure_free37
update_hook17
valent_sms_store_add_message1
valent_sms_store_add_messages6
valent_sms_store_add_messages_finish5
valent_sms_store_class_init5
valent_sms_store_close7
valent_sms_store_close_task7
valent_sms_store_constructed7
valent_sms_store_destroy9
valent_sms_store_finalize2
valent_sms_store_find_messages1
valent_sms_store_find_messages_finish1
valent_sms_store_get_message6
valent_sms_store_get_message_finish6
valent_sms_store_get_message_step30
valent_sms_store_get_summary3
valent_sms_store_get_thread4
valent_sms_store_get_thread_date4
valent_sms_store_get_thread_items4
valent_sms_store_get_type152
valent_sms_store_class_intern_init5
valent_sms_store_get_type142
valent_sms_store_get_type_once5
valent_sms_store_init7
valent_sms_store_message_added13
valent_sms_store_message_changed1
valent_sms_store_message_removed3
valent_sms_store_new4
valent_sms_store_open7
valent_sms_store_open_task7
valent_sms_store_push34
valent_sms_store_remove_message1
valent_sms_store_remove_message_finish1
valent_sms_store_remove_thread1
valent_sms_store_remove_thread_finish1
valent_sms_store_return_error_if_closed27
valent_sms_store_set_message_step15
valent_sms_store_thread7
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-store.c.gcov.html b/coverage/src/plugins/sms/valent-sms-store.c.gcov.html new file mode 100644 index 00000000000..ff7bc857cf1 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-store.c.gcov.html @@ -0,0 +1,1656 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-store.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-store.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:91.2 %559510
Test Date:2024-03-31 18:46:36Functions:98.0 %4948
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.3 %380191
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sms-store"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <valent.h>
+      10                 :             : #include <sqlite3.h>
+      11                 :             : 
+      12                 :             : #include "valent-message.h"
+      13                 :             : #include "valent-message-thread.h"
+      14                 :             : #include "valent-sms-store.h"
+      15                 :             : #include "valent-sms-store-private.h"
+      16                 :             : 
+      17                 :             : /* Ensure that sqlite3_int64 is the same size as int64_t */
+      18                 :             : G_STATIC_ASSERT (sizeof (sqlite3_int64) == sizeof (int64_t));
+      19                 :             : 
+      20                 :             : struct _ValentSmsStore
+      21                 :             : {
+      22                 :             :   ValentContext    parent_instance;
+      23                 :             : 
+      24                 :             :   GAsyncQueue     *queue;
+      25                 :             :   sqlite3         *connection;
+      26                 :             :   char            *path;
+      27                 :             :   sqlite3_stmt    *stmts[9];
+      28                 :             : 
+      29                 :             :   GListStore      *summary;
+      30                 :             : };
+      31                 :             : 
+      32   [ +  +  +  - ]:         152 : G_DEFINE_FINAL_TYPE (ValentSmsStore, valent_sms_store, VALENT_TYPE_CONTEXT)
+      33                 :             : 
+      34                 :             : enum {
+      35                 :             :   MESSAGE_ADDED,
+      36                 :             :   MESSAGE_CHANGED,
+      37                 :             :   MESSAGE_REMOVED,
+      38                 :             :   N_SIGNALS
+      39                 :             : };
+      40                 :             : 
+      41                 :             : static guint signals[N_SIGNALS] = { 0, };
+      42                 :             : 
+      43                 :             : enum {
+      44                 :             :   STMT_ADD_MESSAGE,
+      45                 :             :   STMT_REMOVE_MESSAGE,
+      46                 :             :   STMT_REMOVE_THREAD,
+      47                 :             :   STMT_GET_MESSAGE,
+      48                 :             :   STMT_GET_THREAD,
+      49                 :             :   STMT_GET_THREAD_DATE,
+      50                 :             :   STMT_GET_THREAD_ITEMS,
+      51                 :             :   STMT_FIND_MESSAGES,
+      52                 :             :   STMT_GET_SUMMARY,
+      53                 :             :   N_STATEMENTS,
+      54                 :             : };
+      55                 :             : 
+      56                 :             : static char *statements[N_STATEMENTS] = { NULL, };
+      57                 :             : 
+      58                 :             : 
+      59                 :             : /*
+      60                 :             :  * Signal Emission Helpers
+      61                 :             :  */
+      62                 :             : typedef struct
+      63                 :             : {
+      64                 :             :   GRecMutex       mutex;
+      65                 :             :   GWeakRef        store;
+      66                 :             :   ValentMessage  *message;
+      67                 :             :   guint           signal_id;
+      68                 :             : } ChangeEmission;
+      69                 :             : 
+      70                 :             : static gboolean
+      71                 :          17 : emit_change_main (gpointer data)
+      72                 :             : {
+      73                 :          17 :   ChangeEmission *emission = data;
+      74                 :          34 :   g_autoptr (ValentSmsStore) store = NULL;
+      75                 :             : 
+      76         [ +  - ]:          17 :   g_assert (emission != NULL);
+      77                 :             : 
+      78                 :          17 :   g_rec_mutex_lock (&emission->mutex);
+      79         [ +  - ]:          17 :   if ((store = g_weak_ref_get (&emission->store)) != NULL)
+      80                 :             :     {
+      81                 :          17 :       g_signal_emit (G_OBJECT (store),
+      82                 :             :                      emission->signal_id, 0,
+      83                 :             :                      emission->message);
+      84                 :             :     }
+      85                 :             : 
+      86                 :          17 :   g_weak_ref_clear (&emission->store);
+      87         [ +  - ]:          17 :   g_clear_object (&emission->message);
+      88                 :          17 :   g_rec_mutex_unlock (&emission->mutex);
+      89                 :          17 :   g_rec_mutex_clear (&emission->mutex);
+      90                 :          17 :   g_clear_pointer (&emission, g_free);
+      91                 :             : 
+      92         [ +  - ]:          17 :   return G_SOURCE_REMOVE;
+      93                 :             : }
+      94                 :             : 
+      95                 :             : 
+      96                 :             : /*
+      97                 :             :  * sqlite Threading Helpers
+      98                 :             :  */
+      99                 :             : enum {
+     100                 :             :   TASK_DEFAULT,
+     101                 :             :   TASK_CRITICAL,
+     102                 :             :   TASK_TERMINAL,
+     103                 :             : };
+     104                 :             : 
+     105                 :             : typedef struct
+     106                 :             : {
+     107                 :             :   GTask           *task;
+     108                 :             :   GTaskThreadFunc  task_func;
+     109                 :             :   unsigned int     task_mode;
+     110                 :             : } TaskClosure;
+     111                 :             : 
+     112                 :             : static void
+     113                 :          37 : task_closure_free (gpointer data)
+     114                 :             : {
+     115                 :          74 :   g_autofree TaskClosure *closure = data;
+     116                 :             : 
+     117         [ +  - ]:          37 :   g_clear_object (&closure->task);
+     118                 :          37 :   g_clear_pointer (&closure, g_free);
+     119                 :          37 : }
+     120                 :             : 
+     121                 :             : static void
+     122                 :           0 : task_closure_cancel (gpointer data)
+     123                 :             : {
+     124                 :           0 :   g_autofree TaskClosure *closure = data;
+     125                 :             : 
+     126   [ #  #  #  #  :           0 :   if (G_IS_TASK (closure->task) && !g_task_get_completed (closure->task))
+          #  #  #  #  #  
+                      # ]
+     127                 :             :     {
+     128                 :           0 :       g_task_return_new_error (closure->task,
+     129                 :             :                                G_IO_ERROR,
+     130                 :             :                                G_IO_ERROR_CANCELLED,
+     131                 :             :                                "Operation cancelled");
+     132                 :             :     }
+     133                 :             : 
+     134                 :           0 :   g_clear_pointer (&closure, task_closure_free);
+     135                 :           0 : }
+     136                 :             : 
+     137                 :             : static gpointer
+     138                 :           7 : valent_sms_store_thread (gpointer data)
+     139                 :             : {
+     140                 :          10 :   g_autoptr (GAsyncQueue) tasks = data;
+     141                 :           7 :   TaskClosure *closure = NULL;
+     142                 :             : 
+     143         [ +  - ]:          41 :   while ((closure = g_async_queue_pop (tasks)))
+     144                 :             :     {
+     145                 :          41 :       unsigned int mode = closure->task_mode;
+     146                 :             : 
+     147   [ -  +  +  -  :          41 :       if (G_IS_TASK (closure->task) && !g_task_get_completed (closure->task))
+          -  +  -  -  -  
+                      + ]
+     148                 :             :         {
+     149                 :          41 :           closure->task_func (closure->task,
+     150                 :             :                               g_task_get_source_object (closure->task),
+     151                 :             :                               g_task_get_task_data (closure->task),
+     152                 :             :                               g_task_get_cancellable (closure->task));
+     153                 :             : 
+     154   [ +  -  -  - ]:          37 :           if (mode == TASK_CRITICAL && g_task_had_error (closure->task))
+     155                 :             :             mode = TASK_TERMINAL;
+     156                 :             :         }
+     157                 :             : 
+     158                 :          37 :       g_clear_pointer (&closure, task_closure_free);
+     159                 :             : 
+     160         [ +  + ]:          37 :       if (mode == TASK_TERMINAL)
+     161                 :             :         break;
+     162                 :             :     }
+     163                 :             : 
+     164                 :             :   /* Cancel any queued tasks */
+     165                 :           3 :   g_async_queue_lock (tasks);
+     166                 :             : 
+     167         [ -  + ]:           6 :   while ((closure = g_async_queue_try_pop_unlocked (tasks)) != NULL)
+     168                 :           3 :     g_clear_pointer (&closure, task_closure_cancel);
+     169                 :             : 
+     170                 :           3 :   g_async_queue_unlock (tasks);
+     171                 :             : 
+     172         [ +  - ]:           3 :   return NULL;
+     173                 :             : }
+     174                 :             : 
+     175                 :             : /*
+     176                 :             :  * Step functions
+     177                 :             :  */
+     178                 :             : static inline ValentMessage *
+     179                 :          30 : valent_sms_store_get_message_step (sqlite3_stmt  *stmt,
+     180                 :             :                                    GError       **error)
+     181                 :             : {
+     182                 :          60 :   g_autoptr (GVariant) metadata = NULL;
+     183                 :          30 :   const char *metadata_str;
+     184                 :          30 :   int rc;
+     185                 :             : 
+     186         [ +  - ]:          30 :   g_assert (stmt != NULL);
+     187   [ +  -  -  + ]:          30 :   g_assert (error == NULL || *error == NULL);
+     188                 :             : 
+     189         [ +  + ]:          30 :   if ((rc = sqlite3_step (stmt)) == SQLITE_DONE)
+     190                 :             :     return NULL;
+     191                 :             : 
+     192         [ -  + ]:          25 :   if (rc != SQLITE_ROW)
+     193                 :             :     {
+     194                 :           0 :       g_set_error (error,
+     195                 :             :                    G_IO_ERROR,
+     196                 :             :                    G_IO_ERROR_FAILED,
+     197                 :             :                    "%s: %s", G_STRFUNC, sqlite3_errstr (rc));
+     198                 :           0 :       return NULL;
+     199                 :             :     }
+     200                 :             : 
+     201         [ +  - ]:          25 :   if ((metadata_str = (const char *)sqlite3_column_text (stmt, 3)) != NULL)
+     202                 :          25 :     metadata = g_variant_parse (NULL, metadata_str, NULL, NULL, NULL);
+     203                 :             : 
+     204                 :          25 :   return g_object_new (VALENT_TYPE_MESSAGE,
+     205                 :             :                        "box",       sqlite3_column_int (stmt, 0),
+     206                 :             :                        "date",      sqlite3_column_int64 (stmt, 1),
+     207                 :             :                        "id",        sqlite3_column_int64 (stmt, 2),
+     208                 :             :                        "metadata",  metadata,
+     209                 :             :                        "read",      sqlite3_column_int (stmt, 4),
+     210                 :             :                        "sender",    sqlite3_column_text (stmt, 5),
+     211                 :             :                        "text",      sqlite3_column_text (stmt, 6),
+     212                 :             :                        "thread_id", sqlite3_column_int64 (stmt, 7),
+     213                 :             :                        NULL);
+     214                 :             : }
+     215                 :             : 
+     216                 :             : static inline gboolean
+     217                 :          15 : valent_sms_store_set_message_step (sqlite3_stmt   *stmt,
+     218                 :             :                                    ValentMessage  *message,
+     219                 :             :                                    GError        **error)
+     220                 :             : {
+     221                 :          15 :   int rc;
+     222                 :          15 :   ValentMessageBox box;
+     223                 :          15 :   int64_t date;
+     224                 :          15 :   int64_t id;
+     225                 :          15 :   GVariant *metadata;
+     226                 :          15 :   gboolean read;
+     227                 :          15 :   const char *sender;
+     228                 :          15 :   const char *text;
+     229                 :          15 :   int64_t thread_id;
+     230                 :          30 :   g_autofree char *metadata_str = NULL;
+     231                 :             : 
+     232                 :             :   /* Extract the message data */
+     233                 :          15 :   box = valent_message_get_box (message);
+     234                 :          15 :   date = valent_message_get_date (message);
+     235                 :          15 :   id = valent_message_get_id (message);
+     236                 :          15 :   metadata = valent_message_get_metadata (message);
+     237                 :          15 :   read = valent_message_get_read (message);
+     238                 :          15 :   sender = valent_message_get_sender (message);
+     239                 :          15 :   text = valent_message_get_text (message);
+     240                 :          15 :   thread_id = valent_message_get_thread_id (message);
+     241                 :             : 
+     242         [ +  - ]:          15 :   if (metadata != NULL)
+     243                 :          15 :     metadata_str = g_variant_print (metadata, TRUE);
+     244                 :             : 
+     245                 :             :   /* Bind the message data */
+     246                 :          15 :   sqlite3_bind_int (stmt, 1, box);
+     247                 :          15 :   sqlite3_bind_int64 (stmt, 2, date);
+     248                 :          15 :   sqlite3_bind_int64 (stmt, 3, id);
+     249                 :          15 :   sqlite3_bind_text (stmt, 4, metadata_str, -1, NULL);
+     250                 :          15 :   sqlite3_bind_int (stmt, 5, read);
+     251                 :          15 :   sqlite3_bind_text (stmt, 6, sender, -1, NULL);
+     252                 :          15 :   sqlite3_bind_text (stmt, 7, text, -1, NULL);
+     253                 :          15 :   sqlite3_bind_int64 (stmt, 8, thread_id);
+     254                 :             : 
+     255                 :             :   /* Execute and auto-reset */
+     256         [ +  + ]:          15 :   if ((rc = sqlite3_step (stmt)) != SQLITE_DONE)
+     257                 :             :     {
+     258                 :           2 :       g_set_error (error,
+     259                 :             :                    G_IO_ERROR,
+     260                 :             :                    G_IO_ERROR_FAILED,
+     261                 :             :                    "%s: %s", G_STRFUNC, sqlite3_errstr (rc));
+     262                 :           2 :       sqlite3_reset (stmt);
+     263                 :           2 :       return FALSE;
+     264                 :             :     }
+     265                 :             : 
+     266                 :          13 :   sqlite3_reset (stmt);
+     267                 :          13 :   return TRUE;
+     268                 :             : }
+     269                 :             : 
+     270                 :             : static gboolean
+     271                 :          27 : valent_sms_store_return_error_if_closed (GTask          *task,
+     272                 :             :                                          ValentSmsStore *self)
+     273                 :             : {
+     274   [ +  -  +  -  :          27 :   g_assert (G_IS_TASK (task));
+             -  +  -  - ]
+     275         [ -  + ]:          27 :   g_assert (VALENT_IS_SMS_STORE (self));
+     276                 :             : 
+     277         [ -  + ]:          27 :   if G_UNLIKELY (self->connection == NULL)
+     278                 :             :     {
+     279                 :           0 :       g_task_return_new_error (task,
+     280                 :             :                                G_IO_ERROR,
+     281                 :             :                                G_IO_ERROR_CONNECTION_CLOSED,
+     282                 :             :                                "Database connection closed");
+     283                 :           0 :       return TRUE;
+     284                 :             :     }
+     285                 :             : 
+     286                 :             :   return FALSE;
+     287                 :             : }
+     288                 :             : 
+     289                 :             : 
+     290                 :             : /*
+     291                 :             :  * Database Hooks
+     292                 :             :  */
+     293                 :             : static void
+     294                 :          17 : update_hook (gpointer       user_data,
+     295                 :             :              int            event,
+     296                 :             :              char const    *database,
+     297                 :             :              char const    *table,
+     298                 :             :              sqlite3_int64  rowid)
+     299                 :             : {
+     300                 :          17 :   ValentSmsStore *self = VALENT_SMS_STORE (user_data);
+     301                 :          17 :   sqlite3_stmt *stmt = self->stmts[STMT_GET_MESSAGE];
+     302                 :          17 :   g_autoptr (ValentMessage) message = NULL;
+     303   [ +  -  -  - ]:          17 :   g_autoptr (GError) error = NULL;
+     304                 :             : 
+     305         [ +  - ]:          17 :   g_assert (VALENT_IS_SMS_STORE (self));
+     306         [ -  + ]:          17 :   g_assert (!VALENT_IS_MAIN_THREAD ());
+     307                 :             : 
+     308         [ +  - ]:          17 :   if G_UNLIKELY (g_strcmp0 (table, "message") != 0)
+     309                 :             :     return;
+     310                 :             : 
+     311         [ +  + ]:          17 :   if (event != SQLITE_DELETE)
+     312                 :             :     {
+     313                 :          14 :       sqlite3_bind_int64 (stmt, 1, rowid);
+     314                 :          14 :       message = valent_sms_store_get_message_step (stmt, &error);
+     315                 :          14 :       sqlite3_reset (stmt);
+     316                 :             :     }
+     317                 :             : 
+     318         [ +  - ]:          17 :   if G_UNLIKELY (error != NULL)
+     319                 :             :     {
+     320                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     321                 :           0 :       return;
+     322                 :             :     }
+     323                 :             : 
+     324                 :             :   /* Fallback to using a message skeleton */
+     325         [ +  + ]:          17 :   if (message == NULL)
+     326                 :             :     {
+     327                 :           4 :       message = g_object_new (VALENT_TYPE_MESSAGE,
+     328                 :             :                               "id", rowid,
+     329                 :             :                               NULL);
+     330                 :             :     }
+     331                 :             : 
+     332   [ +  +  +  - ]:          17 :   switch (event)
+     333                 :             :     {
+     334                 :          13 :     case SQLITE_INSERT:
+     335                 :          13 :       valent_sms_store_message_added (self, message);
+     336                 :          13 :       break;
+     337                 :             : 
+     338                 :           1 :     case SQLITE_UPDATE:
+     339                 :           1 :       valent_sms_store_message_changed (self, message);
+     340                 :           1 :       break;
+     341                 :             : 
+     342                 :           3 :     case SQLITE_DELETE:
+     343                 :           3 :       valent_sms_store_message_removed (self, message);
+     344                 :           3 :       break;
+     345                 :             :     }
+     346                 :             : }
+     347                 :             : 
+     348                 :             : 
+     349                 :             : /*
+     350                 :             :  * ValentSmsStore Tasks
+     351                 :             :  */
+     352                 :             : static void
+     353                 :           7 : valent_sms_store_open_task (GTask        *task,
+     354                 :             :                             gpointer      source_object,
+     355                 :             :                             gpointer      task_data,
+     356                 :             :                             GCancellable *cancellable)
+     357                 :             : {
+     358                 :           7 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     359                 :           7 :   const char *path = task_data;
+     360                 :           7 :   int rc;
+     361                 :             : 
+     362         [ +  - ]:           7 :   if (g_task_return_error_if_cancelled (task))
+     363                 :             :     return;
+     364                 :             : 
+     365         [ -  + ]:           7 :   if (self->connection != NULL)
+     366                 :           0 :     return g_task_return_boolean (task, TRUE);
+     367                 :             : 
+     368                 :             :   /* Pass NOMUTEX since concurrency is managed by the GMutex*/
+     369                 :           7 :   rc = sqlite3_open_v2 (path,
+     370                 :             :                         &self->connection,
+     371                 :             :                         (SQLITE_OPEN_READWRITE |
+     372                 :             :                          SQLITE_OPEN_CREATE |
+     373                 :             :                          SQLITE_OPEN_NOMUTEX),
+     374                 :             :                         NULL);
+     375                 :             : 
+     376         [ -  + ]:           7 :   if (rc != SQLITE_OK)
+     377                 :             :     {
+     378                 :           0 :       g_task_return_new_error (task,
+     379                 :             :                                G_IO_ERROR,
+     380                 :             :                                G_IO_ERROR_FAILED,
+     381                 :             :                                "sqlite3_open_v2(): \"%s\": [%i] %s",
+     382                 :             :                                path, rc, sqlite3_errstr (rc));
+     383         [ #  # ]:           0 :       g_clear_pointer (&self->connection, sqlite3_close);
+     384                 :           0 :       return;
+     385                 :             :     }
+     386                 :             : 
+     387                 :             :   /* Prepare the tables */
+     388                 :           7 :   rc = sqlite3_exec (self->connection,
+     389                 :             :                      MESSAGE_TABLE_SQL,
+     390                 :             :                      NULL,
+     391                 :             :                      NULL,
+     392                 :             :                      NULL);
+     393                 :             : 
+     394         [ -  + ]:           7 :   if (rc != SQLITE_OK)
+     395                 :             :     {
+     396                 :           0 :       g_task_return_new_error (task,
+     397                 :             :                                G_IO_ERROR,
+     398                 :             :                                G_IO_ERROR_FAILED,
+     399                 :             :                                "sqlite3_prepare_v2(): [%i] \"message\" Table: %s",
+     400                 :             :                                rc, sqlite3_errstr (rc));
+     401         [ #  # ]:           0 :       g_clear_pointer (&self->connection, sqlite3_close);
+     402                 :           0 :       return;
+     403                 :             :     }
+     404                 :             : 
+     405                 :             :   /* Prepare the statements */
+     406         [ +  + ]:          70 :   for (unsigned int i = 0; i < N_STATEMENTS; i++)
+     407                 :             :     {
+     408                 :          63 :       sqlite3_stmt *stmt = NULL;
+     409                 :          63 :       const char *sql = statements[i];
+     410                 :             : 
+     411                 :          63 :       rc = sqlite3_prepare_v2 (self->connection, sql, -1, &stmt, NULL);
+     412                 :             : 
+     413         [ -  + ]:          63 :       if (rc != SQLITE_OK)
+     414                 :             :         {
+     415                 :           0 :           g_task_return_new_error (task,
+     416                 :             :                                    G_IO_ERROR,
+     417                 :             :                                    G_IO_ERROR_FAILED,
+     418                 :             :                                    "sqlite3_prepare_v2(): \"%s\": [%i] %s",
+     419                 :             :                                    sql, rc, sqlite3_errstr (rc));
+     420         [ #  # ]:           0 :           g_clear_pointer (&self->connection, sqlite3_close);
+     421                 :           0 :           return;
+     422                 :             :         }
+     423                 :             : 
+     424                 :          63 :       self->stmts[i] = g_steal_pointer (&stmt);
+     425                 :             :     }
+     426                 :             : 
+     427                 :             :   /* Connect the hooks */
+     428                 :           7 :   sqlite3_update_hook (self->connection, update_hook, self);
+     429                 :             : 
+     430                 :           7 :   g_task_return_boolean (task, TRUE);
+     431                 :             : }
+     432                 :             : 
+     433                 :             : static void
+     434                 :           7 : valent_sms_store_close_task (GTask        *task,
+     435                 :             :                              gpointer      source_object,
+     436                 :             :                              gpointer      task_data,
+     437                 :             :                              GCancellable *cancellable)
+     438                 :             : {
+     439                 :           7 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     440                 :           7 :   int rc;
+     441                 :             : 
+     442         [ +  - ]:           7 :   if (g_task_return_error_if_cancelled (task))
+     443                 :             :     return;
+     444                 :             : 
+     445         [ -  + ]:           7 :   if (self->connection == NULL)
+     446                 :           0 :     return g_task_return_boolean (task, TRUE);
+     447                 :             : 
+     448                 :             :   /* Cleanup cached statements */
+     449         [ +  + ]:          70 :   for (unsigned int i = 0; i < N_STATEMENTS; i++)
+     450         [ +  - ]:          63 :     g_clear_pointer (&self->stmts[i], sqlite3_finalize);
+     451                 :             : 
+     452                 :             :   /* Optimize the database before closing.
+     453                 :             :    *
+     454                 :             :    * See:
+     455                 :             :    *   https://www.sqlite.org/pragma.html#pragma_optimize
+     456                 :             :    *   https://www.sqlite.org/queryplanner-ng.html#update_2017_a_better_fix
+     457                 :             :    */
+     458                 :           7 :   rc = sqlite3_exec (self->connection, "PRAGMA optimize;", NULL, NULL, NULL);
+     459                 :             : 
+     460         [ +  + ]:           4 :   if (rc != SQLITE_OK)
+     461                 :             :     {
+     462                 :           3 :       g_debug ("sqlite3_exec(): \"%s\": [%i] %s",
+     463                 :             :                "PRAGMA optimize;", rc, sqlite3_errstr (rc));
+     464                 :             :     }
+     465                 :             : 
+     466                 :             :   /* Close the connection */
+     467         [ -  + ]:           4 :   if ((rc = sqlite3_close (self->connection)) != SQLITE_OK)
+     468                 :             :     {
+     469                 :           0 :       g_task_return_new_error (task,
+     470                 :             :                                G_IO_ERROR,
+     471                 :             :                                G_IO_ERROR_FAILED,
+     472                 :             :                                "sqlite3_close(): [%i] %s",
+     473                 :             :                                rc, sqlite3_errstr (rc));
+     474                 :           0 :       return;
+     475                 :             :     }
+     476                 :             : 
+     477                 :           3 :   self->connection = NULL;
+     478                 :           3 :   g_task_return_boolean (task, TRUE);
+     479                 :             : }
+     480                 :             : 
+     481                 :             : static void
+     482                 :           7 : add_messages_task (GTask        *task,
+     483                 :             :                    gpointer      source_object,
+     484                 :             :                    gpointer      task_data,
+     485                 :             :                    GCancellable *cancellable)
+     486                 :             : {
+     487                 :           7 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     488                 :           7 :   GPtrArray *messages = task_data;
+     489                 :           7 :   sqlite3_stmt *stmt = self->stmts[STMT_ADD_MESSAGE];
+     490                 :           7 :   unsigned int n_messages = messages->len;
+     491                 :           7 :   GError *error = NULL;
+     492                 :             : 
+     493         [ +  - ]:           7 :   if (g_task_return_error_if_cancelled (task))
+     494                 :           2 :     return;
+     495                 :             : 
+     496         [ +  - ]:           7 :   if (valent_sms_store_return_error_if_closed (task, self))
+     497                 :             :     return;
+     498                 :             : 
+     499         [ +  + ]:          20 :   for (unsigned int i = 0; i < n_messages; i++)
+     500                 :             :     {
+     501                 :          15 :       ValentMessage *message = g_ptr_array_index (messages, i);
+     502                 :             : 
+     503                 :             :       /* Iterate the results stopping on error to mark the point of failure */
+     504         [ +  + ]:          15 :       if (!valent_sms_store_set_message_step (stmt, message, &error))
+     505                 :             :         {
+     506                 :             :           n_messages = i;
+     507                 :             :           break;
+     508                 :             :         }
+     509                 :             :     }
+     510                 :             : 
+     511                 :             :   /* Truncate the input on failure, since we'll be emitting signals */
+     512         [ +  + ]:           7 :   if (n_messages < messages->len)
+     513                 :           2 :     g_ptr_array_remove_range (messages, n_messages, messages->len - n_messages);
+     514                 :             : 
+     515         [ +  + ]:           7 :   if (error != NULL)
+     516                 :           2 :     return g_task_return_error (task, error);
+     517                 :             : 
+     518                 :           5 :   g_task_return_boolean (task, TRUE);
+     519                 :             : }
+     520                 :             : 
+     521                 :             : static void
+     522                 :           1 : remove_message_task (GTask        *task,
+     523                 :             :                      gpointer      source_object,
+     524                 :             :                      gpointer      task_data,
+     525                 :             :                      GCancellable *cancellable)
+     526                 :             : {
+     527                 :           1 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     528                 :           1 :   int64_t *message_id = task_data;
+     529                 :           1 :   sqlite3_stmt *stmt = self->stmts[STMT_REMOVE_MESSAGE];
+     530                 :           1 :   int rc;
+     531                 :             : 
+     532         [ +  - ]:           1 :   if (g_task_return_error_if_cancelled (task))
+     533                 :             :     return;
+     534                 :             : 
+     535         [ +  - ]:           1 :   if (valent_sms_store_return_error_if_closed (task, self))
+     536                 :             :     return;
+     537                 :             : 
+     538                 :           1 :   sqlite3_bind_int64 (stmt, 1, *message_id);
+     539                 :           1 :   rc = sqlite3_step (stmt);
+     540                 :           1 :   sqlite3_reset (stmt);
+     541                 :             : 
+     542         [ +  - ]:           1 :   if (rc == SQLITE_DONE || rc == SQLITE_OK)
+     543                 :           1 :     return g_task_return_boolean (task, TRUE);
+     544                 :             : 
+     545                 :           0 :   return g_task_return_new_error (task,
+     546                 :             :                                   G_IO_ERROR,
+     547                 :             :                                   G_IO_ERROR_FAILED,
+     548                 :             :                                   "%s: %s",
+     549                 :             :                                   G_STRFUNC, sqlite3_errstr (rc));
+     550                 :             : }
+     551                 :             : 
+     552                 :             : static void
+     553                 :           1 : remove_thread_task (GTask        *task,
+     554                 :             :                       gpointer      source_object,
+     555                 :             :                       gpointer      task_data,
+     556                 :             :                       GCancellable *cancellable)
+     557                 :             : {
+     558                 :           1 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     559                 :           1 :   int64_t *thread_id = task_data;
+     560                 :           1 :   sqlite3_stmt *stmt = self->stmts[STMT_REMOVE_THREAD];
+     561                 :           1 :   int rc;
+     562                 :             : 
+     563         [ +  - ]:           1 :   if (g_task_return_error_if_cancelled (task))
+     564                 :             :     return;
+     565                 :             : 
+     566         [ +  - ]:           1 :   if (valent_sms_store_return_error_if_closed (task, self))
+     567                 :             :     return;
+     568                 :             : 
+     569                 :           1 :   sqlite3_bind_int64 (stmt, 1, *thread_id);
+     570                 :           1 :   rc = sqlite3_step (stmt);
+     571                 :           1 :   sqlite3_reset (stmt);
+     572                 :             : 
+     573         [ +  - ]:           1 :   if (rc == SQLITE_DONE || rc == SQLITE_OK)
+     574                 :           1 :     return g_task_return_boolean (task, TRUE);
+     575                 :             : 
+     576                 :           0 :   return g_task_return_new_error (task,
+     577                 :             :                                   G_IO_ERROR,
+     578                 :             :                                   G_IO_ERROR_FAILED,
+     579                 :             :                                   "%s: %s",
+     580                 :             :                                   G_STRFUNC, sqlite3_errstr (rc));
+     581                 :             : }
+     582                 :             : 
+     583                 :             : static void
+     584                 :           1 : find_messages_task (GTask        *task,
+     585                 :             :                     gpointer      source_object,
+     586                 :             :                     gpointer      task_data,
+     587                 :             :                     GCancellable *cancellable)
+     588                 :             : {
+     589                 :           1 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     590                 :           1 :   const char *query = task_data;
+     591                 :           1 :   sqlite3_stmt *stmt = self->stmts[STMT_FIND_MESSAGES];
+     592                 :           1 :   g_autoptr (GPtrArray) messages = NULL;
+     593         [ -  - ]:           1 :   g_autofree char *query_param = NULL;
+     594                 :           1 :   ValentMessage *message;
+     595                 :           1 :   GError *error = NULL;
+     596                 :             : 
+     597         [ +  - ]:           1 :   if (g_task_return_error_if_cancelled (task))
+     598                 :             :     return;
+     599                 :             : 
+     600         [ +  - ]:           1 :   if (valent_sms_store_return_error_if_closed (task, self))
+     601                 :             :     return;
+     602                 :             : 
+     603                 :             :   // NOTE: escaped percent signs (%%) are query wildcards (%)
+     604                 :           1 :   query_param = g_strdup_printf ("%%%s%%", query);
+     605                 :           1 :   sqlite3_bind_text (stmt, 1, query_param, -1, NULL);
+     606                 :             : 
+     607                 :             :   /* Collect the results */
+     608                 :           1 :   messages = g_ptr_array_new_with_free_func (g_object_unref);
+     609                 :             : 
+     610         [ +  + ]:           3 :   while ((message = valent_sms_store_get_message_step (stmt, &error)))
+     611                 :           2 :     g_ptr_array_add (messages, message);
+     612                 :           1 :   sqlite3_reset (stmt);
+     613                 :             : 
+     614         [ -  + ]:           1 :   if (error != NULL)
+     615                 :           0 :     return g_task_return_error (task, error);
+     616                 :             : 
+     617                 :           1 :   g_task_return_pointer (task,
+     618                 :             :                          g_steal_pointer (&messages),
+     619                 :             :                          (GDestroyNotify)g_ptr_array_unref);
+     620                 :             : }
+     621                 :             : 
+     622                 :             : static void
+     623                 :           6 : get_message_task (GTask        *task,
+     624                 :             :                   gpointer      source_object,
+     625                 :             :                   gpointer      task_data,
+     626                 :             :                   GCancellable *cancellable)
+     627                 :             : {
+     628                 :           6 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     629                 :           6 :   int64_t *message_id = task_data;
+     630                 :           6 :   sqlite3_stmt *stmt = self->stmts[STMT_GET_MESSAGE];
+     631                 :           6 :   g_autoptr (ValentMessage) message = NULL;
+     632                 :           6 :   GError *error = NULL;
+     633                 :             : 
+     634         [ +  - ]:           6 :   if (g_task_return_error_if_cancelled (task))
+     635                 :             :     return;
+     636                 :             : 
+     637         [ +  - ]:           6 :   if (valent_sms_store_return_error_if_closed (task, self))
+     638                 :             :     return;
+     639                 :             : 
+     640                 :           6 :   sqlite3_bind_int64 (stmt, 1, *message_id);
+     641                 :           6 :   message = valent_sms_store_get_message_step (stmt, &error);
+     642                 :           6 :   sqlite3_reset (stmt);
+     643                 :             : 
+     644         [ -  + ]:           6 :   if (error != NULL)
+     645                 :           0 :     return g_task_return_error (task, error);
+     646                 :             : 
+     647                 :           6 :   g_task_return_pointer (task, g_steal_pointer (&message), g_object_unref);
+     648                 :             : }
+     649                 :             : 
+     650                 :             : static void
+     651                 :           3 : get_summary_cb (ValentSmsStore *self,
+     652                 :             :                 GAsyncResult   *result,
+     653                 :             :                 gpointer        user_data)
+     654                 :             : {
+     655                 :           3 :   g_autoptr (GPtrArray) messages = NULL;
+     656                 :           3 :   g_autoptr (GError) error = NULL;
+     657                 :             : 
+     658         [ -  + ]:           3 :   if ((messages = g_task_propagate_pointer (G_TASK (result), &error)) == NULL)
+     659                 :             :     {
+     660                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     661         [ #  # ]:           0 :       return;
+     662                 :             :     }
+     663                 :             : 
+     664         [ -  + ]:           3 :   g_list_store_splice (self->summary, 0, 0, messages->pdata, messages->len);
+     665                 :             : }
+     666                 :             : 
+     667                 :             : static void
+     668                 :           3 : get_summary_task (GTask        *task,
+     669                 :             :                   gpointer      source_object,
+     670                 :             :                   gpointer      task_data,
+     671                 :             :                   GCancellable *cancellable)
+     672                 :             : {
+     673                 :           3 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     674                 :           3 :   sqlite3_stmt *stmt = self->stmts[STMT_GET_SUMMARY];
+     675                 :           3 :   g_autoptr (GPtrArray) messages = NULL;
+     676                 :           3 :   ValentMessage *message;
+     677                 :           3 :   GError *error = NULL;
+     678                 :             : 
+     679         [ +  - ]:           3 :   if (g_task_return_error_if_cancelled (task))
+     680                 :             :     return;
+     681                 :             : 
+     682         [ +  - ]:           3 :   if (valent_sms_store_return_error_if_closed (task, self))
+     683                 :             :     return;
+     684                 :             : 
+     685                 :             :   /* Collect the results */
+     686                 :           3 :   messages = g_ptr_array_new_with_free_func (g_object_unref);
+     687                 :             : 
+     688         [ +  + ]:           7 :   while ((message = valent_sms_store_get_message_step (stmt, &error)))
+     689                 :           4 :     g_ptr_array_add (messages, message);
+     690                 :           3 :   sqlite3_reset (stmt);
+     691                 :             : 
+     692         [ -  + ]:           3 :   if (error != NULL)
+     693                 :           0 :     return g_task_return_error (task, error);
+     694                 :             : 
+     695                 :           3 :   g_task_return_pointer (task,
+     696                 :             :                          g_steal_pointer (&messages),
+     697                 :             :                          (GDestroyNotify)g_ptr_array_unref);
+     698                 :             : }
+     699                 :             : 
+     700                 :             : static void
+     701                 :           4 : get_thread_date_task (GTask        *task,
+     702                 :             :                       gpointer      source_object,
+     703                 :             :                       gpointer      task_data,
+     704                 :             :                       GCancellable *cancellable)
+     705                 :             : {
+     706                 :           4 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     707                 :           4 :   int64_t *thread_id = task_data;
+     708                 :           4 :   sqlite3_stmt *stmt = self->stmts[STMT_GET_THREAD_DATE];
+     709                 :           4 :   int64_t date = 0;
+     710                 :           4 :   int rc;
+     711                 :             : 
+     712         [ +  - ]:           4 :   if (g_task_return_error_if_cancelled (task))
+     713                 :             :     return;
+     714                 :             : 
+     715         [ +  - ]:           4 :   if (valent_sms_store_return_error_if_closed (task, self))
+     716                 :             :     return;
+     717                 :             : 
+     718                 :           4 :   sqlite3_bind_int64 (stmt, 1, *thread_id);
+     719                 :             : 
+     720         [ +  + ]:           4 :   if ((rc = sqlite3_step (stmt)) == SQLITE_ROW)
+     721                 :           2 :     date = sqlite3_column_int64 (stmt, 0);
+     722                 :             : 
+     723                 :           4 :   sqlite3_reset (stmt);
+     724                 :             : 
+     725         [ -  + ]:           4 :   if (rc != SQLITE_DONE && rc != SQLITE_ROW)
+     726                 :             :     {
+     727                 :           0 :       g_task_return_new_error (task,
+     728                 :             :                                G_IO_ERROR,
+     729                 :             :                                G_IO_ERROR_FAILED,
+     730                 :             :                                "%s: %s",
+     731                 :             :                                G_STRFUNC, sqlite3_errstr (rc));
+     732                 :           0 :       return;
+     733                 :             :     }
+     734                 :             : 
+     735                 :           4 :   g_task_return_int (task, date);
+     736                 :             : }
+     737                 :             : 
+     738                 :             : static void
+     739                 :           4 : get_thread_items_task (GTask        *task,
+     740                 :             :                        gpointer      source_object,
+     741                 :             :                        gpointer      task_data,
+     742                 :             :                        GCancellable *cancellable)
+     743                 :             : {
+     744                 :           4 :   ValentSmsStore *self = VALENT_SMS_STORE (source_object);
+     745                 :           4 :   int64_t *thread_id = task_data;
+     746                 :           4 :   sqlite3_stmt *stmt = self->stmts[STMT_GET_THREAD_ITEMS];
+     747                 :           4 :   g_autoptr (GPtrArray) messages = NULL;
+     748                 :           4 :   int rc;
+     749                 :             : 
+     750         [ +  - ]:           4 :   if (g_task_return_error_if_cancelled (task))
+     751                 :             :     return;
+     752                 :             : 
+     753         [ +  - ]:           4 :   if (valent_sms_store_return_error_if_closed (task, self))
+     754                 :             :     return;
+     755                 :             : 
+     756                 :           4 :   messages = g_ptr_array_new_with_free_func (g_object_unref);
+     757                 :           4 :   sqlite3_bind_int64 (stmt, 1, *thread_id);
+     758                 :             : 
+     759         [ +  + ]:          12 :   while ((rc = sqlite3_step (stmt)) == SQLITE_ROW)
+     760                 :             :     {
+     761                 :           8 :       ValentMessage *message;
+     762                 :             : 
+     763                 :           8 :       message = g_object_new (VALENT_TYPE_MESSAGE,
+     764                 :             :                               "date",      sqlite3_column_int64 (stmt, 0),
+     765                 :             :                               "id",        sqlite3_column_int64 (stmt, 1),
+     766                 :             :                               "sender",    sqlite3_column_text (stmt, 2),
+     767                 :             :                               "thread-id", *thread_id,
+     768                 :             :                               NULL);
+     769                 :           8 :       g_ptr_array_add (messages, message);
+     770                 :             :     }
+     771                 :             : 
+     772                 :           4 :   sqlite3_reset (stmt);
+     773                 :             : 
+     774         [ -  + ]:           4 :   if (rc != SQLITE_DONE && rc != SQLITE_ROW)
+     775                 :             :     {
+     776                 :           0 :       g_task_return_new_error (task,
+     777                 :             :                                G_IO_ERROR,
+     778                 :             :                                G_IO_ERROR_FAILED,
+     779                 :             :                                "%s: %s",
+     780                 :             :                                G_STRFUNC, sqlite3_errstr (rc));
+     781         [ #  # ]:           0 :       return;
+     782                 :             :     }
+     783                 :             : 
+     784                 :           4 :   g_task_return_pointer (task,
+     785                 :             :                          g_steal_pointer (&messages),
+     786                 :             :                          (GDestroyNotify)g_ptr_array_unref);
+     787                 :             : }
+     788                 :             : 
+     789                 :             : 
+     790                 :             : /*
+     791                 :             :  * Private
+     792                 :             :  */
+     793                 :             : static inline void
+     794                 :          34 : valent_sms_store_push (ValentSmsStore  *self,
+     795                 :             :                        GTask           *task,
+     796                 :             :                        GTaskThreadFunc  task_func)
+     797                 :             : {
+     798                 :          34 :   TaskClosure *closure = NULL;
+     799                 :             : 
+     800         [ -  + ]:          34 :   if G_UNLIKELY (self->queue == NULL)
+     801                 :             :     {
+     802                 :           0 :       g_task_return_new_error (task,
+     803                 :             :                                G_IO_ERROR,
+     804                 :             :                                G_IO_ERROR_CLOSED,
+     805                 :             :                                "Store is closed");
+     806                 :           0 :       return;
+     807                 :             :     }
+     808                 :             : 
+     809                 :          34 :   closure = g_new0 (TaskClosure, 1);
+     810                 :          34 :   closure->task = g_object_ref (task);
+     811                 :          34 :   closure->task_func = task_func;
+     812                 :          34 :   closure->task_mode = TASK_DEFAULT;
+     813                 :          34 :   g_async_queue_push (self->queue, closure);
+     814                 :             : }
+     815                 :             : 
+     816                 :             : static void
+     817                 :           7 : valent_sms_store_open (ValentSmsStore *self)
+     818                 :             : {
+     819                 :          14 :   g_autoptr (GThread) thread = NULL;
+     820         [ +  - ]:           7 :   g_autoptr (GError) error = NULL;
+     821         [ -  + ]:           7 :   g_autoptr (GTask) task = NULL;
+     822         [ +  - ]:           7 :   g_autoptr (GFile) file = NULL;
+     823                 :             : 
+     824                 :           7 :   file = valent_context_get_cache_file (VALENT_CONTEXT (self), "sms.db");
+     825                 :           7 :   self->path = g_file_get_path (file);
+     826                 :             : 
+     827                 :           7 :   task = g_task_new (self, NULL, NULL, NULL);
+     828         [ +  - ]:           7 :   g_task_set_source_tag (task, valent_sms_store_open);
+     829         [ -  + ]:          14 :   g_task_set_task_data (task, g_strdup (self->path), g_free);
+     830                 :           7 :   valent_sms_store_push (self, task, valent_sms_store_open_task);
+     831                 :             : 
+     832                 :             :   /* Spawn the worker thread, passing in a reference to the queue */
+     833                 :           7 :   thread = g_thread_try_new ("valent-task-queue",
+     834                 :             :                              valent_sms_store_thread,
+     835                 :           7 :                              g_async_queue_ref (self->queue),
+     836                 :             :                              &error);
+     837                 :             : 
+     838                 :             :   /* On failure drop the reference passed to the thread, then clear the last
+     839                 :             :    * reference so the open task is cancelled and new tasks are rejected */
+     840         [ -  + ]:           7 :   if (error != NULL)
+     841                 :             :     {
+     842                 :           0 :       g_critical ("%s: Failed to spawn worker thread: %s",
+     843                 :             :                   G_OBJECT_TYPE_NAME (self),
+     844                 :             :                   error->message);
+     845                 :           0 :       g_async_queue_unref (self->queue);
+     846   [ -  -  +  - ]:           7 :       g_clear_pointer (&self->queue, g_async_queue_unref);
+     847                 :             :     }
+     848                 :           7 : }
+     849                 :             : 
+     850                 :             : static void
+     851                 :           7 : valent_sms_store_close (ValentSmsStore *self)
+     852                 :             : {
+     853                 :          14 :   g_autoptr (GTask) task = NULL;
+     854                 :           7 :   TaskClosure *closure = NULL;
+     855                 :             : 
+     856                 :           7 :   task = g_task_new (self, NULL, NULL, NULL);
+     857         [ +  - ]:           7 :   g_task_set_source_tag (task, valent_sms_store_close);
+     858                 :             : 
+     859                 :           7 :   closure = g_new0 (TaskClosure, 1);
+     860                 :           7 :   closure->task = g_object_ref (task);
+     861                 :           7 :   closure->task_func = valent_sms_store_close_task;
+     862                 :           7 :   closure->task_mode = TASK_TERMINAL;
+     863         [ +  - ]:           7 :   g_async_queue_push (self->queue, closure);
+     864                 :           7 : }
+     865                 :             : 
+     866                 :             : /*
+     867                 :             :  * ValentObject
+     868                 :             :  */
+     869                 :             : static void
+     870                 :           9 : valent_sms_store_destroy (ValentObject *object)
+     871                 :             : {
+     872                 :           9 :   ValentSmsStore *self = VALENT_SMS_STORE (object);
+     873                 :             : 
+     874                 :             :   /* We will drop our reference to queue once we queue the closing task, then
+     875                 :             :    * the task itself will end up holding the last reference. */
+     876         [ +  + ]:           9 :   if (self->queue != NULL)
+     877                 :             :     {
+     878                 :           7 :       valent_sms_store_close (self);
+     879         [ +  - ]:           7 :       g_clear_pointer (&self->queue, g_async_queue_unref);
+     880                 :             :     }
+     881                 :             : 
+     882                 :           9 :   VALENT_OBJECT_CLASS (valent_sms_store_parent_class)->destroy (object);
+     883                 :           9 : }
+     884                 :             : 
+     885                 :             : /*
+     886                 :             :  * GObject
+     887                 :             :  */
+     888                 :             : static void
+     889                 :           7 : valent_sms_store_constructed (GObject *object)
+     890                 :             : {
+     891                 :           7 :   ValentSmsStore *self = VALENT_SMS_STORE (object);
+     892                 :             : 
+     893                 :             :   /* Chain-up before queueing the open task to ensure the path is prepared */
+     894                 :           7 :   G_OBJECT_CLASS (valent_sms_store_parent_class)->constructed (object);
+     895                 :             : 
+     896                 :           7 :   valent_sms_store_open (self);
+     897                 :           7 : }
+     898                 :             : 
+     899                 :             : static void
+     900                 :           2 : valent_sms_store_finalize (GObject *object)
+     901                 :             : {
+     902                 :           2 :   ValentSmsStore *self = VALENT_SMS_STORE (object);
+     903                 :             : 
+     904         [ -  + ]:           2 :   g_clear_pointer (&self->queue, g_async_queue_unref);
+     905         [ +  - ]:           2 :   g_clear_pointer (&self->path, g_free);
+     906                 :           2 :   g_clear_weak_pointer (&self->summary);
+     907                 :             : 
+     908                 :           2 :   G_OBJECT_CLASS (valent_sms_store_parent_class)->finalize (object);
+     909                 :           2 : }
+     910                 :             : 
+     911                 :             : static void
+     912                 :           5 : valent_sms_store_class_init (ValentSmsStoreClass *klass)
+     913                 :             : {
+     914                 :           5 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     915                 :           5 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     916                 :             : 
+     917                 :           5 :   object_class->constructed = valent_sms_store_constructed;
+     918                 :           5 :   object_class->finalize = valent_sms_store_finalize;
+     919                 :             : 
+     920                 :           5 :   vobject_class->destroy = valent_sms_store_destroy;
+     921                 :             : 
+     922                 :             :   /**
+     923                 :             :    * ValentSmsStore::message-added:
+     924                 :             :    * @store: a `ValentSmsStore`
+     925                 :             :    * @message: a `ValentMessage`
+     926                 :             :    *
+     927                 :             :    * ValentSmsStore::message-added is emitted when a new message is added to
+     928                 :             :    * @store.
+     929                 :             :    */
+     930                 :          10 :   signals [MESSAGE_ADDED] =
+     931                 :           5 :     g_signal_new ("message-added",
+     932                 :             :                   VALENT_TYPE_SMS_STORE,
+     933                 :             :                   G_SIGNAL_RUN_LAST,
+     934                 :             :                   0,
+     935                 :             :                   NULL, NULL,
+     936                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     937                 :             :                   G_TYPE_NONE, 1, VALENT_TYPE_MESSAGE);
+     938                 :           5 :   g_signal_set_va_marshaller (signals [MESSAGE_ADDED],
+     939                 :             :                               G_TYPE_FROM_CLASS (klass),
+     940                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     941                 :             : 
+     942                 :             :   /**
+     943                 :             :    * ValentSmsStore::message-changed:
+     944                 :             :    * @store: a `ValentSmsStore`
+     945                 :             :    * @message: a `ValentMessage`
+     946                 :             :    *
+     947                 :             :    * ValentSmsStore::message-changed is emitted when a message is updated in
+     948                 :             :    * @store.
+     949                 :             :    */
+     950                 :          10 :   signals [MESSAGE_CHANGED] =
+     951                 :           5 :     g_signal_new ("message-changed",
+     952                 :             :                   VALENT_TYPE_SMS_STORE,
+     953                 :             :                   G_SIGNAL_RUN_LAST,
+     954                 :             :                   0,
+     955                 :             :                   NULL, NULL,
+     956                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     957                 :             :                   G_TYPE_NONE, 1, VALENT_TYPE_MESSAGE);
+     958                 :           5 :   g_signal_set_va_marshaller (signals [MESSAGE_CHANGED],
+     959                 :             :                               G_TYPE_FROM_CLASS (klass),
+     960                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     961                 :             : 
+     962                 :             :   /**
+     963                 :             :    * ValentSmsStore::message-removed:
+     964                 :             :    * @store: a `ValentSmsStore`
+     965                 :             :    * @message: a `ValentMessage`
+     966                 :             :    *
+     967                 :             :    * ValentSmsStore::message-removed is emitted when a message is removed from
+     968                 :             :    * @store.
+     969                 :             :    */
+     970                 :          10 :   signals [MESSAGE_REMOVED] =
+     971                 :           5 :     g_signal_new ("message-removed",
+     972                 :             :                   VALENT_TYPE_SMS_STORE,
+     973                 :             :                   G_SIGNAL_RUN_FIRST,
+     974                 :             :                   0,
+     975                 :             :                   NULL, NULL,
+     976                 :             :                   g_cclosure_marshal_VOID__OBJECT,
+     977                 :             :                   G_TYPE_NONE, 1, VALENT_TYPE_MESSAGE);
+     978                 :           5 :   g_signal_set_va_marshaller (signals [MESSAGE_REMOVED],
+     979                 :             :                               G_TYPE_FROM_CLASS (klass),
+     980                 :             :                               g_cclosure_marshal_VOID__OBJECTv);
+     981                 :             : 
+     982                 :             :   /* SQL Statements */
+     983                 :           5 :   statements[STMT_ADD_MESSAGE] = ADD_MESSAGE_SQL;
+     984                 :           5 :   statements[STMT_REMOVE_MESSAGE] = REMOVE_MESSAGE_SQL;
+     985                 :           5 :   statements[STMT_REMOVE_THREAD] = REMOVE_THREAD_SQL;
+     986                 :           5 :   statements[STMT_GET_MESSAGE] = GET_MESSAGE_SQL;
+     987                 :           5 :   statements[STMT_GET_THREAD] = GET_THREAD_SQL;
+     988                 :           5 :   statements[STMT_GET_THREAD_DATE] = GET_THREAD_DATE_SQL;
+     989                 :           5 :   statements[STMT_GET_THREAD_ITEMS] = GET_THREAD_ITEMS_SQL;
+     990                 :           5 :   statements[STMT_FIND_MESSAGES] = FIND_MESSAGES_SQL;
+     991                 :           5 :   statements[STMT_GET_SUMMARY] = GET_SUMMARY_SQL;
+     992                 :           5 : }
+     993                 :             : 
+     994                 :             : static void
+     995                 :           7 : valent_sms_store_init (ValentSmsStore *self)
+     996                 :             : {
+     997                 :           7 :   self->queue = g_async_queue_new_full (task_closure_cancel);
+     998                 :           7 : }
+     999                 :             : 
+    1000                 :             : /**
+    1001                 :             :  * valent_sms_store_new:
+    1002                 :             :  * @parent: a `ValentContext`
+    1003                 :             :  *
+    1004                 :             :  * Create a new `ValentSmsStore`.
+    1005                 :             :  *
+    1006                 :             :  * Returns: (transfer full): a new sms store
+    1007                 :             :  */
+    1008                 :             : ValentSmsStore *
+    1009                 :           4 : valent_sms_store_new (ValentContext *parent)
+    1010                 :             : {
+    1011                 :           4 :   return g_object_new (VALENT_TYPE_SMS_STORE,
+    1012                 :             :                        "domain", "plugin",
+    1013                 :             :                        "id",     "sms",
+    1014                 :             :                        "parent", parent,
+    1015                 :             :                        NULL);
+    1016                 :             : }
+    1017                 :             : 
+    1018                 :             : /**
+    1019                 :             :  * valent_sms_store_add_message:
+    1020                 :             :  * @store: a `ValentSmsStore`
+    1021                 :             :  * @message: a `ValentMessage`
+    1022                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1023                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1024                 :             :  * @user_data: (closure): user supplied data
+    1025                 :             :  *
+    1026                 :             :  * Add @message to @store.
+    1027                 :             :  */
+    1028                 :             : void
+    1029                 :           1 : valent_sms_store_add_message (ValentSmsStore      *store,
+    1030                 :             :                               ValentMessage       *message,
+    1031                 :             :                               GCancellable        *cancellable,
+    1032                 :             :                               GAsyncReadyCallback  callback,
+    1033                 :             :                               gpointer             user_data)
+    1034                 :             : {
+    1035                 :           2 :   g_autoptr (GTask) task = NULL;
+    1036         [ +  - ]:           1 :   g_autoptr (GPtrArray) messages = NULL;
+    1037                 :             : 
+    1038         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1039         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+    1040                 :             : 
+    1041                 :           1 :   messages = g_ptr_array_new_with_free_func (g_object_unref);
+    1042                 :           1 :   g_ptr_array_add (messages, g_object_ref (message));
+    1043                 :             : 
+    1044                 :           1 :   task = g_task_new (store, cancellable, callback, user_data);
+    1045         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_sms_store_add_message);
+    1046                 :           1 :   g_task_set_task_data (task,
+    1047                 :             :                         g_steal_pointer (&messages),
+    1048                 :             :                         (GDestroyNotify)g_ptr_array_unref);
+    1049         [ +  - ]:           1 :   valent_sms_store_push (store, task, add_messages_task);
+    1050                 :             : }
+    1051                 :             : 
+    1052                 :             : /**
+    1053                 :             :  * valent_sms_store_add_messages:
+    1054                 :             :  * @store: a `ValentSmsStore`
+    1055                 :             :  * @messages: (element-type Valent.Message): a `ValentMessage`
+    1056                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1057                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1058                 :             :  * @user_data: (closure): user supplied data
+    1059                 :             :  *
+    1060                 :             :  * Add @messages to @store.
+    1061                 :             :  */
+    1062                 :             : void
+    1063                 :           6 : valent_sms_store_add_messages (ValentSmsStore      *store,
+    1064                 :             :                                GPtrArray           *messages,
+    1065                 :             :                                GCancellable        *cancellable,
+    1066                 :             :                                GAsyncReadyCallback  callback,
+    1067                 :             :                                gpointer             user_data)
+    1068                 :             : {
+    1069                 :          12 :   g_autoptr (GTask) task = NULL;
+    1070                 :             : 
+    1071         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1072         [ -  + ]:           6 :   g_return_if_fail (messages != NULL);
+    1073                 :             : 
+    1074                 :           6 :   task = g_task_new (store, cancellable, callback, user_data);
+    1075         [ +  - ]:           6 :   g_task_set_source_tag (task, valent_sms_store_add_message);
+    1076                 :           6 :   g_task_set_task_data (task,
+    1077                 :           6 :                         g_ptr_array_ref (messages),
+    1078                 :             :                         (GDestroyNotify)g_ptr_array_unref);
+    1079         [ +  - ]:           6 :   valent_sms_store_push (store, task, add_messages_task);
+    1080                 :             : }
+    1081                 :             : 
+    1082                 :             : /**
+    1083                 :             :  * valent_sms_store_add_messages_finish:
+    1084                 :             :  * @store: a `ValentSmsStore`
+    1085                 :             :  * @result: a `GAsyncResult`
+    1086                 :             :  * @error: (nullable): a `GError`
+    1087                 :             :  *
+    1088                 :             :  * Finish an operation started by valent_sms_store_add_messages().
+    1089                 :             :  *
+    1090                 :             :  * Returns: %TRUE, or %FALSE with @error set
+    1091                 :             :  */
+    1092                 :             : gboolean
+    1093                 :           5 : valent_sms_store_add_messages_finish (ValentSmsStore  *store,
+    1094                 :             :                                       GAsyncResult    *result,
+    1095                 :             :                                       GError         **error)
+    1096                 :             : {
+    1097         [ +  - ]:           5 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), FALSE);
+    1098         [ -  + ]:           5 :   g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+    1099   [ +  -  -  + ]:           5 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+    1100                 :             : 
+    1101                 :           5 :   return g_task_propagate_boolean (G_TASK (result), error);
+    1102                 :             : }
+    1103                 :             : 
+    1104                 :             : /**
+    1105                 :             :  * valent_sms_store_remove_message:
+    1106                 :             :  * @store: a `ValentSmsStore`
+    1107                 :             :  * @message_id: a message ID
+    1108                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1109                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1110                 :             :  * @user_data: (closure): user supplied data
+    1111                 :             :  *
+    1112                 :             :  * Remove the message with @message_id from @thread_id.
+    1113                 :             :  */
+    1114                 :             : void
+    1115                 :           1 : valent_sms_store_remove_message (ValentSmsStore      *store,
+    1116                 :             :                                  int64_t              message_id,
+    1117                 :             :                                  GCancellable        *cancellable,
+    1118                 :             :                                  GAsyncReadyCallback  callback,
+    1119                 :             :                                  gpointer             user_data)
+    1120                 :             : {
+    1121                 :           0 :   g_autoptr (GTask) task = NULL;
+    1122                 :           1 :   int64_t *task_data;
+    1123                 :             : 
+    1124         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1125                 :             : 
+    1126                 :           1 :   task_data = g_new0 (int64_t, 1);
+    1127                 :           1 :   *task_data = message_id;
+    1128                 :             : 
+    1129                 :           1 :   task = g_task_new (store, cancellable, callback, user_data);
+    1130                 :           1 :   g_task_set_task_data (task, task_data, g_free);
+    1131         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_sms_store_remove_message);
+    1132         [ +  - ]:           1 :   valent_sms_store_push (store, task, remove_message_task);
+    1133                 :             : }
+    1134                 :             : 
+    1135                 :             : /**
+    1136                 :             :  * valent_sms_store_remove_message_finish:
+    1137                 :             :  * @store: a `ValentSmsStore`
+    1138                 :             :  * @result: a `GAsyncResult`
+    1139                 :             :  * @error: (nullable): a `GError`
+    1140                 :             :  *
+    1141                 :             :  * Finish an operation started by valent_sms_store_remove_message().
+    1142                 :             :  *
+    1143                 :             :  * Returns: %TRUE, or %FALSE with @error set
+    1144                 :             :  */
+    1145                 :             : gboolean
+    1146                 :           1 : valent_sms_store_remove_message_finish (ValentSmsStore  *store,
+    1147                 :             :                                         GAsyncResult    *result,
+    1148                 :             :                                         GError         **error)
+    1149                 :             : {
+    1150         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), FALSE);
+    1151         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+    1152   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+    1153                 :             : 
+    1154                 :           1 :   return g_task_propagate_boolean (G_TASK (result), error);
+    1155                 :             : }
+    1156                 :             : 
+    1157                 :             : /**
+    1158                 :             :  * valent_sms_store_remove_thread:
+    1159                 :             :  * @store: a `ValentSmsStore`
+    1160                 :             :  * @thread_id: a thread ID
+    1161                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1162                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1163                 :             :  * @user_data: (closure): user supplied data
+    1164                 :             :  *
+    1165                 :             :  * Remove @thread_id and all it's messages from @store.
+    1166                 :             :  */
+    1167                 :             : void
+    1168                 :           1 : valent_sms_store_remove_thread (ValentSmsStore      *store,
+    1169                 :             :                                 int64_t              thread_id,
+    1170                 :             :                                 GCancellable        *cancellable,
+    1171                 :             :                                 GAsyncReadyCallback  callback,
+    1172                 :             :                                 gpointer             user_data)
+    1173                 :             : {
+    1174                 :           2 :   g_autoptr (GTask) task = NULL;
+    1175                 :           1 :   int64_t *task_data;
+    1176                 :             : 
+    1177         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1178         [ -  + ]:           1 :   g_return_if_fail (thread_id >= 0);
+    1179                 :             : 
+    1180                 :           1 :   task_data = g_new0 (int64_t, 1);
+    1181                 :           1 :   *task_data = thread_id;
+    1182                 :             : 
+    1183                 :           1 :   task = g_task_new (store, cancellable, callback, user_data);
+    1184                 :           1 :   g_task_set_task_data (task, task_data, g_free);
+    1185         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_sms_store_remove_thread);
+    1186         [ +  - ]:           1 :   valent_sms_store_push (store, task, remove_thread_task);
+    1187                 :             : }
+    1188                 :             : 
+    1189                 :             : /**
+    1190                 :             :  * valent_sms_store_remove_thread_finish:
+    1191                 :             :  * @store: a `ValentSmsStore`
+    1192                 :             :  * @result: a `GAsyncResult`
+    1193                 :             :  * @error: (nullable): a `GError`
+    1194                 :             :  *
+    1195                 :             :  * Finish an operation started by valent_sms_store_remove_thread().
+    1196                 :             :  *
+    1197                 :             :  * Returns: %TRUE, or %FALSE with @error set
+    1198                 :             :  */
+    1199                 :             : gboolean
+    1200                 :           1 : valent_sms_store_remove_thread_finish (ValentSmsStore  *store,
+    1201                 :             :                                        GAsyncResult    *result,
+    1202                 :             :                                        GError         **error)
+    1203                 :             : {
+    1204         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), FALSE);
+    1205         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+    1206   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+    1207                 :             : 
+    1208                 :           1 :   return g_task_propagate_boolean (G_TASK (result), error);
+    1209                 :             : }
+    1210                 :             : 
+    1211                 :             : /**
+    1212                 :             :  * valent_sms_store_find_messages:
+    1213                 :             :  * @store: a `ValentSmsStore`
+    1214                 :             :  * @query: a string to search for
+    1215                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1216                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1217                 :             :  * @user_data: (closure): user supplied data
+    1218                 :             :  *
+    1219                 :             :  * Search through all the messages in @store and return the most recent message
+    1220                 :             :  * from each thread containing @query.
+    1221                 :             :  *
+    1222                 :             :  * Call valent_sms_store_find_messages_finish() to get the result.
+    1223                 :             :  */
+    1224                 :             : void
+    1225                 :           1 : valent_sms_store_find_messages (ValentSmsStore      *store,
+    1226                 :             :                                 const char          *query,
+    1227                 :             :                                 GCancellable        *cancellable,
+    1228                 :             :                                 GAsyncReadyCallback  callback,
+    1229                 :             :                                 gpointer             user_data)
+    1230                 :             : {
+    1231                 :           2 :   g_autoptr (GTask) task = NULL;
+    1232                 :             : 
+    1233         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1234         [ -  + ]:           1 :   g_return_if_fail (query != NULL);
+    1235   [ -  +  -  -  :           1 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+    1236                 :             : 
+    1237                 :           1 :   task = g_task_new (store, cancellable, callback, user_data);
+    1238         [ +  - ]:           1 :   g_task_set_source_tag (task, valent_sms_store_find_messages);
+    1239         [ -  + ]:           2 :   g_task_set_task_data (task, g_strdup (query), g_free);
+    1240         [ +  - ]:           1 :   valent_sms_store_push (store, task, find_messages_task);
+    1241                 :             : }
+    1242                 :             : 
+    1243                 :             : /**
+    1244                 :             :  * valent_sms_store_find_messages_finish:
+    1245                 :             :  * @store: a `ValentSmsStore`
+    1246                 :             :  * @result: a `GAsyncResult`
+    1247                 :             :  * @error: (nullable): a `GError`
+    1248                 :             :  *
+    1249                 :             :  * Finish an operation started by valent_sms_store_find_messages().
+    1250                 :             :  *
+    1251                 :             :  * Returns: (transfer container) (element-type Valent.Message): an `GPtrArray`
+    1252                 :             :  */
+    1253                 :             : GPtrArray *
+    1254                 :           1 : valent_sms_store_find_messages_finish (ValentSmsStore  *store,
+    1255                 :             :                                        GAsyncResult    *result,
+    1256                 :             :                                        GError         **error)
+    1257                 :             : {
+    1258         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), NULL);
+    1259         [ -  + ]:           1 :   g_return_val_if_fail (g_task_is_valid (result, store), NULL);
+    1260   [ +  -  -  + ]:           1 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+    1261                 :             : 
+    1262                 :           1 :   return g_task_propagate_pointer (G_TASK (result), error);
+    1263                 :             : }
+    1264                 :             : 
+    1265                 :             : /**
+    1266                 :             :  * valent_sms_store_get_message:
+    1267                 :             :  * @store: a `ValentSmsStore`
+    1268                 :             :  * @message_id: a message ID
+    1269                 :             :  * @cancellable: (nullable): a `GCancellable`
+    1270                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+    1271                 :             :  * @user_data: (closure): user supplied data
+    1272                 :             :  *
+    1273                 :             :  * Get the `ValentMessage` with @message_id or %NULL if not found.
+    1274                 :             :  *
+    1275                 :             :  * Returns: (transfer none) (nullable): a `ValentMessage`
+    1276                 :             :  */
+    1277                 :             : void
+    1278                 :           6 : valent_sms_store_get_message (ValentSmsStore      *store,
+    1279                 :             :                               int64_t              message_id,
+    1280                 :             :                               GCancellable        *cancellable,
+    1281                 :             :                               GAsyncReadyCallback  callback,
+    1282                 :             :                               gpointer             user_data)
+    1283                 :             : {
+    1284                 :          12 :   g_autoptr (GTask) task = NULL;
+    1285                 :           6 :   int64_t *task_data;
+    1286                 :             : 
+    1287         [ +  - ]:           6 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1288   [ +  +  +  -  :           6 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  +  -  - ]
+    1289                 :             : 
+    1290                 :           6 :   task_data = g_new (int64_t, 1);
+    1291                 :           6 :   *task_data = message_id;
+    1292                 :             : 
+    1293                 :           6 :   task = g_task_new (store, cancellable, callback, user_data);
+    1294                 :           6 :   g_task_set_task_data (task, task_data, g_free);
+    1295         [ +  - ]:           6 :   g_task_set_source_tag (task, valent_sms_store_get_message);
+    1296         [ +  - ]:           6 :   valent_sms_store_push (store, task, get_message_task);
+    1297                 :             : }
+    1298                 :             : 
+    1299                 :             : /**
+    1300                 :             :  * valent_sms_store_get_message_finish:
+    1301                 :             :  * @store: a `ValentSmsStore`
+    1302                 :             :  * @result: a `GAsyncResult`
+    1303                 :             :  * @error: (nullable): a `GError`
+    1304                 :             :  *
+    1305                 :             :  * Finish an operation started by valent_sms_store_get_message().
+    1306                 :             :  *
+    1307                 :             :  * Returns: (transfer full) (nullable): a `ValentMessage`
+    1308                 :             :  */
+    1309                 :             : ValentMessage *
+    1310                 :           6 : valent_sms_store_get_message_finish (ValentSmsStore  *store,
+    1311                 :             :                                      GAsyncResult    *result,
+    1312                 :             :                                      GError         **error)
+    1313                 :             : {
+    1314         [ +  - ]:           6 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), NULL);
+    1315         [ -  + ]:           6 :   g_return_val_if_fail (g_task_is_valid (result, store), FALSE);
+    1316   [ +  -  -  + ]:           6 :   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+    1317                 :             : 
+    1318                 :           6 :   return g_task_propagate_pointer (G_TASK (result), error);
+    1319                 :             : }
+    1320                 :             : 
+    1321                 :             : /**
+    1322                 :             :  * valent_sms_store_get_summary:
+    1323                 :             :  * @store: a `ValentSmsStore`
+    1324                 :             :  *
+    1325                 :             :  * Get the latest message of each thread as a `GListModel`.
+    1326                 :             :  *
+    1327                 :             :  * Returns: (transfer full) (nullable): a `GListModel`
+    1328                 :             :  */
+    1329                 :             : GListModel *
+    1330                 :           3 : valent_sms_store_get_summary (ValentSmsStore *store)
+    1331                 :             : {
+    1332                 :           6 :   g_autoptr (GTask) task = NULL;
+    1333                 :             : 
+    1334         [ +  - ]:           3 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), NULL);
+    1335                 :             : 
+    1336         [ -  + ]:           3 :   if (store->summary != NULL)
+    1337                 :           0 :     return g_object_ref (G_LIST_MODEL (store->summary));
+    1338                 :             : 
+    1339                 :           3 :   store->summary = g_list_store_new (VALENT_TYPE_MESSAGE);
+    1340                 :           3 :   g_object_add_weak_pointer (G_OBJECT (store->summary),
+    1341                 :           3 :                              (gpointer)&store->summary);
+    1342                 :             : 
+    1343                 :           3 :   task = g_task_new (store, NULL, (GAsyncReadyCallback)get_summary_cb, NULL);
+    1344         [ +  - ]:           3 :   g_task_set_source_tag (task, valent_sms_store_get_summary);
+    1345                 :           3 :   valent_sms_store_push (store, task, get_summary_task);
+    1346                 :             : 
+    1347         [ -  + ]:           3 :   return G_LIST_MODEL (store->summary);
+    1348                 :             : }
+    1349                 :             : 
+    1350                 :             : /**
+    1351                 :             :  * valent_sms_store_get_thread:
+    1352                 :             :  * @store: a `ValentSmsStore`
+    1353                 :             :  * @thread_id: a message id
+    1354                 :             :  *
+    1355                 :             :  * Get the thread with @thread_id as a `GListModel`.
+    1356                 :             :  *
+    1357                 :             :  * Returns: (transfer full): a `GListModel`
+    1358                 :             :  */
+    1359                 :             : GListModel *
+    1360                 :           4 : valent_sms_store_get_thread (ValentSmsStore *store,
+    1361                 :             :                              int64_t         thread_id)
+    1362                 :             : {
+    1363         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), 0);
+    1364         [ -  + ]:           4 :   g_return_val_if_fail (thread_id > 0, 0);
+    1365                 :             : 
+    1366                 :           4 :   return valent_message_thread_new (store, thread_id);
+    1367                 :             : }
+    1368                 :             : 
+    1369                 :             : /**
+    1370                 :             :  * valent_sms_store_get_thread_date:
+    1371                 :             :  * @store: a `ValentSmsStore`
+    1372                 :             :  * @thread_id: a thread ID
+    1373                 :             :  *
+    1374                 :             :  * Get the date of the last message in @thread_id.
+    1375                 :             :  *
+    1376                 :             :  * Returns: a UNIX epoch timestamp.
+    1377                 :             :  */
+    1378                 :             : int64_t
+    1379                 :           4 : valent_sms_store_get_thread_date (ValentSmsStore *store,
+    1380                 :             :                                   int64_t         thread_id)
+    1381                 :             : {
+    1382                 :           8 :   g_autoptr (GTask) task = NULL;
+    1383         [ +  - ]:           4 :   g_autoptr (GError) error = NULL;
+    1384                 :           4 :   int64_t date = 0;
+    1385                 :             : 
+    1386         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_SMS_STORE (store), 0);
+    1387         [ -  + ]:           4 :   g_return_val_if_fail (thread_id >= 0, 0);
+    1388                 :             : 
+    1389                 :           4 :   task = g_task_new (store, NULL, NULL, NULL);
+    1390         [ +  - ]:           4 :   g_task_set_source_tag (task, valent_sms_store_get_thread_date);
+    1391                 :           4 :   g_task_set_task_data (task, &thread_id, NULL);
+    1392                 :           4 :   valent_sms_store_push (store, task, get_thread_date_task);
+    1393                 :             : 
+    1394         [ +  + ]:         637 :   while (!g_task_get_completed (task))
+    1395                 :         633 :     g_main_context_iteration (NULL, FALSE);
+    1396                 :             : 
+    1397                 :           4 :   date = g_task_propagate_int (task, &error);
+    1398                 :             : 
+    1399         [ -  + ]:           4 :   if (error != NULL)
+    1400                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+    1401                 :             : 
+    1402                 :             :   return date;
+    1403                 :             : }
+    1404                 :             : 
+    1405                 :             : /**
+    1406                 :             :  * valent_sms_store_get_thread_items:
+    1407                 :             :  * @store: a `ValentSmsStore`
+    1408                 :             :  * @thread_id: a thread ID
+    1409                 :             :  *
+    1410                 :             :  * Get the `ValentMessage` in @thread_id at @position, when sorted by date in
+    1411                 :             :  * ascending order.
+    1412                 :             :  */
+    1413                 :             : void
+    1414                 :           4 : valent_sms_store_get_thread_items (ValentSmsStore      *store,
+    1415                 :             :                                    int64_t              thread_id,
+    1416                 :             :                                    GCancellable        *cancellable,
+    1417                 :             :                                    GAsyncReadyCallback  callback,
+    1418                 :             :                                    gpointer             user_data)
+    1419                 :             : {
+    1420                 :           8 :   g_autoptr (GTask) task = NULL;
+    1421                 :           4 :   int64_t *task_data;
+    1422                 :             : 
+    1423         [ +  - ]:           4 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1424         [ -  + ]:           4 :   g_return_if_fail (thread_id >= 0);
+    1425                 :             : 
+    1426                 :           4 :   task_data = g_new0 (int64_t, 1);
+    1427                 :           4 :   *task_data = thread_id;
+    1428                 :             : 
+    1429                 :           4 :   task = g_task_new (store, cancellable, callback, user_data);
+    1430         [ +  - ]:           4 :   g_task_set_source_tag (task, valent_sms_store_get_thread_items);
+    1431                 :           4 :   g_task_set_task_data (task, task_data, g_free);
+    1432         [ +  - ]:           4 :   valent_sms_store_push (store, task, get_thread_items_task);
+    1433                 :             : }
+    1434                 :             : 
+    1435                 :             : /**
+    1436                 :             :  * valent_sms_store_message_added:
+    1437                 :             :  * @store: a `ValentSmsStore`
+    1438                 :             :  * @message: a `ValentMessage`
+    1439                 :             :  *
+    1440                 :             :  * Emits the `ValentSmsStore`::message-added signal on @store.
+    1441                 :             :  *
+    1442                 :             :  * This function should only be called by classes implementing
+    1443                 :             :  * `ValentSmsStore`. It has to be called after the internal representation
+    1444                 :             :  * of @store has been updated, because handlers connected to this signal
+    1445                 :             :  * might query the new state of the provider.
+    1446                 :             :  */
+    1447                 :             : void
+    1448                 :          13 : valent_sms_store_message_added (ValentSmsStore *store,
+    1449                 :             :                                 ValentMessage  *message)
+    1450                 :             : {
+    1451                 :          13 :   ChangeEmission *emission;
+    1452                 :             : 
+    1453         [ +  - ]:          13 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1454         [ -  + ]:          13 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+    1455                 :             : 
+    1456         [ +  - ]:          13 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+    1457                 :             :     {
+    1458                 :           0 :       g_signal_emit (G_OBJECT (store), signals [MESSAGE_ADDED], 0, message);
+    1459                 :           0 :       return;
+    1460                 :             :     }
+    1461                 :             : 
+    1462                 :          13 :   emission = g_new0 (ChangeEmission, 1);
+    1463                 :          13 :   g_rec_mutex_init (&emission->mutex);
+    1464                 :          13 :   g_rec_mutex_lock (&emission->mutex);
+    1465                 :          13 :   g_weak_ref_init (&emission->store, store);
+    1466                 :          13 :   emission->message = g_object_ref (message);
+    1467                 :          13 :   emission->signal_id = signals [MESSAGE_ADDED];
+    1468                 :          13 :   g_rec_mutex_unlock (&emission->mutex);
+    1469                 :             : 
+    1470                 :          13 :   g_idle_add_full (G_PRIORITY_DEFAULT,
+    1471                 :             :                    emit_change_main,
+    1472                 :             :                    g_steal_pointer (&emission),
+    1473                 :             :                    NULL);
+    1474                 :             : }
+    1475                 :             : 
+    1476                 :             : /**
+    1477                 :             :  * valent_sms_store_message_removed:
+    1478                 :             :  * @store: a `ValentSmsStore`
+    1479                 :             :  * @message: a `ValentMessage`
+    1480                 :             :  *
+    1481                 :             :  * Emits the `ValentSmsStore`::message-removed signal on @store.
+    1482                 :             :  *
+    1483                 :             :  * This function should only be called by classes implementing
+    1484                 :             :  * `ValentSmsStore`. It has to be called after the internal representation
+    1485                 :             :  * of @store has been updated, because handlers connected to this signal
+    1486                 :             :  * might query the new state of the provider.
+    1487                 :             :  */
+    1488                 :             : void
+    1489                 :           3 : valent_sms_store_message_removed (ValentSmsStore *store,
+    1490                 :             :                                   ValentMessage  *message)
+    1491                 :             : {
+    1492                 :           3 :   ChangeEmission *emission;
+    1493                 :             : 
+    1494         [ +  - ]:           3 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1495         [ -  + ]:           3 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+    1496                 :             : 
+    1497         [ +  - ]:           3 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+    1498                 :             :     {
+    1499                 :           0 :       g_signal_emit (G_OBJECT (store), signals [MESSAGE_REMOVED], 0, message);
+    1500                 :           0 :       return;
+    1501                 :             :     }
+    1502                 :             : 
+    1503                 :           3 :   emission = g_new0 (ChangeEmission, 1);
+    1504                 :           3 :   g_rec_mutex_init (&emission->mutex);
+    1505                 :           3 :   g_rec_mutex_lock (&emission->mutex);
+    1506                 :           3 :   g_weak_ref_init (&emission->store, store);
+    1507                 :           3 :   emission->message = g_object_ref (message);
+    1508                 :           3 :   emission->signal_id = signals [MESSAGE_REMOVED];
+    1509                 :           3 :   g_rec_mutex_unlock (&emission->mutex);
+    1510                 :             : 
+    1511                 :           3 :   g_idle_add_full (G_PRIORITY_DEFAULT,
+    1512                 :             :                    emit_change_main,
+    1513                 :             :                    g_steal_pointer (&emission),
+    1514                 :             :                    NULL);
+    1515                 :             : }
+    1516                 :             : 
+    1517                 :             : /**
+    1518                 :             :  * valent_sms_store_message_changed:
+    1519                 :             :  * @store: a `ValentSmsStore`
+    1520                 :             :  * @message: a `ValentMessage`
+    1521                 :             :  *
+    1522                 :             :  * Emits the `ValentSmsStore`::message-changed signal on @store.
+    1523                 :             :  *
+    1524                 :             :  * This function should only be called by classes implementing
+    1525                 :             :  * `ValentSmsStore`. It has to be called after the internal representation
+    1526                 :             :  * of @store has been updated, because handlers connected to this signal
+    1527                 :             :  * might query the new state of the provider.
+    1528                 :             :  */
+    1529                 :             : void
+    1530                 :           1 : valent_sms_store_message_changed (ValentSmsStore *store,
+    1531                 :             :                                   ValentMessage  *message)
+    1532                 :             : {
+    1533                 :           1 :   ChangeEmission *emission;
+    1534                 :             : 
+    1535         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_STORE (store));
+    1536         [ -  + ]:           1 :   g_return_if_fail (VALENT_IS_MESSAGE (message));
+    1537                 :             : 
+    1538         [ +  - ]:           1 :   if G_LIKELY (VALENT_IS_MAIN_THREAD ())
+    1539                 :             :     {
+    1540                 :           0 :       g_signal_emit (G_OBJECT (store), signals [MESSAGE_CHANGED], 0, message);
+    1541                 :           0 :       return;
+    1542                 :             :     }
+    1543                 :             : 
+    1544                 :           1 :   emission = g_new0 (ChangeEmission, 1);
+    1545                 :           1 :   g_rec_mutex_init (&emission->mutex);
+    1546                 :           1 :   g_rec_mutex_lock (&emission->mutex);
+    1547                 :           1 :   g_weak_ref_init (&emission->store, store);
+    1548                 :           1 :   emission->message = g_object_ref (message);
+    1549                 :           1 :   emission->signal_id = signals [MESSAGE_CHANGED];
+    1550                 :           1 :   g_rec_mutex_unlock (&emission->mutex);
+    1551                 :             : 
+    1552                 :           1 :   g_idle_add_full (G_PRIORITY_DEFAULT,
+    1553                 :             :                    emit_change_main,
+    1554                 :             :                    g_steal_pointer (&emission),
+    1555                 :             :                    NULL);
+    1556                 :             : }
+    1557                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-store.h.func-c.html b/coverage/src/plugins/sms/valent-sms-store.h.func-c.html new file mode 100644 index 00000000000..f8956e1f490 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-store.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-store.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:70.0 %107
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_STORE112
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-store.h.func.html b/coverage/src/plugins/sms/valent-sms-store.h.func.html new file mode 100644 index 00000000000..b9173a27960 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-store.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-store.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:70.0 %107
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_STORE112
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-store.h.gcov.html b/coverage/src/plugins/sms/valent-sms-store.h.gcov.html new file mode 100644 index 00000000000..83f40a8d235 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-store.h.gcov.html @@ -0,0 +1,170 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-store.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-store.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:70.0 %107
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <gio/gio.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-message.h"
+      10                 :             : 
+      11                 :             : G_BEGIN_DECLS
+      12                 :             : 
+      13                 :             : #define VALENT_TYPE_SMS_STORE (valent_sms_store_get_type())
+      14                 :             : 
+      15   [ +  -  +  -  :         144 : G_DECLARE_FINAL_TYPE (ValentSmsStore, valent_sms_store, VALENT, SMS_STORE, ValentContext)
+          +  +  +  +  +  
+                      - ]
+      16                 :             : 
+      17                 :             : ValentSmsStore * valent_sms_store_new                   (ValentContext        *parent);
+      18                 :             : 
+      19                 :             : void             valent_sms_store_add_message           (ValentSmsStore       *store,
+      20                 :             :                                                          ValentMessage        *message,
+      21                 :             :                                                          GCancellable         *cancellable,
+      22                 :             :                                                          GAsyncReadyCallback   callback,
+      23                 :             :                                                          gpointer              user_data);
+      24                 :             : void             valent_sms_store_add_messages          (ValentSmsStore       *store,
+      25                 :             :                                                          GPtrArray            *messages,
+      26                 :             :                                                          GCancellable         *cancellable,
+      27                 :             :                                                          GAsyncReadyCallback   callback,
+      28                 :             :                                                          gpointer              user_data);
+      29                 :             : gboolean         valent_sms_store_add_messages_finish   (ValentSmsStore       *store,
+      30                 :             :                                                          GAsyncResult         *result,
+      31                 :             :                                                          GError              **error);
+      32                 :             : void             valent_sms_store_remove_message        (ValentSmsStore       *store,
+      33                 :             :                                                          int64_t               message_id,
+      34                 :             :                                                          GCancellable         *cancellable,
+      35                 :             :                                                          GAsyncReadyCallback   callback,
+      36                 :             :                                                          gpointer              user_data);
+      37                 :             : gboolean         valent_sms_store_remove_message_finish (ValentSmsStore       *store,
+      38                 :             :                                                          GAsyncResult         *result,
+      39                 :             :                                                          GError              **error);
+      40                 :             : void             valent_sms_store_remove_thread         (ValentSmsStore       *store,
+      41                 :             :                                                          int64_t               thread_id,
+      42                 :             :                                                          GCancellable         *cancellable,
+      43                 :             :                                                          GAsyncReadyCallback   callback,
+      44                 :             :                                                          gpointer              user_data);
+      45                 :             : gboolean         valent_sms_store_remove_thread_finish  (ValentSmsStore       *store,
+      46                 :             :                                                          GAsyncResult         *result,
+      47                 :             :                                                          GError              **error);
+      48                 :             : void             valent_sms_store_find_messages         (ValentSmsStore       *store,
+      49                 :             :                                                          const char           *query,
+      50                 :             :                                                          GCancellable         *cancellable,
+      51                 :             :                                                          GAsyncReadyCallback   callback,
+      52                 :             :                                                          gpointer              user_data);
+      53                 :             : GPtrArray      * valent_sms_store_find_messages_finish  (ValentSmsStore       *store,
+      54                 :             :                                                          GAsyncResult         *result,
+      55                 :             :                                                          GError              **error);
+      56                 :             : void             valent_sms_store_get_message           (ValentSmsStore       *store,
+      57                 :             :                                                          int64_t               message_id,
+      58                 :             :                                                          GCancellable         *cancellable,
+      59                 :             :                                                          GAsyncReadyCallback   callback,
+      60                 :             :                                                          gpointer              user_data);
+      61                 :             : ValentMessage  * valent_sms_store_get_message_finish    (ValentSmsStore       *store,
+      62                 :             :                                                          GAsyncResult         *result,
+      63                 :             :                                                          GError              **error);
+      64                 :             : GListModel     * valent_sms_store_get_summary           (ValentSmsStore       *store);
+      65                 :             : GListModel     * valent_sms_store_get_thread            (ValentSmsStore       *store,
+      66                 :             :                                                          int64_t               thread_id);
+      67                 :             : int64_t          valent_sms_store_get_thread_date       (ValentSmsStore       *store,
+      68                 :             :                                                          int64_t               thread_id);
+      69                 :             : void             valent_sms_store_message_added         (ValentSmsStore       *store,
+      70                 :             :                                                          ValentMessage        *message);
+      71                 :             : void             valent_sms_store_message_removed       (ValentSmsStore       *store,
+      72                 :             :                                                          ValentMessage        *message);
+      73                 :             : void             valent_sms_store_message_changed       (ValentSmsStore       *store,
+      74                 :             :                                                          ValentMessage        *message);
+      75                 :             : 
+      76                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-utils.c.func-c.html b/coverage/src/plugins/sms/valent-sms-utils.c.func-c.html new file mode 100644 index 00000000000..add52e49a6d --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-utils.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.1 %151130
Test Date:2024-03-31 18:46:36Functions:100.0 %1212
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.8 %16070
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_phone_number_compare_normalized1
valent_phone_number_of_contact1
valent_phone_number_equal4
valent_sms_contact_from_phone_cb4
valent_sms_contact_from_phone_finish4
valent_sms_contact_from_phone5
_e_contact_get_icon11
_e_contact_get_paintable15
valent_phone_number_normalize15
valent_sms_avatar_from_contact15
valent_contact_icon_quark22
valent_contact_paintable_quark26
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-utils.c.func.html b/coverage/src/plugins/sms/valent-sms-utils.c.func.html new file mode 100644 index 00000000000..88ae2769fba --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-utils.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.1 %151130
Test Date:2024-03-31 18:46:36Functions:100.0 %1212
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.8 %16070
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
_e_contact_get_icon11
_e_contact_get_paintable15
valent_contact_icon_quark22
valent_contact_paintable_quark26
valent_phone_number_compare_normalized1
valent_phone_number_equal4
valent_phone_number_normalize15
valent_phone_number_of_contact1
valent_sms_avatar_from_contact15
valent_sms_contact_from_phone5
valent_sms_contact_from_phone_cb4
valent_sms_contact_from_phone_finish4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-utils.c.gcov.html b/coverage/src/plugins/sms/valent-sms-utils.c.gcov.html new file mode 100644 index 00000000000..84c528bde44 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-utils.c.gcov.html @@ -0,0 +1,499 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:86.1 %151130
Test Date:2024-03-31 18:46:36Functions:100.0 %1212
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:43.8 %16070
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sms-utils"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <adwaita.h>
+       9                 :             : #include <gdk/gdk.h>
+      10                 :             : #include <glib/gi18n.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-sms-utils.h"
+      14                 :             : 
+      15                 :             : 
+      16         [ +  + ]:          22 : G_DEFINE_QUARK (VALENT_CONTACT_ICON, valent_contact_icon)
+      17         [ +  + ]:          26 : G_DEFINE_QUARK (VALENT_CONTACT_PAINTABLE, valent_contact_paintable)
+      18                 :             : 
+      19                 :             : 
+      20                 :             : static GLoadableIcon *
+      21                 :          11 : _e_contact_get_icon (EContact *contact)
+      22                 :             : {
+      23                 :          11 :   GLoadableIcon *icon = NULL;
+      24                 :          22 :   g_autoptr (EContactPhoto) photo = NULL;
+      25                 :          11 :   const unsigned char *data;
+      26                 :          11 :   size_t len;
+      27                 :          11 :   const char *uri;
+      28                 :             : 
+      29   [ +  -  +  -  :          11 :   g_assert (E_IS_CONTACT (contact));
+             -  +  -  - ]
+      30                 :             : 
+      31                 :          11 :   icon = g_object_get_qdata (G_OBJECT (contact), valent_contact_icon_quark ());
+      32                 :             : 
+      33   [ -  +  -  -  :          11 :   if (G_IS_LOADABLE_ICON (icon))
+             -  -  -  - ]
+      34                 :             :     return icon;
+      35                 :             : 
+      36         [ +  - ]:          11 :   if ((photo = e_contact_get (contact, E_CONTACT_PHOTO)) == NULL)
+      37                 :             :     return NULL;
+      38                 :             : 
+      39         [ +  - ]:          11 :   if (photo->type == E_CONTACT_PHOTO_TYPE_INLINED &&
+      40         [ +  - ]:          11 :       (data = e_contact_photo_get_inlined (photo, &len)))
+      41                 :             :     {
+      42         [ +  - ]:          11 :       g_autoptr (GBytes) bytes = NULL;
+      43                 :             : 
+      44                 :          11 :       bytes = g_bytes_new (data, len);
+      45         [ +  - ]:          11 :       icon = G_LOADABLE_ICON (g_bytes_icon_new (bytes));
+      46                 :             :     }
+      47         [ #  # ]:           0 :   else if (photo->type == E_CONTACT_PHOTO_TYPE_URI &&
+      48         [ #  # ]:           0 :            (uri = e_contact_photo_get_uri (photo)))
+      49                 :             :     {
+      50                 :          11 :       g_autoptr (GFile) file = NULL;
+      51                 :             : 
+      52                 :           0 :       file = g_file_new_for_uri (uri);
+      53         [ #  # ]:           0 :       icon = G_LOADABLE_ICON (g_file_icon_new (file));
+      54                 :             :     }
+      55                 :             : 
+      56   [ +  -  +  -  :          11 :   if (G_IS_LOADABLE_ICON (icon))
+             +  -  +  - ]
+      57                 :             :     {
+      58                 :          11 :       g_object_set_qdata_full (G_OBJECT (contact),
+      59                 :             :                                valent_contact_icon_quark (),
+      60                 :             :                                icon,
+      61                 :             :                                g_object_unref);
+      62                 :             :     }
+      63                 :             : 
+      64                 :          11 :   return icon;
+      65                 :             : }
+      66                 :             : 
+      67                 :             : static GdkPaintable *
+      68                 :          15 : _e_contact_get_paintable (EContact  *contact,
+      69                 :             :                           int        size,
+      70                 :             :                           int        scale,
+      71                 :             :                           GError   **error)
+      72                 :             : {
+      73                 :          15 :   GdkPaintable *paintable = NULL;
+      74                 :          15 :   GLoadableIcon *icon = NULL;
+      75                 :          30 :   g_autoptr (GInputStream) stream = NULL;
+      76         [ +  + ]:          15 :   g_autoptr (GdkPixbuf) pixbuf = NULL;
+      77                 :             : 
+      78   [ +  -  +  -  :          15 :   g_assert (E_IS_CONTACT (contact));
+             -  +  -  - ]
+      79         [ -  + ]:          15 :   g_assert (size > 0);
+      80         [ -  + ]:          15 :   g_assert (scale > 0);
+      81                 :             : 
+      82                 :          15 :   paintable = g_object_get_qdata (G_OBJECT (contact),
+      83                 :             :                                   valent_contact_paintable_quark ());
+      84                 :             : 
+      85         [ +  + ]:          15 :   if (GDK_IS_PAINTABLE (paintable))
+      86                 :             :     return paintable;
+      87                 :             : 
+      88         [ +  - ]:          11 :   if ((icon = _e_contact_get_icon (contact)) == NULL)
+      89                 :             :     return NULL;
+      90                 :             : 
+      91         [ -  + ]:          11 :   if ((stream = g_loadable_icon_load (icon, -1, NULL, NULL, error)) == NULL)
+      92                 :             :     return NULL;
+      93                 :             : 
+      94                 :          11 :   pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
+      95                 :             :                                                 size,
+      96                 :             :                                                 size,
+      97                 :             :                                                 TRUE,
+      98                 :             :                                                 NULL,
+      99                 :             :                                                 error);
+     100                 :             : 
+     101         [ +  - ]:          11 :   if (pixbuf == NULL)
+     102                 :             :     return NULL;
+     103                 :             : 
+     104                 :          11 :   paintable = GDK_PAINTABLE (gdk_texture_new_for_pixbuf (pixbuf));
+     105                 :          11 :   g_object_set_qdata_full (G_OBJECT (contact),
+     106                 :             :                            valent_contact_paintable_quark (),
+     107                 :             :                            paintable,
+     108                 :             :                            g_object_unref);
+     109                 :             : 
+     110                 :          11 :   return paintable;
+     111                 :             : }
+     112                 :             : 
+     113                 :             : /**
+     114                 :             :  * valent_sms_avatar_from_contact:
+     115                 :             :  * @avatar: a `AdwAvatar`
+     116                 :             :  * @contact: a `EContact`
+     117                 :             :  *
+     118                 :             :  * Set the `GdkPaintable` for @avatar from @contact.
+     119                 :             :  */
+     120                 :             : void
+     121                 :          15 : valent_sms_avatar_from_contact (AdwAvatar *avatar,
+     122                 :             :                                 EContact  *contact)
+     123                 :             : {
+     124                 :          15 :   GdkPaintable *paintable;
+     125                 :          15 :   const char *name;
+     126                 :          15 :   int size, scale;
+     127                 :             : 
+     128         [ +  - ]:          15 :   g_return_if_fail (ADW_IS_AVATAR (avatar));
+     129   [ +  -  +  -  :          15 :   g_return_if_fail (E_IS_CONTACT (contact));
+             -  +  -  - ]
+     130                 :             : 
+     131                 :          15 :   size = adw_avatar_get_size (avatar);
+     132                 :          15 :   scale = gtk_widget_get_scale_factor (GTK_WIDGET (avatar));
+     133                 :          15 :   paintable = _e_contact_get_paintable (contact, size, scale, NULL);
+     134                 :             : 
+     135                 :          15 :   name = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
+     136                 :          15 :   adw_avatar_set_text (avatar, name);
+     137                 :             : 
+     138                 :          15 :   adw_avatar_set_custom_image (avatar, paintable);
+     139                 :          15 :   adw_avatar_set_show_initials (avatar, paintable != NULL);
+     140                 :             : }
+     141                 :             : 
+     142                 :             : static void
+     143                 :           4 : valent_sms_contact_from_phone_cb (ValentContactStore *store,
+     144                 :             :                                   GAsyncResult       *result,
+     145                 :             :                                   gpointer            user_data)
+     146                 :             : {
+     147                 :           4 :   g_autoptr (GTask) task = user_data;
+     148                 :           4 :   const char *number = g_task_get_task_data (task);
+     149   [ -  -  +  - ]:           4 :   g_autoslist (GObject) contacts = NULL;
+     150                 :           4 :   EContact *contact = NULL;
+     151                 :           4 :   GError *error = NULL;
+     152                 :             : 
+     153                 :           4 :   contacts = valent_contact_store_query_finish (store, result, &error);
+     154                 :             : 
+     155         [ -  + ]:           4 :   if (error != NULL)
+     156                 :           0 :     return g_task_return_error (task, error);
+     157                 :             : 
+     158                 :             :   /* Prefer using libphonenumber */
+     159         [ +  - ]:           4 :   if (e_phone_number_is_supported ())
+     160                 :             :     {
+     161         [ +  - ]:           4 :       if (contacts != NULL)
+     162                 :           4 :         contact = g_object_ref (contacts->data);
+     163                 :             :     }
+     164                 :             :   else
+     165                 :             :     {
+     166                 :           0 :       g_autofree char *normalized = NULL;
+     167                 :             : 
+     168                 :           0 :       normalized = valent_phone_number_normalize (number);
+     169                 :             : 
+     170         [ #  # ]:           0 :       for (const GSList *iter = contacts; iter; iter = iter->next)
+     171                 :             :         {
+     172         [ #  # ]:           0 :           if (valent_phone_number_of_contact (iter->data, normalized))
+     173                 :             :             {
+     174                 :           0 :               contact = g_object_ref (iter->data);
+     175                 :           0 :               break;
+     176                 :             :             }
+     177                 :             :         }
+     178                 :             :     }
+     179                 :             : 
+     180         [ -  + ]:           4 :   if (contact == NULL)
+     181                 :             :     {
+     182                 :           0 :       contact = e_contact_new ();
+     183                 :           0 :       e_contact_set (contact, E_CONTACT_FULL_NAME, number);
+     184                 :           0 :       e_contact_set (contact, E_CONTACT_PHONE_OTHER, number);
+     185                 :             :     }
+     186                 :             : 
+     187                 :           4 :   g_task_return_pointer (task, contact, g_object_unref);
+     188                 :             : }
+     189                 :             : 
+     190                 :             : /**
+     191                 :             :  * valent_sms_contact_from_phone:
+     192                 :             :  * @store: a `ValentContactStore`
+     193                 :             :  * @phone: a phone number
+     194                 :             :  * @cancellable: (nullable): `GCancellable`
+     195                 :             :  * @callback: (scope async): a `GAsyncReadyCallback`
+     196                 :             :  * @user_data: (closure): user supplied data
+     197                 :             :  *
+     198                 :             :  * A convenience wrapper around [method@Valent.ContactStore.query] for finding a
+     199                 :             :  * contact by phone number.
+     200                 :             :  *
+     201                 :             :  * Call valent_sms_contact_from_phone_finish() to get the result.
+     202                 :             :  */
+     203                 :             : void
+     204                 :           5 : valent_sms_contact_from_phone (ValentContactStore  *store,
+     205                 :             :                                const char          *number,
+     206                 :             :                                GCancellable        *cancellable,
+     207                 :             :                                GAsyncReadyCallback  callback,
+     208                 :             :                                gpointer             user_data)
+     209                 :             : {
+     210                 :           0 :   g_autoptr (GTask) task = NULL;
+     211                 :           0 :   g_autoptr (EBookQuery) query = NULL;
+     212         [ +  - ]:           5 :   g_autofree char *sexp = NULL;
+     213                 :             : 
+     214         [ +  - ]:           5 :   g_return_if_fail (VALENT_IS_CONTACT_STORE (store));
+     215   [ +  -  -  + ]:           5 :   g_return_if_fail (number != NULL && *number != '\0');
+     216   [ -  +  -  -  :           5 :   g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+             -  -  -  - ]
+     217                 :             : 
+     218                 :           5 :   task = g_task_new (store, cancellable, callback, user_data);
+     219         [ +  - ]:           5 :   g_task_set_source_tag (task, valent_sms_contact_from_phone);
+     220         [ -  + ]:          10 :   g_task_set_task_data (task, g_strdup (number), g_free);
+     221                 :             : 
+     222                 :             :   /* Prefer using libphonenumber */
+     223         [ +  - ]:           5 :   if (e_phone_number_is_supported ())
+     224                 :             :     {
+     225                 :           5 :       query = e_book_query_field_test (E_CONTACT_TEL,
+     226                 :             :                                        E_BOOK_QUERY_EQUALS_SHORT_PHONE_NUMBER,
+     227                 :             :                                        number);
+     228                 :           5 :       sexp = e_book_query_to_string (query);
+     229                 :             :     }
+     230                 :             :   else
+     231                 :             :     {
+     232                 :           0 :       query = e_book_query_field_exists (E_CONTACT_TEL);
+     233                 :           0 :       sexp = e_book_query_to_string (query);
+     234                 :             :     }
+     235                 :             : 
+     236                 :           5 :   valent_contact_store_query (store,
+     237                 :             :                               sexp,
+     238                 :             :                               cancellable,
+     239                 :             :                               (GAsyncReadyCallback)valent_sms_contact_from_phone_cb,
+     240                 :             :                               g_steal_pointer (&task));
+     241                 :             : }
+     242                 :             : 
+     243                 :             : /**
+     244                 :             :  * valent_sms_contact_from_phone_finish:
+     245                 :             :  * @store: a `ValentContactStore`
+     246                 :             :  * @result: a `GAsyncResult`
+     247                 :             :  * @error: (nullable): a `GError`
+     248                 :             :  *
+     249                 :             :  * Finish an operation started by valent_sms_contact_from_phone().
+     250                 :             :  *
+     251                 :             :  * Returns: (transfer full): an `EContact`
+     252                 :             :  */
+     253                 :             : EContact *
+     254                 :           4 : valent_sms_contact_from_phone_finish (ValentContactStore  *store,
+     255                 :             :                                       GAsyncResult        *result,
+     256                 :             :                                       GError             **error)
+     257                 :             : {
+     258         [ +  - ]:           4 :   g_return_val_if_fail (VALENT_IS_CONTACT_STORE (store), NULL);
+     259         [ -  + ]:           4 :   g_return_val_if_fail (g_task_is_valid (result, store), NULL);
+     260   [ +  -  -  + ]:           4 :   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+     261                 :             : 
+     262                 :           4 :   return g_task_propagate_pointer (G_TASK (result), error);
+     263                 :             : }
+     264                 :             : 
+     265                 :             : /**
+     266                 :             :  * valent_phone_number_normalize:
+     267                 :             :  * @number: a phone number string
+     268                 :             :  *
+     269                 :             :  * Return a normalized version of @number.
+     270                 :             :  *
+     271                 :             :  * Returns: (transfer full): a normalized phone number string
+     272                 :             :  *
+     273                 :             :  * Since: 1.0
+     274                 :             :  */
+     275                 :             : char *
+     276                 :          15 : valent_phone_number_normalize (const char *number)
+     277                 :             : {
+     278                 :          30 :   g_autofree char *normalized = NULL;
+     279                 :          15 :   size_t i, len;
+     280                 :          15 :   const char *s = number;
+     281                 :             : 
+     282         [ +  - ]:          15 :   g_return_val_if_fail (number != NULL, NULL);
+     283                 :             : 
+     284                 :             : #ifndef __clang_analyzer__
+     285                 :          15 :   i = 0;
+     286                 :          15 :   len = strlen (number);
+     287                 :          15 :   normalized = g_new (char, len + 1);
+     288                 :             : 
+     289         [ +  + ]:          19 :   while (*s == '0')
+     290                 :           4 :     s++;
+     291                 :             : 
+     292         [ +  + ]:         212 :   while (*s != '\0')
+     293                 :             :     {
+     294         [ +  + ]:         197 :       if G_LIKELY (g_ascii_isdigit (*s))
+     295                 :         152 :         normalized[i++] = *s;
+     296                 :             : 
+     297                 :         197 :       s++;
+     298                 :             :     }
+     299                 :          15 :   normalized[i++] = '\0';
+     300                 :          15 :   normalized = g_realloc (normalized, i * sizeof (char));
+     301                 :             : 
+     302                 :             :   /* If we fail or the number is stripped completely, return the original */
+     303         [ -  + ]:          15 :   if G_UNLIKELY (*normalized == '\0')
+     304         [ #  # ]:           0 :     return g_strdup (number);
+     305                 :             : #endif /* __clang_analyzer__ */
+     306                 :             : 
+     307                 :             :   return g_steal_pointer (&normalized);
+     308                 :             : }
+     309                 :             : 
+     310                 :             : static inline gboolean
+     311                 :           1 : valent_phone_number_compare_normalized (const char *number1,
+     312                 :             :                                         const char *number2)
+     313                 :             : {
+     314                 :           1 :   size_t number1_len, number2_len;
+     315                 :             : 
+     316         [ +  - ]:           1 :   g_assert (number1 != NULL);
+     317         [ -  + ]:           1 :   g_assert (number2 != NULL);
+     318                 :             : 
+     319                 :           1 :   number1_len = strlen (number1);
+     320                 :           1 :   number2_len = strlen (number2);
+     321                 :             : 
+     322         [ -  + ]:           1 :   if (number1_len > number2_len)
+     323                 :           0 :     return g_str_equal (number1 + number1_len - number2_len, number2);
+     324                 :             :   else
+     325                 :           1 :     return g_str_equal (number2 + number2_len - number1_len, number1);
+     326                 :             : }
+     327                 :             : 
+     328                 :             : /**
+     329                 :             :  * valent_phone_number_equal:
+     330                 :             :  * @number1: a phone number string
+     331                 :             :  * @number2: a phone number string
+     332                 :             :  *
+     333                 :             :  * Normalize and compare @number1 with @number2 and return %TRUE if they match
+     334                 :             :  * or %FALSE if they don't.
+     335                 :             :  *
+     336                 :             :  * Returns: %TRUE or %FALSE indicating equality
+     337                 :             :  *
+     338                 :             :  * Since: 1.0
+     339                 :             :  */
+     340                 :             : gboolean
+     341                 :           4 : valent_phone_number_equal (const char *number1,
+     342                 :             :                            const char *number2)
+     343                 :             : {
+     344                 :           8 :   g_autofree char *normalized1 = NULL;
+     345                 :           4 :   g_autofree char *normalized2 = NULL;
+     346                 :           4 :   size_t num1_len, num2_len;
+     347                 :             : 
+     348         [ +  - ]:           4 :   g_return_val_if_fail (number1 != NULL, FALSE);
+     349         [ -  + ]:           4 :   g_return_val_if_fail (number2 != NULL, FALSE);
+     350                 :             : 
+     351                 :           4 :   normalized1 = valent_phone_number_normalize (number1);
+     352                 :           4 :   normalized2 = valent_phone_number_normalize (number2);
+     353                 :             : 
+     354                 :           4 :   num1_len = strlen (normalized1);
+     355                 :           4 :   num2_len = strlen (normalized2);
+     356                 :             : 
+     357         [ -  + ]:           4 :   if (num1_len > num2_len)
+     358                 :           0 :     return g_str_equal (normalized1 + num1_len - num2_len, normalized2);
+     359                 :             :   else
+     360                 :           4 :     return g_str_equal (normalized2 + num2_len - num1_len, normalized1);
+     361                 :             : }
+     362                 :             : 
+     363                 :             : /**
+     364                 :             :  * valent_phone_number_of_contact:
+     365                 :             :  * @contact: an `EContact`
+     366                 :             :  * @number: a normalized phone number
+     367                 :             :  *
+     368                 :             :  * Check if @contact has @number as one of it's phone numbers.
+     369                 :             :  *
+     370                 :             :  * Since this function is typically used to test against a series of contacts, it is expected that
+     371                 :             :  * @number has already been normalized with valent_phone_number_normalize().
+     372                 :             :  *
+     373                 :             :  * Returns: %TRUE if @number belongs to the contact
+     374                 :             :  */
+     375                 :             : gboolean
+     376                 :           1 : valent_phone_number_of_contact (EContact   *contact,
+     377                 :             :                                 const char *number)
+     378                 :             : {
+     379                 :           1 :   GList *numbers = NULL;
+     380                 :           1 :   gboolean ret = FALSE;
+     381                 :             : 
+     382   [ +  -  +  -  :           1 :   g_return_val_if_fail (E_IS_CONTACT (contact), FALSE);
+             -  +  -  - ]
+     383         [ -  + ]:           1 :   g_return_val_if_fail (number != NULL, FALSE);
+     384                 :             : 
+     385                 :           1 :   numbers = e_contact_get (contact, E_CONTACT_TEL);
+     386                 :             : 
+     387         [ +  - ]:           1 :   for (const GList *iter = numbers; iter; iter = iter->next)
+     388                 :             :     {
+     389                 :           1 :       g_autofree char *normalized = NULL;
+     390                 :             : 
+     391                 :           1 :       normalized = valent_phone_number_normalize (iter->data);
+     392                 :             : 
+     393         [ -  + ]:           1 :       if ((ret = valent_phone_number_compare_normalized (number, normalized)))
+     394                 :             :         break;
+     395                 :             :     }
+     396                 :           1 :   g_list_free_full (numbers, g_free);
+     397                 :             : 
+     398                 :           1 :   return ret;
+     399                 :             : }
+     400                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-window.c.func-c.html b/coverage/src/plugins/sms/valent-sms-window.c.func-c.html new file mode 100644 index 00000000000..79579262dd7 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-window.c.func-c.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-window.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-window.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:58.1 %363211
Test Date:2024-03-31 18:46:36Functions:68.4 %3826
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:32.7 %15049
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_contact_selected0
on_conversation_activated0
on_message_search_changed0
on_message_selected0
on_send_message0
reset_search_cb0
search_contacts_cb0
search_header_func0
search_messages_cb0
sms_new_action0
sms_search_action0
valent_sms_window_set_active_message0
check_number1
on_contact_search_changed1
valent_sms_window_ensure_conversation1
valent_sms_window_get_contact_store1
valent_sms_window_get_message_store1
valent_sms_window_search_messages1
valent_sms_window_set_active_thread1
conversation_list_create2
conversation_list_populate2
phone_lookup_cb2
refresh_contacts_cb2
valent_sms_window_class_init2
valent_sms_window_constructed2
valent_sms_window_dispose2
valent_sms_window_finalize2
valent_sms_window_get_property2
valent_sms_window_init2
valent_sms_window_refresh_contacts2
valent_sms_window_search_contacts2
valent_sms_window_set_contact_store2
valent_sms_window_set_property4
contact_search_list_filter12
contact_search_list_sort18
valent_sms_window_get_type18
valent_sms_window_class_intern_init2
valent_sms_window_get_type_once2
valent_sms_window_get_type14
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-window.c.func.html b/coverage/src/plugins/sms/valent-sms-window.c.func.html new file mode 100644 index 00000000000..a5e6b60390e --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-window.c.func.html @@ -0,0 +1,364 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-window.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-window.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:58.1 %363211
Test Date:2024-03-31 18:46:36Functions:68.4 %3826
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:32.7 %15049
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
check_number1
contact_search_list_filter12
contact_search_list_sort18
conversation_list_create2
conversation_list_populate2
on_contact_search_changed1
on_contact_selected0
on_conversation_activated0
on_message_search_changed0
on_message_selected0
on_send_message0
phone_lookup_cb2
refresh_contacts_cb2
reset_search_cb0
search_contacts_cb0
search_header_func0
search_messages_cb0
sms_new_action0
sms_search_action0
valent_sms_window_class_init2
valent_sms_window_constructed2
valent_sms_window_dispose2
valent_sms_window_ensure_conversation1
valent_sms_window_finalize2
valent_sms_window_get_contact_store1
valent_sms_window_get_message_store1
valent_sms_window_get_property2
valent_sms_window_get_type18
valent_sms_window_class_intern_init2
valent_sms_window_get_type14
valent_sms_window_get_type_once2
valent_sms_window_init2
valent_sms_window_refresh_contacts2
valent_sms_window_search_contacts2
valent_sms_window_search_messages1
valent_sms_window_set_active_message0
valent_sms_window_set_active_thread1
valent_sms_window_set_contact_store2
valent_sms_window_set_property4
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-window.c.gcov.html b/coverage/src/plugins/sms/valent-sms-window.c.gcov.html new file mode 100644 index 00000000000..463918ea8ee --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-window.c.gcov.html @@ -0,0 +1,1076 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-window.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-window.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:58.1 %363211
Test Date:2024-03-31 18:46:36Functions:68.4 %3826
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:32.7 %15049
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-sms-window"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <adwaita.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-contact-row.h"
+      14                 :             : #include "valent-message.h"
+      15                 :             : #include "valent-sms-conversation.h"
+      16                 :             : #include "valent-sms-store.h"
+      17                 :             : #include "valent-sms-utils.h"
+      18                 :             : #include "valent-sms-window.h"
+      19                 :             : #include "valent-message-row.h"
+      20                 :             : 
+      21                 :             : 
+      22                 :             : struct _ValentSmsWindow
+      23                 :             : {
+      24                 :             :   AdwApplicationWindow    parent_instance;
+      25                 :             : 
+      26                 :             :   ValentContactStore     *contact_store;
+      27                 :             :   ValentSmsStore         *message_store;
+      28                 :             : 
+      29                 :             :   /* template */
+      30                 :             :   AdwNavigationSplitView *content_box;
+      31                 :             :   AdwHeaderBar           *content_header;
+      32                 :             :   AdwHeaderBar           *sidebar_header;
+      33                 :             : 
+      34                 :             :   AdwNavigationPage      *content_page;
+      35                 :             :   GtkBox                 *content_layout;
+      36                 :             :   GtkListBox             *conversation_list;
+      37                 :             :   GtkStack               *content;
+      38                 :             : 
+      39                 :             :   GtkWidget              *message_search;
+      40                 :             :   GtkWidget              *message_search_entry;
+      41                 :             :   GtkListBox             *message_search_list;
+      42                 :             : 
+      43                 :             :   GtkWidget              *contact_search;
+      44                 :             :   GtkWidget              *contact_search_entry;
+      45                 :             :   GtkListBox             *contact_search_list;
+      46                 :             :   GtkWidget              *placeholder_contact;
+      47                 :             : };
+      48                 :             : 
+      49   [ +  +  +  - ]:          18 : G_DEFINE_FINAL_TYPE (ValentSmsWindow, valent_sms_window, ADW_TYPE_APPLICATION_WINDOW)
+      50                 :             : 
+      51                 :             : enum {
+      52                 :             :   PROP_0,
+      53                 :             :   PROP_CONTACT_STORE,
+      54                 :             :   PROP_MESSAGE_STORE,
+      55                 :             :   N_PROPERTIES
+      56                 :             : };
+      57                 :             : 
+      58                 :             : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+      59                 :             : 
+      60                 :             : enum {
+      61                 :             :   SEND_MESSAGE,
+      62                 :             :   N_SIGNALS
+      63                 :             : };
+      64                 :             : 
+      65                 :             : static guint signals[N_SIGNALS] = { 0, };
+      66                 :             : 
+      67                 :             : 
+      68                 :             : /*
+      69                 :             :  * Generic callback for querying a contact for a widget
+      70                 :             :  */
+      71                 :             : static void
+      72                 :           2 : phone_lookup_cb (ValentContactStore *store,
+      73                 :             :                  GAsyncResult       *result,
+      74                 :             :                  ValentMessageRow   *row)
+      75                 :             : {
+      76                 :           4 :   g_autoptr (GError) error = NULL;
+      77         [ -  + ]:           2 :   g_autoptr (EContact) contact = NULL;
+      78                 :             : 
+      79                 :           2 :   contact = valent_sms_contact_from_phone_finish (store, result, &error);
+      80                 :             : 
+      81         [ -  + ]:           2 :   if (contact == NULL)
+      82                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+      83                 :             : 
+      84         [ +  - ]:           2 :   valent_message_row_set_contact (row, contact);
+      85                 :           2 : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           0 : search_contacts_cb (ValentContactStore *model,
+      89                 :             :                     GAsyncResult       *result,
+      90                 :             :                     ValentSmsWindow    *window)
+      91                 :             : {
+      92                 :           0 :   g_autoptr (GError) error = NULL;
+      93         [ #  # ]:           0 :   g_autoslist (GObject) contacts = NULL;
+      94                 :             : 
+      95                 :           0 :   contacts = valent_contact_store_query_finish (model, result, &error);
+      96                 :             : 
+      97         [ #  # ]:           0 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+      98                 :           0 :     valent_list_add_contact (window->contact_search_list, iter->data);
+      99                 :             : 
+     100         [ #  # ]:           0 :   if (error != NULL)
+     101                 :           0 :     g_warning ("%s(): %s", G_STRFUNC, error->message);
+     102                 :           0 : }
+     103                 :             : 
+     104                 :             : static void
+     105                 :           0 : search_messages_cb (ValentSmsStore  *store,
+     106                 :             :                     GAsyncResult    *result,
+     107                 :             :                     ValentSmsWindow *window)
+     108                 :             : {
+     109                 :           0 :   g_autoptr (GError) error = NULL;
+     110         [ #  # ]:           0 :   g_autoptr (GPtrArray) messages = NULL;
+     111                 :             : 
+     112                 :           0 :   messages = valent_sms_store_find_messages_finish (store, result, &error);
+     113                 :             : 
+     114         [ #  # ]:           0 :   for (unsigned int i = 0; i < messages->len; i++)
+     115                 :             :     {
+     116                 :           0 :       ValentMessage *message;
+     117                 :           0 :       GtkWidget *row;
+     118                 :           0 :       const char *address;
+     119                 :             : 
+     120                 :           0 :       message = g_ptr_array_index (messages, i);
+     121                 :             : 
+     122                 :           0 :       row = g_object_new (VALENT_TYPE_MESSAGE_ROW,
+     123                 :             :                           "message", message,
+     124                 :             :                           NULL);
+     125                 :           0 :       gtk_list_box_insert (window->message_search_list, row, -1);
+     126                 :             : 
+     127         [ #  # ]:           0 :       if ((address = valent_message_get_sender (message)) == NULL)
+     128                 :             :         {
+     129                 :           0 :           GVariant *metadata;
+     130                 :           0 :           g_autoptr (GVariant) addresses = NULL;
+     131   [ #  #  #  # ]:           0 :           g_autoptr (GVariant) address_dict = NULL;
+     132                 :             : 
+     133                 :           0 :           metadata = valent_message_get_metadata (message);
+     134                 :             : 
+     135         [ #  # ]:           0 :           if (!g_variant_lookup (metadata, "addresses", "@aa{sv}", &addresses))
+     136                 :           0 :             continue;
+     137                 :             : 
+     138         [ #  # ]:           0 :           if (g_variant_n_children (addresses) == 0)
+     139                 :           0 :             continue;
+     140                 :             : 
+     141                 :           0 :           address_dict = g_variant_get_child_value (addresses, 0);
+     142                 :             : 
+     143         [ #  # ]:           0 :           if (!g_variant_lookup (address_dict, "address", "&s", &address))
+     144         [ #  # ]:           0 :             continue;
+     145                 :             :         }
+     146                 :             : 
+     147                 :           0 :       valent_sms_contact_from_phone (window->contact_store,
+     148                 :             :                                      address,
+     149                 :             :                                      NULL,
+     150                 :             :                                      (GAsyncReadyCallback)phone_lookup_cb,
+     151                 :             :                                      row);
+     152                 :             :     }
+     153                 :           0 : }
+     154                 :             : 
+     155                 :             : /*
+     156                 :             :  * Reset search pages in a timeout source
+     157                 :             :  */
+     158                 :             : static gboolean
+     159                 :           0 : reset_search_cb (gpointer data)
+     160                 :             : {
+     161                 :           0 :   ValentSmsWindow *self = data;
+     162                 :             : 
+     163         [ #  # ]:           0 :   g_assert (VALENT_IS_SMS_WINDOW (self));
+     164                 :             : 
+     165                 :           0 :   gtk_editable_set_text (GTK_EDITABLE (self->contact_search_entry), "");
+     166                 :           0 :   gtk_editable_set_text (GTK_EDITABLE (self->message_search_entry), "");
+     167                 :             : 
+     168                 :           0 :   return G_SOURCE_REMOVE;
+     169                 :             : }
+     170                 :             : 
+     171                 :             : /*
+     172                 :             :  * Message Search
+     173                 :             :  */
+     174                 :             : static void
+     175                 :           0 : search_header_func (GtkListBoxRow *row,
+     176                 :             :                     GtkListBoxRow *before,
+     177                 :             :                     gpointer       user_data)
+     178                 :             : {
+     179         [ #  # ]:           0 :   if (VALENT_IS_MESSAGE_ROW (row))
+     180                 :             :     {
+     181   [ #  #  #  # ]:           0 :       if (before == NULL || !VALENT_IS_MESSAGE_ROW (before))
+     182                 :             :         {
+     183                 :           0 :           GtkWidget *label;
+     184                 :             : 
+     185                 :           0 :           label = g_object_new (GTK_TYPE_LABEL,
+     186                 :             :                                 "label",        _("Conversations"),
+     187                 :             :                                 "halign",       GTK_ALIGN_START,
+     188                 :             :                                 "margin-end",   6,
+     189                 :             :                                 "margin-start", 6,
+     190                 :             :                                 "margin-top",   6,
+     191                 :             :                                 NULL);
+     192                 :           0 :           gtk_widget_add_css_class (label, "dim-label");
+     193                 :           0 :           gtk_widget_add_css_class (label, "list-header-title");
+     194                 :           0 :           gtk_list_box_row_set_header (row, label);
+     195                 :             :         }
+     196                 :             :     }
+     197                 :             : 
+     198                 :           0 :   valent_contact_row_header_func (row, before, user_data);
+     199                 :           0 : }
+     200                 :             : 
+     201                 :             : static void
+     202                 :           0 : on_message_search_changed (GtkSearchEntry  *entry,
+     203                 :             :                            ValentSmsWindow *window)
+     204                 :             : {
+     205                 :           0 :   GtkWidget *child;
+     206                 :           0 :   const char *query_str;
+     207                 :           0 :   EBookQuery *queries[2];
+     208                 :           0 :   g_autoptr (EBookQuery) query = NULL;
+     209         [ #  # ]:           0 :   g_autofree char *sexp = NULL;
+     210                 :             : 
+     211                 :           0 :   query_str = gtk_editable_get_text (GTK_EDITABLE (entry));
+     212                 :             : 
+     213                 :             :   /* Clear previous results */
+     214         [ #  # ]:           0 :   while ((child = gtk_widget_get_first_child (GTK_WIDGET (window->message_search_list))))
+     215                 :           0 :     gtk_list_box_remove (window->message_search_list, child);
+     216                 :             : 
+     217                 :             :   /* NULL query */
+     218         [ #  # ]:           0 :   if (g_strcmp0 (query_str, "") == 0)
+     219                 :           0 :     return;
+     220                 :             : 
+     221                 :             :   /* Search messages */
+     222                 :           0 :   valent_sms_store_find_messages (window->message_store,
+     223                 :             :                                   query_str,
+     224                 :             :                                   NULL,
+     225                 :             :                                   (GAsyncReadyCallback)search_messages_cb,
+     226                 :             :                                   window);
+     227                 :             : 
+     228                 :             :   /* Search contacts */
+     229                 :           0 :   queries[0] = e_book_query_field_test (E_CONTACT_FULL_NAME,
+     230                 :             :                                         E_BOOK_QUERY_CONTAINS,
+     231                 :             :                                         query_str);
+     232                 :           0 :   queries[1] = e_book_query_field_test (E_CONTACT_TEL,
+     233                 :             :                                         E_BOOK_QUERY_CONTAINS,
+     234                 :             :                                         query_str);
+     235                 :             : 
+     236                 :           0 :   query = e_book_query_or (G_N_ELEMENTS (queries), queries, TRUE);
+     237                 :           0 :   sexp = e_book_query_to_string (query);
+     238                 :             : 
+     239                 :           0 :   valent_contact_store_query (window->contact_store,
+     240                 :             :                               sexp,
+     241                 :             :                               NULL,
+     242                 :             :                               (GAsyncReadyCallback)search_contacts_cb,
+     243                 :             :                               window);
+     244                 :             : }
+     245                 :             : 
+     246                 :             : static void
+     247                 :           0 : on_message_selected (GtkListBox      *box,
+     248                 :             :                      GtkListBoxRow   *row,
+     249                 :             :                      ValentSmsWindow *self)
+     250                 :             : {
+     251                 :           0 :   EContact *contact;
+     252                 :             : 
+     253         [ #  # ]:           0 :   if (VALENT_IS_MESSAGE_ROW (row))
+     254                 :             :     {
+     255                 :           0 :       ValentMessage *message;
+     256                 :             : 
+     257                 :           0 :       message = valent_message_row_get_message (VALENT_MESSAGE_ROW (row));
+     258                 :           0 :       valent_sms_window_set_active_message (self, message);
+     259                 :             : 
+     260                 :             :       /* Reset the search after the transition */
+     261                 :           0 :       g_timeout_add_seconds (1, reset_search_cb, self);
+     262                 :             :     }
+     263         [ #  # ]:           0 :   else if (VALENT_IS_CONTACT_ROW (row))
+     264                 :             :     {
+     265                 :           0 :       contact = valent_contact_row_get_contact (VALENT_CONTACT_ROW (row));
+     266                 :           0 :       g_debug ("CONTACT ROW SELECTED %s",
+     267                 :             :                (const char *)e_contact_get_const (contact, E_CONTACT_FULL_NAME));
+     268                 :             :     }
+     269                 :           0 : }
+     270                 :             : 
+     271                 :             : /*
+     272                 :             :  * Contact Search
+     273                 :             :  */
+     274                 :             : static gboolean
+     275                 :           1 : check_number (const char *query)
+     276                 :             : {
+     277                 :           1 :   static GRegex *is_number = NULL;
+     278                 :             : 
+     279         [ +  - ]:           1 :   if (is_number == NULL)
+     280                 :           1 :     is_number = g_regex_new ("(?!0)[\\d]{3,}", G_REGEX_OPTIMIZE, 0, NULL);
+     281                 :             : 
+     282                 :           1 :   return g_regex_match (is_number, query, 0, NULL);
+     283                 :             : }
+     284                 :             : 
+     285                 :             : static void
+     286                 :           0 : on_contact_selected (GtkListBox      *box,
+     287                 :             :                      GtkListBoxRow   *row,
+     288                 :             :                      ValentSmsWindow *self)
+     289                 :             : {
+     290                 :           0 :   const char *address;
+     291                 :             : 
+     292                 :           0 :   address = valent_contact_row_get_contact_address (VALENT_CONTACT_ROW (row));
+     293                 :           0 :   g_debug ("NUMBER SELECTED: %s", address);
+     294                 :           0 : }
+     295                 :             : 
+     296                 :             : static void
+     297                 :           1 : on_contact_search_changed (GtkSearchEntry  *entry,
+     298                 :             :                            ValentSmsWindow *self)
+     299                 :             : {
+     300                 :           1 :   const char *query;
+     301                 :             : 
+     302                 :           1 :   query = gtk_editable_get_text (GTK_EDITABLE (entry));
+     303                 :             : 
+     304                 :             :   /* If the entry contains a possible phone number... */
+     305         [ -  + ]:           1 :   if (check_number (query))
+     306                 :             :     {
+     307                 :           0 :       EContact *contact;
+     308                 :           0 :       g_autofree char *name_label = NULL;
+     309                 :             : 
+     310                 :           0 :       name_label = g_strdup_printf (_("Send to %s"), query);
+     311                 :             : 
+     312                 :             :       /* ...ensure we have a dynamic contact for it */
+     313         [ #  # ]:           0 :       if (self->placeholder_contact == NULL)
+     314                 :             :         {
+     315                 :             :           /* Create a dummy contact */
+     316                 :           0 :           contact = e_contact_new ();
+     317                 :           0 :           e_contact_set (contact, E_CONTACT_FULL_NAME, query);
+     318                 :           0 :           e_contact_set (contact, E_CONTACT_PHONE_OTHER, query);
+     319                 :             : 
+     320                 :             :           /* Create and add a new row */
+     321                 :           0 :           self->placeholder_contact = g_object_new (VALENT_TYPE_CONTACT_ROW,
+     322                 :             :                                                 "contact",         contact,
+     323                 :             :                                                 "contact-name",    name_label,
+     324                 :             :                                                 "contact-address", query,
+     325                 :             :                                                 NULL);
+     326                 :             : 
+     327                 :           0 :           gtk_list_box_insert (self->contact_search_list,
+     328                 :             :                                self->placeholder_contact,
+     329                 :             :                                -1);
+     330                 :             :         }
+     331                 :             : 
+     332                 :             :       /* ...or if we already do, then update it */
+     333                 :             :       else
+     334                 :             :         {
+     335                 :           0 :           g_object_get (self->placeholder_contact, "contact", &contact, NULL);
+     336                 :             : 
+     337                 :             :           /* Update contact */
+     338                 :           0 :           e_contact_set (contact, E_CONTACT_FULL_NAME, query);
+     339                 :           0 :           e_contact_set (contact, E_CONTACT_PHONE_OTHER, query);
+     340                 :             : 
+     341                 :             :           /* Update row */
+     342                 :           0 :           g_object_set (self->placeholder_contact,
+     343                 :             :                         "contact-name",    name_label,
+     344                 :             :                         "contact-address", query,
+     345                 :             :                         NULL);
+     346                 :             :         }
+     347                 :             : 
+     348                 :             :       /* Drop the extra ref */
+     349         [ #  # ]:           0 :       g_clear_pointer (&contact, g_object_unref);
+     350                 :             :     }
+     351                 :             : 
+     352                 :             :   /* ...otherwise remove the dynamic row if created */
+     353         [ -  + ]:           1 :   else if (self->placeholder_contact != NULL)
+     354                 :             :     {
+     355                 :           0 :       gtk_list_box_remove (self->contact_search_list,
+     356                 :             :                            self->placeholder_contact);
+     357                 :           0 :       self->placeholder_contact = NULL;
+     358                 :             :     }
+     359                 :             : 
+     360                 :           1 :   gtk_list_box_invalidate_filter (self->contact_search_list);
+     361                 :           1 :   gtk_list_box_invalidate_sort (self->contact_search_list);
+     362                 :           1 :   gtk_list_box_invalidate_headers (self->contact_search_list);
+     363                 :           1 : }
+     364                 :             : 
+     365                 :             : static gboolean
+     366                 :          12 : contact_search_list_filter (ValentContactRow *row,
+     367                 :             :                             ValentSmsWindow  *self)
+     368                 :             : {
+     369                 :          12 :   const char *query;
+     370                 :          24 :   g_autofree char *query_folded = NULL;
+     371                 :          12 :   g_autofree char *name = NULL;
+     372                 :          12 :   const char *address = NULL;
+     373                 :             : 
+     374                 :             :   /* Always show dynamic contact */
+     375         [ -  + ]:          12 :   if G_UNLIKELY (GTK_WIDGET (row) == self->placeholder_contact)
+     376                 :             :     return TRUE;
+     377                 :             : 
+     378                 :          12 :   query = gtk_editable_get_text (GTK_EDITABLE (self->contact_search_entry));
+     379                 :             : 
+     380         [ +  - ]:          12 :   if (g_strcmp0 (query, "") == 0)
+     381                 :             :     return TRUE;
+     382                 :             : 
+     383                 :           0 :   query_folded = g_utf8_casefold (query, -1);
+     384                 :             : 
+     385                 :             :   /* Show contact if text is substring of name */
+     386                 :           0 :   name = g_utf8_casefold (valent_contact_row_get_contact_name (row), -1);
+     387                 :             : 
+     388         [ #  # ]:           0 :   if (g_strrstr (name, query_folded) != NULL)
+     389                 :             :     return TRUE;
+     390                 :             : 
+     391                 :             :   /* Show contact if text is substring of number */
+     392                 :           0 :   address = valent_contact_row_get_contact_address (row);
+     393                 :             : 
+     394         [ #  # ]:           0 :   if (g_strrstr (address, query_folded))
+     395                 :             :     return TRUE;
+     396                 :             : 
+     397                 :             :   return FALSE;
+     398                 :             : }
+     399                 :             : 
+     400                 :             : static int
+     401                 :          18 : contact_search_list_sort (GtkListBoxRow   *row1,
+     402                 :             :                           GtkListBoxRow   *row2,
+     403                 :             :                           ValentSmsWindow *self)
+     404                 :             : {
+     405                 :          18 :   const char *name1;
+     406                 :          18 :   const char *name2;
+     407                 :             : 
+     408         [ +  - ]:          18 :   if G_UNLIKELY (GTK_WIDGET (row1) == self->placeholder_contact)
+     409                 :             :     return -1;
+     410                 :             : 
+     411         [ +  - ]:          18 :   if G_UNLIKELY (GTK_WIDGET (row2) == self->placeholder_contact)
+     412                 :             :     return 1;
+     413                 :             : 
+     414                 :          18 :   name1 = valent_contact_row_get_contact_name (VALENT_CONTACT_ROW (row1));
+     415                 :          18 :   name2 = valent_contact_row_get_contact_name (VALENT_CONTACT_ROW (row2));
+     416                 :             : 
+     417                 :          18 :   return g_utf8_collate (name1, name2);
+     418                 :             : }
+     419                 :             : 
+     420                 :             : static void
+     421                 :           2 : refresh_contacts_cb (ValentContactStore *store,
+     422                 :             :                      GAsyncResult       *result,
+     423                 :             :                      ValentSmsWindow    *self)
+     424                 :             : {
+     425                 :           2 :   g_autoslist (GObject) contacts = NULL;
+     426                 :           2 :   g_autoptr (GError) error = NULL;
+     427                 :             : 
+     428                 :           2 :   contacts = valent_contact_store_query_finish (store, result, &error);
+     429                 :             : 
+     430         [ -  + ]:           2 :   if (error != NULL)
+     431                 :             :     {
+     432                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     433         [ #  # ]:           0 :       return;
+     434                 :             :     }
+     435                 :             : 
+     436         [ +  + ]:           5 :   for (const GSList *iter = contacts; iter; iter = iter->next)
+     437                 :           3 :     valent_list_add_contact (self->contact_search_list, iter->data);
+     438                 :             : }
+     439                 :             : 
+     440                 :             : static void
+     441                 :           2 : valent_sms_window_refresh_contacts (ValentSmsWindow *self)
+     442                 :             : {
+     443                 :           2 :   GtkWidget *row;
+     444                 :           0 :   g_autoptr (EBookQuery) query = NULL;
+     445         [ +  - ]:           2 :   g_autofree char *sexp = NULL;
+     446                 :             : 
+     447                 :             :   /* Clear the list */
+     448         [ +  + ]:           4 :   while ((row = gtk_widget_get_first_child (GTK_WIDGET (self->contact_search_list))))
+     449                 :           2 :     gtk_list_box_remove (self->contact_search_list, row);
+     450                 :             : 
+     451         [ -  + ]:           2 :   if (self->contact_store == NULL)
+     452                 :           0 :     return;
+     453                 :             : 
+     454                 :             :   /* Add the contacts */
+     455                 :           2 :   query = e_book_query_vcard_field_exists (EVC_TEL);
+     456                 :           2 :   sexp = e_book_query_to_string (query);
+     457                 :             : 
+     458                 :           2 :   valent_contact_store_query (self->contact_store,
+     459                 :             :                               sexp,
+     460                 :             :                               NULL,
+     461                 :             :                               (GAsyncReadyCallback)refresh_contacts_cb,
+     462                 :             :                               self);
+     463                 :             : }
+     464                 :             : 
+     465                 :             : /*
+     466                 :             :  * Conversation List
+     467                 :             :  */
+     468                 :             : static gboolean
+     469                 :           0 : on_send_message (GObject         *object,
+     470                 :             :                  ValentMessage   *message,
+     471                 :             :                  ValentSmsWindow *window)
+     472                 :             : {
+     473                 :           0 :   gboolean sent;
+     474                 :             : 
+     475                 :           0 :   g_signal_emit (G_OBJECT (window), signals [SEND_MESSAGE], 0, message, &sent);
+     476                 :             : 
+     477                 :           0 :   return sent;
+     478                 :             : }
+     479                 :             : 
+     480                 :             : /*
+     481                 :             :  * Conversation List Callbacks
+     482                 :             :  */
+     483                 :             : static GtkWidget *
+     484                 :           2 : conversation_list_create (gpointer item,
+     485                 :             :                           gpointer user_data)
+     486                 :             : {
+     487                 :           2 :   ValentSmsWindow *window = VALENT_SMS_WINDOW (user_data);
+     488                 :           2 :   ValentMessage *message = VALENT_MESSAGE (item);
+     489                 :           2 :   GtkWidget *row;
+     490                 :           2 :   GVariant *metadata;
+     491                 :           4 :   g_autoptr (GVariant) addresses = NULL;
+     492                 :             : 
+     493                 :           2 :   row = g_object_new (VALENT_TYPE_MESSAGE_ROW,
+     494                 :             :                       "message", message,
+     495                 :             :                       NULL);
+     496                 :             : 
+     497                 :             :   /* TODO: probably a failure of kdeconnect-android, but occasionally a message
+     498                 :             :    *       will have no addresses */
+     499   [ +  -  +  - ]:           4 :   if ((metadata = valent_message_get_metadata (message)) != NULL &&
+     500         [ +  - ]:           4 :       g_variant_lookup (metadata, "addresses", "@aa{sv}", &addresses) &&
+     501                 :           2 :       g_variant_n_children (addresses) > 0)
+     502                 :             :     {
+     503                 :           2 :       g_autoptr (GVariant) participant = NULL;
+     504                 :           2 :       const char *address;
+     505                 :             : 
+     506                 :           2 :       participant = g_variant_get_child_value (addresses, 0);
+     507                 :             : 
+     508         [ +  - ]:           2 :       if (g_variant_lookup (participant, "address", "&s", &address))
+     509                 :             :         {
+     510                 :           2 :           valent_sms_contact_from_phone (window->contact_store,
+     511                 :             :                                          address,
+     512                 :             :                                          NULL,
+     513                 :             :                                          (GAsyncReadyCallback)phone_lookup_cb,
+     514                 :             :                                          row);
+     515                 :             :         }
+     516                 :             :     }
+     517                 :             : 
+     518         [ +  - ]:           2 :   return row;
+     519                 :             : }
+     520                 :             : 
+     521                 :             : static void
+     522                 :           2 : conversation_list_populate (ValentSmsWindow *window)
+     523                 :             : {
+     524                 :           4 :   g_autoptr (GListModel) threads = NULL;
+     525                 :             : 
+     526         [ +  - ]:           2 :   g_assert (VALENT_IS_SMS_WINDOW (window));
+     527                 :             : 
+     528                 :           2 :   threads = valent_sms_store_get_summary (window->message_store);
+     529         [ +  - ]:           2 :   gtk_list_box_bind_model (window->conversation_list,
+     530                 :             :                            threads,
+     531                 :             :                            conversation_list_create,
+     532                 :             :                            window,
+     533                 :             :                            NULL);
+     534                 :           2 : }
+     535                 :             : 
+     536                 :             : static GtkWidget *
+     537                 :           1 : valent_sms_window_ensure_conversation (ValentSmsWindow *window,
+     538                 :             :                                        int64_t          thread_id)
+     539                 :             : {
+     540                 :           1 :   GtkWidget *conversation;
+     541                 :           2 :   g_autofree char *page_name = NULL;
+     542                 :             : 
+     543                 :           1 :   page_name = g_strdup_printf ("%"G_GINT64_FORMAT, thread_id);
+     544                 :           1 :   conversation = gtk_stack_get_child_by_name (window->content, page_name);
+     545                 :             : 
+     546         [ +  - ]:           1 :   if (conversation == NULL)
+     547                 :             :     {
+     548                 :           1 :       conversation = g_object_new (VALENT_TYPE_SMS_CONVERSATION,
+     549                 :             :                                    "contact-store", window->contact_store,
+     550                 :             :                                    "message-store", window->message_store,
+     551                 :             :                                    "thread-id",     thread_id,
+     552                 :             :                                    NULL);
+     553                 :             : 
+     554                 :           1 :       g_object_bind_property (window,       "contact-store",
+     555                 :             :                               conversation, "contact-store",
+     556                 :             :                               G_BINDING_DEFAULT);
+     557                 :             : 
+     558                 :           1 :       g_signal_connect_object (conversation,
+     559                 :             :                                "send-message",
+     560                 :             :                                G_CALLBACK (on_send_message),
+     561                 :             :                                window, 0);
+     562                 :             : 
+     563                 :           1 :       gtk_stack_add_named (window->content, conversation, page_name);
+     564                 :             :     }
+     565                 :             : 
+     566                 :           1 :   return conversation;
+     567                 :             : }
+     568                 :             : 
+     569                 :             : static void
+     570                 :           0 : on_conversation_activated (GtkListBox      *box,
+     571                 :             :                            GtkListBoxRow   *row,
+     572                 :             :                            ValentSmsWindow *self)
+     573                 :             : {
+     574                 :           0 :   ValentMessageRow *summary;
+     575                 :           0 :   int64_t thread_id;
+     576                 :             : 
+     577                 :             :   /* Deselect */
+     578         [ #  # ]:           0 :   if (row == NULL)
+     579                 :             :     return;
+     580                 :             : 
+     581                 :           0 :   summary = VALENT_MESSAGE_ROW (row);
+     582                 :           0 :   thread_id = valent_message_row_get_thread_id (summary);
+     583                 :             : 
+     584                 :           0 :   valent_sms_window_set_active_thread (self, thread_id);
+     585                 :           0 :   adw_navigation_split_view_set_show_content (self->content_box, TRUE);
+     586                 :             : }
+     587                 :             : 
+     588                 :             : 
+     589                 :             : /*
+     590                 :             :  * GActions
+     591                 :             :  */
+     592                 :             : static void
+     593                 :           0 : sms_new_action (GtkWidget  *widget,
+     594                 :             :                 const char *action_name,
+     595                 :             :                 GVariant   *parameter)
+     596                 :             : {
+     597                 :           0 :   ValentSmsWindow *self = VALENT_SMS_WINDOW (widget);
+     598                 :             : 
+     599         [ #  # ]:           0 :   g_assert (VALENT_IS_SMS_WINDOW (self));
+     600                 :             : 
+     601                 :           0 :   gtk_list_box_select_row (self->conversation_list, NULL);
+     602                 :           0 :   adw_navigation_page_set_title (self->content_page, _("New Conversation"));
+     603                 :           0 :   gtk_stack_set_visible_child_name (self->content, "contacts");
+     604                 :           0 :   gtk_widget_grab_focus (self->contact_search_entry);
+     605                 :           0 :   adw_navigation_split_view_set_show_content (self->content_box, TRUE);
+     606                 :           0 : }
+     607                 :             : 
+     608                 :             : static void
+     609                 :           0 : sms_search_action (GtkWidget  *widget,
+     610                 :             :                    const char *action_name,
+     611                 :             :                    GVariant   *parameter)
+     612                 :             : {
+     613                 :           0 :   ValentSmsWindow *self = VALENT_SMS_WINDOW (widget);
+     614                 :             : 
+     615         [ #  # ]:           0 :   g_assert (VALENT_IS_SMS_WINDOW (self));
+     616                 :             : 
+     617                 :           0 :   adw_navigation_page_set_title (self->content_page, _("Search Messages"));
+     618                 :           0 :   gtk_stack_set_visible_child_name (self->content, "search");
+     619                 :           0 :   gtk_widget_grab_focus (self->message_search_entry);
+     620                 :           0 :   adw_navigation_split_view_set_show_content (self->content_box, TRUE);
+     621                 :           0 : }
+     622                 :             : 
+     623                 :             : /*
+     624                 :             :  * GObject
+     625                 :             :  */
+     626                 :             : static void
+     627                 :           2 : valent_sms_window_constructed (GObject *object)
+     628                 :             : {
+     629                 :           2 :   ValentSmsWindow *self = VALENT_SMS_WINDOW (object);
+     630                 :             : 
+     631         [ +  - ]:           2 :   g_assert (VALENT_IS_CONTACT_STORE (self->contact_store));
+     632         [ -  + ]:           2 :   g_assert (VALENT_IS_SMS_STORE (self->message_store));
+     633                 :             : 
+     634                 :             :   /* Prepare conversation summaries */
+     635                 :           2 :   conversation_list_populate (self);
+     636                 :             : 
+     637                 :           2 :   G_OBJECT_CLASS (valent_sms_window_parent_class)->constructed (object);
+     638                 :           2 : }
+     639                 :             : 
+     640                 :             : static void
+     641                 :           2 : valent_sms_window_dispose (GObject *object)
+     642                 :             : {
+     643                 :           2 :   GtkWidget *widget = GTK_WIDGET (object);
+     644                 :             : 
+     645                 :           2 :   gtk_widget_dispose_template (widget, VALENT_TYPE_SMS_WINDOW);
+     646                 :             : 
+     647                 :           2 :   G_OBJECT_CLASS (valent_sms_window_parent_class)->dispose (object);
+     648                 :           2 : }
+     649                 :             : 
+     650                 :             : static void
+     651                 :           2 : valent_sms_window_finalize (GObject *object)
+     652                 :             : {
+     653                 :           2 :   ValentSmsWindow *self = VALENT_SMS_WINDOW (object);
+     654                 :             : 
+     655         [ +  - ]:           2 :   g_clear_object (&self->contact_store);
+     656         [ +  - ]:           2 :   g_clear_object (&self->message_store);
+     657                 :             : 
+     658                 :           2 :   G_OBJECT_CLASS (valent_sms_window_parent_class)->finalize (object);
+     659                 :           2 : }
+     660                 :             : 
+     661                 :             : static void
+     662                 :           2 : valent_sms_window_get_property (GObject    *object,
+     663                 :             :                                 guint       prop_id,
+     664                 :             :                                 GValue     *value,
+     665                 :             :                                 GParamSpec *pspec)
+     666                 :             : {
+     667                 :           2 :   ValentSmsWindow *self = VALENT_SMS_WINDOW (object);
+     668                 :             : 
+     669      [ +  +  - ]:           2 :   switch (prop_id)
+     670                 :             :     {
+     671                 :           1 :     case PROP_CONTACT_STORE:
+     672                 :           1 :       g_value_set_object (value, self->contact_store);
+     673                 :           1 :       break;
+     674                 :             : 
+     675                 :           1 :     case PROP_MESSAGE_STORE:
+     676                 :           1 :       g_value_set_object (value, self->message_store);
+     677                 :           1 :       break;
+     678                 :             : 
+     679                 :           0 :     default:
+     680                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     681                 :             :     }
+     682                 :           2 : }
+     683                 :             : 
+     684                 :             : static void
+     685                 :           4 : valent_sms_window_set_property (GObject      *object,
+     686                 :             :                                 guint         prop_id,
+     687                 :             :                                 const GValue *value,
+     688                 :             :                                 GParamSpec   *pspec)
+     689                 :             : {
+     690                 :           4 :   ValentSmsWindow *self = VALENT_SMS_WINDOW (object);
+     691                 :             : 
+     692      [ +  +  - ]:           4 :   switch (prop_id)
+     693                 :             :     {
+     694                 :           2 :     case PROP_CONTACT_STORE:
+     695                 :           2 :       valent_sms_window_set_contact_store (self, g_value_get_object (value));
+     696                 :           2 :       break;
+     697                 :             : 
+     698                 :           2 :     case PROP_MESSAGE_STORE:
+     699                 :           2 :       g_set_object (&self->message_store, g_value_get_object (value));
+     700                 :           2 :       break;
+     701                 :             : 
+     702                 :           0 :     default:
+     703                 :           0 :       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+     704                 :             :     }
+     705                 :           4 : }
+     706                 :             : 
+     707                 :             : static void
+     708                 :           2 : valent_sms_window_class_init (ValentSmsWindowClass *klass)
+     709                 :             : {
+     710                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     711                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     712                 :           4 :   g_autoptr (GtkCssProvider) theme = NULL;
+     713                 :             : 
+     714                 :           2 :   object_class->constructed = valent_sms_window_constructed;
+     715                 :           2 :   object_class->dispose = valent_sms_window_dispose;
+     716                 :           2 :   object_class->finalize = valent_sms_window_finalize;
+     717                 :           2 :   object_class->get_property = valent_sms_window_get_property;
+     718                 :           2 :   object_class->set_property = valent_sms_window_set_property;
+     719                 :             : 
+     720                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/sms/valent-sms-window.ui");
+     721                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, content_box);
+     722                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, sidebar_header);
+     723                 :             : 
+     724                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, content_page);
+     725                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, content_header);
+     726                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, content_layout);
+     727                 :             : 
+     728                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, conversation_list);
+     729                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, content);
+     730                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_conversation_activated);
+     731                 :             : 
+     732                 :             :   /* Message Search */
+     733                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, message_search);
+     734                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, message_search_entry);
+     735                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, message_search_list);
+     736                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_message_search_changed);
+     737                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_message_selected);
+     738                 :             : 
+     739                 :             :   /* Contact Search */
+     740                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, contact_search);
+     741                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, contact_search_entry);
+     742                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentSmsWindow, contact_search_list);
+     743                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_contact_search_changed);
+     744                 :           2 :   gtk_widget_class_bind_template_callback (widget_class, on_contact_selected);
+     745                 :             : 
+     746                 :           2 :   gtk_widget_class_install_action (widget_class, "sms.new", NULL, sms_new_action);
+     747                 :           2 :   gtk_widget_class_install_action (widget_class, "sms.search", NULL, sms_search_action);
+     748                 :             : 
+     749                 :             :   /**
+     750                 :             :    * ValentSmsWindow:contact-store:
+     751                 :             :    *
+     752                 :             :    * The `ValentContactStore` providing contacts for the window.
+     753                 :             :    */
+     754                 :           4 :   properties [PROP_CONTACT_STORE] =
+     755                 :           2 :     g_param_spec_object ("contact-store", NULL, NULL,
+     756                 :             :                          VALENT_TYPE_CONTACT_STORE,
+     757                 :             :                          (G_PARAM_READWRITE |
+     758                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     759                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     760                 :             :                           G_PARAM_STATIC_STRINGS));
+     761                 :             : 
+     762                 :             :   /**
+     763                 :             :    * ValentSmsWindow:message-store:
+     764                 :             :    *
+     765                 :             :    * The `ValentSmsStore` providing messages for the window.
+     766                 :             :    */
+     767                 :           4 :   properties [PROP_MESSAGE_STORE] =
+     768                 :           2 :     g_param_spec_object ("message-store", NULL, NULL,
+     769                 :             :                          VALENT_TYPE_SMS_STORE,
+     770                 :             :                          (G_PARAM_READWRITE |
+     771                 :             :                           G_PARAM_CONSTRUCT_ONLY |
+     772                 :             :                           G_PARAM_EXPLICIT_NOTIFY |
+     773                 :             :                           G_PARAM_STATIC_STRINGS));
+     774                 :             : 
+     775                 :           2 :   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+     776                 :             : 
+     777                 :             :   /**
+     778                 :             :    * ValentSmsWindow::send-message:
+     779                 :             :    * @window: a `ValentSmsWindow`
+     780                 :             :    * @message: a `ValentMessage`
+     781                 :             :    *
+     782                 :             :    * The `ValentSmsWindow`::send-message signal is emitted when a child
+     783                 :             :    * `ValentSmsConversation` emits `ValentSmsConversation`::send-message.
+     784                 :             :    *
+     785                 :             :    * The signal handler should return a boolean indicating success, although
+     786                 :             :    * this only indicates the request was sent to the device.
+     787                 :             :    */
+     788                 :           4 :   signals [SEND_MESSAGE] =
+     789                 :           2 :     g_signal_new ("send-message",
+     790                 :             :                   G_TYPE_FROM_CLASS (klass),
+     791                 :             :                   G_SIGNAL_RUN_LAST,
+     792                 :             :                   0,
+     793                 :             :                   g_signal_accumulator_first_wins, NULL, NULL,
+     794                 :             :                   G_TYPE_BOOLEAN, 1, VALENT_TYPE_MESSAGE);
+     795                 :             : 
+     796                 :             :   /* Custom CSS */
+     797                 :           2 :   theme = gtk_css_provider_new ();
+     798                 :           2 :   gtk_css_provider_load_from_resource (theme, "/plugins/sms/sms.css");
+     799         [ +  - ]:           2 :   gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+     800                 :             :                                               GTK_STYLE_PROVIDER (theme),
+     801                 :             :                                               GTK_STYLE_PROVIDER_PRIORITY_USER);
+     802                 :           2 : }
+     803                 :             : 
+     804                 :             : static void
+     805                 :           2 : valent_sms_window_init (ValentSmsWindow *self)
+     806                 :             : {
+     807                 :           2 :   gtk_widget_init_template (GTK_WIDGET (self));
+     808                 :             : 
+     809                 :           2 :   gtk_list_box_set_header_func (self->message_search_list,
+     810                 :             :                                 search_header_func,
+     811                 :             :                                 self, NULL);
+     812                 :             : 
+     813                 :             :   /* Contacts */
+     814                 :           2 :   gtk_list_box_set_filter_func (self->contact_search_list,
+     815                 :             :                                 (GtkListBoxFilterFunc)contact_search_list_filter,
+     816                 :             :                                 self,
+     817                 :             :                                 NULL);
+     818                 :             : 
+     819                 :           2 :   gtk_list_box_set_sort_func (self->contact_search_list,
+     820                 :             :                               (GtkListBoxSortFunc)contact_search_list_sort,
+     821                 :             :                               self,
+     822                 :             :                               NULL);
+     823                 :             : 
+     824                 :           2 :   gtk_list_box_set_header_func (self->contact_search_list,
+     825                 :             :                                 valent_contact_row_header_func,
+     826                 :             :                                 self,
+     827                 :             :                                 NULL);
+     828                 :           2 : }
+     829                 :             : 
+     830                 :             : /**
+     831                 :             :  * valent_sms_window_get_contact_store:
+     832                 :             :  * @window: a `ValentSmsWindow`
+     833                 :             :  *
+     834                 :             :  * Get the `ValentContactStore` providing contacts for @window.
+     835                 :             :  *
+     836                 :             :  * Returns: (transfer none) (nullable): a `ValentContactStore`
+     837                 :             :  */
+     838                 :             : ValentContactStore *
+     839                 :           1 : valent_sms_window_get_contact_store (ValentSmsWindow *window)
+     840                 :             : {
+     841         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_WINDOW (window), NULL);
+     842                 :             : 
+     843                 :           1 :   return window->contact_store;
+     844                 :             : }
+     845                 :             : 
+     846                 :             : /**
+     847                 :             :  * valent_sms_window_set_contact_store:
+     848                 :             :  * @window: a `ValentSmsWindow`
+     849                 :             :  * @store: a `ValentContactStore`
+     850                 :             :  *
+     851                 :             :  * Set the `ValentContactStore` providing contacts for @window.
+     852                 :             :  */
+     853                 :             : void
+     854                 :           2 : valent_sms_window_set_contact_store (ValentSmsWindow    *window,
+     855                 :             :                                      ValentContactStore *store)
+     856                 :             : {
+     857         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_SMS_WINDOW (window));
+     858   [ +  -  -  + ]:           2 :   g_return_if_fail (store == NULL || VALENT_IS_CONTACT_STORE (store));
+     859                 :             : 
+     860         [ +  - ]:           2 :   if (!g_set_object (&window->contact_store, store))
+     861                 :             :     return;
+     862                 :             : 
+     863                 :           2 :   valent_sms_window_refresh_contacts (window);
+     864                 :           2 :   g_object_notify_by_pspec (G_OBJECT (window), properties[PROP_CONTACT_STORE]);
+     865                 :             : }
+     866                 :             : 
+     867                 :             : /**
+     868                 :             :  * valent_sms_window_get_sms_store:
+     869                 :             :  * @window: a `ValentSmsWindow`
+     870                 :             :  *
+     871                 :             :  * Get the `ValentSmsStore` providing messages for @window.
+     872                 :             :  *
+     873                 :             :  * Returns: (transfer none) (nullable): a `ValentSmsStore`
+     874                 :             :  */
+     875                 :             : ValentSmsStore *
+     876                 :           1 : valent_sms_window_get_message_store (ValentSmsWindow *window)
+     877                 :             : {
+     878         [ +  - ]:           1 :   g_return_val_if_fail (VALENT_IS_SMS_WINDOW (window), NULL);
+     879                 :             : 
+     880                 :           1 :   return window->message_store;
+     881                 :             : }
+     882                 :             : 
+     883                 :             : /**
+     884                 :             :  * valent_sms_window_search_contacts:
+     885                 :             :  * @window: a `ValentSmsWindow`
+     886                 :             :  * @query: query string
+     887                 :             :  *
+     888                 :             :  * Switch the contact view and search for @query.
+     889                 :             :  */
+     890                 :             : void
+     891                 :           2 : valent_sms_window_search_contacts (ValentSmsWindow *window,
+     892                 :             :                                    const char      *query)
+     893                 :             : {
+     894         [ +  - ]:           2 :   g_return_if_fail (VALENT_IS_SMS_WINDOW (window));
+     895         [ -  + ]:           2 :   g_return_if_fail (query != NULL);
+     896                 :             : 
+     897                 :           2 :   gtk_list_box_select_row (window->conversation_list, NULL);
+     898                 :             : 
+     899                 :           2 :   adw_navigation_page_set_title (window->content_page, _("New Conversation"));
+     900                 :           2 :   gtk_stack_set_visible_child_name (window->content, "contacts");
+     901                 :           2 :   gtk_widget_grab_focus (window->contact_search_entry);
+     902                 :           2 :   adw_navigation_split_view_set_show_content (window->content_box, TRUE);
+     903                 :             : 
+     904                 :           2 :   gtk_editable_set_text (GTK_EDITABLE (window->contact_search_entry), query);
+     905                 :             : }
+     906                 :             : 
+     907                 :             : /**
+     908                 :             :  * valent_sms_window_search_messages:
+     909                 :             :  * @window: a `ValentSmsWindow`
+     910                 :             :  * @query: query string
+     911                 :             :  *
+     912                 :             :  * Switch the search view and search for @query.
+     913                 :             :  */
+     914                 :             : void
+     915                 :           1 : valent_sms_window_search_messages (ValentSmsWindow *window,
+     916                 :             :                                    const char      *query)
+     917                 :             : {
+     918         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_WINDOW (window));
+     919         [ -  + ]:           1 :   g_return_if_fail (query != NULL);
+     920                 :             : 
+     921                 :           1 :   adw_navigation_page_set_title (window->content_page, _("Search Messages"));
+     922                 :           1 :   gtk_stack_set_visible_child_name (window->content, "search");
+     923                 :           1 :   gtk_widget_grab_focus (window->message_search_entry);
+     924                 :           1 :   adw_navigation_split_view_set_show_content (window->content_box, TRUE);
+     925                 :             : 
+     926                 :           1 :   gtk_editable_set_text (GTK_EDITABLE (window->message_search_entry), query);
+     927                 :             : }
+     928                 :             : 
+     929                 :             : /**
+     930                 :             :  * valent_sms_window_set_active_message:
+     931                 :             :  * @window: a `ValentSmsWindow`
+     932                 :             :  * @message: a `ValentMessage`
+     933                 :             :  *
+     934                 :             :  * Set the active conversation to the thread of @message scroll to @message.
+     935                 :             :  */
+     936                 :             : void
+     937                 :           0 : valent_sms_window_set_active_message (ValentSmsWindow *window,
+     938                 :             :                                       ValentMessage   *message)
+     939                 :             : {
+     940                 :           0 :   GtkWidget *widget;
+     941                 :           0 :   ValentSmsConversation *conversation;
+     942                 :           0 :   int64_t thread_id;
+     943                 :             : 
+     944         [ #  # ]:           0 :   g_return_if_fail (VALENT_IS_SMS_WINDOW (window));
+     945                 :             : 
+     946                 :             :   /* Select the conversation */
+     947                 :           0 :   thread_id = valent_message_get_thread_id (message);
+     948                 :           0 :   valent_sms_window_set_active_thread (window, thread_id);
+     949                 :             : 
+     950                 :             :   /* Get the conversation */
+     951                 :           0 :   widget = valent_sms_window_ensure_conversation (window, thread_id);
+     952                 :           0 :   conversation = VALENT_SMS_CONVERSATION (widget);
+     953                 :             : 
+     954                 :           0 :   valent_sms_conversation_scroll_to_message (conversation, message);
+     955                 :             : }
+     956                 :             : 
+     957                 :             : /**
+     958                 :             :  * valent_sms_window_set_active_thread:
+     959                 :             :  * @window: a `ValentSmsWindow`
+     960                 :             :  * @thread_id: a thread id
+     961                 :             :  *
+     962                 :             :  * Set the active conversation
+     963                 :             :  */
+     964                 :             : void
+     965                 :           1 : valent_sms_window_set_active_thread (ValentSmsWindow *window,
+     966                 :             :                                      int64_t          thread_id)
+     967                 :             : {
+     968                 :           1 :   GtkWidget *conversation;
+     969                 :           1 :   const char *title;
+     970                 :             : 
+     971         [ +  - ]:           1 :   g_return_if_fail (VALENT_IS_SMS_WINDOW (window));
+     972         [ -  + ]:           1 :   g_return_if_fail (thread_id >= 0);
+     973                 :             : 
+     974                 :             :   /* Ensure a conversation widget exists */
+     975                 :           1 :   conversation = valent_sms_window_ensure_conversation (window, thread_id);
+     976                 :             : 
+     977                 :             :   /* Set the header title */
+     978                 :           1 :   title = valent_sms_conversation_get_title (VALENT_SMS_CONVERSATION (conversation));
+     979                 :           1 :   adw_navigation_page_set_title (window->content_page, title);
+     980                 :             : 
+     981                 :             :   /* Switch to conversation widget */
+     982                 :           1 :   gtk_stack_set_visible_child (window->content, conversation);
+     983                 :             : }
+     984                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-window.h.func-c.html b/coverage/src/plugins/sms/valent-sms-window.h.func-c.html new file mode 100644 index 00000000000..2e05fff04fb --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-window.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-window.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-window.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_WINDOW10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-window.h.func.html b/coverage/src/plugins/sms/valent-sms-window.h.func.html new file mode 100644 index 00000000000..5568ca1a63b --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-window.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-window.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-window.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SMS_WINDOW10
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/sms/valent-sms-window.h.gcov.html b/coverage/src/plugins/sms/valent-sms-window.h.gcov.html new file mode 100644 index 00000000000..0a9bb75b685 --- /dev/null +++ b/coverage/src/plugins/sms/valent-sms-window.h.gcov.html @@ -0,0 +1,133 @@ + + + + + + + LCOV - Code Coverage - src/plugins/sms/valent-sms-window.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/sms - valent-sms-window.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <adwaita.h>
+       7                 :             : #include <gtk/gtk.h>
+       8                 :             : #include <valent.h>
+       9                 :             : 
+      10                 :             : #include "valent-message.h"
+      11                 :             : #include "valent-sms-store.h"
+      12                 :             : 
+      13                 :             : G_BEGIN_DECLS
+      14                 :             : 
+      15                 :             : #define VALENT_TYPE_SMS_WINDOW (valent_sms_window_get_type())
+      16                 :             : 
+      17   [ +  -  +  -  :          10 : G_DECLARE_FINAL_TYPE (ValentSmsWindow, valent_sms_window, VALENT, SMS_WINDOW, AdwApplicationWindow)
+                   -  + ]
+      18                 :             : 
+      19                 :             : ValentContactStore * valent_sms_window_get_contact_store  (ValentSmsWindow    *window);
+      20                 :             : void                 valent_sms_window_set_contact_store  (ValentSmsWindow    *window,
+      21                 :             :                                                            ValentContactStore *store);
+      22                 :             : ValentSmsStore     * valent_sms_window_get_message_store  (ValentSmsWindow    *window);
+      23                 :             : 
+      24                 :             : void                 valent_sms_window_search_contacts    (ValentSmsWindow    *window,
+      25                 :             :                                                            const char         *query);
+      26                 :             : void                 valent_sms_window_search_messages    (ValentSmsWindow    *window,
+      27                 :             :                                                            const char         *query);
+      28                 :             : 
+      29                 :             : void                 valent_sms_window_set_active_address (ValentSmsWindow    *window,
+      30                 :             :                                                            const char         *address,
+      31                 :             :                                                            EContact           *contact);
+      32                 :             : 
+      33                 :             : void                 valent_sms_window_set_active_message (ValentSmsWindow    *window,
+      34                 :             :                                                            ValentMessage      *message);
+      35                 :             : void                 valent_sms_window_set_active_thread  (ValentSmsWindow    *window,
+      36                 :             :                                                            int64_t             thread_id);
+      37                 :             : 
+      38                 :             : void                 valent_sms_window_reset_search       (ValentSmsWindow    *window);
+      39                 :             : 
+      40                 :             : G_END_DECLS
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-detail-sort-b.html b/coverage/src/plugins/systemvolume/index-detail-sort-b.html new file mode 100644 index 00000000000..4b208fe8cb0 --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-detail-sort-b.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-detail-sort-f.html b/coverage/src/plugins/systemvolume/index-detail-sort-f.html new file mode 100644 index 00000000000..5b8fd462060 --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-detail-sort-f.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-detail-sort-l.html b/coverage/src/plugins/systemvolume/index-detail-sort-l.html new file mode 100644 index 00000000000..0923b80a2fb --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-detail-sort-l.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-detail.html b/coverage/src/plugins/systemvolume/index-detail.html new file mode 100644 index 00000000000..6af884c694f --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-detail.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-sort-b.html b/coverage/src/plugins/systemvolume/index-sort-b.html new file mode 100644 index 00000000000..4b208fe8cb0 --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-sort-b.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-sort-f.html b/coverage/src/plugins/systemvolume/index-sort-f.html new file mode 100644 index 00000000000..5b8fd462060 --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-sort-f.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index-sort-l.html b/coverage/src/plugins/systemvolume/index-sort-l.html new file mode 100644 index 00000000000..0923b80a2fb --- /dev/null +++ b/coverage/src/plugins/systemvolume/index-sort-l.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/index.html b/coverage/src/plugins/systemvolume/index.html new file mode 100644 index 00000000000..6af884c694f --- /dev/null +++ b/coverage/src/plugins/systemvolume/index.html @@ -0,0 +1,158 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolumeCoverageTotalHit
Test:Code CoverageLines:95.1 %206196
Test Date:2024-03-31 18:46:36Functions:100.0 %2020
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:63.3 %12881
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
systemvolume-plugin.c +
100.0%
+
100.0 %33-100.0 %11
valent-systemvolume-plugin.c +
95.0%95.0%
+
95.0 %20219263.9 %12278100.0 %1818
valent-systemvolume-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/systemvolume-plugin.c.func-c.html b/coverage/src/plugins/systemvolume/systemvolume-plugin.c.func-c.html new file mode 100644 index 00000000000..e520788f935 --- /dev/null +++ b/coverage/src/plugins/systemvolume/systemvolume-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/systemvolume-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - systemvolume-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_systemvolume_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/systemvolume-plugin.c.func.html b/coverage/src/plugins/systemvolume/systemvolume-plugin.c.func.html new file mode 100644 index 00000000000..4c468035165 --- /dev/null +++ b/coverage/src/plugins/systemvolume/systemvolume-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/systemvolume-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - systemvolume-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_systemvolume_plugin_register_types1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/systemvolume-plugin.c.gcov.html b/coverage/src/plugins/systemvolume/systemvolume-plugin.c.gcov.html new file mode 100644 index 00000000000..6b04502bea6 --- /dev/null +++ b/coverage/src/plugins/systemvolume/systemvolume-plugin.c.gcov.html @@ -0,0 +1,111 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/systemvolume-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - systemvolume-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %33
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-systemvolume-plugin.h"
+      10                 :             : 
+      11                 :             : 
+      12                 :             : _VALENT_EXTERN void
+      13                 :           1 : valent_systemvolume_plugin_register_types (PeasObjectModule *module)
+      14                 :             : {
+      15                 :           1 :   peas_object_module_register_extension_type (module,
+      16                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      17                 :             :                                               VALENT_TYPE_SYSTEMVOLUME_PLUGIN);
+      18                 :           1 : }
+      19                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.func-c.html b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.func-c.html new file mode 100644 index 00000000000..54add7cb4b3 --- /dev/null +++ b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/valent-systemvolume-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - valent-systemvolume-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.0 %202192
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:63.9 %12278
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_systemvolume_plugin_constructed1
valent_systemvolume_plugin_init1
on_default_output_changed2
valent_systemvolume_plugin_destroy2
on_items_changed3
on_stream_changed4
stream_state_free4
stream_state_new4
valent_systemvolume_plugin_update_state4
valent_systemvolume_plugin_handle_sink_change5
valent_systemvolume_plugin_handle_packet6
valent_systemvolume_plugin_handle_request6
valent_systemvolume_plugin_watch_mixer6
valent_systemvolume_plugin_send_sinklist7
stream_state_find9
valent_systemvolume_plugin_get_type50
valent_systemvolume_plugin_class_intern_init1
valent_systemvolume_plugin_get_type_once1
valent_systemvolume_plugin_get_type48
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.func.html b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.func.html new file mode 100644 index 00000000000..c1fe27b24a7 --- /dev/null +++ b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/valent-systemvolume-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - valent-systemvolume-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.0 %202192
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:63.9 %12278
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_default_output_changed2
on_items_changed3
on_stream_changed4
stream_state_find9
stream_state_free4
stream_state_new4
valent_systemvolume_plugin_constructed1
valent_systemvolume_plugin_destroy2
valent_systemvolume_plugin_get_type50
valent_systemvolume_plugin_class_intern_init1
valent_systemvolume_plugin_get_type48
valent_systemvolume_plugin_get_type_once1
valent_systemvolume_plugin_handle_packet6
valent_systemvolume_plugin_handle_request6
valent_systemvolume_plugin_handle_sink_change5
valent_systemvolume_plugin_init1
valent_systemvolume_plugin_send_sinklist7
valent_systemvolume_plugin_update_state4
valent_systemvolume_plugin_watch_mixer6
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.gcov.html b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.gcov.html new file mode 100644 index 00000000000..f7b3c5418de --- /dev/null +++ b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.c.gcov.html @@ -0,0 +1,541 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/valent-systemvolume-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - valent-systemvolume-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:95.0 %202192
Test Date:2024-03-31 18:46:36Functions:100.0 %1818
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:63.9 %12278
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-systemvolume-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <gio/gio.h>
+       9                 :             : #include <json-glib/json-glib.h>
+      10                 :             : #include <valent.h>
+      11                 :             : 
+      12                 :             : #include "valent-systemvolume-plugin.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentSystemvolumePlugin
+      16                 :             : {
+      17                 :             :   ValentDevicePlugin  parent_instance;
+      18                 :             : 
+      19                 :             :   ValentMixer        *mixer;
+      20                 :             :   unsigned int        mixer_watch : 1;
+      21                 :             :   GPtrArray          *states;
+      22                 :             : };
+      23                 :             : 
+      24                 :             : static void valent_systemvolume_plugin_handle_request     (ValentSystemvolumePlugin *self,
+      25                 :             :                                                            JsonNode                 *packet);
+      26                 :             : static void valent_systemvolume_plugin_handle_sink_change (ValentSystemvolumePlugin *self,
+      27                 :             :                                                            JsonNode                 *packet);
+      28                 :             : static void valent_systemvolume_plugin_send_sinklist      (ValentSystemvolumePlugin *self);
+      29                 :             : 
+      30   [ +  +  +  - ]:          50 : G_DEFINE_FINAL_TYPE (ValentSystemvolumePlugin, valent_systemvolume_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      31                 :             : 
+      32                 :             : 
+      33                 :             : /*
+      34                 :             :  * Local Mixer
+      35                 :             :  */
+      36                 :             : typedef struct
+      37                 :             : {
+      38                 :             :   ValentMixerStream *stream;
+      39                 :             :   unsigned long      notify_id;
+      40                 :             :   char              *name;
+      41                 :             :   char              *description;
+      42                 :             :   unsigned int       volume;
+      43                 :             :   unsigned int       muted : 1;
+      44                 :             :   unsigned int       enabled : 1;
+      45                 :             : } StreamState;
+      46                 :             : 
+      47                 :             : static StreamState *
+      48                 :           9 : stream_state_find (ValentSystemvolumePlugin *self,
+      49                 :             :                    const char               *name)
+      50                 :             : {
+      51         [ +  + ]:          11 :   for (unsigned int i = 0; i < self->states->len; i++)
+      52                 :             :     {
+      53                 :          10 :       StreamState *state = g_ptr_array_index (self->states, i);
+      54                 :             : 
+      55         [ +  + ]:          10 :       if (g_strcmp0 (state->name, name) == 0)
+      56                 :             :         return state;
+      57                 :             :     }
+      58                 :             : 
+      59                 :             :   return NULL;
+      60                 :             : }
+      61                 :             : 
+      62                 :             : static void
+      63                 :           4 : on_stream_changed (ValentMixerStream        *stream,
+      64                 :             :                    GParamSpec               *pspec,
+      65                 :             :                    ValentSystemvolumePlugin *self)
+      66                 :             : {
+      67                 :           4 :   StreamState *state;
+      68                 :           4 :   const char *name;
+      69                 :           4 :   const char *description;
+      70                 :           4 :   gboolean enabled;
+      71                 :           4 :   gboolean muted;
+      72                 :           4 :   unsigned int volume;
+      73                 :           4 :   g_autoptr (JsonBuilder) builder = NULL;
+      74   [ -  +  -  - ]:           4 :   g_autoptr (JsonNode) packet = NULL;
+      75                 :             : 
+      76         [ +  - ]:           4 :   g_assert (VALENT_IS_MIXER_STREAM (stream));
+      77         [ -  + ]:           4 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+      78                 :             : 
+      79                 :             :   /* If this is an unknown stream, send a new sink list */
+      80                 :           4 :   name = valent_mixer_stream_get_name (stream);
+      81                 :             : 
+      82         [ -  + ]:           4 :   if ((state = stream_state_find (self, name)) == NULL)
+      83                 :             :     {
+      84                 :           0 :       valent_systemvolume_plugin_send_sinklist (self);
+      85                 :           0 :       return;
+      86                 :             :     }
+      87                 :             : 
+      88                 :             :   /* If the description changed it's probably because the port changed, so
+      89                 :             :    * update the state and send the whole list */
+      90                 :           4 :   description = valent_mixer_stream_get_description (stream);
+      91                 :             : 
+      92         [ -  + ]:           4 :   if (g_set_str (&state->description, description))
+      93                 :             :     {
+      94                 :           0 :       valent_systemvolume_plugin_send_sinklist (self);
+      95                 :           0 :       return;
+      96                 :             :     }
+      97                 :             : 
+      98                 :             :   /* If none of the other properties changed, there's nothing to update */
+      99                 :           4 :   enabled = valent_mixer_get_default_output (self->mixer) == stream;
+     100                 :           4 :   muted = valent_mixer_stream_get_muted (stream);
+     101                 :           4 :   volume = valent_mixer_stream_get_level (stream);
+     102                 :             : 
+     103         [ +  - ]:           4 :   if (state->enabled == enabled &&
+     104         [ +  + ]:           4 :       state->muted == muted &&
+     105         [ +  - ]:           2 :       state->volume == volume)
+     106                 :             :     return;
+     107                 :             : 
+     108                 :             :   /* Sink update */
+     109                 :           4 :   valent_packet_init (&builder, "kdeconnect.systemvolume");
+     110                 :           4 :   json_builder_set_member_name (builder, "name");
+     111                 :           4 :   json_builder_add_string_value (builder, state->name);
+     112                 :             : 
+     113         [ +  + ]:           4 :   if (state->muted != muted)
+     114                 :             :     {
+     115                 :           2 :       state->muted = muted;
+     116                 :           2 :       json_builder_set_member_name (builder, "muted");
+     117                 :           2 :       json_builder_add_boolean_value (builder, state->muted);
+     118                 :             :     }
+     119                 :             : 
+     120         [ +  + ]:           4 :   if (state->volume != volume)
+     121                 :             :     {
+     122                 :           2 :       state->volume = volume;
+     123                 :           2 :       json_builder_set_member_name (builder, "volume");
+     124                 :           2 :       json_builder_add_int_value (builder, state->volume);
+     125                 :             :     }
+     126                 :             : 
+     127         [ -  + ]:           4 :   if (state->enabled != enabled)
+     128                 :             :     {
+     129                 :           0 :       state->enabled = enabled;
+     130                 :           0 :       json_builder_set_member_name (builder, "enabled");
+     131                 :           0 :       json_builder_add_boolean_value (builder, state->enabled);
+     132                 :             :     }
+     133                 :             : 
+     134                 :           4 :   packet = valent_packet_end (&builder);
+     135                 :             : 
+     136         [ +  - ]:           4 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     137                 :             : }
+     138                 :             : 
+     139                 :             : static StreamState *
+     140                 :           4 : stream_state_new (ValentSystemvolumePlugin *self,
+     141                 :             :                   ValentMixerStream        *stream)
+     142                 :             : {
+     143                 :           4 :   StreamState *state;
+     144                 :             : 
+     145         [ +  - ]:           4 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     146         [ -  + ]:           4 :   g_assert (VALENT_IS_MIXER_STREAM (stream));
+     147                 :             : 
+     148                 :           4 :   state = g_new0 (StreamState, 1);
+     149                 :           4 :   state->stream = g_object_ref (stream);
+     150                 :           4 :   g_signal_connect_object (state->stream,
+     151                 :             :                            "notify",
+     152                 :             :                            G_CALLBACK (on_stream_changed),
+     153                 :             :                            self, 0);
+     154                 :             : 
+     155         [ -  + ]:           4 :   state->name = g_strdup (valent_mixer_stream_get_name (stream));
+     156         [ -  + ]:           4 :   state->description = g_strdup (valent_mixer_stream_get_description (stream));
+     157                 :           4 :   state->volume = valent_mixer_stream_get_level (stream);
+     158                 :           4 :   state->muted = valent_mixer_stream_get_muted (stream);
+     159                 :           4 :   state->enabled = valent_mixer_get_default_output (self->mixer) == stream;
+     160                 :             : 
+     161                 :           4 :   return state;
+     162                 :             : }
+     163                 :             : 
+     164                 :             : static void
+     165                 :           4 : stream_state_free (gpointer data)
+     166                 :             : {
+     167                 :           4 :   StreamState *state = data;
+     168                 :             : 
+     169         [ -  + ]:           4 :   g_clear_signal_handler (&state->notify_id, state->stream);
+     170         [ +  - ]:           4 :   g_clear_object (&state->stream);
+     171         [ +  - ]:           4 :   g_clear_pointer (&state->name, g_free);
+     172         [ +  - ]:           4 :   g_clear_pointer (&state->description, g_free);
+     173                 :           4 :   g_clear_pointer (&state, g_free);
+     174                 :           4 : }
+     175                 :             : 
+     176                 :             : static void
+     177                 :           2 : on_default_output_changed (ValentMixer              *mixer,
+     178                 :             :                            GParamSpec               *pspec,
+     179                 :             :                            ValentSystemvolumePlugin *self)
+     180                 :             : {
+     181                 :           2 :   ValentMixerStream *default_output = NULL;
+     182                 :             : 
+     183         [ +  - ]:           2 :   g_assert (VALENT_IS_MIXER (mixer));
+     184         [ -  + ]:           2 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     185                 :             : 
+     186                 :           2 :   default_output = valent_mixer_get_default_output (mixer);
+     187                 :             : 
+     188         [ +  + ]:           6 :   for (unsigned int i = 0; i < self->states->len; i++)
+     189                 :             :     {
+     190                 :           4 :       StreamState *state = g_ptr_array_index (self->states, i);
+     191                 :             : 
+     192                 :           4 :       state->enabled = state->stream == default_output;
+     193                 :             :     }
+     194                 :             : 
+     195                 :             :   /* It's unclear whether the `enabled` field with a value of `false` is
+     196                 :             :    * relevant in the protocol, we resend the whole list */
+     197                 :           2 :   valent_systemvolume_plugin_send_sinklist (self);
+     198                 :           2 : }
+     199                 :             : 
+     200                 :             : static void
+     201                 :           3 : on_items_changed (GListModel               *list,
+     202                 :             :                   unsigned int              position,
+     203                 :             :                   unsigned int              removed,
+     204                 :             :                   unsigned int              added,
+     205                 :             :                   ValentSystemvolumePlugin *self)
+     206                 :             : {
+     207                 :           3 :   unsigned int n_streams = 0;
+     208                 :             : 
+     209         [ +  - ]:           3 :   g_assert (G_IS_LIST_MODEL (list));
+     210         [ -  + ]:           3 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     211                 :             : 
+     212                 :           3 :   g_ptr_array_remove_range (self->states, 0, self->states->len);
+     213                 :           3 :   n_streams = g_list_model_get_n_items (list);
+     214                 :             : 
+     215         [ +  + ]:           7 :   for (unsigned int i = 0; i < n_streams; i++)
+     216                 :             :     {
+     217                 :           4 :       g_autoptr (ValentMixerStream) stream = NULL;
+     218                 :             : 
+     219                 :           4 :       stream = g_list_model_get_item (list, i);
+     220                 :             : 
+     221         [ -  + ]:           4 :       if (valent_mixer_stream_get_direction (stream) != VALENT_MIXER_OUTPUT)
+     222         [ #  # ]:           0 :         continue;
+     223                 :             : 
+     224         [ +  - ]:           4 :       g_ptr_array_add (self->states, stream_state_new (self, stream));
+     225                 :             :     }
+     226                 :             : 
+     227                 :           3 :   valent_systemvolume_plugin_send_sinklist (self);
+     228                 :           3 : }
+     229                 :             : 
+     230                 :             : static void
+     231                 :           6 : valent_systemvolume_plugin_watch_mixer (ValentSystemvolumePlugin *self,
+     232                 :             :                                         gboolean                  watch)
+     233                 :             : {
+     234         [ +  - ]:           6 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     235                 :             : 
+     236         [ +  + ]:           6 :   if (self->mixer_watch == watch)
+     237                 :             :     return;
+     238                 :             : 
+     239         [ +  + ]:           2 :   if (self->mixer == NULL)
+     240                 :           1 :     self->mixer = valent_mixer_get_default ();
+     241                 :             : 
+     242         [ +  + ]:           2 :   if (watch)
+     243                 :             :     {
+     244                 :           1 :       GListModel *list = G_LIST_MODEL (self->mixer);
+     245                 :             : 
+     246                 :           1 :       g_signal_connect_object (self->mixer,
+     247                 :             :                                "notify::default-output",
+     248                 :             :                                G_CALLBACK (on_default_output_changed),
+     249                 :             :                                self, 0);
+     250                 :           1 :       g_signal_connect_object (self->mixer,
+     251                 :             :                                "items-changed",
+     252                 :             :                                G_CALLBACK (on_items_changed),
+     253                 :             :                                self, 0);
+     254                 :           1 :       on_items_changed (list, 0, 0, g_list_model_get_n_items (list), self);
+     255                 :           1 :       self->mixer_watch = TRUE;
+     256                 :             :     }
+     257                 :             :   else
+     258                 :             :     {
+     259                 :           1 :       g_signal_handlers_disconnect_by_data (self->mixer, self);
+     260                 :           1 :       g_ptr_array_remove_range (self->states, 0, self->states->len);
+     261                 :           1 :       self->mixer_watch = FALSE;
+     262                 :             :     }
+     263                 :             : }
+     264                 :             : 
+     265                 :             : /*
+     266                 :             :  * Packet Providers
+     267                 :             :  */
+     268                 :             : static void
+     269                 :           7 : valent_systemvolume_plugin_send_sinklist (ValentSystemvolumePlugin *self)
+     270                 :             : {
+     271                 :          14 :   g_autoptr (JsonBuilder) builder = NULL;
+     272         [ -  + ]:           7 :   g_autoptr (JsonNode) packet = NULL;
+     273                 :           7 :   unsigned int max_volume = 100;
+     274                 :             : 
+     275         [ +  - ]:           7 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     276                 :             : 
+     277                 :             :   /* Sink List */
+     278                 :           7 :   valent_packet_init (&builder, "kdeconnect.systemvolume");
+     279                 :           7 :   json_builder_set_member_name (builder, "sinkList");
+     280                 :           7 :   json_builder_begin_array (builder);
+     281                 :             : 
+     282         [ +  + ]:          17 :   for (unsigned int i = 0; i < self->states->len; i++)
+     283                 :             :     {
+     284                 :          10 :       StreamState *state;
+     285                 :             : 
+     286                 :          10 :       state = g_ptr_array_index (self->states, i);
+     287                 :             : 
+     288                 :          10 :       json_builder_begin_object (builder);
+     289                 :          10 :       json_builder_set_member_name (builder, "name");
+     290                 :          10 :       json_builder_add_string_value (builder, state->name);
+     291                 :          10 :       json_builder_set_member_name (builder, "description");
+     292                 :          10 :       json_builder_add_string_value (builder, state->description);
+     293                 :          10 :       json_builder_set_member_name (builder, "muted");
+     294                 :          10 :       json_builder_add_boolean_value (builder, state->muted);
+     295                 :          10 :       json_builder_set_member_name (builder, "volume");
+     296                 :          10 :       json_builder_add_int_value (builder, state->volume);
+     297                 :          10 :       json_builder_set_member_name (builder, "maxVolume");
+     298                 :          10 :       json_builder_add_int_value (builder, max_volume);
+     299                 :          10 :       json_builder_set_member_name (builder, "enabled");
+     300                 :          10 :       json_builder_add_boolean_value (builder, state->enabled);
+     301                 :          10 :       json_builder_end_object (builder);
+     302                 :             :     }
+     303                 :             : 
+     304                 :           7 :   json_builder_end_array (builder);
+     305                 :           7 :   packet = valent_packet_end (&builder);
+     306                 :             : 
+     307         [ +  - ]:           7 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     308                 :           7 : }
+     309                 :             : 
+     310                 :             : static void
+     311                 :           5 : valent_systemvolume_plugin_handle_sink_change (ValentSystemvolumePlugin *self,
+     312                 :             :                                                JsonNode                 *packet)
+     313                 :             : {
+     314                 :           5 :   StreamState *state;
+     315                 :           5 :   const char *name;
+     316                 :           5 :   int64_t volume;
+     317                 :           5 :   gboolean muted;
+     318                 :           5 :   gboolean enabled;
+     319                 :             : 
+     320         [ +  - ]:           5 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     321         [ -  + ]:           5 :   g_assert (VALENT_IS_PACKET (packet));
+     322                 :             : 
+     323         [ -  + ]:           5 :   if (!valent_packet_get_string (packet, "name", &name))
+     324                 :             :     {
+     325                 :           0 :       g_debug ("%s(): expected \"name\" field holding a string",
+     326                 :             :                G_STRFUNC);
+     327                 :           1 :       return;
+     328                 :             :     }
+     329                 :             : 
+     330         [ +  + ]:           5 :   if ((state = stream_state_find (self, name)) == NULL)
+     331                 :             :     {
+     332                 :           1 :       valent_systemvolume_plugin_send_sinklist (self);
+     333                 :           1 :       return;
+     334                 :             :     }
+     335                 :             : 
+     336   [ +  +  +  - ]:           4 :   if (valent_packet_get_int (packet, "volume", &volume) && volume >= 0)
+     337                 :           1 :     valent_mixer_stream_set_level (state->stream, volume);
+     338                 :             : 
+     339         [ +  + ]:           4 :   if (valent_packet_get_boolean (packet, "muted", &muted))
+     340                 :           1 :     valent_mixer_stream_set_muted (state->stream, muted);
+     341                 :             : 
+     342   [ +  +  +  - ]:           4 :   if (valent_packet_get_boolean (packet, "enabled", &enabled) && enabled)
+     343                 :           2 :     valent_mixer_set_default_output (self->mixer, state->stream);
+     344                 :             : }
+     345                 :             : 
+     346                 :             : static void
+     347                 :           6 : valent_systemvolume_plugin_handle_request (ValentSystemvolumePlugin *self,
+     348                 :             :                                            JsonNode                 *packet)
+     349                 :             : {
+     350         [ +  - ]:           6 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     351                 :             : 
+     352                 :             :   /* A request for a list of audio outputs */
+     353         [ +  + ]:           6 :   if (valent_packet_check_field (packet, "requestSinks"))
+     354                 :           1 :     valent_systemvolume_plugin_send_sinklist (self);
+     355                 :             : 
+     356                 :             :   /* A request to change an audio output */
+     357         [ +  - ]:           5 :   else if (valent_packet_check_field (packet, "name"))
+     358                 :           5 :     valent_systemvolume_plugin_handle_sink_change (self, packet);
+     359                 :             : 
+     360                 :             :   else
+     361                 :           0 :     g_warn_if_reached ();
+     362                 :           6 : }
+     363                 :             : 
+     364                 :             : /*
+     365                 :             :  * ValentDevicePlugin
+     366                 :             :  */
+     367                 :             : static void
+     368                 :           4 : valent_systemvolume_plugin_update_state (ValentDevicePlugin *plugin,
+     369                 :             :                                          ValentDeviceState   state)
+     370                 :             : {
+     371                 :           4 :   ValentSystemvolumePlugin *self = VALENT_SYSTEMVOLUME_PLUGIN (plugin);
+     372                 :           4 :   gboolean available;
+     373                 :             : 
+     374         [ +  - ]:           4 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     375                 :             : 
+     376                 :           4 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     377                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     378                 :             : 
+     379                 :             :   /* Watch stream changes */
+     380         [ +  + ]:           4 :   if (available)
+     381                 :           1 :     valent_systemvolume_plugin_watch_mixer (self, TRUE);
+     382                 :             :   else
+     383                 :           3 :     valent_systemvolume_plugin_watch_mixer (self, FALSE);
+     384                 :           4 : }
+     385                 :             : 
+     386                 :             : static void
+     387                 :           6 : valent_systemvolume_plugin_handle_packet (ValentDevicePlugin *plugin,
+     388                 :             :                                           const char         *type,
+     389                 :             :                                           JsonNode           *packet)
+     390                 :             : {
+     391                 :           6 :   ValentSystemvolumePlugin *self = VALENT_SYSTEMVOLUME_PLUGIN (plugin);
+     392                 :             : 
+     393         [ +  - ]:           6 :   g_assert (VALENT_IS_SYSTEMVOLUME_PLUGIN (self));
+     394         [ -  + ]:           6 :   g_assert (type != NULL);
+     395         [ -  + ]:           6 :   g_assert (VALENT_IS_PACKET (packet));
+     396                 :             : 
+     397         [ +  - ]:           6 :   if (g_str_equal (type, "kdeconnect.systemvolume.request"))
+     398                 :           6 :     valent_systemvolume_plugin_handle_request (self, packet);
+     399                 :             :   else
+     400                 :           6 :     g_assert_not_reached ();
+     401                 :           6 : }
+     402                 :             : 
+     403                 :             : /*
+     404                 :             :  * ValentObject
+     405                 :             :  */
+     406                 :             : static void
+     407                 :           2 : valent_systemvolume_plugin_destroy (ValentObject *object)
+     408                 :             : {
+     409                 :           2 :   ValentSystemvolumePlugin *self = VALENT_SYSTEMVOLUME_PLUGIN (object);
+     410                 :             : 
+     411                 :           2 :   valent_systemvolume_plugin_watch_mixer (self, FALSE);
+     412         [ +  + ]:           2 :   g_clear_pointer (&self->states, g_ptr_array_unref);
+     413                 :             : 
+     414                 :           2 :   VALENT_OBJECT_CLASS (valent_systemvolume_plugin_parent_class)->destroy (object);
+     415                 :           2 : }
+     416                 :             : 
+     417                 :             : /*
+     418                 :             :  * GObject
+     419                 :             :  */
+     420                 :             : static void
+     421                 :           1 : valent_systemvolume_plugin_constructed (GObject *object)
+     422                 :             : {
+     423                 :           1 :   ValentSystemvolumePlugin *self = VALENT_SYSTEMVOLUME_PLUGIN (object);
+     424                 :             : 
+     425                 :           1 :   self->states = g_ptr_array_new_with_free_func (stream_state_free);
+     426                 :             : 
+     427                 :           1 :   G_OBJECT_CLASS (valent_systemvolume_plugin_parent_class)->constructed (object);
+     428                 :           1 : }
+     429                 :             : 
+     430                 :             : static void
+     431                 :           1 : valent_systemvolume_plugin_class_init (ValentSystemvolumePluginClass *klass)
+     432                 :             : {
+     433                 :           1 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     434                 :           1 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     435                 :           1 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     436                 :             : 
+     437                 :           1 :   object_class->constructed = valent_systemvolume_plugin_constructed;
+     438                 :             : 
+     439                 :           1 :   vobject_class->destroy = valent_systemvolume_plugin_destroy;
+     440                 :             : 
+     441                 :           1 :   plugin_class->handle_packet = valent_systemvolume_plugin_handle_packet;
+     442                 :           1 :   plugin_class->update_state = valent_systemvolume_plugin_update_state;
+     443                 :             : }
+     444                 :             : 
+     445                 :             : static void
+     446                 :           1 : valent_systemvolume_plugin_init (ValentSystemvolumePlugin *self)
+     447                 :             : {
+     448                 :           1 : }
+     449                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.func-c.html b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.func-c.html new file mode 100644 index 00000000000..cd409a87a2f --- /dev/null +++ b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/valent-systemvolume-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - valent-systemvolume-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SYSTEMVOLUME_PLUGIN47
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.func.html b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.func.html new file mode 100644 index 00000000000..d968a74ba69 --- /dev/null +++ b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/valent-systemvolume-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - valent-systemvolume-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_SYSTEMVOLUME_PLUGIN47
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.gcov.html b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.gcov.html new file mode 100644 index 00000000000..4870b918ef1 --- /dev/null +++ b/coverage/src/plugins/systemvolume/valent-systemvolume-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/systemvolume/valent-systemvolume-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/systemvolume - valent-systemvolume-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_SYSTEMVOLUME_PLUGIN (valent_systemvolume_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          47 : G_DECLARE_FINAL_TYPE (ValentSystemvolumePlugin, valent_systemvolume_plugin, VALENT, SYSTEMVOLUME_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-detail-sort-b.html b/coverage/src/plugins/telephony/index-detail-sort-b.html new file mode 100644 index 00000000000..e0b68da35e1 --- /dev/null +++ b/coverage/src/plugins/telephony/index-detail-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-detail-sort-f.html b/coverage/src/plugins/telephony/index-detail-sort-f.html new file mode 100644 index 00000000000..198aa372a8a --- /dev/null +++ b/coverage/src/plugins/telephony/index-detail-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-detail-sort-l.html b/coverage/src/plugins/telephony/index-detail-sort-l.html new file mode 100644 index 00000000000..0fe8c2d320d --- /dev/null +++ b/coverage/src/plugins/telephony/index-detail-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-detail.html b/coverage/src/plugins/telephony/index-detail.html new file mode 100644 index 00000000000..b9652cfee1b --- /dev/null +++ b/coverage/src/plugins/telephony/index-detail.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-sort-b.html b/coverage/src/plugins/telephony/index-sort-b.html new file mode 100644 index 00000000000..e0b68da35e1 --- /dev/null +++ b/coverage/src/plugins/telephony/index-sort-b.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-sort-f.html b/coverage/src/plugins/telephony/index-sort-f.html new file mode 100644 index 00000000000..198aa372a8a --- /dev/null +++ b/coverage/src/plugins/telephony/index-sort-f.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index-sort-l.html b/coverage/src/plugins/telephony/index-sort-l.html new file mode 100644 index 00000000000..0fe8c2d320d --- /dev/null +++ b/coverage/src/plugins/telephony/index-sort-l.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/index.html b/coverage/src/plugins/telephony/index.html new file mode 100644 index 00000000000..b9652cfee1b --- /dev/null +++ b/coverage/src/plugins/telephony/index.html @@ -0,0 +1,173 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephonyCoverageTotalHit
Test:Code CoverageLines:85.3 %266227
Test Date:2024-03-31 18:46:36Functions:90.3 %3128
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:54.7 %15082
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
telephony-plugin.c +
100.0%
+
100.0 %44-100.0 %11
valent-telephony-plugin.c +
89.1%89.1%
+
89.1 %19317256.8 %1327594.4 %1817
valent-telephony-plugin.h +
100.0%
+
100.0 %1150.0 %63100.0 %11
valent-telephony-preferences.c +
73.5%73.5%
+
73.5 %685033.3 %12481.8 %119
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/telephony-plugin.c.func-c.html b/coverage/src/plugins/telephony/telephony-plugin.c.func-c.html new file mode 100644 index 00000000000..e1973e4c753 --- /dev/null +++ b/coverage/src/plugins/telephony/telephony-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/telephony-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - telephony-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_telephony_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/telephony-plugin.c.func.html b/coverage/src/plugins/telephony/telephony-plugin.c.func.html new file mode 100644 index 00000000000..cbb1dd4d776 --- /dev/null +++ b/coverage/src/plugins/telephony/telephony-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/telephony-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - telephony-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_telephony_plugin_register_types2
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/telephony-plugin.c.gcov.html b/coverage/src/plugins/telephony/telephony-plugin.c.gcov.html new file mode 100644 index 00000000000..310201f6434 --- /dev/null +++ b/coverage/src/plugins/telephony/telephony-plugin.c.gcov.html @@ -0,0 +1,114 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/telephony-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - telephony-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %44
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <libpeas.h>
+       7                 :             : #include <valent.h>
+       8                 :             : 
+       9                 :             : #include "valent-telephony-plugin.h"
+      10                 :             : #include "valent-telephony-preferences.h"
+      11                 :             : 
+      12                 :             : 
+      13                 :             : _VALENT_EXTERN void
+      14                 :           2 : valent_telephony_plugin_register_types (PeasObjectModule *module)
+      15                 :             : {
+      16                 :           2 :   peas_object_module_register_extension_type (module,
+      17                 :             :                                               VALENT_TYPE_DEVICE_PLUGIN,
+      18                 :             :                                               VALENT_TYPE_TELEPHONY_PLUGIN);
+      19                 :           2 :   peas_object_module_register_extension_type (module,
+      20                 :             :                                               VALENT_TYPE_DEVICE_PREFERENCES_GROUP,
+      21                 :             :                                               VALENT_TYPE_TELEPHONY_PREFERENCES);
+      22                 :           2 : }
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-plugin.c.func-c.html b/coverage/src/plugins/telephony/valent-telephony-plugin.c.func-c.html new file mode 100644 index 00000000000..b11920cb0ba --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-plugin.c.func-c.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.1 %193172
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.8 %13275
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
stream_state_free0
mute_call_action1
valent_telephony_plugin_mute_call1
stream_state_update4
valent_telephony_plugin_constructed4
valent_telephony_plugin_init4
valent_telephony_plugin_restore_media_state4
valent_telephony_plugin_get_event_icon6
valent_telephony_plugin_update_media_state6
stream_state_new8
stream_state_restore8
valent_telephony_plugin_destroy8
valent_telephony_plugin_handle_packet10
valent_telephony_plugin_handle_telephony10
valent_telephony_plugin_update_state13
valent_telephony_plugin_get_type51
valent_telephony_plugin_class_intern_init2
valent_telephony_plugin_get_type_once2
valent_telephony_plugin_get_type47
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-plugin.c.func.html b/coverage/src/plugins/telephony/valent-telephony-plugin.c.func.html new file mode 100644 index 00000000000..c82a5dfaca2 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-plugin.c.func.html @@ -0,0 +1,224 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.1 %193172
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.8 %13275
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
mute_call_action1
stream_state_free0
stream_state_new8
stream_state_restore8
stream_state_update4
valent_telephony_plugin_constructed4
valent_telephony_plugin_destroy8
valent_telephony_plugin_get_event_icon6
valent_telephony_plugin_get_type51
valent_telephony_plugin_class_intern_init2
valent_telephony_plugin_get_type47
valent_telephony_plugin_get_type_once2
valent_telephony_plugin_handle_packet10
valent_telephony_plugin_handle_telephony10
valent_telephony_plugin_init4
valent_telephony_plugin_mute_call1
valent_telephony_plugin_restore_media_state4
valent_telephony_plugin_update_media_state6
valent_telephony_plugin_update_state13
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-plugin.c.gcov.html b/coverage/src/plugins/telephony/valent-telephony-plugin.c.gcov.html new file mode 100644 index 00000000000..ef39b4c8582 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-plugin.c.gcov.html @@ -0,0 +1,541 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:89.1 %193172
Test Date:2024-03-31 18:46:36Functions:94.4 %1817
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:56.8 %13275
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-telephony-plugin"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gio/gio.h>
+      10                 :             : #include <json-glib/json-glib.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-telephony-plugin.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentTelephonyPlugin
+      17                 :             : {
+      18                 :             :   ValentDevicePlugin  parent_instance;
+      19                 :             : 
+      20                 :             :   gpointer           prev_input;
+      21                 :             :   gpointer           prev_output;
+      22                 :             :   gboolean           prev_paused;
+      23                 :             : };
+      24                 :             : 
+      25   [ +  +  +  - ]:          51 : G_DEFINE_FINAL_TYPE (ValentTelephonyPlugin, valent_telephony_plugin, VALENT_TYPE_DEVICE_PLUGIN)
+      26                 :             : 
+      27                 :             : 
+      28                 :             : /*
+      29                 :             :  * StreamState Helpers
+      30                 :             :  */
+      31                 :             : typedef struct
+      32                 :             : {
+      33                 :             :   GWeakRef      stream;
+      34                 :             : 
+      35                 :             :   unsigned int  current_level;
+      36                 :             :   unsigned int  current_muted : 1;
+      37                 :             :   unsigned int  original_level;
+      38                 :             :   unsigned int  original_muted : 1;
+      39                 :             : } StreamState;
+      40                 :             : 
+      41                 :             : static StreamState *
+      42                 :           8 : stream_state_new (ValentMixerStream *stream,
+      43                 :             :                   int                level)
+      44                 :             : {
+      45                 :           8 :   StreamState *state;
+      46                 :             : 
+      47                 :           8 :   state = g_new0 (StreamState, 1);
+      48                 :           8 :   g_weak_ref_init (&state->stream, stream);
+      49                 :           8 :   state->original_level = valent_mixer_stream_get_level (stream);
+      50                 :           8 :   state->original_muted = valent_mixer_stream_get_muted (stream);
+      51                 :             : 
+      52         [ -  + ]:           8 :   if (level == 0)
+      53                 :             :     {
+      54                 :           0 :       state->current_level = valent_mixer_stream_get_level (stream);
+      55                 :           0 :       state->current_muted = TRUE;
+      56                 :             : 
+      57                 :           0 :       valent_mixer_stream_set_muted (stream, TRUE);
+      58                 :             :     }
+      59         [ +  + ]:           8 :   else if (level > 0)
+      60                 :             :     {
+      61                 :           4 :       state->current_level = level;
+      62                 :           4 :       state->current_muted = valent_mixer_stream_get_muted (stream);
+      63                 :             : 
+      64                 :           4 :       valent_mixer_stream_set_level (stream, level);
+      65                 :             :     }
+      66                 :             : 
+      67                 :           8 :   return state;
+      68                 :             : }
+      69                 :             : 
+      70                 :             : static void
+      71                 :           4 : stream_state_update (StreamState       *state,
+      72                 :             :                      ValentMixerStream *stream,
+      73                 :             :                      int                level)
+      74                 :             : {
+      75                 :           8 :   g_autoptr (ValentMixerStream) current_stream = NULL;
+      76                 :             : 
+      77                 :             :   /* If the active stream has changed, bail instead of guessing what to do */
+      78         [ +  + ]:           4 :   if ((current_stream = g_weak_ref_get (&state->stream)) != stream)
+      79                 :             :     {
+      80                 :           1 :       g_weak_ref_set (&state->stream, NULL);
+      81         [ +  - ]:           1 :       return;
+      82                 :             :     }
+      83                 :             : 
+      84         [ +  - ]:           3 :   if (level == 0)
+      85                 :             :     {
+      86                 :           3 :       state->current_muted = TRUE;
+      87                 :           3 :       valent_mixer_stream_set_muted (stream, TRUE);
+      88                 :             :     }
+      89         [ #  # ]:           0 :   else if (level > 0)
+      90                 :             :     {
+      91                 :           0 :       state->current_level = level;
+      92                 :           0 :       valent_mixer_stream_set_level (stream, level);
+      93                 :             :     }
+      94                 :             : }
+      95                 :             : 
+      96                 :             : static inline void
+      97                 :           8 : stream_state_restore (gpointer data)
+      98                 :             : {
+      99                 :           8 :   StreamState *state = data;
+     100                 :          16 :   g_autoptr (ValentMixerStream) stream = NULL;
+     101                 :             : 
+     102         [ +  + ]:           8 :   if ((stream = g_weak_ref_get (&state->stream)) != NULL)
+     103                 :             :     {
+     104         [ +  + ]:           7 :       if (valent_mixer_stream_get_level (stream) == state->current_level)
+     105                 :           3 :         valent_mixer_stream_set_level (stream, state->original_level);
+     106                 :             : 
+     107         [ +  - ]:           7 :       if (valent_mixer_stream_get_muted (stream) == state->current_muted)
+     108                 :           7 :         valent_mixer_stream_set_muted (stream, state->original_muted);
+     109                 :             :     }
+     110                 :             : 
+     111                 :           8 :   g_weak_ref_clear (&state->stream);
+     112   [ +  -  +  + ]:           8 :   g_clear_pointer (&state, g_free);
+     113                 :           8 : }
+     114                 :             : 
+     115                 :             : static inline void
+     116                 :           0 : stream_state_free (gpointer data)
+     117                 :             : {
+     118                 :           0 :   StreamState *state = data;
+     119                 :             : 
+     120                 :           0 :   g_weak_ref_clear (&state->stream);
+     121         [ #  # ]:           0 :   g_clear_pointer (&state, g_free);
+     122                 :           0 : }
+     123                 :             : 
+     124                 :             : static void
+     125                 :           4 : valent_telephony_plugin_restore_media_state (ValentTelephonyPlugin *self)
+     126                 :             : {
+     127         [ +  - ]:           4 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (self));
+     128                 :             : 
+     129         [ +  - ]:           4 :   g_clear_pointer (&self->prev_output, stream_state_restore);
+     130         [ +  - ]:           4 :   g_clear_pointer (&self->prev_input, stream_state_restore);
+     131                 :             : 
+     132         [ +  + ]:           4 :   if (self->prev_paused)
+     133                 :             :     {
+     134                 :           2 :       ValentMedia *media;
+     135                 :             : 
+     136                 :           2 :       media = valent_media_get_default ();
+     137                 :           2 :       valent_media_unpause (media);
+     138                 :           2 :       self->prev_paused = FALSE;
+     139                 :             :     }
+     140                 :           4 : }
+     141                 :             : 
+     142                 :             : static void
+     143                 :           6 : valent_telephony_plugin_update_media_state (ValentTelephonyPlugin *self,
+     144                 :             :                                             const char            *event)
+     145                 :             : {
+     146                 :           6 :   GSettings *settings;
+     147                 :           6 :   ValentMixer *mixer;
+     148                 :           6 :   ValentMixerStream *stream;
+     149                 :           6 :   int output_level;
+     150                 :           6 :   int input_level;
+     151                 :           6 :   gboolean pause = FALSE;
+     152                 :             : 
+     153         [ +  - ]:           6 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (self));
+     154   [ +  -  -  + ]:           6 :   g_assert (event != NULL && *event != '\0');
+     155                 :             : 
+     156                 :           6 :   settings = valent_extension_get_settings (VALENT_EXTENSION (self));
+     157                 :             : 
+     158                 :             :   /* Retrieve the user preference for this event */
+     159         [ +  + ]:           6 :   if (g_str_equal (event, "ringing"))
+     160                 :             :     {
+     161                 :           4 :       output_level = g_settings_get_int (settings, "ringing-volume");
+     162                 :           4 :       input_level = g_settings_get_int (settings, "ringing-microphone");
+     163                 :           4 :       pause = g_settings_get_boolean (settings, "ringing-pause");
+     164                 :             :     }
+     165         [ +  - ]:           2 :   else if (g_str_equal (event, "talking"))
+     166                 :             :     {
+     167                 :           2 :       output_level = g_settings_get_int (settings, "talking-volume");
+     168                 :           2 :       input_level = g_settings_get_int (settings, "talking-microphone");
+     169                 :           2 :       pause = g_settings_get_boolean (settings, "talking-pause");
+     170                 :             :     }
+     171                 :             :   else
+     172                 :             :     {
+     173                 :           0 :       g_return_if_reached ();
+     174                 :             :     }
+     175                 :             : 
+     176                 :             :   /* Speakers & Microphone */
+     177                 :           6 :   mixer = valent_mixer_get_default ();
+     178                 :             : 
+     179         [ +  - ]:           6 :   if ((stream = valent_mixer_get_default_output (mixer)) != NULL)
+     180                 :             :     {
+     181         [ +  + ]:           6 :       if (self->prev_output == NULL)
+     182                 :           4 :         self->prev_output = stream_state_new (stream, output_level);
+     183                 :             :       else
+     184                 :           2 :         stream_state_update (self->prev_output, stream, output_level);
+     185                 :             :     }
+     186                 :             : 
+     187         [ +  - ]:           6 :   if ((stream = valent_mixer_get_default_input (mixer)) != NULL)
+     188                 :             :     {
+     189         [ +  + ]:           6 :       if (self->prev_input == NULL)
+     190                 :           4 :         self->prev_input = stream_state_new (stream, input_level);
+     191                 :             :       else
+     192                 :           2 :         stream_state_update (self->prev_input, stream, input_level);
+     193                 :             :     }
+     194                 :             : 
+     195                 :             :   /* Media Players */
+     196         [ +  + ]:           6 :   if (pause)
+     197                 :             :     {
+     198                 :           2 :       ValentMedia *media;
+     199                 :             : 
+     200                 :           2 :       media = valent_media_get_default ();
+     201                 :           2 :       valent_media_pause (media);
+     202                 :           2 :       self->prev_paused = TRUE;
+     203                 :             :     }
+     204                 :             : }
+     205                 :             : 
+     206                 :             : static GIcon *
+     207                 :           6 : valent_telephony_plugin_get_event_icon (JsonNode   *packet,
+     208                 :             :                                         const char *event)
+     209                 :             : {
+     210                 :           6 :   const char *phone_thumbnail = NULL;
+     211                 :             : 
+     212         [ +  - ]:           6 :   g_assert (VALENT_IS_PACKET (packet));
+     213                 :             : 
+     214         [ +  - ]:           6 :   if (valent_packet_get_string (packet, "phoneThumbnail", &phone_thumbnail))
+     215                 :             :     {
+     216                 :           6 :       g_autoptr (GdkPixbufLoader) loader = NULL;
+     217                 :           6 :       GdkPixbuf *pixbuf = NULL;
+     218   [ +  -  -  - ]:           6 :       g_autoptr (GError) error = NULL;
+     219   [ -  +  -  - ]:           6 :       g_autofree unsigned char *data = NULL;
+     220                 :           6 :       size_t dlen;
+     221                 :             : 
+     222                 :           6 :       data = g_base64_decode (phone_thumbnail, &dlen);
+     223                 :           6 :       loader = gdk_pixbuf_loader_new();
+     224                 :             : 
+     225   [ -  +  -  + ]:          12 :       if (gdk_pixbuf_loader_write (loader, data, dlen, &error) &&
+     226                 :           6 :           gdk_pixbuf_loader_close (loader, &error))
+     227                 :           6 :         pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+     228                 :             : 
+     229         [ -  + ]:           6 :       if (error != NULL)
+     230                 :           0 :         g_debug ("%s(): %s", G_STRFUNC, error->message);
+     231                 :             : 
+     232         [ +  - ]:           6 :       if (pixbuf != NULL)
+     233                 :           6 :         return G_ICON (g_object_ref (pixbuf));
+     234                 :             :     }
+     235                 :             : 
+     236         [ #  # ]:           0 :   if (g_str_equal (event, "ringing"))
+     237                 :           0 :     return g_themed_icon_new ("call-incoming-symbolic");
+     238                 :             : 
+     239         [ #  # ]:           0 :   if (g_str_equal (event, "talking"))
+     240                 :           0 :     return g_themed_icon_new ("call-start-symbolic");
+     241                 :             : 
+     242         [ #  # ]:           0 :   if (g_str_equal (event, "missedCall"))
+     243                 :           0 :     return g_themed_icon_new ("call-missed-symbolic");
+     244                 :             : 
+     245                 :             :   return NULL;
+     246                 :             : }
+     247                 :             : 
+     248                 :             : static void
+     249                 :          10 : valent_telephony_plugin_handle_telephony (ValentTelephonyPlugin *self,
+     250                 :             :                                           JsonNode              *packet)
+     251                 :             : {
+     252                 :          10 :   ValentDevice *device;
+     253                 :          10 :   const char *event;
+     254                 :          10 :   const char *sender;
+     255                 :          10 :   g_autoptr (GNotification) notification = NULL;
+     256         [ +  - ]:          10 :   g_autoptr (GIcon) icon = NULL;
+     257                 :             : 
+     258         [ +  - ]:          10 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (self));
+     259         [ -  + ]:          10 :   g_assert (VALENT_IS_PACKET (packet));
+     260                 :             : 
+     261         [ -  + ]:          10 :   if (!valent_packet_get_string (packet, "event", &event))
+     262                 :             :     {
+     263                 :           0 :       g_debug ("%s(): expected \"event\" field holding a string",
+     264                 :             :                G_STRFUNC);
+     265                 :           0 :       return;
+     266                 :             :     }
+     267                 :             : 
+     268                 :             :   /* Currently, only "ringing" and "talking" events are supported */
+     269   [ +  +  +  - ]:          10 :   if (!g_str_equal (event, "ringing") && !g_str_equal (event, "talking"))
+     270                 :             :     {
+     271                 :             :       VALENT_NOTE ("TODO: \"%s\" event", event);
+     272                 :             :       return;
+     273                 :             :     }
+     274                 :             : 
+     275                 :             :   /* Sender*/
+     276   [ +  +  +  - ]:          14 :   if (!valent_packet_get_string (packet, "contactName", &sender) &&
+     277                 :           4 :       !valent_packet_get_string (packet, "phoneNumber", &sender))
+     278                 :           4 :     sender = _("Unknown Contact");
+     279                 :             : 
+     280                 :             :   /* The sender is injected into the notification ID, since it's possible an
+     281                 :             :    * event could occur for multiple callers concurrently.
+     282                 :             :    *
+     283                 :             :    * Because we only support voice events, we can be certain that subsequent
+     284                 :             :    * events from the same sender supersede previous events, and replace the
+     285                 :             :    * older notifications.
+     286                 :             :    */
+     287                 :          10 :   device = valent_extension_get_object (VALENT_EXTENSION (self));
+     288                 :             : 
+     289                 :             :   /* This is a cancelled event */
+     290         [ +  + ]:          10 :   if (valent_packet_check_field (packet, "isCancel"))
+     291                 :             :     {
+     292                 :           4 :       valent_telephony_plugin_restore_media_state (self);
+     293                 :           4 :       valent_device_plugin_hide_notification (VALENT_DEVICE_PLUGIN (self),
+     294                 :             :                                               sender);
+     295                 :           4 :       return;
+     296                 :             :     }
+     297                 :             : 
+     298                 :             :   /* Adjust volume/pause media */
+     299                 :           6 :   valent_telephony_plugin_update_media_state (self, event);
+     300                 :             : 
+     301                 :             :   /* Notify user */
+     302                 :           6 :   notification = g_notification_new (sender);
+     303                 :           6 :   icon = valent_telephony_plugin_get_event_icon (packet, event);
+     304                 :           6 :   g_notification_set_icon (notification, icon);
+     305                 :             : 
+     306         [ +  + ]:           6 :   if (g_str_equal (event, "ringing"))
+     307                 :             :     {
+     308                 :           4 :       g_notification_set_body (notification, _("Incoming call"));
+     309                 :           4 :       valent_notification_add_device_button (notification,
+     310                 :             :                                              device,
+     311                 :           4 :                                              _("Mute"),
+     312                 :             :                                              "telephony.mute-call",
+     313                 :             :                                              NULL);
+     314                 :           4 :       g_notification_set_priority (notification,
+     315                 :             :                                    G_NOTIFICATION_PRIORITY_URGENT);
+     316                 :             :     }
+     317         [ +  - ]:           2 :   else if (g_str_equal (event, "talking"))
+     318                 :             :     {
+     319                 :           2 :       g_notification_set_body (notification, _("Ongoing call"));
+     320                 :             :     }
+     321                 :             : 
+     322         [ +  - ]:           6 :   valent_device_plugin_show_notification (VALENT_DEVICE_PLUGIN (self),
+     323                 :             :                                           sender,
+     324                 :             :                                           notification);
+     325                 :             : }
+     326                 :             : 
+     327                 :             : static void
+     328                 :           1 : valent_telephony_plugin_mute_call (ValentTelephonyPlugin *self)
+     329                 :             : {
+     330                 :           2 :   g_autoptr (JsonNode) packet = NULL;
+     331                 :             : 
+     332         [ +  - ]:           1 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (self));
+     333                 :             : 
+     334                 :           1 :   packet = valent_packet_new ("kdeconnect.telephony.request_mute");
+     335         [ +  - ]:           1 :   valent_device_plugin_queue_packet (VALENT_DEVICE_PLUGIN (self), packet);
+     336                 :           1 : }
+     337                 :             : 
+     338                 :             : /*
+     339                 :             :  * GActions
+     340                 :             :  */
+     341                 :             : static void
+     342                 :           1 : mute_call_action (GSimpleAction *action,
+     343                 :             :                   GVariant      *parameter,
+     344                 :             :                   gpointer       user_data)
+     345                 :             : {
+     346                 :           1 :   ValentTelephonyPlugin *self = VALENT_TELEPHONY_PLUGIN (user_data);
+     347                 :             : 
+     348         [ +  - ]:           1 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (self));
+     349                 :             : 
+     350                 :           1 :   valent_telephony_plugin_mute_call (self);
+     351                 :           1 : }
+     352                 :             : 
+     353                 :             : static const GActionEntry actions[] = {
+     354                 :             :     {"mute-call", mute_call_action, NULL, NULL, NULL}
+     355                 :             : };
+     356                 :             : 
+     357                 :             : /*
+     358                 :             :  * ValentDevicePlugin
+     359                 :             :  */
+     360                 :             : static void
+     361                 :          13 : valent_telephony_plugin_update_state (ValentDevicePlugin *plugin,
+     362                 :             :                                       ValentDeviceState   state)
+     363                 :             : {
+     364                 :          13 :   ValentTelephonyPlugin *self = VALENT_TELEPHONY_PLUGIN (plugin);
+     365                 :          13 :   gboolean available;
+     366                 :             : 
+     367         [ +  - ]:          13 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (plugin));
+     368                 :             : 
+     369                 :          13 :   available = (state & VALENT_DEVICE_STATE_CONNECTED) != 0 &&
+     370                 :             :               (state & VALENT_DEVICE_STATE_PAIRED) != 0;
+     371                 :             : 
+     372                 :             :   /* Clear the stream state, but don't restore it as there may still be an
+     373                 :             :    * event in progress. */
+     374         [ +  + ]:          13 :   if (!available)
+     375                 :             :     {
+     376         [ -  + ]:           9 :       g_clear_pointer (&self->prev_output, stream_state_free);
+     377         [ -  + ]:           9 :       g_clear_pointer (&self->prev_input, stream_state_free);
+     378                 :             :     }
+     379                 :             : 
+     380                 :          13 :   valent_extension_toggle_actions (VALENT_EXTENSION (plugin), available);
+     381                 :          13 : }
+     382                 :             : 
+     383                 :             : static void
+     384                 :          10 : valent_telephony_plugin_handle_packet (ValentDevicePlugin *plugin,
+     385                 :             :                                        const char         *type,
+     386                 :             :                                        JsonNode           *packet)
+     387                 :             : {
+     388                 :          10 :   ValentTelephonyPlugin *self = VALENT_TELEPHONY_PLUGIN (plugin);
+     389                 :             : 
+     390         [ +  - ]:          10 :   g_assert (VALENT_IS_TELEPHONY_PLUGIN (plugin));
+     391         [ -  + ]:          10 :   g_assert (type != NULL);
+     392         [ -  + ]:          10 :   g_assert (VALENT_IS_PACKET (packet));
+     393                 :             : 
+     394         [ +  - ]:          10 :   if (g_str_equal (type, "kdeconnect.telephony"))
+     395                 :          10 :     valent_telephony_plugin_handle_telephony (self, packet);
+     396                 :             :   else
+     397                 :          10 :     g_assert_not_reached ();
+     398                 :          10 : }
+     399                 :             : 
+     400                 :             : /*
+     401                 :             :  * ValentObject
+     402                 :             :  */
+     403                 :             : static void
+     404                 :           8 : valent_telephony_plugin_destroy (ValentObject *object)
+     405                 :             : {
+     406                 :           8 :   ValentTelephonyPlugin *self = VALENT_TELEPHONY_PLUGIN (object);
+     407                 :             : 
+     408         [ -  + ]:           8 :   g_clear_pointer (&self->prev_output, stream_state_free);
+     409         [ -  + ]:           8 :   g_clear_pointer (&self->prev_input, stream_state_free);
+     410                 :             : 
+     411                 :           8 :   VALENT_OBJECT_CLASS (valent_telephony_plugin_parent_class)->destroy (object);
+     412                 :           8 : }
+     413                 :             : 
+     414                 :             : /*
+     415                 :             :  * GObject
+     416                 :             :  */
+     417                 :             : static void
+     418                 :           4 : valent_telephony_plugin_constructed (GObject *object)
+     419                 :             : {
+     420                 :           4 :   ValentDevicePlugin *plugin = VALENT_DEVICE_PLUGIN (object);
+     421                 :             : 
+     422                 :           4 :   g_action_map_add_action_entries (G_ACTION_MAP (plugin),
+     423                 :             :                                    actions,
+     424                 :             :                                    G_N_ELEMENTS (actions),
+     425                 :             :                                    plugin);
+     426                 :             : 
+     427                 :           4 :   G_OBJECT_CLASS (valent_telephony_plugin_parent_class)->constructed (object);
+     428                 :           4 : }
+     429                 :             : 
+     430                 :             : static void
+     431                 :           2 : valent_telephony_plugin_class_init (ValentTelephonyPluginClass *klass)
+     432                 :             : {
+     433                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     434                 :           2 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     435                 :           2 :   ValentDevicePluginClass *plugin_class = VALENT_DEVICE_PLUGIN_CLASS (klass);
+     436                 :             : 
+     437                 :           2 :   object_class->constructed = valent_telephony_plugin_constructed;
+     438                 :             : 
+     439                 :           2 :   vobject_class->destroy = valent_telephony_plugin_destroy;
+     440                 :             : 
+     441                 :           2 :   plugin_class->handle_packet = valent_telephony_plugin_handle_packet;
+     442                 :           2 :   plugin_class->update_state = valent_telephony_plugin_update_state;
+     443                 :             : }
+     444                 :             : 
+     445                 :             : static void
+     446                 :           4 : valent_telephony_plugin_init (ValentTelephonyPlugin *self)
+     447                 :             : {
+     448                 :           4 : }
+     449                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-plugin.h.func-c.html b/coverage/src/plugins/telephony/valent-telephony-plugin.h.func-c.html new file mode 100644 index 00000000000..5b81429a321 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-plugin.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_TELEPHONY_PLUGIN45
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-plugin.h.func.html b/coverage/src/plugins/telephony/valent-telephony-plugin.h.func.html new file mode 100644 index 00000000000..da1c634960a --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-plugin.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-plugin.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_TELEPHONY_PLUGIN45
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-plugin.h.gcov.html b/coverage/src/plugins/telephony/valent-telephony-plugin.h.gcov.html new file mode 100644 index 00000000000..8296832be17 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-plugin.h.gcov.html @@ -0,0 +1,108 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-plugin.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-plugin.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:100.0 %11
Test Date:2024-03-31 18:46:36Functions:100.0 %11
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:50.0 %63
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_TELEPHONY_PLUGIN (valent_telephony_plugin_get_type())
+      11                 :             : 
+      12   [ +  -  +  -  :          45 : G_DECLARE_FINAL_TYPE (ValentTelephonyPlugin, valent_telephony_plugin, VALENT, TELEPHONY_PLUGIN, ValentDevicePlugin)
+                   -  + ]
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-preferences.c.func-c.html b/coverage/src/plugins/telephony/valent-telephony-preferences.c.func-c.html new file mode 100644 index 00000000000..a5b2bdd0f64 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-preferences.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:73.5 %6850
Test Date:2024-03-31 18:46:36Functions:81.8 %119
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:33.3 %124
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
set_mute_volume_boolean0
set_volume0
get_mute_volume_boolean1
valent_telephony_preferences_constructed1
valent_telephony_preferences_dispose1
valent_telephony_preferences_init1
get_volume2
valent_telephony_preferences_class_init2
valent_telephony_preferences_get_type7
valent_telephony_preferences_class_intern_init2
valent_telephony_preferences_get_type_once2
valent_telephony_preferences_get_type3
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-preferences.c.func.html b/coverage/src/plugins/telephony/valent-telephony-preferences.c.func.html new file mode 100644 index 00000000000..b0e6cdd7aa6 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-preferences.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-preferences.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:73.5 %6850
Test Date:2024-03-31 18:46:36Functions:81.8 %119
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:33.3 %124
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
get_mute_volume_boolean1
get_volume2
set_mute_volume_boolean0
set_volume0
valent_telephony_preferences_class_init2
valent_telephony_preferences_constructed1
valent_telephony_preferences_dispose1
valent_telephony_preferences_get_type7
valent_telephony_preferences_class_intern_init2
valent_telephony_preferences_get_type3
valent_telephony_preferences_get_type_once2
valent_telephony_preferences_init1
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/telephony/valent-telephony-preferences.c.gcov.html b/coverage/src/plugins/telephony/valent-telephony-preferences.c.gcov.html new file mode 100644 index 00000000000..f8112f477c4 --- /dev/null +++ b/coverage/src/plugins/telephony/valent-telephony-preferences.c.gcov.html @@ -0,0 +1,291 @@ + + + + + + + LCOV - Code Coverage - src/plugins/telephony/valent-telephony-preferences.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/telephony - valent-telephony-preferences.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:73.5 %6850
Test Date:2024-03-31 18:46:36Functions:81.8 %119
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:33.3 %124
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-telephony-preferences"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <adwaita.h>
+      10                 :             : #include <gtk/gtk.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-telephony-preferences.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : struct _ValentTelephonyPreferences
+      17                 :             : {
+      18                 :             :   ValentDevicePreferencesGroup  parent_instance;
+      19                 :             : 
+      20                 :             :   /* template */
+      21                 :             :   AdwComboRow                  *ringing_volume;
+      22                 :             :   GtkSwitch                    *ringing_pause;
+      23                 :             : 
+      24                 :             :   AdwComboRow                  *talking_volume;
+      25                 :             :   GtkSwitch                    *talking_pause;
+      26                 :             :   GtkSwitch                    *talking_microphone;
+      27                 :             : };
+      28                 :             : 
+      29   [ +  +  +  - ]:           7 : G_DEFINE_FINAL_TYPE (ValentTelephonyPreferences, valent_telephony_preferences, VALENT_TYPE_DEVICE_PREFERENCES_GROUP)
+      30                 :             : 
+      31                 :             : 
+      32                 :             : /* Mapping functions for converting our [-1...100] volume range to a boolean,
+      33                 :             :  * where -1 generally means "don't change", 0 means mute and any other value is
+      34                 :             :  * a volume percentage.
+      35                 :             :  * */
+      36                 :             : static gboolean
+      37                 :           1 : get_mute_volume_boolean (GValue   *value,
+      38                 :             :                          GVariant *variant,
+      39                 :             :                          gpointer  user_data)
+      40                 :             : {
+      41                 :           1 :   int volume;
+      42                 :             : 
+      43                 :           1 :   volume = g_variant_get_int32 (variant);
+      44                 :             : 
+      45                 :           1 :   g_value_set_boolean (value, (volume == 0));
+      46                 :             : 
+      47                 :           1 :   return TRUE;
+      48                 :             : }
+      49                 :             : 
+      50                 :             : static GVariant *
+      51                 :           0 : set_mute_volume_boolean (const GValue       *value,
+      52                 :             :                          const GVariantType *expected_type,
+      53                 :             :                          gpointer            user_data)
+      54                 :             : {
+      55                 :           0 :   gboolean mute_volume;
+      56                 :             : 
+      57                 :           0 :   mute_volume = g_value_get_boolean (value);
+      58                 :             : 
+      59         [ #  # ]:           0 :   if (mute_volume)
+      60                 :           0 :     return g_variant_new_int32 (0);
+      61                 :             :   else
+      62                 :           0 :     return g_variant_new_int32 (-1);
+      63                 :             : }
+      64                 :             : 
+      65                 :             : #define VOLUME_NOTHING -1
+      66                 :             : #define VOLUME_LOWER   15
+      67                 :             : #define VOLUME_MUTE     0
+      68                 :             : 
+      69                 :             : static gboolean
+      70                 :           2 : get_volume (GValue   *value,
+      71                 :             :             GVariant *variant,
+      72                 :             :             gpointer  user_data)
+      73                 :             : {
+      74                 :           2 :   int volume;
+      75                 :           2 :   guint selected;
+      76                 :             : 
+      77                 :           2 :   volume = g_variant_get_int32 (variant);
+      78                 :             : 
+      79         [ +  - ]:           2 :   switch (volume)
+      80                 :             :     {
+      81                 :             :     case VOLUME_NOTHING:
+      82                 :             :       selected = 0;
+      83                 :             :       break;
+      84                 :             : 
+      85                 :             :     case VOLUME_LOWER:
+      86                 :             :       selected = 1;
+      87                 :             :       break;
+      88                 :             : 
+      89                 :             :     case VOLUME_MUTE:
+      90                 :             :       selected = 2;
+      91                 :             :       break;
+      92                 :             : 
+      93                 :             :     default:
+      94                 :             :       selected = GTK_INVALID_LIST_POSITION;
+      95                 :             :     }
+      96                 :             : 
+      97                 :           2 :   g_value_set_uint (value, selected);
+      98                 :             : 
+      99                 :           2 :   return TRUE;
+     100                 :             : }
+     101                 :             : 
+     102                 :             : static GVariant *
+     103                 :           0 : set_volume (const GValue       *value,
+     104                 :             :             const GVariantType *expected_type,
+     105                 :             :             gpointer            user_data)
+     106                 :             : {
+     107                 :           0 :   unsigned int selected;
+     108                 :             : 
+     109                 :           0 :   selected = g_value_get_uint (value);
+     110                 :             : 
+     111   [ #  #  #  # ]:           0 :   switch (selected)
+     112                 :             :     {
+     113                 :           0 :     case 0:
+     114                 :           0 :       return g_variant_new_int32 (-1);
+     115                 :             : 
+     116                 :           0 :     case 1:
+     117                 :           0 :       return g_variant_new_int32 (15);
+     118                 :             : 
+     119                 :           0 :     case 2:
+     120                 :           0 :       return g_variant_new_int32 (0);
+     121                 :             : 
+     122                 :           0 :     default:
+     123                 :           0 :       return g_variant_new_int32 (-1);
+     124                 :             :     }
+     125                 :             : }
+     126                 :             : 
+     127                 :             : 
+     128                 :             : /*
+     129                 :             :  * GObject
+     130                 :             :  */
+     131                 :             : static void
+     132                 :           1 : valent_telephony_preferences_constructed (GObject *object)
+     133                 :             : {
+     134                 :           1 :   ValentTelephonyPreferences *self = VALENT_TELEPHONY_PREFERENCES (object);
+     135                 :           1 :   ValentDevicePreferencesGroup *group = VALENT_DEVICE_PREFERENCES_GROUP (self);
+     136                 :           1 :   GSettings *settings;
+     137                 :             : 
+     138                 :           1 :   settings = valent_device_preferences_group_get_settings (group);
+     139                 :           1 :   g_settings_bind (settings,            "ringing-pause",
+     140                 :           1 :                    self->ringing_pause, "active",
+     141                 :             :                    G_SETTINGS_BIND_DEFAULT);
+     142                 :           1 :   g_settings_bind_with_mapping (settings,             "ringing-volume",
+     143                 :           1 :                                 self->ringing_volume, "selected",
+     144                 :             :                                 G_SETTINGS_BIND_DEFAULT,
+     145                 :             :                                 get_volume,
+     146                 :             :                                 set_volume,
+     147                 :             :                                 NULL, NULL);
+     148                 :           1 :   g_settings_bind_with_mapping (settings,                 "talking-microphone",
+     149                 :           1 :                                 self->talking_microphone, "active",
+     150                 :             :                                 G_SETTINGS_BIND_DEFAULT,
+     151                 :             :                                 get_mute_volume_boolean,
+     152                 :             :                                 set_mute_volume_boolean,
+     153                 :             :                                 NULL, NULL);
+     154                 :           1 :   g_settings_bind_with_mapping (settings,             "talking-volume",
+     155                 :           1 :                                 self->talking_volume, "selected",
+     156                 :             :                                 G_SETTINGS_BIND_DEFAULT,
+     157                 :             :                                 get_volume,
+     158                 :             :                                 set_volume,
+     159                 :             :                                 NULL, NULL);
+     160                 :           1 :   g_settings_bind (settings,            "talking-pause",
+     161                 :           1 :                    self->talking_pause, "active",
+     162                 :             :                    G_SETTINGS_BIND_DEFAULT);
+     163                 :             : 
+     164                 :           1 :   G_OBJECT_CLASS (valent_telephony_preferences_parent_class)->constructed (object);
+     165                 :           1 : }
+     166                 :             : 
+     167                 :             : static void
+     168                 :           1 : valent_telephony_preferences_dispose (GObject *object)
+     169                 :             : {
+     170                 :           1 :   GtkWidget *widget = GTK_WIDGET (object);
+     171                 :             : 
+     172                 :           1 :   gtk_widget_dispose_template (widget, VALENT_TYPE_TELEPHONY_PREFERENCES);
+     173                 :             : 
+     174                 :           1 :   G_OBJECT_CLASS (valent_telephony_preferences_parent_class)->dispose (object);
+     175                 :           1 : }
+     176                 :             : 
+     177                 :             : static void
+     178                 :           2 : valent_telephony_preferences_class_init (ValentTelephonyPreferencesClass *klass)
+     179                 :             : {
+     180                 :           2 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     181                 :           2 :   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+     182                 :             : 
+     183                 :           2 :   object_class->constructed = valent_telephony_preferences_constructed;
+     184                 :           2 :   object_class->dispose = valent_telephony_preferences_dispose;
+     185                 :             : 
+     186                 :           2 :   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/telephony/valent-telephony-preferences.ui");
+     187                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentTelephonyPreferences, ringing_volume);
+     188                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentTelephonyPreferences, ringing_pause);
+     189                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentTelephonyPreferences, talking_volume);
+     190                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentTelephonyPreferences, talking_pause);
+     191                 :           2 :   gtk_widget_class_bind_template_child (widget_class, ValentTelephonyPreferences, talking_microphone);
+     192                 :           2 : }
+     193                 :             : 
+     194                 :             : static void
+     195                 :           1 : valent_telephony_preferences_init (ValentTelephonyPreferences *self)
+     196                 :             : {
+     197                 :           1 :   gtk_widget_init_template (GTK_WIDGET (self));
+     198                 :           1 : }
+     199                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-detail-sort-b.html b/coverage/src/plugins/xdp/index-detail-sort-b.html new file mode 100644 index 00000000000..c67f196a0e6 --- /dev/null +++ b/coverage/src/plugins/xdp/index-detail-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-detail-sort-f.html b/coverage/src/plugins/xdp/index-detail-sort-f.html new file mode 100644 index 00000000000..9d868a90fc7 --- /dev/null +++ b/coverage/src/plugins/xdp/index-detail-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-detail-sort-l.html b/coverage/src/plugins/xdp/index-detail-sort-l.html new file mode 100644 index 00000000000..4c7d7843774 --- /dev/null +++ b/coverage/src/plugins/xdp/index-detail-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-detail.html b/coverage/src/plugins/xdp/index-detail.html new file mode 100644 index 00000000000..92dd1c756a4 --- /dev/null +++ b/coverage/src/plugins/xdp/index-detail.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-sort-b.html b/coverage/src/plugins/xdp/index-sort-b.html new file mode 100644 index 00000000000..c67f196a0e6 --- /dev/null +++ b/coverage/src/plugins/xdp/index-sort-b.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-sort-f.html b/coverage/src/plugins/xdp/index-sort-f.html new file mode 100644 index 00000000000..9d868a90fc7 --- /dev/null +++ b/coverage/src/plugins/xdp/index-sort-f.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index-sort-l.html b/coverage/src/plugins/xdp/index-sort-l.html new file mode 100644 index 00000000000..4c7d7843774 --- /dev/null +++ b/coverage/src/plugins/xdp/index-sort-l.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/index.html b/coverage/src/plugins/xdp/index.html new file mode 100644 index 00000000000..92dd1c756a4 --- /dev/null +++ b/coverage/src/plugins/xdp/index.html @@ -0,0 +1,233 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdpCoverageTotalHit
Test:Code CoverageLines:0.0 %3060
Test Date:2024-03-31 18:46:36Functions:0.0 %460
Legend: Rating: + low: < 75 % + medium: >= 75 % + high: >= 90 % +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filename Sort by file nameLine Coverage ( show details ) Sort by line coverageBranch Coverage Sort by branch coverageFunction Coverage Sort by function coverage
Rate Total Hit Rate Total Hit Rate Total Hit
valent-xdp-background.c +
0.0%
+
0.0 %79-0.0 %11
valent-xdp-background.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-input.c +
0.0%
+
0.0 %134-0.0 %16
valent-xdp-input.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-session.c +
0.0%
+
0.0 %61-0.0 %11
valent-xdp-session.h +
0.0%
+
0.0 %1-0.0 %1
valent-xdp-utils.c +
0.0%
+
0.0 %22-0.0 %4
xdp-plugin.c +
0.0%
+
0.0 %7-0.0 %1
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-background.c.func-c.html b/coverage/src/plugins/xdp/valent-xdp-background.c.func-c.html new file mode 100644 index 00000000000..8e7eb7a1117 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-background.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-background.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-background.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %790
Test Date:2024-03-31 18:46:36Functions:0.0 %110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_autostart_changed0
on_window_is_active0
on_windows_changed0
valent_xdp_background_constructed0
valent_xdp_background_destroy0
valent_xdp_background_get_type0
valent_xdp_background_class_intern_init0
valent_xdp_background_get_type0
valent_xdp_background_get_type_once0
valent_xdp_background_init0
valent_xdp_background_request0
xdp_portal_request_background_cb0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-background.c.func.html b/coverage/src/plugins/xdp/valent-xdp-background.c.func.html new file mode 100644 index 00000000000..cf473ef7f9a --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-background.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-background.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-background.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %790
Test Date:2024-03-31 18:46:36Functions:0.0 %110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
on_autostart_changed0
on_window_is_active0
on_windows_changed0
valent_xdp_background_constructed0
valent_xdp_background_destroy0
valent_xdp_background_get_type0
valent_xdp_background_class_intern_init0
valent_xdp_background_get_type0
valent_xdp_background_get_type_once0
valent_xdp_background_init0
valent_xdp_background_request0
xdp_portal_request_background_cb0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-background.c.gcov.html b/coverage/src/plugins/xdp/valent-xdp-background.c.gcov.html new file mode 100644 index 00000000000..631c7108fcd --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-background.c.gcov.html @@ -0,0 +1,315 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-background.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-background.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %790
Test Date:2024-03-31 18:46:36Functions:0.0 %110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-xdp-background"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <glib/gi18n.h>
+       9                 :             : #include <gtk/gtk.h>
+      10                 :             : #include <libportal/portal.h>
+      11                 :             : #include <valent.h>
+      12                 :             : 
+      13                 :             : #include "valent-xdp-background.h"
+      14                 :             : #include "valent-xdp-utils.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : struct _ValentXdpBackground
+      18                 :             : {
+      19                 :             :   ValentApplicationPlugin  parent;
+      20                 :             : 
+      21                 :             :   GSettings               *settings;
+      22                 :             :   unsigned int             autostart : 1;
+      23                 :             :   unsigned long            active_id;
+      24                 :             : };
+      25                 :             : 
+      26                 :           0 : G_DEFINE_FINAL_TYPE (ValentXdpBackground, valent_xdp_background, VALENT_TYPE_APPLICATION_PLUGIN)
+      27                 :             : 
+      28                 :             : 
+      29                 :             : static void
+      30                 :           0 : xdp_portal_request_background_cb (GObject      *object,
+      31                 :             :                                   GAsyncResult *result,
+      32                 :             :                                   gpointer      user_data)
+      33                 :             : {
+      34                 :           0 :   XdpPortal *portal = XDP_PORTAL (object);
+      35                 :           0 :   g_autoptr (GError) error = NULL;
+      36                 :             : 
+      37                 :           0 :   g_assert (XDP_IS_PORTAL (portal));
+      38                 :             : 
+      39                 :           0 :   if (!xdp_portal_request_background_finish (portal, result, &error))
+      40                 :             :     {
+      41                 :           0 :       if (error != NULL)
+      42                 :           0 :         g_warning ("ValentXdpPlugin: %s", error->message);
+      43                 :             :       else
+      44                 :           0 :         g_debug ("ValentXdpPlugin: permission denied");
+      45                 :             :     }
+      46                 :             :   else
+      47                 :             :     {
+      48                 :           0 :       xdp_portal_set_background_status (portal,
+      49                 :           0 :                                         _("Syncing Devices"),
+      50                 :             :                                         g_task_get_cancellable (G_TASK (result)),
+      51                 :             :                                         NULL,
+      52                 :             :                                         NULL);
+      53                 :             :     }
+      54                 :           0 : }
+      55                 :             : 
+      56                 :             : static void
+      57                 :           0 : valent_xdp_background_request (ValentXdpBackground *self)
+      58                 :             : {
+      59                 :           0 :   g_autoptr (GPtrArray) command_line = NULL;
+      60                 :           0 :   g_autoptr (XdpParent) parent = NULL;
+      61                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+      62                 :           0 :   XdpBackgroundFlags flags = XDP_BACKGROUND_FLAG_NONE;
+      63                 :             : 
+      64                 :           0 :   g_assert (VALENT_IS_XDP_BACKGROUND (self));
+      65                 :             : 
+      66                 :           0 :   if (self->autostart)
+      67                 :             :     {
+      68                 :           0 :       command_line = g_ptr_array_new_with_free_func (g_free);
+      69                 :           0 :       g_ptr_array_add (command_line, g_strdup ("valent"));
+      70                 :           0 :       g_ptr_array_add (command_line, g_strdup ("--gapplication-service"));
+      71                 :             : 
+      72                 :           0 :       flags |= XDP_BACKGROUND_FLAG_AUTOSTART;
+      73                 :             :     }
+      74                 :             : 
+      75                 :           0 :   parent = valent_xdp_get_parent ();
+      76                 :           0 :   destroy = valent_object_ref_cancellable (VALENT_OBJECT (self));
+      77                 :           0 :   xdp_portal_request_background (valent_xdp_get_default (),
+      78                 :             :                                  parent,
+      79                 :             :                                  _("Valent wants to run as a service"),
+      80                 :             :                                  command_line,
+      81                 :             :                                  flags,
+      82                 :             :                                  destroy,
+      83                 :             :                                  xdp_portal_request_background_cb,
+      84                 :             :                                  NULL);
+      85                 :           0 : }
+      86                 :             : 
+      87                 :             : static void
+      88                 :           0 : on_window_is_active (GtkWindow           *window,
+      89                 :             :                      GParamSpec          *pspec,
+      90                 :             :                      ValentXdpBackground *self)
+      91                 :             : {
+      92                 :           0 :   GListModel *windows = NULL;
+      93                 :           0 :   unsigned int n_windows = 0;
+      94                 :             : 
+      95                 :           0 :   if (!gtk_window_is_active (window))
+      96                 :             :     return;
+      97                 :             : 
+      98                 :           0 :   windows = gtk_window_get_toplevels ();
+      99                 :           0 :   n_windows = g_list_model_get_n_items (windows);
+     100                 :             : 
+     101                 :           0 :   for (unsigned int i = 0; i < n_windows; i++)
+     102                 :             :     {
+     103                 :           0 :       g_autoptr (GtkWindow) item = g_list_model_get_item (windows, i);
+     104                 :             : 
+     105                 :           0 :       g_signal_handlers_disconnect_by_func (item, on_window_is_active, self);
+     106                 :             :     }
+     107                 :             : 
+     108                 :           0 :   g_clear_signal_handler (&self->active_id, windows);
+     109                 :           0 :   valent_xdp_background_request (self);
+     110                 :             : }
+     111                 :             : 
+     112                 :             : static void
+     113                 :           0 : on_windows_changed (GListModel          *list,
+     114                 :             :                     unsigned int         position,
+     115                 :             :                     unsigned int         removed,
+     116                 :             :                     unsigned int         added,
+     117                 :             :                     ValentXdpBackground *self)
+     118                 :             : {
+     119                 :           0 :   for (unsigned int i = 0; i < added; i++)
+     120                 :             :     {
+     121                 :           0 :       g_autoptr (GtkWindow) window = g_list_model_get_item (list, position + i);
+     122                 :             : 
+     123                 :             :       // If the new window is active, we can bail now
+     124                 :           0 :       on_window_is_active (window, NULL, self);
+     125                 :           0 :       if (self->active_id == 0)
+     126                 :           0 :         return;
+     127                 :             : 
+     128                 :           0 :       g_signal_connect_object (window,
+     129                 :             :                                "notify::is-active",
+     130                 :             :                                G_CALLBACK (on_window_is_active),
+     131                 :             :                                self, 0);
+     132                 :             :     }
+     133                 :             : }
+     134                 :             : 
+     135                 :             : static void
+     136                 :           0 : on_autostart_changed (GSettings           *settings,
+     137                 :             :                       const char          *key,
+     138                 :             :                       ValentXdpBackground *self)
+     139                 :             : {
+     140                 :           0 :   g_assert (VALENT_IS_XDP_BACKGROUND (self));
+     141                 :             : 
+     142                 :           0 :   self->autostart = g_settings_get_boolean (self->settings, "autostart");
+     143                 :             : 
+     144                 :             :   /* Already waiting for an active window */
+     145                 :           0 :   if (self->active_id > 0)
+     146                 :             :     return;
+     147                 :             : 
+     148                 :             :   /* If there is no window or Valent is not the focused application, defer the
+     149                 :             :    * request until that changes. */
+     150                 :           0 :   if (!valent_xdp_has_parent ())
+     151                 :             :     {
+     152                 :           0 :       GListModel *windows = gtk_window_get_toplevels ();
+     153                 :             : 
+     154                 :           0 :       self->active_id = g_signal_connect_object (windows,
+     155                 :             :                                                  "items-changed",
+     156                 :             :                                                  G_CALLBACK (on_windows_changed),
+     157                 :             :                                                  self, 0);
+     158                 :           0 :       on_windows_changed (windows, 0, 0, g_list_model_get_n_items (windows), self);
+     159                 :           0 :       return;
+     160                 :             :     }
+     161                 :             : 
+     162                 :           0 :   valent_xdp_background_request (self);
+     163                 :             : }
+     164                 :             : 
+     165                 :             : /*
+     166                 :             :  * ValentObject
+     167                 :             :  */
+     168                 :             : static void
+     169                 :           0 : valent_xdp_background_destroy (ValentObject *object)
+     170                 :             : {
+     171                 :           0 :   ValentXdpBackground *self = VALENT_XDP_BACKGROUND (object);
+     172                 :           0 :   GListModel *windows = gtk_window_get_toplevels ();
+     173                 :             : 
+     174                 :           0 :   g_clear_signal_handler (&self->active_id, windows);
+     175                 :           0 :   g_clear_object (&self->settings);
+     176                 :             : 
+     177                 :             :   /* If the extension is being disabled during application shutdown, the main
+     178                 :             :    * window is already closed and this will be skipped. If the user has disabled
+     179                 :             :    * the extension, then the window must be active and it will succeed */
+     180                 :           0 :   if (valent_xdp_has_parent ())
+     181                 :             :     {
+     182                 :           0 :       self->autostart = FALSE;
+     183                 :           0 :       valent_xdp_background_request (self);
+     184                 :             :     }
+     185                 :             : 
+     186                 :           0 :   VALENT_OBJECT_CLASS (valent_xdp_background_parent_class)->destroy (object);
+     187                 :           0 : }
+     188                 :             : 
+     189                 :             : /*
+     190                 :             :  * GObject
+     191                 :             :  */
+     192                 :             : static void
+     193                 :           0 : valent_xdp_background_constructed (GObject *object)
+     194                 :             : {
+     195                 :           0 :   ValentXdpBackground *self = VALENT_XDP_BACKGROUND (object);
+     196                 :             : 
+     197                 :           0 :   self->settings = g_settings_new ("ca.andyholmes.Valent.Plugin.xdp");
+     198                 :           0 :   g_signal_connect_object (self->settings,
+     199                 :             :                            "changed::autostart",
+     200                 :             :                            G_CALLBACK (on_autostart_changed),
+     201                 :             :                            self, 0);
+     202                 :             : 
+     203                 :           0 :   on_autostart_changed (self->settings, "autostart", self);
+     204                 :             : 
+     205                 :           0 :   G_OBJECT_CLASS (valent_xdp_background_parent_class)->constructed (object);
+     206                 :           0 : }
+     207                 :             : 
+     208                 :             : static void
+     209                 :           0 : valent_xdp_background_class_init (ValentXdpBackgroundClass *klass)
+     210                 :             : {
+     211                 :           0 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     212                 :           0 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     213                 :             : 
+     214                 :           0 :   object_class->constructed = valent_xdp_background_constructed;
+     215                 :             : 
+     216                 :           0 :   vobject_class->destroy = valent_xdp_background_destroy;
+     217                 :             : }
+     218                 :             : 
+     219                 :             : static void
+     220                 :           0 : valent_xdp_background_init (ValentXdpBackground *self)
+     221                 :             : {
+     222                 :           0 : }
+     223                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-background.h.func-c.html b/coverage/src/plugins/xdp/valent-xdp-background.h.func-c.html new file mode 100644 index 00000000000..d1940d233ad --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-background.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-background.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-background.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_XDP_BACKGROUND0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-background.h.func.html b/coverage/src/plugins/xdp/valent-xdp-background.h.func.html new file mode 100644 index 00000000000..fe909673e88 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-background.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-background.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-background.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_XDP_BACKGROUND0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-background.h.gcov.html b/coverage/src/plugins/xdp/valent-xdp-background.h.gcov.html new file mode 100644 index 00000000000..452e085119f --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-background.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-background.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-background.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_XDP_BACKGROUND (valent_xdp_background_get_type())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentXdpBackground, valent_xdp_background, VALENT, XDP_BACKGROUND, ValentApplicationPlugin)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-input.c.func-c.html b/coverage/src/plugins/xdp/valent-xdp-input.c.func-c.html new file mode 100644 index 00000000000..ef2ff7be52c --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-input.c.func-c.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-input.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1340
Test Date:2024-03-31 18:46:36Functions:0.0 %160
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ensure_session0
on_session_closed0
on_session_created0
on_session_expired0
on_session_started0
session_update0
valent_xdp_input_destroy0
valent_xdp_input_finalize0
valent_xdp_input_get_type0
valent_xdp_input_class_intern_init0
valent_xdp_input_get_type0
valent_xdp_input_get_type_once0
valent_xdp_input_init0
valent_xdp_input_keyboard_keysym0
valent_xdp_input_pointer_axis0
valent_xdp_input_pointer_button0
valent_xdp_input_pointer_motion0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-input.c.func.html b/coverage/src/plugins/xdp/valent-xdp-input.c.func.html new file mode 100644 index 00000000000..197a6fed1f4 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-input.c.func.html @@ -0,0 +1,210 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-input.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1340
Test Date:2024-03-31 18:46:36Functions:0.0 %160
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
ensure_session0
on_session_closed0
on_session_created0
on_session_expired0
on_session_started0
session_update0
valent_xdp_input_destroy0
valent_xdp_input_finalize0
valent_xdp_input_get_type0
valent_xdp_input_class_intern_init0
valent_xdp_input_get_type0
valent_xdp_input_get_type_once0
valent_xdp_input_init0
valent_xdp_input_keyboard_keysym0
valent_xdp_input_pointer_axis0
valent_xdp_input_pointer_button0
valent_xdp_input_pointer_motion0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-input.c.gcov.html b/coverage/src/plugins/xdp/valent-xdp-input.c.gcov.html new file mode 100644 index 00000000000..a6c95d37c74 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-input.c.gcov.html @@ -0,0 +1,471 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-input.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-input.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %1340
Test Date:2024-03-31 18:46:36Functions:0.0 %160
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-xdp-input"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #ifdef __linux__
+       9                 :             : # include <linux/input-event-codes.h>
+      10                 :             : #else
+      11                 :             : # define BTN_LEFT    0x110
+      12                 :             : # define BTN_RIGHT   0x111
+      13                 :             : # define BTN_MIDDLE  0x112
+      14                 :             : #endif /* __linux */
+      15                 :             : 
+      16                 :             : #include <glib-object.h>
+      17                 :             : #include <gdk/gdk.h>
+      18                 :             : #ifdef GDK_WINDOWING_X11
+      19                 :             : #  include <gdk/x11/gdkx.h>
+      20                 :             : #endif /* GDK_WINDOWING_X11 */
+      21                 :             : #include <libportal/portal.h>
+      22                 :             : #include <valent.h>
+      23                 :             : 
+      24                 :             : #include "valent-xdp-input.h"
+      25                 :             : #include "valent-xdp-utils.h"
+      26                 :             : 
+      27                 :             : 
+      28                 :             : struct _ValentXdpInput
+      29                 :             : {
+      30                 :             :   ValentInputAdapter  parent_instance;
+      31                 :             : 
+      32                 :             :   GCancellable       *cancellable;
+      33                 :             :   GSettings          *settings;
+      34                 :             : 
+      35                 :             :   XdpSession         *session;
+      36                 :             :   int64_t             session_expiry;
+      37                 :             :   guint               session_expiry_id;
+      38                 :             :   gboolean            session_starting;
+      39                 :             :   gboolean            started;
+      40                 :             : };
+      41                 :             : 
+      42                 :           0 : G_DEFINE_FINAL_TYPE (ValentXdpInput, valent_xdp_input, VALENT_TYPE_INPUT_ADAPTER)
+      43                 :             : 
+      44                 :             : 
+      45                 :             : /*
+      46                 :             :  * Portal Callbacks
+      47                 :             :  */
+      48                 :             : static void
+      49                 :           0 : session_update (ValentXdpInput *self)
+      50                 :             : {
+      51                 :           0 :   g_autoptr (GDateTime) now = NULL;
+      52                 :           0 :   unsigned int timeout = 0;
+      53                 :             : 
+      54                 :           0 :   now = g_date_time_new_now_local ();
+      55                 :           0 :   timeout = g_settings_get_uint (self->settings, "xdp-session-timeout");
+      56                 :           0 :   self->session_expiry = g_date_time_to_unix (now) + timeout;
+      57                 :           0 : }
+      58                 :             : 
+      59                 :             : static void
+      60                 :           0 : on_session_closed (XdpSession *session,
+      61                 :             :                    gpointer    user_data)
+      62                 :             : {
+      63                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (user_data);
+      64                 :             : 
+      65                 :             :   /* Mark the session as inactive */
+      66                 :           0 :   self->started = FALSE;
+      67                 :           0 :   g_clear_handle_id (&self->session_expiry_id, g_source_remove);
+      68                 :           0 :   g_clear_object (&self->session);
+      69                 :           0 : }
+      70                 :             : 
+      71                 :             : static gboolean
+      72                 :           0 : on_session_expired (gpointer user_data)
+      73                 :             : {
+      74                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (user_data);
+      75                 :           0 :   g_autoptr (GDateTime) now = NULL;
+      76                 :           0 :   int remainder;
+      77                 :             : 
+      78                 :             :   /* If the session has been used recently, schedule a new expiry */
+      79                 :           0 :   now = g_date_time_new_now_local ();
+      80                 :           0 :   remainder = self->session_expiry - g_date_time_to_unix (now);
+      81                 :             : 
+      82                 :           0 :   if (remainder > 0)
+      83                 :             :     {
+      84                 :           0 :       self->session_expiry_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
+      85                 :             :                                                             remainder,
+      86                 :             :                                                             on_session_expired,
+      87                 :             :                                                             g_object_ref (self),
+      88                 :             :                                                             g_object_unref);
+      89                 :             : 
+      90                 :           0 :       return G_SOURCE_REMOVE;
+      91                 :             :     }
+      92                 :             : 
+      93                 :             :   /* Otherwise if there's an active session, close it */
+      94                 :           0 :   if (self->session != NULL)
+      95                 :           0 :     xdp_session_close (self->session);
+      96                 :             : 
+      97                 :             :   // Reset the GSource Id
+      98                 :           0 :   self->session_expiry_id = 0;
+      99                 :             : 
+     100                 :           0 :   return G_SOURCE_REMOVE;
+     101                 :             : }
+     102                 :             : 
+     103                 :             : static void
+     104                 :           0 : on_session_started (XdpSession   *session,
+     105                 :             :                     GAsyncResult *res,
+     106                 :             :                     gpointer      user_data)
+     107                 :             : {
+     108                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (user_data);
+     109                 :           0 :   g_autoptr (GError) error = NULL;
+     110                 :           0 :   unsigned int timeout;
+     111                 :             : 
+     112                 :           0 :   if (!xdp_session_start_finish (session, res, &error))
+     113                 :             :     {
+     114                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     115                 :           0 :       g_clear_object (&self->session);
+     116                 :           0 :       self->session_starting = FALSE;
+     117                 :             : 
+     118                 :           0 :       return;
+     119                 :             :     }
+     120                 :             : 
+     121                 :           0 :   if (!(xdp_session_get_devices (session) & XDP_DEVICE_POINTER) ||
+     122                 :           0 :       !(xdp_session_get_devices (session) & XDP_DEVICE_KEYBOARD))
+     123                 :             :     {
+     124                 :           0 :       g_warning ("%s(): failed to get input device", G_STRFUNC);
+     125                 :           0 :       g_clear_object (&self->session);
+     126                 :           0 :       self->session_starting = FALSE;
+     127                 :             : 
+     128                 :           0 :       return;
+     129                 :             :     }
+     130                 :             : 
+     131                 :             :   /* Set a timeout */
+     132                 :           0 :   timeout = g_settings_get_uint (self->settings, "xdp-session-timeout");
+     133                 :             : 
+     134                 :           0 :   if (timeout > 0)
+     135                 :             :     {
+     136                 :           0 :       self->session_expiry_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
+     137                 :             :                                                             timeout,
+     138                 :             :                                                             on_session_expired,
+     139                 :             :                                                             g_object_ref (self),
+     140                 :             :                                                             g_object_unref);
+     141                 :           0 :       session_update (self);
+     142                 :             :     }
+     143                 :             : 
+     144                 :           0 :   self->session_starting = FALSE;
+     145                 :           0 :   self->started = TRUE;
+     146                 :             : }
+     147                 :             : 
+     148                 :             : static void
+     149                 :           0 : on_session_created (XdpPortal    *portal,
+     150                 :             :                     GAsyncResult *result,
+     151                 :             :                     gpointer      user_data)
+     152                 :             : {
+     153                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (user_data);
+     154                 :           0 :   g_autoptr (XdpParent) parent = NULL;
+     155                 :           0 :   g_autoptr (GError) error = NULL;
+     156                 :             : 
+     157                 :           0 :   self->session = xdp_portal_create_remote_desktop_session_finish (portal,
+     158                 :             :                                                                    result,
+     159                 :             :                                                                    &error);
+     160                 :             : 
+     161                 :           0 :   if (self->session == NULL)
+     162                 :             :     {
+     163                 :           0 :       g_warning ("%s(): %s", G_STRFUNC, error->message);
+     164                 :           0 :       self->session_starting = FALSE;
+     165                 :             : 
+     166                 :           0 :       return;
+     167                 :             :     }
+     168                 :             : 
+     169                 :           0 :   g_signal_connect_object (self->session,
+     170                 :             :                            "closed",
+     171                 :             :                            G_CALLBACK (on_session_closed),
+     172                 :             :                            self, 0);
+     173                 :             : 
+     174                 :           0 :   parent = valent_xdp_get_parent ();
+     175                 :           0 :   xdp_session_start (self->session,
+     176                 :             :                      parent,
+     177                 :             :                      self->cancellable,
+     178                 :             :                      (GAsyncReadyCallback)on_session_started,
+     179                 :             :                      self);
+     180                 :             : }
+     181                 :             : 
+     182                 :             : static gboolean
+     183                 :           0 : ensure_session (ValentXdpInput *self)
+     184                 :             : {
+     185                 :           0 :   if G_LIKELY (self->started)
+     186                 :             :     {
+     187                 :           0 :       session_update (self);
+     188                 :           0 :       return TRUE;
+     189                 :             :     }
+     190                 :             : 
+     191                 :           0 :   if (self->session_starting)
+     192                 :             :     return FALSE;
+     193                 :             : 
+     194                 :             :   /* Try to acquire a new session */
+     195                 :           0 :   self->session_starting = TRUE;
+     196                 :           0 :   xdp_portal_create_remote_desktop_session (valent_xdp_get_default (),
+     197                 :             :                                             (XDP_DEVICE_KEYBOARD |
+     198                 :             :                                              XDP_DEVICE_POINTER),
+     199                 :             :                                             XDP_OUTPUT_MONITOR,
+     200                 :             :                                             XDP_REMOTE_DESKTOP_FLAG_NONE,
+     201                 :             :                                             XDP_CURSOR_MODE_HIDDEN,
+     202                 :             :                                             self->cancellable,
+     203                 :             :                                             (GAsyncReadyCallback)on_session_created,
+     204                 :             :                                             self);
+     205                 :             : 
+     206                 :           0 :   return FALSE;
+     207                 :             : }
+     208                 :             : 
+     209                 :             : 
+     210                 :             : /*
+     211                 :             :  * ValentInputAdapter
+     212                 :             :  */
+     213                 :             : static void
+     214                 :           0 : valent_xdp_input_keyboard_keysym (ValentInputAdapter *adapter,
+     215                 :             :                                   uint32_t            keysym,
+     216                 :             :                                   gboolean            state)
+     217                 :             : {
+     218                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (adapter);
+     219                 :             : 
+     220                 :           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     221                 :           0 :   g_assert (VALENT_IS_XDP_INPUT (self));
+     222                 :             : 
+     223                 :           0 :   if G_UNLIKELY (!ensure_session (self))
+     224                 :             :     return;
+     225                 :             : 
+     226                 :             :   // TODO: XDP_KEY_PRESSED/XDP_KEY_RELEASED
+     227                 :             : 
+     228                 :           0 :   xdp_session_keyboard_key (self->session, TRUE, keysym, state);
+     229                 :             : }
+     230                 :             : 
+     231                 :             : static unsigned int
+     232                 :           0 : translate_to_evdev_button (unsigned int button)
+     233                 :             : {
+     234                 :           0 :   switch (button)
+     235                 :             :     {
+     236                 :             :     case VALENT_POINTER_PRIMARY:
+     237                 :             :       return BTN_LEFT;
+     238                 :             : 
+     239                 :             :     case VALENT_POINTER_MIDDLE:
+     240                 :             :       return BTN_MIDDLE;
+     241                 :             : 
+     242                 :             :     case VALENT_POINTER_SECONDARY:
+     243                 :             :       return BTN_RIGHT;
+     244                 :             : 
+     245                 :           0 :     default:
+     246                 :             :       /* Any other buttons go after the legacy scroll buttons (4-7). */
+     247                 :           0 :       return button + (BTN_LEFT - 1) - 4;
+     248                 :             :     }
+     249                 :             : }
+     250                 :             : 
+     251                 :             : static void
+     252                 :           0 : valent_xdp_input_pointer_axis (ValentInputAdapter *adapter,
+     253                 :             :                                double              dx,
+     254                 :             :                                double              dy)
+     255                 :             : {
+     256                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (adapter);
+     257                 :             : 
+     258                 :           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     259                 :           0 :   g_assert (VALENT_IS_XDP_INPUT (self));
+     260                 :           0 :   g_assert (!G_APPROX_VALUE (dx, 0.0, 0.01) || !G_APPROX_VALUE (dy, 0.0, 0.01));
+     261                 :             : 
+     262                 :           0 :   if G_UNLIKELY (!ensure_session (self))
+     263                 :             :     return;
+     264                 :             : 
+     265                 :             :   /* On X11 we use discrete axis steps (eg. mouse wheel) because the absolute
+     266                 :             :    * axis change doesn't seem to work
+     267                 :             :    */
+     268                 :             :   #ifdef GDK_WINDOWING_X11
+     269                 :           0 :     if (GDK_IS_X11_DISPLAY (gdk_display_get_default ()))
+     270                 :             :       {
+     271                 :           0 :         g_debug ("[%s] X11: using discrete axis step", G_STRFUNC);
+     272                 :             : 
+     273                 :           0 :         if (dy < 0.0)
+     274                 :           0 :           xdp_session_pointer_axis_discrete (self->session,
+     275                 :             :                                              XDP_AXIS_VERTICAL_SCROLL,
+     276                 :             :                                              1);
+     277                 :           0 :         else if (dy > 0.0)
+     278                 :           0 :           xdp_session_pointer_axis_discrete (self->session,
+     279                 :             :                                              XDP_AXIS_VERTICAL_SCROLL,
+     280                 :             :                                              -1);
+     281                 :             : 
+     282                 :           0 :         return;
+     283                 :             :       }
+     284                 :             :   #endif /* GDK_WINDOWING_X11 */
+     285                 :             : 
+     286                 :           0 :   xdp_session_pointer_axis (self->session, FALSE, dx, dy);
+     287                 :           0 :   xdp_session_pointer_axis (self->session, TRUE, 0.0, 0.0);
+     288                 :             : }
+     289                 :             : 
+     290                 :             : static void
+     291                 :           0 : valent_xdp_input_pointer_button (ValentInputAdapter *adapter,
+     292                 :             :                                  unsigned int        button,
+     293                 :             :                                  gboolean            pressed)
+     294                 :             : {
+     295                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (adapter);
+     296                 :             : 
+     297                 :           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     298                 :           0 :   g_assert (VALENT_IS_XDP_INPUT (self));
+     299                 :             : 
+     300                 :           0 :   if G_UNLIKELY (!ensure_session (self))
+     301                 :             :     return;
+     302                 :             : 
+     303                 :             :   /* Translate the button to EVDEV constant */
+     304                 :           0 :   button = translate_to_evdev_button (button);
+     305                 :           0 :   xdp_session_pointer_button (self->session, button, pressed);
+     306                 :             : }
+     307                 :             : 
+     308                 :             : static void
+     309                 :           0 : valent_xdp_input_pointer_motion (ValentInputAdapter *adapter,
+     310                 :             :                                  double              dx,
+     311                 :             :                                  double              dy)
+     312                 :             : {
+     313                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (adapter);
+     314                 :             : 
+     315                 :           0 :   g_assert (VALENT_IS_INPUT_ADAPTER (adapter));
+     316                 :           0 :   g_assert (VALENT_IS_XDP_INPUT (self));
+     317                 :             : 
+     318                 :           0 :   if G_UNLIKELY (!ensure_session (self))
+     319                 :             :     return;
+     320                 :             : 
+     321                 :           0 :   xdp_session_pointer_motion (self->session, dx, dy);
+     322                 :             : }
+     323                 :             : 
+     324                 :             : 
+     325                 :             : /*
+     326                 :             :  * ValentObject
+     327                 :             :  */
+     328                 :             : static void
+     329                 :           0 : valent_xdp_input_destroy (ValentObject *object)
+     330                 :             : {
+     331                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (object);
+     332                 :             : 
+     333                 :           0 :   g_cancellable_cancel (self->cancellable);
+     334                 :             : 
+     335                 :           0 :   if (self->session != NULL)
+     336                 :           0 :     xdp_session_close (self->session);
+     337                 :             : 
+     338                 :           0 :   VALENT_OBJECT_CLASS (valent_xdp_input_parent_class)->destroy (object);
+     339                 :           0 : }
+     340                 :             : 
+     341                 :             : /*
+     342                 :             :  * GObject
+     343                 :             :  */
+     344                 :             : static void
+     345                 :           0 : valent_xdp_input_finalize (GObject *object)
+     346                 :             : {
+     347                 :           0 :   ValentXdpInput *self = VALENT_XDP_INPUT (object);
+     348                 :             : 
+     349                 :           0 :   g_clear_object (&self->cancellable);
+     350                 :           0 :   g_clear_object (&self->settings);
+     351                 :           0 :   g_clear_object (&self->session);
+     352                 :             : 
+     353                 :           0 :   G_OBJECT_CLASS (valent_xdp_input_parent_class)->finalize (object);
+     354                 :           0 : }
+     355                 :             : 
+     356                 :             : static void
+     357                 :           0 : valent_xdp_input_class_init (ValentXdpInputClass *klass)
+     358                 :             : {
+     359                 :           0 :   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+     360                 :           0 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     361                 :           0 :   ValentInputAdapterClass *adapter_class = VALENT_INPUT_ADAPTER_CLASS (klass);
+     362                 :             : 
+     363                 :           0 :   object_class->finalize = valent_xdp_input_finalize;
+     364                 :             : 
+     365                 :           0 :   vobject_class->destroy = valent_xdp_input_destroy;
+     366                 :             : 
+     367                 :           0 :   adapter_class->keyboard_keysym = valent_xdp_input_keyboard_keysym;
+     368                 :           0 :   adapter_class->pointer_axis = valent_xdp_input_pointer_axis;
+     369                 :           0 :   adapter_class->pointer_button = valent_xdp_input_pointer_button;
+     370                 :           0 :   adapter_class->pointer_motion = valent_xdp_input_pointer_motion;
+     371                 :             : }
+     372                 :             : 
+     373                 :             : static void
+     374                 :           0 : valent_xdp_input_init (ValentXdpInput *self)
+     375                 :             : {
+     376                 :           0 :   self->cancellable = g_cancellable_new ();
+     377                 :           0 :   self->settings = g_settings_new ("ca.andyholmes.Valent.Plugin.xdp");
+     378                 :           0 : }
+     379                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-input.h.func-c.html b/coverage/src/plugins/xdp/valent-xdp-input.h.func-c.html new file mode 100644 index 00000000000..20ea37ded0f --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-input.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-input.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_XDP_INPUT0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-input.h.func.html b/coverage/src/plugins/xdp/valent-xdp-input.h.func.html new file mode 100644 index 00000000000..05e0092de77 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-input.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-input.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_XDP_INPUT0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-input.h.gcov.html b/coverage/src/plugins/xdp/valent-xdp-input.h.gcov.html new file mode 100644 index 00000000000..da56d9351f6 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-input.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-input.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-input.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_XDP_INPUT (valent_xdp_input_get_type())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentXdpInput, valent_xdp_input, VALENT, XDP_INPUT, ValentInputAdapter)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-session.c.func-c.html b/coverage/src/plugins/xdp/valent-xdp-session.c.func-c.html new file mode 100644 index 00000000000..60365da9df5 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-session.c.func-c.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-session.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %610
Test Date:2024-03-31 18:46:36Functions:0.0 %110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init0
on_session_state_changed0
valent_xdp_session_destroy0
valent_xdp_session_get_active0
valent_xdp_session_get_locked0
valent_xdp_session_get_type0
valent_xdp_session_class_intern_init0
valent_xdp_session_get_type0
valent_xdp_session_get_type_once0
valent_xdp_session_init0
valent_xdp_session_init_async0
xdp_portal_session_monitor_start_cb0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-session.c.func.html b/coverage/src/plugins/xdp/valent-xdp-session.c.func.html new file mode 100644 index 00000000000..4272a55691e --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-session.c.func.html @@ -0,0 +1,175 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-session.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %610
Test Date:2024-03-31 18:46:36Functions:0.0 %110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
g_async_initable_iface_init0
on_session_state_changed0
valent_xdp_session_destroy0
valent_xdp_session_get_active0
valent_xdp_session_get_locked0
valent_xdp_session_get_type0
valent_xdp_session_class_intern_init0
valent_xdp_session_get_type0
valent_xdp_session_get_type_once0
valent_xdp_session_init0
valent_xdp_session_init_async0
xdp_portal_session_monitor_start_cb0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-session.c.gcov.html b/coverage/src/plugins/xdp/valent-xdp-session.c.gcov.html new file mode 100644 index 00000000000..0fda634d8a2 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-session.c.gcov.html @@ -0,0 +1,274 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-session.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-session.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %610
Test Date:2024-03-31 18:46:36Functions:0.0 %110
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-xdp-session"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libportal/portal.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-xdp-session.h"
+      12                 :             : #include "valent-xdp-utils.h"
+      13                 :             : 
+      14                 :             : 
+      15                 :             : struct _ValentXdpSession
+      16                 :             : {
+      17                 :             :   ValentSessionAdapter  parent_instance;
+      18                 :             : 
+      19                 :             :   unsigned int          active : 1;
+      20                 :             :   unsigned int          locked : 1;
+      21                 :             : };
+      22                 :             : 
+      23                 :             : static void   g_async_initable_iface_init (GAsyncInitableIface *iface);
+      24                 :             : 
+      25                 :           0 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentXdpSession, valent_xdp_session, VALENT_TYPE_SESSION_ADAPTER,
+      26                 :             :                                G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
+      27                 :             : 
+      28                 :             : 
+      29                 :             : static void
+      30                 :           0 : on_session_state_changed (XdpPortal            *portal,
+      31                 :             :                           gboolean              screensaver_active,
+      32                 :             :                           XdpLoginSessionState  state,
+      33                 :             :                           ValentXdpSession     *self)
+      34                 :             : {
+      35                 :           0 :   g_assert (VALENT_IS_XDP_SESSION (self));
+      36                 :             : 
+      37                 :           0 :   if (self->active != (state == XDP_LOGIN_SESSION_RUNNING))
+      38                 :             :     {
+      39                 :           0 :       self->active = (state == XDP_LOGIN_SESSION_RUNNING);
+      40                 :           0 :       g_object_notify (G_OBJECT (self), "active");
+      41                 :             :     }
+      42                 :             : 
+      43                 :           0 :   if (self->locked != screensaver_active)
+      44                 :             :     {
+      45                 :           0 :       self->locked = screensaver_active;
+      46                 :           0 :       g_object_notify (G_OBJECT (self), "locked");
+      47                 :             :     }
+      48                 :             : 
+      49                 :           0 :   xdp_portal_session_monitor_query_end_response (portal);
+      50                 :           0 : }
+      51                 :             : 
+      52                 :             : /*
+      53                 :             :  * ValentSessionAdapter
+      54                 :             :  */
+      55                 :             : static gboolean
+      56                 :           0 : valent_xdp_session_get_active (ValentSessionAdapter *adapter)
+      57                 :             : {
+      58                 :           0 :   ValentXdpSession *self = VALENT_XDP_SESSION (adapter);
+      59                 :             : 
+      60                 :           0 :   return self->active;
+      61                 :             : }
+      62                 :             : 
+      63                 :             : static gboolean
+      64                 :           0 : valent_xdp_session_get_locked (ValentSessionAdapter *adapter)
+      65                 :             : {
+      66                 :           0 :   ValentXdpSession *self = VALENT_XDP_SESSION (adapter);
+      67                 :             : 
+      68                 :           0 :   return self->locked;
+      69                 :             : }
+      70                 :             : 
+      71                 :             : /*
+      72                 :             :  * GAsyncInitable
+      73                 :             :  */
+      74                 :             : static void
+      75                 :           0 : xdp_portal_session_monitor_start_cb (GObject      *object,
+      76                 :             :                                      GAsyncResult *result,
+      77                 :             :                                      gpointer      user_data)
+      78                 :             : {
+      79                 :           0 :   XdpPortal *portal = XDP_PORTAL (object);
+      80                 :           0 :   g_autoptr (GTask) task = G_TASK (user_data);
+      81                 :           0 :   ValentXdpSession *self = g_task_get_source_object (task);
+      82                 :           0 :   g_autoptr (GError) error = NULL;
+      83                 :             : 
+      84                 :           0 :   g_assert (G_IS_TASK (task));
+      85                 :           0 :   g_assert (VALENT_IS_XDP_SESSION (self));
+      86                 :             : 
+      87                 :           0 :   if (!xdp_portal_session_monitor_start_finish (portal, result, &error))
+      88                 :             :     {
+      89                 :           0 :       valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+      90                 :             :                                              VALENT_PLUGIN_STATE_ERROR,
+      91                 :             :                                              error);
+      92                 :           0 :       return g_task_return_error (task, g_steal_pointer (&error));
+      93                 :             :     }
+      94                 :             : 
+      95                 :           0 :   g_signal_connect_object (portal,
+      96                 :             :                            "session-state-changed",
+      97                 :             :                            G_CALLBACK (on_session_state_changed),
+      98                 :             :                            self, 0);
+      99                 :             : 
+     100                 :             :   /* Report the adapter as active */
+     101                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
+     102                 :             :                                          VALENT_PLUGIN_STATE_ACTIVE,
+     103                 :             :                                          NULL);
+     104                 :           0 :   g_task_return_boolean (task, TRUE);
+     105                 :             : }
+     106                 :             : 
+     107                 :             : static void
+     108                 :           0 : valent_xdp_session_init_async (GAsyncInitable      *initable,
+     109                 :             :                                int                  io_priority,
+     110                 :             :                                GCancellable        *cancellable,
+     111                 :             :                                GAsyncReadyCallback  callback,
+     112                 :             :                                gpointer             user_data)
+     113                 :             : {
+     114                 :           0 :   g_autoptr (GTask) task = NULL;
+     115                 :           0 :   g_autoptr (GCancellable) destroy = NULL;
+     116                 :           0 :   g_autoptr (XdpParent) parent = NULL;
+     117                 :             : 
+     118                 :           0 :   g_assert (VALENT_IS_XDP_SESSION (initable));
+     119                 :             : 
+     120                 :             :   /* Cede the primary position until complete */
+     121                 :           0 :   valent_extension_plugin_state_changed (VALENT_EXTENSION (initable),
+     122                 :             :                                          VALENT_PLUGIN_STATE_INACTIVE,
+     123                 :             :                                          NULL);
+     124                 :             : 
+     125                 :             :   /* Cancel initialization if the object is destroyed */
+     126                 :           0 :   destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
+     127                 :             :                                              cancellable);
+     128                 :             : 
+     129                 :           0 :   task = g_task_new (initable, destroy, callback, user_data);
+     130                 :           0 :   g_task_set_priority (task, io_priority);
+     131                 :           0 :   g_task_set_source_tag (task, valent_xdp_session_init_async);
+     132                 :             : 
+     133                 :           0 :   parent = valent_xdp_get_parent ();
+     134                 :           0 :   xdp_portal_session_monitor_start (valent_xdp_get_default (),
+     135                 :             :                                     parent,
+     136                 :             :                                     XDP_SESSION_MONITOR_FLAG_NONE,
+     137                 :             :                                     destroy,
+     138                 :             :                                     xdp_portal_session_monitor_start_cb,
+     139                 :             :                                     g_steal_pointer (&task));
+     140                 :           0 : }
+     141                 :             : 
+     142                 :             : static void
+     143                 :           0 : g_async_initable_iface_init (GAsyncInitableIface *iface)
+     144                 :             : {
+     145                 :           0 :   iface->init_async = valent_xdp_session_init_async;
+     146                 :           0 : }
+     147                 :             : 
+     148                 :             : /*
+     149                 :             :  * ValentObject
+     150                 :             :  */
+     151                 :             : static void
+     152                 :           0 : valent_xdp_session_destroy (ValentObject *object)
+     153                 :             : {
+     154                 :           0 :   ValentXdpSession *self = VALENT_XDP_SESSION (object);
+     155                 :           0 :   XdpPortal *portal = valent_xdp_get_default ();
+     156                 :             : 
+     157                 :           0 :   g_signal_handlers_disconnect_by_data (portal, self);
+     158                 :           0 :   xdp_portal_session_monitor_stop (portal);
+     159                 :             : 
+     160                 :           0 :   VALENT_OBJECT_CLASS (valent_xdp_session_parent_class)->destroy (object);
+     161                 :           0 : }
+     162                 :             : 
+     163                 :             : /*
+     164                 :             :  * GObject
+     165                 :             :  */
+     166                 :             : static void
+     167                 :           0 : valent_xdp_session_class_init (ValentXdpSessionClass *klass)
+     168                 :             : {
+     169                 :           0 :   ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
+     170                 :           0 :   ValentSessionAdapterClass *session_class = VALENT_SESSION_ADAPTER_CLASS (klass);
+     171                 :             : 
+     172                 :           0 :   vobject_class->destroy = valent_xdp_session_destroy;
+     173                 :             : 
+     174                 :           0 :   session_class->get_active = valent_xdp_session_get_active;
+     175                 :           0 :   session_class->get_locked = valent_xdp_session_get_locked;
+     176                 :             : }
+     177                 :             : 
+     178                 :             : static void
+     179                 :           0 : valent_xdp_session_init (ValentXdpSession *self)
+     180                 :             : {
+     181                 :           0 : }
+     182                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-session.h.func-c.html b/coverage/src/plugins/xdp/valent-xdp-session.h.func-c.html new file mode 100644 index 00000000000..0f53eeefcea --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-session.h.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-session.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_XDP_SESSION0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-session.h.func.html b/coverage/src/plugins/xdp/valent-xdp-session.h.func.html new file mode 100644 index 00000000000..8acdfe89cf8 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-session.h.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-session.h - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
VALENT_IS_XDP_SESSION0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-session.h.gcov.html b/coverage/src/plugins/xdp/valent-xdp-session.h.gcov.html new file mode 100644 index 00000000000..49e1d13eabd --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-session.h.gcov.html @@ -0,0 +1,107 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-session.h + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-session.h (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %10
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #pragma once
+       5                 :             : 
+       6                 :             : #include <valent.h>
+       7                 :             : 
+       8                 :             : G_BEGIN_DECLS
+       9                 :             : 
+      10                 :             : #define VALENT_TYPE_XDP_SESSION (valent_xdp_session_get_type())
+      11                 :             : 
+      12                 :           0 : G_DECLARE_FINAL_TYPE (ValentXdpSession, valent_xdp_session, VALENT, XDP_SESSION, ValentSessionAdapter)
+      13                 :             : 
+      14                 :             : G_END_DECLS
+      15                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-utils.c.func-c.html b/coverage/src/plugins/xdp/valent-xdp-utils.c.func-c.html new file mode 100644 index 00000000000..7f4cb3d5c47 --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-utils.c.func-c.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %220
Test Date:2024-03-31 18:46:36Functions:0.0 %40
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_xdp_get_active_window0
valent_xdp_get_default0
valent_xdp_get_parent0
valent_xdp_has_parent0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-utils.c.func.html b/coverage/src/plugins/xdp/valent-xdp-utils.c.func.html new file mode 100644 index 00000000000..5d4221a155c --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-utils.c.func.html @@ -0,0 +1,119 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-utils.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %220
Test Date:2024-03-31 18:46:36Functions:0.0 %40
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_xdp_get_active_window0
valent_xdp_get_default0
valent_xdp_get_parent0
valent_xdp_has_parent0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/valent-xdp-utils.c.gcov.html b/coverage/src/plugins/xdp/valent-xdp-utils.c.gcov.html new file mode 100644 index 00000000000..1bdc3a518ac --- /dev/null +++ b/coverage/src/plugins/xdp/valent-xdp-utils.c.gcov.html @@ -0,0 +1,199 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/valent-xdp-utils.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - valent-xdp-utils.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %220
Test Date:2024-03-31 18:46:36Functions:0.0 %40
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #define G_LOG_DOMAIN "valent-xdp-utils"
+       5                 :             : 
+       6                 :             : #include "config.h"
+       7                 :             : 
+       8                 :             : #include <libportal/portal.h>
+       9                 :             : #ifdef HAVE_LIBPORTAL_GTK4
+      10                 :             : # include <gtk/gtk.h>
+      11                 :             : # include <libportal-gtk4/portal-gtk4.h>
+      12                 :             : #endif /* HAVE_LIBPORTAL_GTK4 */
+      13                 :             : 
+      14                 :             : #include "valent-xdp-utils.h"
+      15                 :             : 
+      16                 :             : 
+      17                 :             : static XdpPortal *default_portal = NULL;
+      18                 :             : 
+      19                 :             : 
+      20                 :             : #ifdef HAVE_LIBPORTAL_GTK4
+      21                 :             : static GtkWindow *
+      22                 :           0 : valent_xdp_get_active_window (void)
+      23                 :             : {
+      24                 :           0 :   GListModel *windows = NULL;
+      25                 :           0 :   unsigned int n_windows = 0;
+      26                 :             : 
+      27                 :           0 :   windows = gtk_window_get_toplevels ();
+      28                 :           0 :   n_windows = g_list_model_get_n_items (windows);
+      29                 :             : 
+      30                 :           0 :   for (unsigned int i = 0; i < n_windows; i++)
+      31                 :             :     {
+      32                 :           0 :       g_autoptr (GtkWindow) window = g_list_model_get_item (windows, i);
+      33                 :             : 
+      34                 :           0 :       if (gtk_window_is_active (window))
+      35                 :             :         return g_steal_pointer (&window);
+      36                 :             :     }
+      37                 :             : 
+      38                 :             :   return NULL;
+      39                 :             : }
+      40                 :             : #endif /* HAVE_LIBPORTAL_GTK4 */
+      41                 :             : 
+      42                 :             : /**
+      43                 :             :  * valent_xdp_get_default:
+      44                 :             :  *
+      45                 :             :  * Get the default [class@Xdp.Portal] object for Valent.
+      46                 :             :  *
+      47                 :             :  * Returns: (transfer none): a `XdpPortal`
+      48                 :             :  */
+      49                 :             : XdpPortal *
+      50                 :           0 : valent_xdp_get_default (void)
+      51                 :             : {
+      52                 :           0 :   if (default_portal == NULL)
+      53                 :           0 :     default_portal = xdp_portal_new ();
+      54                 :             : 
+      55                 :           0 :   return default_portal;
+      56                 :             : }
+      57                 :             : 
+      58                 :             : /**
+      59                 :             :  * valent_xdp_get_parent:
+      60                 :             :  *
+      61                 :             :  * Get an [class@Xdp.Parent], if available.
+      62                 :             :  *
+      63                 :             :  * If Valent was compiled without support for libportal-gtk4 or there is no
+      64                 :             :  * active window, this function will return %NULL.
+      65                 :             :  *
+      66                 :             :  * Returns: (nullable) (transfer full): a `XdpParent`
+      67                 :             :  */
+      68                 :             : XdpParent *
+      69                 :           0 : valent_xdp_get_parent (void)
+      70                 :             : {
+      71                 :             : #ifdef HAVE_LIBPORTAL_GTK4
+      72                 :           0 :   g_autoptr (GtkWindow) window = NULL;
+      73                 :             : 
+      74                 :           0 :   window = valent_xdp_get_active_window ();
+      75                 :             : 
+      76                 :           0 :   if (window != NULL)
+      77                 :           0 :     return xdp_parent_new_gtk (window);
+      78                 :             : #endif /* HAVE_LIBPORTAL_GTK4 */
+      79                 :             : 
+      80                 :             :   return NULL;
+      81                 :             : }
+      82                 :             : 
+      83                 :             : /**
+      84                 :             :  * valent_xdp_has_parent:
+      85                 :             :  *
+      86                 :             :  * Check if an active parent is available.
+      87                 :             :  *
+      88                 :             :  * If Valent was compiled without support for libportal-gtk4 or there is no
+      89                 :             :  * active window, this function will return %FALSE.
+      90                 :             :  *
+      91                 :             :  * Returns: %TRUE if there is an active window, or %FALSE if not
+      92                 :             :  */
+      93                 :             : gboolean
+      94                 :           0 : valent_xdp_has_parent (void)
+      95                 :             : {
+      96                 :             : #ifdef HAVE_LIBPORTAL_GTK4
+      97                 :           0 :   g_autoptr (GtkWindow) window = NULL;
+      98                 :             : 
+      99                 :           0 :   window = valent_xdp_get_active_window ();
+     100                 :             : 
+     101                 :           0 :   if (window != NULL)
+     102                 :           0 :     return TRUE;
+     103                 :             : #endif /* HAVE_LIBPORTAL_GTK4 */
+     104                 :             : 
+     105                 :             :   return FALSE;
+     106                 :             : }
+     107                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/xdp-plugin.c.func-c.html b/coverage/src/plugins/xdp/xdp-plugin.c.func-c.html new file mode 100644 index 00000000000..e0ab3aac549 --- /dev/null +++ b/coverage/src/plugins/xdp/xdp-plugin.c.func-c.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/xdp-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - xdp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %70
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_xdp_plugin_register_types0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/xdp-plugin.c.func.html b/coverage/src/plugins/xdp/xdp-plugin.c.func.html new file mode 100644 index 00000000000..cd3cae13522 --- /dev/null +++ b/coverage/src/plugins/xdp/xdp-plugin.c.func.html @@ -0,0 +1,98 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/xdp-plugin.c - functions + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - xdp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %70
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ +
+ + + + + + + + + + + + + + + + +

Function Name Sort by function nameHit count Sort by function hit count
valent_xdp_plugin_register_types0
+
+
+ + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/src/plugins/xdp/xdp-plugin.c.gcov.html b/coverage/src/plugins/xdp/xdp-plugin.c.gcov.html new file mode 100644 index 00000000000..c574f7c8d9b --- /dev/null +++ b/coverage/src/plugins/xdp/xdp-plugin.c.gcov.html @@ -0,0 +1,133 @@ + + + + + + + LCOV - Code Coverage - src/plugins/xdp/xdp-plugin.c + + + + + + + + + + + + + + +
LCOV - code coverage report
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current view:top level - src/plugins/xdp - xdp-plugin.c (source / functions)CoverageTotalHit
Test:Code CoverageLines:0.0 %70
Test Date:2024-03-31 18:46:36Functions:0.0 %10
Legend: Lines: + hit + not hit + | Branches: + + taken + - not taken + # not executed +Branches:-00
+
+ + + + + + + + +

+
             Branch data     Line data    Source code
+
+       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
+       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
+       3                 :             : 
+       4                 :             : #include "config.h"
+       5                 :             : 
+       6                 :             : #include <gtk/gtk.h>
+       7                 :             : #include <libpeas.h>
+       8                 :             : #include <libportal/portal.h>
+       9                 :             : #include <valent.h>
+      10                 :             : 
+      11                 :             : #include "valent-xdp-background.h"
+      12                 :             : #include "valent-xdp-input.h"
+      13                 :             : #include "valent-xdp-session.h"
+      14                 :             : 
+      15                 :             : 
+      16                 :             : _VALENT_EXTERN void
+      17                 :           0 : valent_xdp_plugin_register_types (PeasObjectModule *module)
+      18                 :             : {
+      19                 :             :   /* This extension only makes sense in a graphical environment. */
+      20                 :           0 :   if (gtk_is_initialized ())
+      21                 :             :     {
+      22                 :           0 :       peas_object_module_register_extension_type (module,
+      23                 :             :                                                   VALENT_TYPE_INPUT_ADAPTER,
+      24                 :             :                                                   VALENT_TYPE_XDP_INPUT);
+      25                 :             :     }
+      26                 :             : 
+      27                 :             :   /* These extensions only makes sense in a sandbox environment. */
+      28                 :           0 :   if (xdp_portal_running_under_sandbox ())
+      29                 :             :     {
+      30                 :             : #ifdef HAVE_LIBPORTAL_GTK4
+      31                 :           0 :       peas_object_module_register_extension_type (module,
+      32                 :             :                                                   VALENT_TYPE_APPLICATION_PLUGIN,
+      33                 :             :                                                   VALENT_TYPE_XDP_BACKGROUND);
+      34                 :             : #endif /* HAVE_LIBPORTAL_GTK4 */
+      35                 :             : 
+      36                 :           0 :       peas_object_module_register_extension_type (module,
+      37                 :             :                                                   VALENT_TYPE_SESSION_ADAPTER,
+      38                 :             :                                                   VALENT_TYPE_XDP_SESSION);
+      39                 :             :     }
+      40                 :           0 : }
+      41                 :             : 
+        
+
+
+ + + + +
Generated by: LCOV version 2.0-1
+
+ + + diff --git a/coverage/updown.png b/coverage/updown.png new file mode 100644 index 00000000000..aa56a238b3e Binary files /dev/null and b/coverage/updown.png differ diff --git a/documentation/class.Application.html b/documentation/class.Application.html new file mode 100644 index 00000000000..4ab4982994e --- /dev/null +++ b/documentation/class.Application.html @@ -0,0 +1,807 @@ + + + + + + Valent.Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentApplication

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Application : Gio.Application
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

The primary application class of Valent.

+

ValentApplication is the primary application class for Valent.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentApplication + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +GApplication + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+ + + +
Methods inherited from GApplication (34)
+
+ +
+

Please see GApplication for a full list of methods.

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
Properties inherited from GApplication (8)
+
+
Gio.Application:action-group
+
+

The group of actions that the application exports.

+
+
+

unstable since: 2.28

+
+
Gio.Application:application-id
+
+

The unique identifier for the application.

+
+
+

unstable since: 2.28

+
+
Gio.Application:flags
+
+

Flags specifying the behaviour of the application.

+
+
+

unstable since: 2.28

+
+
Gio.Application:inactivity-timeout
+
+

Time (in milliseconds) to stay alive after becoming idle.

+
+
+

unstable since: 2.28

+
+
Gio.Application:is-busy
+
+

Whether the application is currently marked as busy through +g_application_mark_busy() or g_application_bind_busy_property().

+
+
+

unstable since: 2.44

+
+
Gio.Application:is-registered
+
+

Whether g_application_register() has been called.

+
+
+

unstable since: 2.28

+
+
Gio.Application:is-remote
+
+

Whether this application instance is remote.

+
+
+

unstable since: 2.28

+
+
Gio.Application:resource-base-path
+
+

The base resource path for the application.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
Signals inherited from GApplication (7)
+
+
GApplication::activate
+
+

The ::activate signal is emitted on the primary instance when an +activation occurs. See g_application_activate().

+
+
+

+
+
GApplication::command-line
+
+

The ::command-line signal is emitted on the primary instance when +a commandline is not handled locally. See g_application_run() and +the GApplicationCommandLine documentation for more information.

+
+
+

+
+
GApplication::handle-local-options
+
+

The ::handle-local-options signal is emitted on the local instance +after the parsing of the commandline options has occurred.

+
+
+

unstable since: 2.40

+
+
GApplication::name-lost
+
+

The ::name-lost signal is emitted only on the registered primary instance +when a new instance has taken over. This can only happen if the application +is using the G_APPLICATION_ALLOW_REPLACEMENT flag.

+
+
+

unstable since: 2.60

+
+
GApplication::open
+
+

The ::open signal is emitted on the primary instance when there are +files to open. See g_application_open() for more information.

+
+
+

+
+
GApplication::shutdown
+
+

The ::shutdown signal is emitted only on the registered primary instance +immediately after the main loop terminates.

+
+
+

+
+
GApplication::startup
+
+

The ::startup signal is emitted on the primary instance immediately +after registration. See g_application_register().

+
+
+

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentApplicationClass {
+  GApplicationClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: GApplicationClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.ApplicationPlugin.html b/documentation/class.ApplicationPlugin.html new file mode 100644 index 00000000000..3ef0cad06bf --- /dev/null +++ b/documentation/class.ApplicationPlugin.html @@ -0,0 +1,1172 @@ + + + + + + Valent.ApplicationPlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentApplicationPlugin

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.ApplicationPlugin : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for application plugins.

+

ValentApplicationPlugin is a base class for plugins that operate in the +scope of the application. This usually means integrating the application with +the host environment (eg. XDG Autostart).

+

Implementation Notes

+

Implementations may handle application events by overriding the appropriate +virtual function, including Valent.ApplicationPluginClass.activate to +handle activation, Valent.ApplicationPluginClass.command_line to handle +CLI options, or Valent.ApplicationPluginClass.open to handle files.

+

For plugin preferences see ValentPreferencesPage.

+

.plugin File

+

Application plugins have no special fields in the .plugin file.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentApplicationPlugin + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + +
+

Descendants

+ +
+ + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_application_plugin_activate
+
+

Handle activation of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_application_plugin_command_line
+
+

Handle the given command-line options.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_application_plugin_dbus_register
+
+

Handle the D-Bus registration phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_application_plugin_dbus_unregister
+
+

Handle the D-Bus unregistration phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_application_plugin_open
+
+

Open the given files.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_application_plugin_shutdown
+
+

Handle the shutdown phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_application_plugin_startup
+
+

Handle the startup phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentApplicationPluginClass {
+  ValentExtensionClass parent_class;
+  gboolean (* activate) (
+    ValentApplicationPlugin* plugin
+  );
+  int (* command_line) (
+    ValentApplicationPlugin* plugin,
+    GApplicationCommandLine* command_line
+  );
+  gboolean (* dbus_register) (
+    ValentApplicationPlugin* plugin,
+    GDBusConnection* connection,
+    const char* object_path,
+    GError** error
+  );
+  void (* dbus_unregister) (
+    ValentApplicationPlugin* plugin,
+    GDBusConnection* connection,
+    const char* object_path
+  );
+  gboolean (* open) (
+    ValentApplicationPlugin* plugin,
+    GFile** files,
+    int n_files,
+    const char* hint
+  );
+  void (* shutdown) (
+    ValentApplicationPlugin* plugin
+  );
+  void (* startup) (
+    ValentApplicationPlugin* plugin
+  );
+  
+}
+
+ +
+

The virtual function table for ValentApplicationPlugin.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
activate: gboolean (* activate) ( + ValentApplicationPlugin* plugin + )
+
No description available.
+ +
command_line: int (* command_line) ( + ValentApplicationPlugin* plugin, + GApplicationCommandLine* command_line + )
+
No description available.
+ +
dbus_register: gboolean (* dbus_register) ( + ValentApplicationPlugin* plugin, + GDBusConnection* connection, + const char* object_path, + GError** error + )
+
No description available.
+ +
dbus_unregister: void (* dbus_unregister) ( + ValentApplicationPlugin* plugin, + GDBusConnection* connection, + const char* object_path + )
+
No description available.
+ +
open: gboolean (* open) ( + ValentApplicationPlugin* plugin, + GFile** files, + int n_files, + const char* hint + )
+
No description available.
+ +
shutdown: void (* shutdown) ( + ValentApplicationPlugin* plugin + )
+
No description available.
+ +
startup: void (* startup) ( + ValentApplicationPlugin* plugin + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ApplicationPluginClass.activate
+
+

Handle activation of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ApplicationPluginClass.command_line
+
+

Handle the given command-line options.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ApplicationPluginClass.dbus_register
+
+

Handle the D-Bus registration phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ApplicationPluginClass.dbus_unregister
+
+

Handle the D-Bus unregistration phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ApplicationPluginClass.open
+
+

Open the given files.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ApplicationPluginClass.shutdown
+
+

Handle the shutdown phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ApplicationPluginClass.startup
+
+

Handle the startup phase of the application.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Channel.html b/documentation/class.Channel.html new file mode 100644 index 00000000000..918d419356f --- /dev/null +++ b/documentation/class.Channel.html @@ -0,0 +1,1025 @@ + + + + + + Valent.Channel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentChannel

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
class Valent.Channel : Valent.Object
+{
+  /* No available fields */
+}
+ +
+

A base class for device connections.

+

ValentChannel is a base class for the primary communication channel in +Valent. It is effectively an abstraction layer around a GIOStream.

+

Packet Exchange

+

The core of the KDE Connect protocol is built on the exchange of JSON +packets, similar to JSON-RPC. Packets can be queued concurrently from +different threads with valent_channel_write_packet() and read +sequentially with valent_channel_read_packet().

+

Packets may contain payload information, allowing devices to negotiate +auxiliary connections. Incoming connections can be accepted by passing the +packet to valent_channel_download(), or opened by passing the packet +to valent_channel_upload().

+

Implementation Notes

+

Implementations should override Valent.ChannelClass.download and +Valent.ChannelClass.upload to support accepting and opening auxiliary +connections, respectively. If pairing involves exchanging a key, override +Valent.ChannelClass.get_verification_key. To know when to store persistent +data related to the connection, override Valent.ChannelClass.store_data.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentChannel + + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_channel_close
+
+

Close the channel.

+
+
+

+
+
+ +
+
valent_channel_close_async
+
+

Close the channel asynchronously.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_close_finish
+
+

Finish an operation started by valent_channel_close_async().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_download
+
+

Open an auxiliary connection, usually to download data.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_download_async
+
+

Open an auxiliary connection, usually to download data.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_download_finish
+
+

Finish an operation started with valent_channel_download_async().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_get_identity
+
+

Get the local identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_get_peer_identity
+
+

Get the peer identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_get_verification_key
+
+

Get a verification key for the connection.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_read_packet
+
+

Read the next KDE Connect packet from channel.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_read_packet_finish
+
+

Finish an operation started by valent_channel_read_packet().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_ref_base_stream
+
+

Get the base GIOStream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_store_data
+
+

Store channel metadata.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_upload
+
+

Accept an auxiliary connection, usually to upload data.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_upload_async
+
+

Accept an auxiliary connection, usually to upload data.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_upload_finish
+
+

Finish an operation started with valent_channel_upload_async().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_write_packet
+
+

Send a packet over the channel.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_write_packet_finish
+
+

Finish an operation started by valent_channel_write_packet().

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Channel:base-stream
+
+

The base GIOStream for the channel.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Channel:identity
+
+

The local identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Channel:peer-identity
+
+

The peer identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentChannelClass {
+  ValentObjectClass parent_class;
+  const char* (* get_verification_key) (
+    ValentChannel* channel
+  );
+  GIOStream* (* download) (
+    ValentChannel* channel,
+    JsonNode* packet,
+    GCancellable* cancellable,
+    GError** error
+  );
+  void (* download_async) (
+    ValentChannel* channel,
+    JsonNode* packet,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  GIOStream* (* download_finish) (
+    ValentChannel* channel,
+    GAsyncResult* result,
+    GError** error
+  );
+  GIOStream* (* upload) (
+    ValentChannel* channel,
+    JsonNode* packet,
+    GCancellable* cancellable,
+    GError** error
+  );
+  void (* upload_async) (
+    ValentChannel* channel,
+    JsonNode* packet,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  GIOStream* (* upload_finish) (
+    ValentChannel* channel,
+    GAsyncResult* result,
+    GError** error
+  );
+  void (* store_data) (
+    ValentChannel* channel,
+    ValentContext* context
+  );
+  
+}
+
+ +
+

The virtual function table for ValentChannel.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ +
get_verification_key: const char* (* get_verification_key) ( + ValentChannel* channel + )
+
No description available.
+ +
download: GIOStream* (* download) ( + ValentChannel* channel, + JsonNode* packet, + GCancellable* cancellable, + GError** error + )
+
No description available.
+ +
download_async: void (* download_async) ( + ValentChannel* channel, + JsonNode* packet, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
download_finish: GIOStream* (* download_finish) ( + ValentChannel* channel, + GAsyncResult* result, + GError** error + )
+
No description available.
+ +
upload: GIOStream* (* upload) ( + ValentChannel* channel, + JsonNode* packet, + GCancellable* cancellable, + GError** error + )
+
No description available.
+ +
upload_async: void (* upload_async) ( + ValentChannel* channel, + JsonNode* packet, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
upload_finish: GIOStream* (* upload_finish) ( + ValentChannel* channel, + GAsyncResult* result, + GError** error + )
+
No description available.
+ +
store_data: void (* store_data) ( + ValentChannel* channel, + ValentContext* context + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ChannelClass.download
+
+

Open an auxiliary connection, usually to download data.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.download_async
+
+

Open an auxiliary connection, usually to download data.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.download_finish
+
+

Finish an operation started with valent_channel_download_async().

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.get_verification_key
+
+

Get a verification key for the connection.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.store_data
+
+

Store channel metadata.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.upload
+
+

Accept an auxiliary connection, usually to upload data.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.upload_async
+
+

Accept an auxiliary connection, usually to upload data.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelClass.upload_finish
+
+

Finish an operation started with valent_channel_upload_async().

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.ChannelService.html b/documentation/class.ChannelService.html new file mode 100644 index 00000000000..a4ae301cecf --- /dev/null +++ b/documentation/class.ChannelService.html @@ -0,0 +1,1163 @@ + + + + + + Valent.ChannelService + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentChannelService

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.ChannelService : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for connection backends.

+

ValentChannelService is a base class for plugins that implement an interface +to negotiate connections with other devices.

+

Implementation Notes

+

Implementations may safely invoke valent_channel_service_channel() from +any thread; it is guaranteed to be emitted in the main thread.

+

.plugin File

+

Channel services have no special fields in the .plugin file.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentChannelService + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_channel_service_build_identity
+
+

Rebuild the local KDE Connect identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_service_channel
+
+

Emit ValentChannelService::channel on service.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_service_dup_id
+
+

Get the local ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_service_get_name
+
+

Get the local display name.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_service_identify
+
+

Identify the host device to the network.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_service_ref_certificate
+
+

Get the TLS certificate for the service.

+
+
+

+
+
+ +
+
valent_channel_service_ref_identity
+
+

Get the local identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_channel_service_set_name
+
+

Set the local display name.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.ChannelService:certificate
+
+

The TLS certificate the service uses to authenticate with other devices.

+
+
+

+
+
+ +
+
Valent.ChannelService:id
+
+

The local ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelService:identity
+
+

The local identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelService:name
+
+

The local display name.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.ChannelService::channel
+
+

Emitted when a new channel has been negotiated.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentChannelServiceClass {
+  ValentExtensionClass parent_class;
+  void (* build_identity) (
+    ValentChannelService* service
+  );
+  void (* identify) (
+    ValentChannelService* service,
+    const char* target
+  );
+  void (* channel) (
+    ValentChannelService* service,
+    ValentChannel* channel
+  );
+  
+}
+
+ +
+

The virtual function table for ValentChannelService.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
build_identity: void (* build_identity) ( + ValentChannelService* service + )
+
No description available.
+ +
identify: void (* identify) ( + ValentChannelService* service, + const char* target + )
+
No description available.
+ +
channel: void (* channel) ( + ValentChannelService* service, + ValentChannel* channel + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ChannelServiceClass.build_identity
+
+

Rebuild the local KDE Connect identity packet.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelServiceClass.channel
+
+

Emit ValentChannelService::channel on service.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ChannelServiceClass.identify
+
+

Identify the host device to the network.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Clipboard.html b/documentation/class.Clipboard.html new file mode 100644 index 00000000000..e1523427cc3 --- /dev/null +++ b/documentation/class.Clipboard.html @@ -0,0 +1,742 @@ + + + + + + Valent.Clipboard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentClipboard

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Clipboard : Valent.Component
+{
+  /* No available fields */
+}
+ +
+

A class for reading and writing the desktop clipboard.

+

ValentClipboard is an abstraction of clipboard selections, intended for use +by ValentDevicePlugin implementations.

+

Plugins can implement ValentClipboardAdapter to provide an interface +to access a clipboard selection.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentClipboard + + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + +
+

+ Functions + +

+ +
+ +
+
valent_clipboard_get_default
+
+

Get the default ValentClipboard.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_clipboard_get_mimetypes
+
+

Get the mime-types of the primary clipboard content.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_get_timestamp
+
+

Get the timestamp of the current clipboard content, in milliseconds since the +UNIX epoch.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_read_bytes
+
+

Get the content of the primary clipboard adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_read_bytes_finish
+
+

Finish an operation started by valent_clipboard_read_bytes().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_read_text
+
+

Get the text content of the primary clipboard adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_read_text_finish
+
+

Finish an operation started by valent_clipboard_read_text().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_write_bytes
+
+

Set the content of the primary clipboard adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_write_bytes_finish
+
+

Finish an operation started by valent_clipboard_write_bytes().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_write_text
+
+

Set the text content of the primary clipboard adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_write_text_finish
+
+

Finish an operation started by valent_clipboard_write_text().

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.Clipboard::changed
+
+

Emitted when the content of the primary ValentClipboardAdapter +changes.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentClipboardClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.ClipboardAdapter.html b/documentation/class.ClipboardAdapter.html new file mode 100644 index 00000000000..9b149991243 --- /dev/null +++ b/documentation/class.ClipboardAdapter.html @@ -0,0 +1,1193 @@ + + + + + + Valent.ClipboardAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentClipboardAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.ClipboardAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for clipboard selections.

+

ValentClipboardAdapter is a base class for plugins that provide an interface +to the desktop clipboard. This usually means reading and writing content, +including notification of content changes.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-ClipboardAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentClipboardAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_clipboard_adapter_changed
+
+

Emits ValentClipboardAdapter::changed signal on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_adapter_get_mimetypes
+
+

Get the mime-types of the current clipboard content.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_adapter_get_timestamp
+
+

Get the timestamp of the current clipboard content.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_adapter_read_bytes
+
+

Get the content of adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_adapter_read_bytes_finish
+
+

Finish an operation started by valent_clipboard_adapter_read_bytes().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_adapter_write_bytes
+
+

Set the content of the clipboard.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_clipboard_adapter_write_bytes_finish
+
+

Finish an operation started by valent_clipboard_adapter_write_bytes().

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.ClipboardAdapter::changed
+
+

Emitted when the content of adapter changes.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentClipboardAdapterClass {
+  ValentExtensionClass parent_class;
+  GStrv (* get_mimetypes) (
+    ValentClipboardAdapter* adapter
+  );
+  int64_t (* get_timestamp) (
+    ValentClipboardAdapter* adapter
+  );
+  void (* read_bytes) (
+    ValentClipboardAdapter* adapter,
+    const char* mimetype,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  GBytes* (* read_bytes_finish) (
+    ValentClipboardAdapter* adapter,
+    GAsyncResult* result,
+    GError** error
+  );
+  void (* write_bytes) (
+    ValentClipboardAdapter* adapter,
+    const char* mimetype,
+    GBytes* bytes,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  gboolean (* write_bytes_finish) (
+    ValentClipboardAdapter* adapter,
+    GAsyncResult* result,
+    GError** error
+  );
+  void (* changed) (
+    ValentClipboardAdapter* adapter
+  );
+  
+}
+
+ +
+

The virtual function table for ValentClipboardAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
get_mimetypes: GStrv (* get_mimetypes) ( + ValentClipboardAdapter* adapter + )
+
No description available.
+ +
get_timestamp: int64_t (* get_timestamp) ( + ValentClipboardAdapter* adapter + )
+
No description available.
+ +
read_bytes: void (* read_bytes) ( + ValentClipboardAdapter* adapter, + const char* mimetype, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
read_bytes_finish: GBytes* (* read_bytes_finish) ( + ValentClipboardAdapter* adapter, + GAsyncResult* result, + GError** error + )
+
No description available.
+ +
write_bytes: void (* write_bytes) ( + ValentClipboardAdapter* adapter, + const char* mimetype, + GBytes* bytes, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
write_bytes_finish: gboolean (* write_bytes_finish) ( + ValentClipboardAdapter* adapter, + GAsyncResult* result, + GError** error + )
+
No description available.
+ +
changed: void (* changed) ( + ValentClipboardAdapter* adapter + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ClipboardAdapterClass.changed
+
+

Emits ValentClipboardAdapter::changed signal on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ClipboardAdapterClass.get_mimetypes
+
+

Get the mime-types of the current clipboard content.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ClipboardAdapterClass.get_timestamp
+
+

Get the timestamp of the current clipboard content.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ClipboardAdapterClass.read_bytes
+
+

Get the content of adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ClipboardAdapterClass.read_bytes_finish
+
+

Finish an operation started by valent_clipboard_adapter_read_bytes().

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ClipboardAdapterClass.write_bytes
+
+

Set the content of the clipboard.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ClipboardAdapterClass.write_bytes_finish
+
+

Finish an operation started by valent_clipboard_adapter_write_bytes().

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Component.html b/documentation/class.Component.html new file mode 100644 index 00000000000..e10ce974fe9 --- /dev/null +++ b/documentation/class.Component.html @@ -0,0 +1,653 @@ + + + + + + Valent.Component + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentComponent

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.Component : Valent.Object
+{
+  /* No available fields */
+}
+ +
+

An abstract base class for components.

+

ValentComponent is a base class for session and system components, such as +the clipboard or volume control. Each component is typically used in a +singleton pattern, backed by one or more extensions.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentComponent + + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Component:plugin-domain
+
+ No description available. +
+
+

+
+
+ +
+
Valent.Component:plugin-type
+
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentComponentClass {
+  ValentObjectClass parent_class;
+  void (* bind_extension) (
+    ValentComponent* component,
+    GObject* extension
+  );
+  void (* unbind_extension) (
+    ValentComponent* component,
+    GObject* extension
+  );
+  void (* bind_preferred) (
+    ValentComponent* component,
+    GObject* extension
+  );
+  
+}
+
+ +
+

The virtual function table for ValentComponent.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ +
bind_extension: void (* bind_extension) ( + ValentComponent* component, + GObject* extension + )
+
No description available.
+ +
unbind_extension: void (* unbind_extension) ( + ValentComponent* component, + GObject* extension + )
+
No description available.
+ +
bind_preferred: void (* bind_preferred) ( + ValentComponent* component, + GObject* extension + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ComponentClass.bind_extension
+
+ No description available. +
+
+

+
+
+ +
+
Valent.ComponentClass.bind_preferred
+
+ No description available. +
+
+

+
+
+ +
+
Valent.ComponentClass.unbind_extension
+
+ No description available. +
+
+

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.ContactStore.html b/documentation/class.ContactStore.html new file mode 100644 index 00000000000..12cfe66b837 --- /dev/null +++ b/documentation/class.ContactStore.html @@ -0,0 +1,987 @@ + + + + + + Valent.ContactStore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentContactStore

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.ContactStore : Valent.Object
+{
+  /* No available fields */
+}
+ +
+

An abstract base class for address books.

+

ValentContactStore is a base class to provide an interface to an address +book. This usually means adding, removing and querying contacts.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentContactStore + + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_contact_store_add_contact
+
+

A convenience wrapper around valent_contact_store_add_contacts() for +adding a single contact.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_add_contacts
+
+

Add contacts to store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_add_contacts_finish
+
+

Finish an operation started by valent_contact_store_add_contact() or +valent_contact_store_add_contacts().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_contact_added
+
+

Emits ValentContactStore::contact-added signal on store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_contact_removed
+
+

Emits ValentContactStore::contact-removed on store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_get_contact
+
+

Get a contact by UID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_get_contact_finish
+
+

Finish an operation started by valent_contact_store_get_contact().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_get_contacts
+
+

A convenience wrapper around valent_contact_store_query() for searching +contacts by UID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_get_name
+
+

Get the display name of store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_get_source
+
+

Get the ESource backing store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_get_uid
+
+

Get the UID of store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_query
+
+

Query store for contacts matching query.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_query_finish
+
+

Finish an operation started by valent_contact_store_query().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_remove_contact
+
+

Remove contact uid from store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_remove_contacts
+
+

Remove contact uid from store.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_remove_contacts_finish
+
+

Finish an operation started by valent_contact_store_remove_contact() or +valent_contact_store_remove_contacts().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contact_store_set_name
+
+

Set the display name of store to name.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.ContactStore:name
+
+

The display name.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStore:source
+
+

The store ESource.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStore:uid
+
+

The unique identifier.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.ContactStore::contact-added
+
+

Emitted when an EContact is added to store.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStore::contact-removed
+
+

Emitted when an EContact is removed from store.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentContactStoreClass {
+  ValentObjectClass parent_class;
+  void (* add_contacts) (
+    ValentContactStore* store,
+    GSList* contacts,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  void (* remove_contacts) (
+    ValentContactStore* store,
+    GSList* uids,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  void (* query) (
+    ValentContactStore* store,
+    const char* query,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  void (* get_contact) (
+    ValentContactStore* store,
+    const char* uid,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  void (* contact_added) (
+    ValentContactStore* store,
+    EContact* contact
+  );
+  void (* contact_removed) (
+    ValentContactStore* store,
+    const char* uid
+  );
+  
+}
+
+ +
+

The virtual function table for ValentContactStore.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ +
add_contacts: void (* add_contacts) ( + ValentContactStore* store, + GSList* contacts, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
remove_contacts: void (* remove_contacts) ( + ValentContactStore* store, + GSList* uids, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
query: void (* query) ( + ValentContactStore* store, + const char* query, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
get_contact: void (* get_contact) ( + ValentContactStore* store, + const char* uid, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
contact_added: void (* contact_added) ( + ValentContactStore* store, + EContact* contact + )
+
No description available.
+ +
contact_removed: void (* contact_removed) ( + ValentContactStore* store, + const char* uid + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ContactStoreClass.add_contacts
+
+

Add contacts to store.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStoreClass.contact_added
+
+

Emits ValentContactStore::contact-added signal on store.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStoreClass.contact_removed
+
+

Emits ValentContactStore::contact-removed on store.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStoreClass.get_contact
+
+

Get a contact by UID.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStoreClass.query
+
+

Query store for contacts matching query.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.ContactStoreClass.remove_contacts
+
+

Remove contact uid from store.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Contacts.html b/documentation/class.Contacts.html new file mode 100644 index 00000000000..97368bf6fff --- /dev/null +++ b/documentation/class.Contacts.html @@ -0,0 +1,702 @@ + + + + + + Valent.Contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentContacts

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Contacts : Valent.Component
+  implements Gio.ListModel {
+  /* No available fields */
+}
+ +
+

A class for managing address books.

+

ValentContacts is an address book manager, intended for use by +ValentDevicePlugin implementations.

+

Plugins can implement ValentContactsAdapter to provide an interface +to manage instances of ValentContactStore.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentContacts + + + + + +implements_0 + + +GListModel + + + + + +this--implements_0 + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + +
+

+ Functions + +

+ +
+ +
+
valent_contacts_get_default
+
+

Get the default ValentContacts.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_contacts_ensure_store
+
+

Get a ValentContactStore for uid.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentContactsClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.ContactsAdapter.html b/documentation/class.ContactsAdapter.html new file mode 100644 index 00000000000..62498e1fb74 --- /dev/null +++ b/documentation/class.ContactsAdapter.html @@ -0,0 +1,1002 @@ + + + + + + Valent.ContactsAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentContactsAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.ContactsAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap, Gio.ListModel {
+  /* No available fields */
+}
+ +
+

An abstract base class for address book providers.

+

ValentContactsAdapter is a base class for plugins that provide an +interface to manage address books. This usually means monitoring and +querying ValentContactStore instances.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-ContactsAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentContactsAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +implements_2 + + +GListModel + + + + + +this--implements_2 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_contacts_adapter_store_added
+
+

Called when store has been added to adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_contacts_adapter_store_removed
+
+

Called when store has been removed from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentContactsAdapterClass {
+  ValentExtensionClass parent_class;
+  
+}
+
+ +
+

The virtual function table for ValentContactsAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Context.html b/documentation/class.Context.html new file mode 100644 index 00000000000..9e3e2a5e5a5 --- /dev/null +++ b/documentation/class.Context.html @@ -0,0 +1,738 @@ + + + + + + Valent.Context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentContext

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
class Valent.Context : Valent.Object
+{
+  /* No available fields */
+}
+ +
+

A class representing a abstract data context.

+

ValentContext is an abstraction of a data context, with a loose hierarchy +expressed as a virtual path (e.g. device/0123456789abcdef/plugin/battery). +It can be used to coordinate persistent data of various types by mapping onto +existing hierarchies like GSettings (i.e. relocatable schemas), +on-disk caches and configuration files (i.e. XDG data dirs) and user files +(i.e. XDG user dirs).

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentContext + + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_context_clear
+
+

Clear cache and configuration data.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_clear_cache
+
+

Clear cache data.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_create_settings
+
+

Create a GSettings object.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_cache_file
+
+

Create a new cache file.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_config_file
+
+

Create a new config file.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_data_file
+
+

Create a new data file.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_domain
+
+

Get the context domain.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_id
+
+

Get the context ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_parent
+
+

Get the parent context.

+
+
+

+
+
+ +
+
valent_context_get_path
+
+

Get the virtual path.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_plugin_context
+
+

Create a new ValentContext for a plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_plugin_settings
+
+

Create a GSettings object for a plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_get_root
+
+

Get the root context.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_context_new
+
+

Create a new ValentContext.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Context:domain
+
+

The domain for this context.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Context:id
+
+

The ID for this context.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Context:parent
+
+

The parent context.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentContextClass {
+  ValentObjectClass parent_class;
+  
+}
+
+ +
+

The virtual function table for ValentContext.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Device.html b/documentation/class.Device.html new file mode 100644 index 00000000000..9160da3a79e --- /dev/null +++ b/documentation/class.Device.html @@ -0,0 +1,975 @@ + + + + + + Valent.Device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentDevice

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Device : Valent.Object
+  implements Gio.ActionGroup {
+  /* No available fields */
+}
+ +
+

A class representing a remote device, such as a smartphone or desktop.

+

Device functionality is limited to pairing and sending packets, while other +functionality is delegated to ValentDevicePlugin extensions.

+

ValentDevice implements the GActionGroup interface, acting as an +aggregate action group for plugins. Plugin actions are automatically included +in the device action group with the plugin module name as a prefix +(eg. share.files).

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentDevice + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + +
+

+ Constructors + +

+ +
+ +
+
valent_device_new
+
+

Create a new device for id.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Functions + +

+ +
+ +
+
valent_device_get_resource
+
+ No description available. +
+
+

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_device_get_context
+
+

Get the data context.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_get_icon_name
+
+

Get the symbolic icon name.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_get_id
+
+

Get the unique ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_get_menu
+
+

Get the GMenuModel of the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_get_name
+
+

Get the display name of the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_get_plugins
+
+

Get a list of the loaded plugins.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_get_state
+
+

Get the state of the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_ref_channel
+
+

Get the active channel.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_send_packet
+
+

Send a KDE Connect packet to the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_send_packet_finish
+
+

Finish an operation started by valent_device_send_packet().

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Device:context
+
+

The data context.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Device:icon-name
+
+

A symbolic icon name for the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Device:id
+
+

A unique ID for the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Device:name
+
+

A display name for the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Device:plugins
+
+

A list of loaded plugin names.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Device:state
+
+

The state of the device.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentDeviceClass {
+  ValentObjectClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.DeviceGadget.html b/documentation/class.DeviceGadget.html new file mode 100644 index 00000000000..9edc9544d8d --- /dev/null +++ b/documentation/class.DeviceGadget.html @@ -0,0 +1,1078 @@ + + + + + + Valent.DeviceGadget + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentDeviceGadget

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.DeviceGadget : Gtk.Widget
+  implements Gtk.Accessible, Gtk.Buildable, Gtk.ConstraintTarget {
+  /* No available fields */
+}
+ +
+

An abstract base class for device plugin gadgets.

+

ValentDeviceGadget is an base class for ValentDevicePlugin +implementations that want to provide a small widget to display or control a +simple state (e.g. battery level).

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentDeviceGadget + + + + + +implements_0 + + +GtkAccessible + + + + + +this--implements_0 + + + + +implements_1 + + +GtkBuildable + + + + + +this--implements_1 + + + + +implements_2 + + +GtkConstraintTarget + + + + + +this--implements_2 + + + + +ancestor_0 + + +GtkWidget + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GInitiallyUnowned + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+ + + +
Methods inherited from GtkWidget (162)
+
+ +
+

Please see GtkWidget for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GtkAccessible (19)
+
+
gtk_accessible_announce
+
+

Requests the user’s screen reader to announce the given message.

+
+
+

unstable since: 4.14

+
+
gtk_accessible_get_accessible_parent
+
+

Retrieves the accessible parent for an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_accessible_role
+
+

Retrieves the accessible role of an accessible object.

+
+
+

+
+
gtk_accessible_get_at_context
+
+

Retrieves the accessible implementation for the given GtkAccessible.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_bounds
+
+

Queries the coordinates and dimensions of this accessible.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_first_accessible_child
+
+

Retrieves the first accessible child of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_next_accessible_sibling
+
+

Retrieves the next accessible sibling of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_platform_state
+
+

Query a platform state, such as focus.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_reset_property
+
+

Resets the accessible property to its default value.

+
+
+

+
+
gtk_accessible_reset_relation
+
+

Resets the accessible relation to its default value.

+
+
+

+
+
gtk_accessible_reset_state
+
+

Resets the accessible state to its default value.

+
+
+

+
+
gtk_accessible_set_accessible_parent
+
+

Sets the parent and sibling of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_update_next_accessible_sibling
+
+

Updates the next accessible sibling of self.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_update_property
+
+

Updates a list of accessible properties.

+
+
+

+
+
gtk_accessible_update_property_value
+
+

Updates an array of accessible properties.

+
+
+

+
+
gtk_accessible_update_relation
+
+

Updates a list of accessible relations.

+
+
+

+
+
gtk_accessible_update_relation_value
+
+

Updates an array of accessible relations.

+
+
+

+
+
gtk_accessible_update_state
+
+

Updates a list of accessible states. See the GtkAccessibleState +documentation for the value types of accessible states.

+
+
+

+
+
gtk_accessible_update_state_value
+
+

Updates an array of accessible states.

+
+
+

+
+ +
+
+ + + +
Methods inherited from GtkBuildable (1)
+
+
gtk_buildable_get_buildable_id
+
+

Gets the ID of the buildable object.

+
+
+

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.DeviceGadget:device
+
+

The ValentDevice this gadget is for.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
Properties inherited from GtkWidget (34)
+
+
Gtk.Widget:can-focus
+
+

Whether the widget or any of its descendents can accept +the input focus.

+
+
+

+
+
Gtk.Widget:can-target
+
+

Whether the widget can receive pointer events.

+
+
+

+
+
Gtk.Widget:css-classes
+
+

A list of css classes applied to this widget.

+
+
+

+
+
Gtk.Widget:css-name
+
+

The name of this widget in the CSS tree.

+
+
+

+
+
Gtk.Widget:cursor
+
+

The cursor used by widget.

+
+
+

+
+
Gtk.Widget:focus-on-click
+
+

Whether the widget should grab focus when it is clicked with the mouse.

+
+
+

+
+
Gtk.Widget:focusable
+
+

Whether this widget itself will accept the input focus.

+
+
+

+
+
Gtk.Widget:halign
+
+

How to distribute horizontal space if widget gets extra space.

+
+
+

+
+
Gtk.Widget:has-default
+
+

Whether the widget is the default widget.

+
+
+

+
+
Gtk.Widget:has-focus
+
+

Whether the widget has the input focus.

+
+
+

+
+
Gtk.Widget:has-tooltip
+
+

Enables or disables the emission of the ::query-tooltip signal on widget.

+
+
+

+
+
Gtk.Widget:height-request
+
+

Override for height request of the widget.

+
+
+

+
+
Gtk.Widget:hexpand
+
+

Whether to expand horizontally.

+
+
+

+
+
Gtk.Widget:hexpand-set
+
+

Whether to use the hexpand property.

+
+
+

+
+
Gtk.Widget:layout-manager
+
+

The GtkLayoutManager instance to use to compute the preferred size +of the widget, and allocate its children.

+
+
+

+
+
Gtk.Widget:margin-bottom
+
+

Margin on bottom side of widget.

+
+
+

+
+
Gtk.Widget:margin-end
+
+

Margin on end of widget, horizontally.

+
+
+

+
+
Gtk.Widget:margin-start
+
+

Margin on start of widget, horizontally.

+
+
+

+
+
Gtk.Widget:margin-top
+
+

Margin on top side of widget.

+
+
+

+
+
Gtk.Widget:name
+
+

The name of the widget.

+
+
+

+
+
Gtk.Widget:opacity
+
+

The requested opacity of the widget.

+
+
+

+
+
Gtk.Widget:overflow
+
+

How content outside the widget’s content area is treated.

+
+
+

+
+
Gtk.Widget:parent
+
+

The parent widget of this widget.

+
+
+

+
+
Gtk.Widget:receives-default
+
+

Whether the widget will receive the default action when it is focused.

+
+
+

+
+
Gtk.Widget:root
+
+

The GtkRoot widget of the widget tree containing this widget.

+
+
+

+
+
Gtk.Widget:scale-factor
+
+

The scale factor of the widget.

+
+
+

+
+
Gtk.Widget:sensitive
+
+

Whether the widget responds to input.

+
+
+

+
+
Gtk.Widget:tooltip-markup
+
+

Sets the text of tooltip to be the given string, which is marked up +with Pango markup.

+
+
+

+
+
Gtk.Widget:tooltip-text
+
+

Sets the text of tooltip to be the given string.

+
+
+

+
+
Gtk.Widget:valign
+
+

How to distribute vertical space if widget gets extra space.

+
+
+

+
+
Gtk.Widget:vexpand
+
+

Whether to expand vertically.

+
+
+

+
+
Gtk.Widget:vexpand-set
+
+

Whether to use the vexpand property.

+
+
+

+
+
Gtk.Widget:visible
+
+

Whether the widget is visible.

+
+
+

+
+
Gtk.Widget:width-request
+
+

Override for width request of the widget.

+
+
+

+
+ +
+
+ + + + + + + + + +
Properties inherited from GtkAccessible (1)
+
+
Gtk.Accessible:accessible-role
+
+

The accessible role of the given GtkAccessible implementation.

+
+
+

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
Signals inherited from GtkWidget (13)
+
+
GtkWidget::destroy
+
+

Signals that all holders of a reference to the widget should release +the reference that they hold.

+
+
+

+
+
GtkWidget::direction-changed
+
+

Emitted when the text direction of a widget changes.

+
+
+

+
+
GtkWidget::hide
+
+

Emitted when widget is hidden.

+
+
+

+
+
GtkWidget::keynav-failed
+
+

Emitted if keyboard navigation fails.

+
+
+

+
+
GtkWidget::map
+
+

Emitted when widget is going to be mapped.

+
+
+

+
+
GtkWidget::mnemonic-activate
+
+

Emitted when a widget is activated via a mnemonic.

+
+
+

+
+
GtkWidget::move-focus
+
+

Emitted when the focus is moved.

+
+
+

+
+
GtkWidget::query-tooltip
+
+

Emitted when the widget’s tooltip is about to be shown.

+
+
+

+
+
GtkWidget::realize
+
+

Emitted when widget is associated with a GdkSurface.

+
+
+

+
+
GtkWidget::show
+
+

Emitted when widget is shown.

+
+
+

+
+
GtkWidget::state-flags-changed
+
+

Emitted when the widget state changes.

+
+
+

+
+
GtkWidget::unmap
+
+

Emitted when widget is going to be unmapped.

+
+
+

+
+
GtkWidget::unrealize
+
+

Emitted when the GdkSurface associated with widget is destroyed.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentDeviceGadgetClass {
+  GtkWidgetClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: GtkWidgetClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.DeviceManager.html b/documentation/class.DeviceManager.html new file mode 100644 index 00000000000..d676f1ef4e4 --- /dev/null +++ b/documentation/class.DeviceManager.html @@ -0,0 +1,1136 @@ + + + + + + Valent.DeviceManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentDeviceManager

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.DeviceManager : Valent.ApplicationPlugin
+  implements Gio.ActionGroup, Gio.ActionMap, Gio.ListModel {
+  /* No available fields */
+}
+ +
+

A class for discovering and managing devices.

+

ValentDeviceManager manages the available ValentDevice objects, +connecting them when ValentChannelService::channel is emitted by an +enabled implementation, exporting them on D-Bus and removing them when they +become unavailable.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentDeviceManager + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +implements_2 + + +GListModel + + + + + +this--implements_2 + + + + +ancestor_0 + + +ValentApplicationPlugin + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentExtension + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +ValentObject + + + + + +ancestor_2--ancestor_1 + + + + +ancestor_3 + + +GObject + + + + + +ancestor_3--ancestor_2 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + +
+

+ Functions + +

+ +
+ +
+
valent_device_manager_get_default
+
+

Get the default ValentDeviceManager.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_device_manager_get_name
+
+

Get the display name of the local device.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_manager_refresh
+
+

Refresh the available devices.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_manager_set_name
+
+

Set the display name of the local device to name.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentApplicationPlugin (7)
+ +
valent_application_plugin_activate
+

Handle activation of the application.

+
+
+

unstable since: 1.0

+
+ +
valent_application_plugin_command_line
+

Handle the given command-line options.

+
+
+

unstable since: 1.0

+
+ +
valent_application_plugin_dbus_register
+

Handle the D-Bus registration phase of the application.

+
+
+

unstable since: 1.0

+
+ +
valent_application_plugin_dbus_unregister
+

Handle the D-Bus unregistration phase of the application.

+
+
+

unstable since: 1.0

+
+ +
valent_application_plugin_open
+

Open the given files.

+
+
+

unstable since: 1.0

+
+ +
valent_application_plugin_shutdown
+

Handle the shutdown phase of the application.

+
+
+

unstable since: 1.0

+
+ +
valent_application_plugin_startup
+

Handle the startup phase of the application.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.DeviceManager:name
+
+

The display name of the local device.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentDeviceManagerClass {
+  ValentApplicationPluginClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentApplicationPluginClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.DevicePlugin.html b/documentation/class.DevicePlugin.html new file mode 100644 index 00000000000..4b8ecaef77d --- /dev/null +++ b/documentation/class.DevicePlugin.html @@ -0,0 +1,1099 @@ + + + + + + Valent.DevicePlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentDevicePlugin

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.DevicePlugin : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for device plugins.

+

ValentDevicePlugin is a base class for plugins that operate in the scope of +a single device. This usually means communicating with other devices, however +plugins aren’t required to be packet based.

+

Plugin Requirements

+

Device plugins essentially have two sets of dependent conditions for being +enabled. Plugins become available (i.e. can be enabled) when any of the +following are true:

+
    +
  • any of the device’s outgoing capabilities match any of the plugin’s + incoming capabilities
  • +
  • any of the device’s incoming capabilities match any of the plugin’s + outgoing capabilities
  • +
  • the plugin doesn’t list any capabilities (eg. a non-packet based plugin)
  • +
+

When a plugin becomes available it may be enabled, disabled and configured.

+

Plugin Actions

+

ValentDevicePlugin implements the GActionGroup and +GActionMap interfaces, providing a simple way for plugins to +expose functions and states. Each GAction added to the action map +will be included in the device action group with the plugin’s module name as +a prefix (eg. share.uri).

+

If the ValentDeviceManager is exported on D-Bus, the actions will be +exported along with the ValentDevice.

+

Implementation Notes

+

Implementations that define X-DevicePluginIncoming in the .plugin file +must override Valent.DevicePluginClass.handle_packet to handle incoming +packets. Implementations that depend on the device state, especially those +that define X-DevicePluginOutgoing in the .plugin file, should override +Valent.DevicePluginClass.update_state.

+

For device plugin preferences see ValentDevicePreferencesGroup.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-DevicePluginCategory

    +

    A list of categories separated by semi-colons, serving as a hint for +organizational purposes. This should be in the form Main;Additional;, +with values from the freedesktop.org Desktop Menu Specification.

    +
  • +
  • +

    X-DevicePluginIncoming

    +

    A list of packet types (eg. kdeconnect.ping) separated by semi-colons +indicating the packets that the plugin can handle.

    +
  • +
  • +

    X-DevicePluginOutgoing

    +

    A list of packet types (eg. kdeconnect.share.request) separated by +semi-colons indicating the packets that the plugin may send.

    +
  • +
  • +

    X-DevicePluginSettings

    +

    A GSettings schema ID for the plugin’s settings. See +valent_context_get_plugin_settings() for more information.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentDevicePlugin + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_device_plugin_handle_packet
+
+

Handle a packet from the device the plugin is bound to.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_plugin_hide_notification
+
+

A convenience for withdrawing a notification.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_plugin_queue_packet
+
+

Queue a KDE Connect packet to be sent to the device this plugin is bound to.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_plugin_set_menu_action
+
+

Set or remove a device menu action by GAction name.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_plugin_set_menu_item
+
+

Set or remove a device GMenuItem by GAction name.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_plugin_show_notification
+
+

A convenience for showing a local notification.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_plugin_update_state
+
+

Update the plugin based on the new state of the device.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentDevicePluginClass {
+  ValentExtensionClass parent_class;
+  void (* handle_packet) (
+    ValentDevicePlugin* plugin,
+    const char* type,
+    JsonNode* packet
+  );
+  void (* update_state) (
+    ValentDevicePlugin* plugin,
+    ValentDeviceState state
+  );
+  
+}
+
+ +
+

The virtual function table for ValentDevicePlugin.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
handle_packet: void (* handle_packet) ( + ValentDevicePlugin* plugin, + const char* type, + JsonNode* packet + )
+
No description available.
+ +
update_state: void (* update_state) ( + ValentDevicePlugin* plugin, + ValentDeviceState state + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.DevicePluginClass.handle_packet
+
+

Handle a packet from the device the plugin is bound to.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.DevicePluginClass.update_state
+
+

Update the plugin based on the new state of the device.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.DevicePreferencesGroup.html b/documentation/class.DevicePreferencesGroup.html new file mode 100644 index 00000000000..15446d0ac36 --- /dev/null +++ b/documentation/class.DevicePreferencesGroup.html @@ -0,0 +1,1247 @@ + + + + + + Valent.DevicePreferencesGroup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentDevicePreferencesGroup

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.DevicePreferencesGroup : Adw.PreferencesGroup
+  implements Gtk.Accessible, Gtk.Buildable, Gtk.ConstraintTarget {
+  /* No available fields */
+}
+ +
+

An abstract base class for device plugin preferences.

+

ValentDevicePreferencesGroup is a base class for ValentDevicePlugin +implementations that want to provide a group of preferences.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentDevicePreferencesGroup + + + + + +implements_0 + + +GtkAccessible + + + + + +this--implements_0 + + + + +implements_1 + + +GtkBuildable + + + + + +this--implements_1 + + + + +implements_2 + + +GtkConstraintTarget + + + + + +this--implements_2 + + + + +ancestor_0 + + +AdwPreferencesGroup + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GtkWidget + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GInitiallyUnowned + + + + + +ancestor_2--ancestor_1 + + + + +ancestor_3 + + +GObject + + + + + +ancestor_3--ancestor_2 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_device_preferences_group_get_context
+
+

Get the ValentContext for the ValentDevicePlugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_preferences_group_get_settings
+
+

Get the GSettings for the ValentDevicePlugin.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
Methods inherited from AdwPreferencesGroup (8)
+
+
adw_preferences_group_add
+
+

Adds a child to self.

+
+
+

+
+
adw_preferences_group_get_description
+
+

Gets the description of self.

+
+
+

+
+
adw_preferences_group_get_header_suffix
+
+

Gets the suffix for selfs header.

+
+
+

unstable since: 1.1

+
+
adw_preferences_group_get_title
+
+

Gets the title of self.

+
+
+

+
+
adw_preferences_group_remove
+
+

Removes a child from self.

+
+
+

+
+
adw_preferences_group_set_description
+
+

Sets the description for self.

+
+
+

+
+
adw_preferences_group_set_header_suffix
+
+

Sets the suffix for selfs header.

+
+
+

unstable since: 1.1

+
+
adw_preferences_group_set_title
+
+

Sets the title for self.

+
+
+

+
+ +
+
+ + + +
Methods inherited from GtkWidget (162)
+
+ +
+

Please see GtkWidget for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GtkAccessible (19)
+
+
gtk_accessible_announce
+
+

Requests the user’s screen reader to announce the given message.

+
+
+

unstable since: 4.14

+
+
gtk_accessible_get_accessible_parent
+
+

Retrieves the accessible parent for an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_accessible_role
+
+

Retrieves the accessible role of an accessible object.

+
+
+

+
+
gtk_accessible_get_at_context
+
+

Retrieves the accessible implementation for the given GtkAccessible.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_bounds
+
+

Queries the coordinates and dimensions of this accessible.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_first_accessible_child
+
+

Retrieves the first accessible child of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_next_accessible_sibling
+
+

Retrieves the next accessible sibling of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_platform_state
+
+

Query a platform state, such as focus.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_reset_property
+
+

Resets the accessible property to its default value.

+
+
+

+
+
gtk_accessible_reset_relation
+
+

Resets the accessible relation to its default value.

+
+
+

+
+
gtk_accessible_reset_state
+
+

Resets the accessible state to its default value.

+
+
+

+
+
gtk_accessible_set_accessible_parent
+
+

Sets the parent and sibling of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_update_next_accessible_sibling
+
+

Updates the next accessible sibling of self.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_update_property
+
+

Updates a list of accessible properties.

+
+
+

+
+
gtk_accessible_update_property_value
+
+

Updates an array of accessible properties.

+
+
+

+
+
gtk_accessible_update_relation
+
+

Updates a list of accessible relations.

+
+
+

+
+
gtk_accessible_update_relation_value
+
+

Updates an array of accessible relations.

+
+
+

+
+
gtk_accessible_update_state
+
+

Updates a list of accessible states. See the GtkAccessibleState +documentation for the value types of accessible states.

+
+
+

+
+
gtk_accessible_update_state_value
+
+

Updates an array of accessible states.

+
+
+

+
+ +
+
+ + + +
Methods inherited from GtkBuildable (1)
+
+
gtk_buildable_get_buildable_id
+
+

Gets the ID of the buildable object.

+
+
+

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.DevicePreferencesGroup:context
+
+

The ValentContext for the ValentDevicePlugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.DevicePreferencesGroup:plugin-info
+
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.DevicePreferencesGroup:settings
+
+

The GSettings for the ValentDevicePlugin.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
Properties inherited from AdwPreferencesGroup (3)
+
+
Adw.PreferencesGroup:description
+
+

The description for this group of preferences.

+
+
+

+
+
Adw.PreferencesGroup:header-suffix
+
+

The header suffix widget.

+
+
+

unstable since: 1.1

+
+
Adw.PreferencesGroup:title
+
+

The title for this group of preferences.

+
+
+

+
+ +
+
+ + + +
Properties inherited from GtkWidget (34)
+
+
Gtk.Widget:can-focus
+
+

Whether the widget or any of its descendents can accept +the input focus.

+
+
+

+
+
Gtk.Widget:can-target
+
+

Whether the widget can receive pointer events.

+
+
+

+
+
Gtk.Widget:css-classes
+
+

A list of css classes applied to this widget.

+
+
+

+
+
Gtk.Widget:css-name
+
+

The name of this widget in the CSS tree.

+
+
+

+
+
Gtk.Widget:cursor
+
+

The cursor used by widget.

+
+
+

+
+
Gtk.Widget:focus-on-click
+
+

Whether the widget should grab focus when it is clicked with the mouse.

+
+
+

+
+
Gtk.Widget:focusable
+
+

Whether this widget itself will accept the input focus.

+
+
+

+
+
Gtk.Widget:halign
+
+

How to distribute horizontal space if widget gets extra space.

+
+
+

+
+
Gtk.Widget:has-default
+
+

Whether the widget is the default widget.

+
+
+

+
+
Gtk.Widget:has-focus
+
+

Whether the widget has the input focus.

+
+
+

+
+
Gtk.Widget:has-tooltip
+
+

Enables or disables the emission of the ::query-tooltip signal on widget.

+
+
+

+
+
Gtk.Widget:height-request
+
+

Override for height request of the widget.

+
+
+

+
+
Gtk.Widget:hexpand
+
+

Whether to expand horizontally.

+
+
+

+
+
Gtk.Widget:hexpand-set
+
+

Whether to use the hexpand property.

+
+
+

+
+
Gtk.Widget:layout-manager
+
+

The GtkLayoutManager instance to use to compute the preferred size +of the widget, and allocate its children.

+
+
+

+
+
Gtk.Widget:margin-bottom
+
+

Margin on bottom side of widget.

+
+
+

+
+
Gtk.Widget:margin-end
+
+

Margin on end of widget, horizontally.

+
+
+

+
+
Gtk.Widget:margin-start
+
+

Margin on start of widget, horizontally.

+
+
+

+
+
Gtk.Widget:margin-top
+
+

Margin on top side of widget.

+
+
+

+
+
Gtk.Widget:name
+
+

The name of the widget.

+
+
+

+
+
Gtk.Widget:opacity
+
+

The requested opacity of the widget.

+
+
+

+
+
Gtk.Widget:overflow
+
+

How content outside the widget’s content area is treated.

+
+
+

+
+
Gtk.Widget:parent
+
+

The parent widget of this widget.

+
+
+

+
+
Gtk.Widget:receives-default
+
+

Whether the widget will receive the default action when it is focused.

+
+
+

+
+
Gtk.Widget:root
+
+

The GtkRoot widget of the widget tree containing this widget.

+
+
+

+
+
Gtk.Widget:scale-factor
+
+

The scale factor of the widget.

+
+
+

+
+
Gtk.Widget:sensitive
+
+

Whether the widget responds to input.

+
+
+

+
+
Gtk.Widget:tooltip-markup
+
+

Sets the text of tooltip to be the given string, which is marked up +with Pango markup.

+
+
+

+
+
Gtk.Widget:tooltip-text
+
+

Sets the text of tooltip to be the given string.

+
+
+

+
+
Gtk.Widget:valign
+
+

How to distribute vertical space if widget gets extra space.

+
+
+

+
+
Gtk.Widget:vexpand
+
+

Whether to expand vertically.

+
+
+

+
+
Gtk.Widget:vexpand-set
+
+

Whether to use the vexpand property.

+
+
+

+
+
Gtk.Widget:visible
+
+

Whether the widget is visible.

+
+
+

+
+
Gtk.Widget:width-request
+
+

Override for width request of the widget.

+
+
+

+
+ +
+
+ + + + + + + + + +
Properties inherited from GtkAccessible (1)
+
+
Gtk.Accessible:accessible-role
+
+

The accessible role of the given GtkAccessible implementation.

+
+
+

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
Signals inherited from GtkWidget (13)
+
+
GtkWidget::destroy
+
+

Signals that all holders of a reference to the widget should release +the reference that they hold.

+
+
+

+
+
GtkWidget::direction-changed
+
+

Emitted when the text direction of a widget changes.

+
+
+

+
+
GtkWidget::hide
+
+

Emitted when widget is hidden.

+
+
+

+
+
GtkWidget::keynav-failed
+
+

Emitted if keyboard navigation fails.

+
+
+

+
+
GtkWidget::map
+
+

Emitted when widget is going to be mapped.

+
+
+

+
+
GtkWidget::mnemonic-activate
+
+

Emitted when a widget is activated via a mnemonic.

+
+
+

+
+
GtkWidget::move-focus
+
+

Emitted when the focus is moved.

+
+
+

+
+
GtkWidget::query-tooltip
+
+

Emitted when the widget’s tooltip is about to be shown.

+
+
+

+
+
GtkWidget::realize
+
+

Emitted when widget is associated with a GdkSurface.

+
+
+

+
+
GtkWidget::show
+
+

Emitted when widget is shown.

+
+
+

+
+
GtkWidget::state-flags-changed
+
+

Emitted when the widget state changes.

+
+
+

+
+
GtkWidget::unmap
+
+

Emitted when widget is going to be unmapped.

+
+
+

+
+
GtkWidget::unrealize
+
+

Emitted when the GdkSurface associated with widget is destroyed.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentDevicePreferencesGroupClass {
+  AdwPreferencesGroupClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: AdwPreferencesGroupClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.DeviceTransfer.html b/documentation/class.DeviceTransfer.html new file mode 100644 index 00000000000..e1219315d05 --- /dev/null +++ b/documentation/class.DeviceTransfer.html @@ -0,0 +1,751 @@ + + + + + + Valent.DeviceTransfer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentDeviceTransfer

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.DeviceTransfer : Valent.Transfer
+{
+  /* No available fields */
+}
+ +
+

A class for device file transfers.

+

ValentDeviceTransfer is an implementation of ValentTransfer for the +common case of transferring a file between devices.

+

The direction of the transfer is automatically detected from the content of +ValentDeviceTransfer:packet. If the KDE Connect packet holds +payload information the transfer is assumed to be a download, otherwise it is +assumed to be an upload.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentDeviceTransfer + + + + + +ancestor_0 + + +ValentTransfer + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + +
+

+ Constructors + +

+ +
+ +
+
valent_device_transfer_new
+
+

A convenience for creating a simple file transfer.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_device_transfer_ref_device
+
+

Get the ValentDevice.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_transfer_ref_file
+
+

Get the local GFile.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_device_transfer_ref_packet
+
+

Get the KDE Connect packet.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentTransfer (8)
+ +
valent_transfer_cancel
+

Cancel the transfer operation.

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_check_status
+

Check the transfer status.

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_dup_id
+

Get the transfer ID.

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_execute
+

Start the transfer operation.

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_execute_finish
+

Finish an operation started by valent_transfer_execute().

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_get_progress
+

Get the transfer progress.

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_get_state
+

Get the transfer state.

+
+
+

unstable since: 1.0

+
+ +
valent_transfer_set_progress
+

Set the transfer progress.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.DeviceTransfer:device
+
+

The ValentDevice this transfer is for.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.DeviceTransfer:file
+
+

The local GFile.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.DeviceTransfer:packet
+
+

The KDE Connect packet describing the payload.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentTransfer (3)
+ +
Valent.Transfer:id
+

A unique identifier for the transfer.

+
+
+

unstable since: 1.0

+
+ +
Valent.Transfer:progress
+

The progress of the transfer.

+
+
+

unstable since: 1.0

+
+ +
Valent.Transfer:state
+

The ValentTransferState of the transfer.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentDeviceTransferClass {
+  ValentTransferClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentTransferClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Extension.html b/documentation/class.Extension.html new file mode 100644 index 00000000000..51009ebf784 --- /dev/null +++ b/documentation/class.Extension.html @@ -0,0 +1,979 @@ + + + + + + Valent.Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentExtension

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.Extension : Valent.Object
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for extensions.

+

ValentExtension is a base class for extensions with conveniences for +GAction, GSettings backed by ValentContext.

+

Plugin Actions

+

ValentExtension implements the GActionGroup and +GActionMap interfaces, providing a simple way for plugins to +expose functions and states. Each GAction added to the action map +will be included in the object action group with the plugin’s module name as +a prefix (eg. share.uri).

+

.plugin File

+

Implementations may define the extra fields in the .plugin file, to take +advantage of core features in the base class.

+

The field names are inferred from the GType name of the implementation, with +Valent being stripped if present. For example ValentDevicePlugin becomes +X-DevicePluginSettings, while NameDevicePlugin would become +X-NameDevicePluginSettings.

+
    +
  • +

    Extension Category Field

    +

    A list of categories separated by semi-colons, serving as a hint for +organizational purposes. This should be in the form Main;Additional;, +with values from the freedesktop.org Desktop Menu Specification.

    +

    Field pattern: X-<type name>Category

    +
  • +
  • +

    GSettings Schema Field

    +

    A GSettings schema ID for the extensions’s settings. See +valent_context_get_plugin_settings() for more information.

    +

    Field pattern: X-<type name>Settings

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentExtension + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_extension_get_context
+
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_extension_get_object
+
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_extension_get_settings
+
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_extension_plugin_state_changed
+
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_extension_plugin_state_check
+
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_extension_toggle_actions
+
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Extension:context
+
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Extension:object
+
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Extension:plugin-info
+
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Extension:plugin-state
+
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Extension:settings
+
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentExtensionClass {
+  ValentObjectClass parent_class;
+  
+}
+
+ +
+

The virtual function table for ValentExtension.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Input.html b/documentation/class.Input.html new file mode 100644 index 00000000000..6407a5a2dea --- /dev/null +++ b/documentation/class.Input.html @@ -0,0 +1,762 @@ + + + + + + Valent.Input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentInput

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Input : Valent.Component
+  implements Gio.ListModel {
+  /* No available fields */
+}
+ +
+

A class for controlling pointer and keyboard devices.

+

ValentInput is an abstraction of virtual input devices, intended for use by +ValentDevicePlugin implementations.

+

Plugins can implement ValentInputAdapter to provide an interface to +control the pointer and keyboard.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentInput + + + + + +implements_0 + + +GListModel + + + + + +this--implements_0 + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + +
+

+ Functions + +

+ +
+ +
+
valent_input_get_default
+
+

Get the default ValentInput.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_input_export_adapter
+
+

Export adapter on all adapters that support it.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_keyboard_keysym
+
+

Press or release keysym.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_pointer_axis
+
+

Scroll the surface under the pointer (dx, dy), relative to its current position.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_pointer_button
+
+

Press or release button.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_pointer_motion
+
+

Move the pointer (dx, dy), relative to its current position.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_unexport_adapter
+
+

Unexport adapter from all adapters that support it.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentInputClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.InputAdapter.html b/documentation/class.InputAdapter.html new file mode 100644 index 00000000000..73ac5a218a8 --- /dev/null +++ b/documentation/class.InputAdapter.html @@ -0,0 +1,1062 @@ + + + + + + Valent.InputAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentInputAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.InputAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for virtual input devices.

+

ValentInputAdapter is a base class for plugins that provide an interface to +the pointer and keyboard. This usually means simulating pointer and keyboard +events on the host system.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-InputAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentInputAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_input_adapter_keyboard_keysym
+
+

Press or release keysym.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_adapter_pointer_axis
+
+

Scroll the surface under the pointer (dx, dy), relative to its current position.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_adapter_pointer_button
+
+

Press or release button.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_input_adapter_pointer_motion
+
+

Move the pointer (dx, dy), relative to its current position.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentInputAdapterClass {
+  ValentExtensionClass parent_class;
+  void (* keyboard_keysym) (
+    ValentInputAdapter* adapter,
+    uint32_t keysym,
+    gboolean state
+  );
+  void (* pointer_axis) (
+    ValentInputAdapter* adapter,
+    double dx,
+    double dy
+  );
+  void (* pointer_button) (
+    ValentInputAdapter* adapter,
+    unsigned int button,
+    gboolean state
+  );
+  void (* pointer_motion) (
+    ValentInputAdapter* adapter,
+    double dx,
+    double dy
+  );
+  
+}
+
+ +
+

The virtual function table for ValentInputAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
keyboard_keysym: void (* keyboard_keysym) ( + ValentInputAdapter* adapter, + uint32_t keysym, + gboolean state + )
+
No description available.
+ +
pointer_axis: void (* pointer_axis) ( + ValentInputAdapter* adapter, + double dx, + double dy + )
+
No description available.
+ +
pointer_button: void (* pointer_button) ( + ValentInputAdapter* adapter, + unsigned int button, + gboolean state + )
+
No description available.
+ +
pointer_motion: void (* pointer_motion) ( + ValentInputAdapter* adapter, + double dx, + double dy + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.InputAdapterClass.keyboard_keysym
+
+

Press or release keysym.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.InputAdapterClass.pointer_axis
+
+

Scroll the surface under the pointer (dx, dy), relative to its current position.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.InputAdapterClass.pointer_button
+
+

Press or release button.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.InputAdapterClass.pointer_motion
+
+

Move the pointer (dx, dy), relative to its current position.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Media.html b/documentation/class.Media.html new file mode 100644 index 00000000000..7488d59a92e --- /dev/null +++ b/documentation/class.Media.html @@ -0,0 +1,739 @@ + + + + + + Valent.Media + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentMedia

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Media : Valent.Component
+  implements Gio.ListModel {
+  /* No available fields */
+}
+ +
+

A class for monitoring and controlling media players.

+

ValentMedia is an aggregator of media players, intended for use by +ValentDevicePlugin implementations.

+

Plugins can implement ValentMediaAdapter to provide an +interface to manage instances of ValentMediaPlayer.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentMedia + + + + + +implements_0 + + +GListModel + + + + + +this--implements_0 + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + +
+

+ Functions + +

+ +
+ +
+
valent_media_get_default
+
+

Get the default ValentMedia.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_media_export_player
+
+

Export player on all adapters that support it.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_pause
+
+

Pause any playing media players. Any player whose playback status is changed +will be tracked so that playback may be resumed with valent_media_play().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_unexport_player
+
+

Unexport player from all adapters that support it.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_unpause
+
+

Unpause any media players we previously paused.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentMediaClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.MediaAdapter.html b/documentation/class.MediaAdapter.html new file mode 100644 index 00000000000..63084406f15 --- /dev/null +++ b/documentation/class.MediaAdapter.html @@ -0,0 +1,1090 @@ + + + + + + Valent.MediaAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentMediaAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.MediaAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap, Gio.ListModel {
+  /* No available fields */
+}
+ +
+

An abstract base class for media player adapters.

+

ValentMediaAdapter is a base class for plugins that provide an interface to +manage media players. This usually means monitoring and querying instances of +ValentMediaPlayer.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-MediaAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentMediaAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +implements_2 + + +GListModel + + + + + +this--implements_2 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_media_adapter_export_player
+
+

Export player on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_adapter_player_added
+
+

Called when player has been added to adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_adapter_player_removed
+
+

Called when player has been removed from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_adapter_unexport_player
+
+

Unexport player from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentMediaAdapterClass {
+  ValentExtensionClass parent_class;
+  void (* export_player) (
+    ValentMediaAdapter* adapter,
+    ValentMediaPlayer* player
+  );
+  void (* unexport_player) (
+    ValentMediaAdapter* adapter,
+    ValentMediaPlayer* player
+  );
+  
+}
+
+ +
+

The virtual function table for ValentMediaAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
export_player: void (* export_player) ( + ValentMediaAdapter* adapter, + ValentMediaPlayer* player + )
+
No description available.
+ +
unexport_player: void (* unexport_player) ( + ValentMediaAdapter* adapter, + ValentMediaPlayer* player + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.MediaAdapterClass.export_player
+
+

Export player on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaAdapterClass.unexport_player
+
+

Unexport player from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.MediaPlayer.html b/documentation/class.MediaPlayer.html new file mode 100644 index 00000000000..dc43b8eedf8 --- /dev/null +++ b/documentation/class.MediaPlayer.html @@ -0,0 +1,1232 @@ + + + + + + Valent.MediaPlayer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentMediaPlayer

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
class Valent.MediaPlayer : Valent.Object
+{
+  /* No available fields */
+}
+ +
+

A base class for media players.

+

A ValentMediaPlayer is a base class for plugins to providing an interface to +media players via ValentMediaAdapter.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentMediaPlayer + + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_media_player_get_flags
+
+

Get flags describing the available actions of player.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_metadata
+
+

Get the metadata of the active media items.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_name
+
+

Get the display name of the player.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_position
+
+

Get the current position in seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_repeat
+
+

Get the repeat mode for player.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_shuffle
+
+

Get whether playback order is shuffled.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_state
+
+

Get the playback state for player.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_get_volume
+
+

Get the volume level.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_next
+
+

Skip to the next media item.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_pause
+
+

Pauses playback.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_play
+
+

Start playback.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_previous
+
+

Skip to the previous media item.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_seek
+
+

Seek in the current media item by offset seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_set_position
+
+

Set the current position in seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_set_repeat
+
+

Set the repeat mode of player to repeat.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_set_shuffle
+
+

Set whether playback order is shuffled.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_set_volume
+
+

Set the volume level of player.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_media_player_stop
+
+

Stop playback.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.MediaPlayer:flags
+
+

The available actions.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:metadata
+
+

The metadata of the active media item.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:name
+
+

The display name of the media player.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:position
+
+

The current track position in seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:repeat
+
+

The repeat mode.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:shuffle
+
+

Whether playback order is shuffled.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:state
+
+

The playback state.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayer:volume
+
+

The volume level.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentMediaPlayerClass {
+  ValentObjectClass parent_class;
+  ValentMediaActions (* get_flags) (
+    ValentMediaPlayer* player
+  );
+  GVariant* (* get_metadata) (
+    ValentMediaPlayer* player
+  );
+  const char* (* get_name) (
+    ValentMediaPlayer* player
+  );
+  double (* get_position) (
+    ValentMediaPlayer* player
+  );
+  void (* set_position) (
+    ValentMediaPlayer* player,
+    double position
+  );
+  ValentMediaRepeat (* get_repeat) (
+    ValentMediaPlayer* player
+  );
+  void (* set_repeat) (
+    ValentMediaPlayer* player,
+    ValentMediaRepeat repeat
+  );
+  gboolean (* get_shuffle) (
+    ValentMediaPlayer* player
+  );
+  void (* set_shuffle) (
+    ValentMediaPlayer* player,
+    gboolean shuffle
+  );
+  ValentMediaState (* get_state) (
+    ValentMediaPlayer* player
+  );
+  double (* get_volume) (
+    ValentMediaPlayer* player
+  );
+  void (* set_volume) (
+    ValentMediaPlayer* player,
+    double volume
+  );
+  void (* next) (
+    ValentMediaPlayer* player
+  );
+  void (* pause) (
+    ValentMediaPlayer* player
+  );
+  void (* play) (
+    ValentMediaPlayer* player
+  );
+  void (* previous) (
+    ValentMediaPlayer* player
+  );
+  void (* seek) (
+    ValentMediaPlayer* player,
+    double offset
+  );
+  void (* stop) (
+    ValentMediaPlayer* player
+  );
+  
+}
+
+ +
+

Virtual table for ValentMediaPlayer

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ +
get_flags: ValentMediaActions (* get_flags) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
get_metadata: GVariant* (* get_metadata) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
get_name: const char* (* get_name) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
get_position: double (* get_position) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
set_position: void (* set_position) ( + ValentMediaPlayer* player, + double position + )
+
No description available.
+ +
get_repeat: ValentMediaRepeat (* get_repeat) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
set_repeat: void (* set_repeat) ( + ValentMediaPlayer* player, + ValentMediaRepeat repeat + )
+
No description available.
+ +
get_shuffle: gboolean (* get_shuffle) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
set_shuffle: void (* set_shuffle) ( + ValentMediaPlayer* player, + gboolean shuffle + )
+
No description available.
+ +
get_state: ValentMediaState (* get_state) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
get_volume: double (* get_volume) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
set_volume: void (* set_volume) ( + ValentMediaPlayer* player, + double volume + )
+
No description available.
+ +
next: void (* next) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
pause: void (* pause) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
play: void (* play) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
previous: void (* previous) ( + ValentMediaPlayer* player + )
+
No description available.
+ +
seek: void (* seek) ( + ValentMediaPlayer* player, + double offset + )
+
No description available.
+ +
stop: void (* stop) ( + ValentMediaPlayer* player + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.MediaPlayerClass.get_flags
+
+

Get flags describing the available actions of player.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_metadata
+
+

Get the metadata of the active media items.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_name
+
+

Get the display name of the player.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_position
+
+

Get the current position in seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_repeat
+
+

Get the repeat mode for player.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_shuffle
+
+

Get whether playback order is shuffled.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_state
+
+

Get the playback state for player.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.get_volume
+
+

Get the volume level.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.next
+
+

Skip to the next media item.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.pause
+
+

Pauses playback.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.play
+
+

Start playback.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.previous
+
+

Skip to the previous media item.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.seek
+
+

Seek in the current media item by offset seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.set_position
+
+

Set the current position in seconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.set_repeat
+
+

Set the repeat mode of player to repeat.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.set_shuffle
+
+

Set whether playback order is shuffled.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.set_volume
+
+

Set the volume level of player.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MediaPlayerClass.stop
+
+

Stop playback.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Mixer.html b/documentation/class.Mixer.html new file mode 100644 index 00000000000..d2aa511874c --- /dev/null +++ b/documentation/class.Mixer.html @@ -0,0 +1,775 @@ + + + + + + Valent.Mixer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentMixer

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Mixer : Valent.Component
+  implements Gio.ListModel {
+  /* No available fields */
+}
+ +
+

A class for monitoring and controlling the system volume.

+

ValentMixer is an abstraction of volume mixers, intended for use by +ValentDevicePlugin implementations.

+

Plugins can implement ValentMixerAdapter to provide an interface to +monitor and control audio streams.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentMixer + + + + + +implements_0 + + +GListModel + + + + + +this--implements_0 + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + +
+

+ Functions + +

+ +
+ +
+
valent_mixer_get_default
+
+

Get the default ValentMixer.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_mixer_get_default_input
+
+

Get the default input stream for the primary ValentMixerAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_get_default_output
+
+

Get the default output stream for the primary ValentMixerAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_set_default_input
+
+

Set the default input stream for the primary ValentMixerAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_set_default_output
+
+

Set the default output stream for the primary ValentMixerAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Mixer:default-input
+
+

The active input stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Mixer:default-output
+
+

The active output stream.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentMixerClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.MixerAdapter.html b/documentation/class.MixerAdapter.html new file mode 100644 index 00000000000..97597fde74c --- /dev/null +++ b/documentation/class.MixerAdapter.html @@ -0,0 +1,1192 @@ + + + + + + Valent.MixerAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentMixerAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.MixerAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap, Gio.ListModel {
+  /* No available fields */
+}
+ +
+

An abstract base class for audio mixers.

+

ValentMixerAdapter is a base class for plugins that provide an interface to +audio mixers and volume control. This usually means monitoring the available +input and output streams, changing properties on those streams, and selecting +which are the active input and output.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-MixerAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentMixerAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +implements_2 + + +GListModel + + + + + +this--implements_2 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_mixer_adapter_get_default_input
+
+

Get the default input stream for adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_adapter_get_default_output
+
+

Get the default output stream for adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_adapter_set_default_input
+
+

Set the default input stream for adapter to stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_adapter_set_default_output
+
+

Set the default output stream for adapter to stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_adapter_stream_added
+
+

Called when stream has been added to the mixer.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_adapter_stream_removed
+
+

Called when stream has been removed from the mixer.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + + +
Methods inherited from GListModel (5)
+
+
g_list_model_get_item
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_item_type
+
+

Gets the type of the items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_n_items
+
+

Gets the number of items in list.

+
+
+

unstable since: 2.44

+
+
g_list_model_get_object
+
+

Get the item at position.

+
+
+

unstable since: 2.44

+
+
g_list_model_items_changed
+
+

Emits the GListModel::items-changed signal on list.

+
+
+

unstable since: 2.44

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.MixerAdapter:default-input
+
+

The active input stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerAdapter:default-output
+
+

The active output stream.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
Signals inherited from GListModel (1)
+
+
GListModel::items-changed
+
+

This signal is emitted whenever items were added to or removed +from list. At position, removed items were removed and added +items were added in their place.

+
+
+

unstable since: 2.44

+
+ +
+
+ + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentMixerAdapterClass {
+  ValentExtensionClass parent_class;
+  ValentMixerStream* (* get_default_input) (
+    ValentMixerAdapter* adapter
+  );
+  void (* set_default_input) (
+    ValentMixerAdapter* adapter,
+    ValentMixerStream* stream
+  );
+  ValentMixerStream* (* get_default_output) (
+    ValentMixerAdapter* adapter
+  );
+  void (* set_default_output) (
+    ValentMixerAdapter* adapter,
+    ValentMixerStream* stream
+  );
+  
+}
+
+ +
+

The virtual function table for ValentMixerAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
get_default_input: ValentMixerStream* (* get_default_input) ( + ValentMixerAdapter* adapter + )
+
No description available.
+ +
set_default_input: void (* set_default_input) ( + ValentMixerAdapter* adapter, + ValentMixerStream* stream + )
+
No description available.
+ +
get_default_output: ValentMixerStream* (* get_default_output) ( + ValentMixerAdapter* adapter + )
+
No description available.
+ +
set_default_output: void (* set_default_output) ( + ValentMixerAdapter* adapter, + ValentMixerStream* stream + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.MixerAdapterClass.get_default_input
+
+

Get the default input stream for adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerAdapterClass.get_default_output
+
+

Get the default output stream for adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerAdapterClass.set_default_input
+
+

Set the default input stream for adapter to stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerAdapterClass.set_default_output
+
+

Set the default output stream for adapter to stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.MixerStream.html b/documentation/class.MixerStream.html new file mode 100644 index 00000000000..6ce8dab215f --- /dev/null +++ b/documentation/class.MixerStream.html @@ -0,0 +1,726 @@ + + + + + + Valent.MixerStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentMixerStream

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
class Valent.MixerStream : GObject.Object
+{
+  /* No available fields */
+}
+ +
+

A base class for mixer streams.

+

ValentMixerStream is a base class for mixer streams, intended for use by +implementations of ValentMixerAdapter.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentMixerStream + + + + + +ancestor_0 + + +GObject + + + + + +ancestor_0--this + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_mixer_stream_get_description
+
+

Get the human-readable label of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_stream_get_direction
+
+

Get the port direction of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_stream_get_level
+
+

Get the level of stream (eg. speaker volume, microphone sensitivity).

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_stream_get_muted
+
+

Get the muted state of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_stream_get_name
+
+

Get the unique name of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_stream_set_level
+
+

Set the level of stream (eg. speaker volume, microphone sensitivity).

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_mixer_stream_set_muted
+
+

Set the muted state of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.MixerStream:description
+
+

The human-readable label of the stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStream:direction
+
+

The port direction of the stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStream:level
+
+

The input or output level of the stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStream:muted
+
+

Whether the stream is muted.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStream:name
+
+

The unique name of the stream.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentMixerStreamClass {
+  GObjectClass parent_class;
+  const char* (* get_name) (
+    ValentMixerStream* stream
+  );
+  const char* (* get_description) (
+    ValentMixerStream* stream
+  );
+  ValentMixerDirection (* get_direction) (
+    ValentMixerStream* stream
+  );
+  unsigned int (* get_level) (
+    ValentMixerStream* stream
+  );
+  void (* set_level) (
+    ValentMixerStream* stream,
+    unsigned int level
+  );
+  gboolean (* get_muted) (
+    ValentMixerStream* stream
+  );
+  void (* set_muted) (
+    ValentMixerStream* stream,
+    gboolean state
+  );
+  
+}
+
+ +
+

The virtual function table for ValentMixerStream.

+
+ + +
+
Class members
+ +
+ +
parent_class: GObjectClass
+
No description available.
+ +
get_name: const char* (* get_name) ( + ValentMixerStream* stream + )
+
No description available.
+ +
get_description: const char* (* get_description) ( + ValentMixerStream* stream + )
+
No description available.
+ +
get_direction: ValentMixerDirection (* get_direction) ( + ValentMixerStream* stream + )
+
No description available.
+ +
get_level: unsigned int (* get_level) ( + ValentMixerStream* stream + )
+
No description available.
+ +
set_level: void (* set_level) ( + ValentMixerStream* stream, + unsigned int level + )
+
No description available.
+ +
get_muted: gboolean (* get_muted) ( + ValentMixerStream* stream + )
+
No description available.
+ +
set_muted: void (* set_muted) ( + ValentMixerStream* stream, + gboolean state + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.MixerStreamClass.get_description
+
+

Get the human-readable label of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStreamClass.get_direction
+
+

Get the port direction of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStreamClass.get_level
+
+

Get the level of stream (eg. speaker volume, microphone sensitivity).

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStreamClass.get_muted
+
+

Get the muted state of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStreamClass.get_name
+
+

Get the unique name of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStreamClass.set_level
+
+

Set the level of stream (eg. speaker volume, microphone sensitivity).

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.MixerStreamClass.set_muted
+
+

Set the muted state of stream.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Notification.html b/documentation/class.Notification.html new file mode 100644 index 00000000000..fb9931e2924 --- /dev/null +++ b/documentation/class.Notification.html @@ -0,0 +1,859 @@ + + + + + + Valent.Notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentNotification

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Notification : GObject.Object
+{
+  /* No available fields */
+}
+ +
+

A class representing a notification.

+

ValentNotification is a derivable, generic class for a notification.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentNotification + + + + + +ancestor_0 + + +GObject + + + + + +ancestor_0--this + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + +
+

+ Constructors + +

+ +
+ +
+
valent_notification_new
+
+

Create a new ValentNotification.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Functions + +

+ +
+ +
+
valent_notification_add_device_button
+
+

Add an action button to notification. action is wrapped in the special +device action for device, which allows it to be activated from the app +action scope.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_deserialize
+
+

Deserializes variant into a ValentNotification. Since ValentNotification +is effectively a super-set of GNotification, variant may be a serialized +GNotification or ValentNotification.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_device_action
+
+

Set the default action for notification. action is wrapped in the special +device action for device, which allows it to be activated from the app +action scope.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_notification_add_button
+
+

Add a notification button.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_add_button_with_target
+
+

Add a notification button.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_equal
+
+

Compare two notifications for equality by ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_application
+
+

Get the notifying application.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_body
+
+

Get the notification body.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_icon
+
+

Get the notification icon.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_id
+
+

Get the notification ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_priority
+
+

Get the notification priority.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_time
+
+

Get the notification time.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_get_title
+
+

Get the notification title.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_hash
+
+

Converts a notification to a hash value, using g_str_hash() on the ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_serialize
+
+

Serialize the notification into a variant of type a{sv}.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_action
+
+

Sets the default notification action.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_action_and_target
+
+

Set the default notification action.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_application
+
+

Set the notifying application.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_body
+
+

Set the notification body.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_icon
+
+

Set the notification icon.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_id
+
+

Set the notification ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_priority
+
+

Set the notification priority.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_time
+
+

Set the notification time.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notification_set_title
+
+

Set the notification title.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Notification:action
+
+

The default notification action.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:application
+
+

The notifying application.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:body
+
+

The notification body.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:icon
+
+

The notification GIcon.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:id
+
+

The unique ID of the notification.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:priority
+
+

The notification priority.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:time
+
+

The posting time of the notification in milliseconds.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notification:title
+
+

The title of the notification.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentNotificationClass {
+  GObjectClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: GObjectClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Notifications.html b/documentation/class.Notifications.html new file mode 100644 index 00000000000..8ab7181b835 --- /dev/null +++ b/documentation/class.Notifications.html @@ -0,0 +1,646 @@ + + + + + + Valent.Notifications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentNotifications

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Notifications : Valent.Component
+{
+  /* No available fields */
+}
+ +
+

A class for sending and receiving notifications.

+

ValentNotifications is an aggregator of notifications, intended for use by +ValentDevicePlugin implementations.

+

Plugins can implement ValentNotificationsAdapter to provide an +interface to monitor, send and withdraw notifications.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentNotifications + + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + +
+

+ Functions + +

+ +
+ +
+
valent_notifications_get_default
+
+

Get the default ValentNotifications.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_notifications_get_applications
+
+

Get a dictionary of applications that are known to send notifications.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.Notifications::notification-added
+
+

Emitted when a notification is added to a +ValentNotificationsAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Notifications::notification-removed
+
+

Emitted when a notification is removed from a +ValentNotificationsAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentNotificationsClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.NotificationsAdapter.html b/documentation/class.NotificationsAdapter.html new file mode 100644 index 00000000000..1931313a820 --- /dev/null +++ b/documentation/class.NotificationsAdapter.html @@ -0,0 +1,1090 @@ + + + + + + Valent.NotificationsAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentNotificationsAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.NotificationsAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for notification servers.

+

ValentNotificationsAdapter is a base class for notification servers. This +usually means monitoring a D-Bus service for notifications being sent and withdrawn.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-NotificationsAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentNotificationsAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_notifications_adapter_add_notification
+
+

Send notification to the adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notifications_adapter_notification_added
+
+

Emit ValentNotificationsAdapter::notification-added on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notifications_adapter_notification_removed
+
+

Emit ValentNotificationsAdapter::notification-removed on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_notifications_adapter_remove_notification
+
+

Withdraw id from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.NotificationsAdapter::notification-added
+
+

Emitted when a ValentNotification is added to adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.NotificationsAdapter::notification-removed
+
+

Emitted when a ValentNotification is removed from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentNotificationsAdapterClass {
+  ValentExtensionClass parent_class;
+  void (* add_notification) (
+    ValentNotificationsAdapter* adapter,
+    ValentNotification* notification
+  );
+  void (* remove_notification) (
+    ValentNotificationsAdapter* adapter,
+    const char* id
+  );
+  void (* notification_added) (
+    ValentNotificationsAdapter* adapter,
+    ValentNotification* notification
+  );
+  void (* notification_removed) (
+    ValentNotificationsAdapter* adapter,
+    const char* id
+  );
+  
+}
+
+ +
+

The virtual function table for ValentNotificationsAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
add_notification: void (* add_notification) ( + ValentNotificationsAdapter* adapter, + ValentNotification* notification + )
+
No description available.
+ +
remove_notification: void (* remove_notification) ( + ValentNotificationsAdapter* adapter, + const char* id + )
+
No description available.
+ +
notification_added: void (* notification_added) ( + ValentNotificationsAdapter* adapter, + ValentNotification* notification + )
+
No description available.
+ +
notification_removed: void (* notification_removed) ( + ValentNotificationsAdapter* adapter, + const char* id + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.NotificationsAdapterClass.add_notification
+
+

Send notification to the adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.NotificationsAdapterClass.notification_added
+
+

Emit ValentNotificationsAdapter::notification-added on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.NotificationsAdapterClass.notification_removed
+
+

Emit ValentNotificationsAdapter::notification-removed on adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.NotificationsAdapterClass.remove_notification
+
+

Withdraw id from adapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Object.html b/documentation/class.Object.html new file mode 100644 index 00000000000..70e0a1c1b45 --- /dev/null +++ b/documentation/class.Object.html @@ -0,0 +1,617 @@ + + + + + + Valent.Object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentObject

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
class Valent.Object : GObject.Object
+{
+  /* No available fields */
+}
+ +
+

A base class for objects.

+

ValentObject is a specialized GObject class, based on GNOME Builder’s +IdeObject. It provides a simple base class with helpers for working in threads.

+

Instances have a GRecMutex and a GCancellable that is created on demand by +valent_object_ref_cancellable() is called. When the object is destroyed, the +GCancellable::cancel signal is emitted.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentObject + + + + + +ancestor_0 + + +GObject + + + + + +ancestor_0--this + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_object_chain_cancellable
+
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_destroy
+
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_in_destruction
+
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_lock
+
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_notify
+
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_notify_by_pspec
+
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_ref_cancellable
+
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_object_unlock
+
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Object:cancellable
+
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + + + + +
+ + + +
+

+ Signals + +

+ + +
+ +
+
Valent.Object::destroy
+
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentObjectClass {
+  GObjectClass parent_class;
+  void (* destroy) (
+    ValentObject* object
+  );
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: GObjectClass
+
No description available.
+ +
destroy: void (* destroy) ( + ValentObject* object + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.ObjectClass.destroy
+
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.PreferencesPage.html b/documentation/class.PreferencesPage.html new file mode 100644 index 00000000000..e5fcf04077f --- /dev/null +++ b/documentation/class.PreferencesPage.html @@ -0,0 +1,1244 @@ + + + + + + Valent.PreferencesPage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentPreferencesPage

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.PreferencesPage : Adw.PreferencesPage
+  implements Gtk.Accessible, Gtk.Buildable, Gtk.ConstraintTarget {
+  /* No available fields */
+}
+ +
+

An abstract base class for plugin preferences.

+

ValentPreferencesPage is a base class for plugins that want to provide a +preferences page. Unlike ValentDevicePreferencesGroup the page should +configure all of the plugin’s extension implementations, with the exception +of ValentDevicePlugin.

+

Implementations of ValentDevicePlugin should instead implement +ValentDevicePreferencesGroup, which will allow plugins to store +per-devices settings.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentPreferencesPage + + + + + +implements_0 + + +GtkAccessible + + + + + +this--implements_0 + + + + +implements_1 + + +GtkBuildable + + + + + +this--implements_1 + + + + +implements_2 + + +GtkConstraintTarget + + + + + +this--implements_2 + + + + +ancestor_0 + + +AdwPreferencesPage + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GtkWidget + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GInitiallyUnowned + + + + + +ancestor_2--ancestor_1 + + + + +ancestor_3 + + +GObject + + + + + +ancestor_3--ancestor_2 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+ + + +
Methods inherited from AdwPreferencesPage (13)
+
+
adw_preferences_page_add
+
+

Adds a preferences group to self.

+
+
+

+
+
adw_preferences_page_get_description
+
+

Gets the description of self.

+
+
+

unstable since: 1.4

+
+
adw_preferences_page_get_icon_name
+
+

Gets the icon name for self.

+
+
+

+
+
adw_preferences_page_get_name
+
+

Gets the name of self.

+
+
+

+
+
adw_preferences_page_get_title
+
+

Gets the title of self.

+
+
+

+
+
adw_preferences_page_get_use_underline
+
+

Gets whether an embedded underline in the title indicates a mnemonic.

+
+
+

+
+
adw_preferences_page_remove
+
+

Removes a group from self.

+
+
+

+
+
adw_preferences_page_scroll_to_top
+
+

Scrolls the scrolled window of self to the top.

+
+
+

unstable since: 1.3

+
+
adw_preferences_page_set_description
+
+

Sets the description of self.

+
+
+

unstable since: 1.4

+
+
adw_preferences_page_set_icon_name
+
+

Sets the icon name for self.

+
+
+

+
+
adw_preferences_page_set_name
+
+

Sets the name of self.

+
+
+

+
+
adw_preferences_page_set_title
+
+

Sets the title of self.

+
+
+

+
+
adw_preferences_page_set_use_underline
+
+

Sets whether an embedded underline in the title indicates a mnemonic.

+
+
+

+
+ +
+
+ + + +
Methods inherited from GtkWidget (162)
+
+ +
+

Please see GtkWidget for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GtkAccessible (19)
+
+
gtk_accessible_announce
+
+

Requests the user’s screen reader to announce the given message.

+
+
+

unstable since: 4.14

+
+
gtk_accessible_get_accessible_parent
+
+

Retrieves the accessible parent for an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_accessible_role
+
+

Retrieves the accessible role of an accessible object.

+
+
+

+
+
gtk_accessible_get_at_context
+
+

Retrieves the accessible implementation for the given GtkAccessible.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_bounds
+
+

Queries the coordinates and dimensions of this accessible.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_first_accessible_child
+
+

Retrieves the first accessible child of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_next_accessible_sibling
+
+

Retrieves the next accessible sibling of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_get_platform_state
+
+

Query a platform state, such as focus.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_reset_property
+
+

Resets the accessible property to its default value.

+
+
+

+
+
gtk_accessible_reset_relation
+
+

Resets the accessible relation to its default value.

+
+
+

+
+
gtk_accessible_reset_state
+
+

Resets the accessible state to its default value.

+
+
+

+
+
gtk_accessible_set_accessible_parent
+
+

Sets the parent and sibling of an accessible object.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_update_next_accessible_sibling
+
+

Updates the next accessible sibling of self.

+
+
+

unstable since: 4.10

+
+
gtk_accessible_update_property
+
+

Updates a list of accessible properties.

+
+
+

+
+
gtk_accessible_update_property_value
+
+

Updates an array of accessible properties.

+
+
+

+
+
gtk_accessible_update_relation
+
+

Updates a list of accessible relations.

+
+
+

+
+
gtk_accessible_update_relation_value
+
+

Updates an array of accessible relations.

+
+
+

+
+
gtk_accessible_update_state
+
+

Updates a list of accessible states. See the GtkAccessibleState +documentation for the value types of accessible states.

+
+
+

+
+
gtk_accessible_update_state_value
+
+

Updates an array of accessible states.

+
+
+

+
+ +
+
+ + + +
Methods inherited from GtkBuildable (1)
+
+
gtk_buildable_get_buildable_id
+
+

Gets the ID of the buildable object.

+
+
+

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.PreferencesPage:plugin-info
+
+

The PeasPluginInfo describing the plugin this page configures.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
Properties inherited from AdwPreferencesPage (5)
+
+
Adw.PreferencesPage:description
+
+

The description to be displayed at the top of the page.

+
+
+

unstable since: 1.4

+
+
Adw.PreferencesPage:icon-name
+
+

The icon name for this page.

+
+
+

+
+
Adw.PreferencesPage:name
+
+

The name of this page.

+
+
+

+
+
Adw.PreferencesPage:title
+
+

The title for this page.

+
+
+

+
+
Adw.PreferencesPage:use-underline
+
+

Whether an embedded underline in the title indicates a mnemonic.

+
+
+

+
+ +
+
+ + + +
Properties inherited from GtkWidget (34)
+
+
Gtk.Widget:can-focus
+
+

Whether the widget or any of its descendents can accept +the input focus.

+
+
+

+
+
Gtk.Widget:can-target
+
+

Whether the widget can receive pointer events.

+
+
+

+
+
Gtk.Widget:css-classes
+
+

A list of css classes applied to this widget.

+
+
+

+
+
Gtk.Widget:css-name
+
+

The name of this widget in the CSS tree.

+
+
+

+
+
Gtk.Widget:cursor
+
+

The cursor used by widget.

+
+
+

+
+
Gtk.Widget:focus-on-click
+
+

Whether the widget should grab focus when it is clicked with the mouse.

+
+
+

+
+
Gtk.Widget:focusable
+
+

Whether this widget itself will accept the input focus.

+
+
+

+
+
Gtk.Widget:halign
+
+

How to distribute horizontal space if widget gets extra space.

+
+
+

+
+
Gtk.Widget:has-default
+
+

Whether the widget is the default widget.

+
+
+

+
+
Gtk.Widget:has-focus
+
+

Whether the widget has the input focus.

+
+
+

+
+
Gtk.Widget:has-tooltip
+
+

Enables or disables the emission of the ::query-tooltip signal on widget.

+
+
+

+
+
Gtk.Widget:height-request
+
+

Override for height request of the widget.

+
+
+

+
+
Gtk.Widget:hexpand
+
+

Whether to expand horizontally.

+
+
+

+
+
Gtk.Widget:hexpand-set
+
+

Whether to use the hexpand property.

+
+
+

+
+
Gtk.Widget:layout-manager
+
+

The GtkLayoutManager instance to use to compute the preferred size +of the widget, and allocate its children.

+
+
+

+
+
Gtk.Widget:margin-bottom
+
+

Margin on bottom side of widget.

+
+
+

+
+
Gtk.Widget:margin-end
+
+

Margin on end of widget, horizontally.

+
+
+

+
+
Gtk.Widget:margin-start
+
+

Margin on start of widget, horizontally.

+
+
+

+
+
Gtk.Widget:margin-top
+
+

Margin on top side of widget.

+
+
+

+
+
Gtk.Widget:name
+
+

The name of the widget.

+
+
+

+
+
Gtk.Widget:opacity
+
+

The requested opacity of the widget.

+
+
+

+
+
Gtk.Widget:overflow
+
+

How content outside the widget’s content area is treated.

+
+
+

+
+
Gtk.Widget:parent
+
+

The parent widget of this widget.

+
+
+

+
+
Gtk.Widget:receives-default
+
+

Whether the widget will receive the default action when it is focused.

+
+
+

+
+
Gtk.Widget:root
+
+

The GtkRoot widget of the widget tree containing this widget.

+
+
+

+
+
Gtk.Widget:scale-factor
+
+

The scale factor of the widget.

+
+
+

+
+
Gtk.Widget:sensitive
+
+

Whether the widget responds to input.

+
+
+

+
+
Gtk.Widget:tooltip-markup
+
+

Sets the text of tooltip to be the given string, which is marked up +with Pango markup.

+
+
+

+
+
Gtk.Widget:tooltip-text
+
+

Sets the text of tooltip to be the given string.

+
+
+

+
+
Gtk.Widget:valign
+
+

How to distribute vertical space if widget gets extra space.

+
+
+

+
+
Gtk.Widget:vexpand
+
+

Whether to expand vertically.

+
+
+

+
+
Gtk.Widget:vexpand-set
+
+

Whether to use the vexpand property.

+
+
+

+
+
Gtk.Widget:visible
+
+

Whether the widget is visible.

+
+
+

+
+
Gtk.Widget:width-request
+
+

Override for width request of the widget.

+
+
+

+
+ +
+
+ + + + + + + + + +
Properties inherited from GtkAccessible (1)
+
+
Gtk.Accessible:accessible-role
+
+

The accessible role of the given GtkAccessible implementation.

+
+
+

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
Signals inherited from GtkWidget (13)
+
+
GtkWidget::destroy
+
+

Signals that all holders of a reference to the widget should release +the reference that they hold.

+
+
+

+
+
GtkWidget::direction-changed
+
+

Emitted when the text direction of a widget changes.

+
+
+

+
+
GtkWidget::hide
+
+

Emitted when widget is hidden.

+
+
+

+
+
GtkWidget::keynav-failed
+
+

Emitted if keyboard navigation fails.

+
+
+

+
+
GtkWidget::map
+
+

Emitted when widget is going to be mapped.

+
+
+

+
+
GtkWidget::mnemonic-activate
+
+

Emitted when a widget is activated via a mnemonic.

+
+
+

+
+
GtkWidget::move-focus
+
+

Emitted when the focus is moved.

+
+
+

+
+
GtkWidget::query-tooltip
+
+

Emitted when the widget’s tooltip is about to be shown.

+
+
+

+
+
GtkWidget::realize
+
+

Emitted when widget is associated with a GdkSurface.

+
+
+

+
+
GtkWidget::show
+
+

Emitted when widget is shown.

+
+
+

+
+
GtkWidget::state-flags-changed
+
+

Emitted when the widget state changes.

+
+
+

+
+
GtkWidget::unmap
+
+

Emitted when widget is going to be unmapped.

+
+
+

+
+
GtkWidget::unrealize
+
+

Emitted when the GdkSurface associated with widget is destroyed.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentPreferencesPageClass {
+  AdwPreferencesPageClass parent_class;
+  
+}
+
+ +
+

The virtual function table for ValentPreferencesPage.

+
+ + +
+
Class members
+ +
+ +
parent_class: AdwPreferencesPageClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Session.html b/documentation/class.Session.html new file mode 100644 index 00000000000..a1246f2e4d0 --- /dev/null +++ b/documentation/class.Session.html @@ -0,0 +1,668 @@ + + + + + + Valent.Session + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentSession

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
final class Valent.Session : Valent.Component
+{
+  /* No available fields */
+}
+ +
+

A class for monitoring the session state.

+

ValentSession is an abstraction of session managers, intended for use by +ValentDevicePlugin implementations.

+

Plugins can implement ValentSessionAdapter to provide an interface +to monitor and control the session state.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentSession + + + + + +ancestor_0 + + +ValentComponent + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + + + + + +
+

+ Functions + +

+ +
+ +
+
valent_session_get_default
+
+

Get the default ValentSession.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + +
+

+ Instance methods + +

+ +
+ +
+
valent_session_get_active
+
+

Get the active state of the primary ValentSessionAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_session_get_locked
+
+

Get the locked state of the primary ValentSessionAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_session_set_locked
+
+

Set the locked state of the primary ValentSessionAdapter.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Session:active
+
+

Whether the session is active.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Session:locked
+
+

Whether the session is locked.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentComponent (2)
+ +
Valent.Component:plugin-domain
+ No description available. +
+
+

+
+ +
Valent.Component:plugin-type
+

The extension point GType.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentSessionClass {
+  ValentComponentClass parent_class;
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentComponentClass
+
No description available.
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.SessionAdapter.html b/documentation/class.SessionAdapter.html new file mode 100644 index 00000000000..292e4198573 --- /dev/null +++ b/documentation/class.SessionAdapter.html @@ -0,0 +1,1053 @@ + + + + + + Valent.SessionAdapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentSessionAdapter

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.SessionAdapter : Valent.Extension
+  implements Gio.ActionGroup, Gio.ActionMap {
+  /* No available fields */
+}
+ +
+

An abstract base class for session managers.

+

ValentSessionAdapter is a base class for plugins that provide an interface +to the desktop session manager. This usually means monitoring the idle state, +locking and unlocking the session.

+

.plugin File

+

Implementations may define the following extra fields in the .plugin file:

+
    +
  • +

    X-SessionAdapterPriority

    +

    An integer indicating the adapter priority. The implementation with the +lowest value will be used as the primary adapter.

    +
  • +
+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentSessionAdapter + + + + + +implements_0 + + +GActionGroup + + + + + +this--implements_0 + + + + +implements_1 + + +GActionMap + + + + + +this--implements_1 + + + + +ancestor_0 + + +ValentExtension + + + + + +ancestor_0--this + + + + +ancestor_1 + + +ValentObject + + + + + +ancestor_1--ancestor_0 + + + + +ancestor_2 + + +GObject + + + + + +ancestor_2--ancestor_1 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + + + +
+

+ Implements + +

+ +
+ +
+
+ + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_session_adapter_get_active
+
+

Get whether the session is active.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_session_adapter_get_locked
+
+

Get whether the session is locked.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_session_adapter_set_locked
+
+

Set whether the session is locked.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentExtension (6)
+ +
valent_extension_get_context
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_object
+

Get the object this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_get_settings
+

Get the settings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_changed
+

Emits GObject::notify for +ValentExtension:plugin-state.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_plugin_state_check
+

Get the extension state, while propagating any errors that describe it.

+
+
+

unstable since: 1.0

+
+ +
valent_extension_toggle_actions
+

Enable or disable all actions.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + + +
Methods inherited from GActionGroup (14)
+
+
g_action_group_action_added
+
+

Emits the GActionGroup::action-added signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_enabled_changed
+
+

Emits the GActionGroup::action-enabled-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_removed
+
+

Emits the GActionGroup::action-removed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_action_state_changed
+
+

Emits the GActionGroup::action-state-changed signal on action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_activate_action
+
+

Activate the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_change_action_state
+
+

Request for the state of the named action within action_group to be +changed to value.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_enabled
+
+

Checks if the named action within action_group is currently enabled.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_parameter_type
+
+

Queries the type of the parameter that must be given when activating +the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state
+
+

Queries the current state of the named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_hint
+
+

Requests a hint about the valid range of values for the state of the +named action within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_get_action_state_type
+
+

Queries the type of the state of the named action within +action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_has_action
+
+

Checks if the named action exists within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_list_actions
+
+

Lists the actions contained within action_group.

+
+
+

unstable since: 2.28

+
+
g_action_group_query_action
+
+

Queries all aspects of the named action within an action_group.

+
+
+

unstable since: 2.32

+
+ +
+
+ + + +
Methods inherited from GActionMap (5)
+
+
g_action_map_add_action
+
+

Adds an action to the action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_add_action_entries
+
+

A convenience function for creating multiple GSimpleAction instances +and adding them to a GActionMap.

+
+
+

unstable since: 2.32

+
+
g_action_map_lookup_action
+
+

Looks up the action with the name action_name in action_map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action
+
+

Removes the named action from the action map.

+
+
+

unstable since: 2.32

+
+
g_action_map_remove_action_entries
+
+

Remove actions from a GActionMap. This is meant as the reverse of g_action_map_add_action_entries().

+
+
+

unstable since: 2.78

+
+ +
+
+ + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.SessionAdapter:active
+
+

Whether the session is active.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.SessionAdapter:locked
+
+

Whether the session is locked.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentExtension (5)
+ +
Valent.Extension:context
+

The ValentDevice this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:object
+

The GObject this plugin is bound to.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-info
+

The PeasPluginInfo describing this plugin.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:plugin-state
+

The ValentPluginState describing the state of the extension.

+
+
+

unstable since: 1.0

+
+ +
Valent.Extension:settings
+

The GSettings for this plugin.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
Signals inherited from GActionGroup (4)
+
+
GActionGroup::action-added
+
+

Signals that a new action was just added to the group. +This signal is emitted after the action has been added +and is now visible.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-enabled-changed
+
+

Signals that the enabled status of the named action has changed.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-removed
+
+

Signals that an action is just about to be removed from the group. +This signal is emitted before the action is removed, so the action +is still visible and can be queried from the signal handler.

+
+
+

unstable since: 2.28

+
+
GActionGroup::action-state-changed
+
+

Signals that the state of the named action has changed.

+
+
+

unstable since: 2.28

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentSessionAdapterClass {
+  ValentExtensionClass parent_class;
+  gboolean (* get_active) (
+    ValentSessionAdapter* adapter
+  );
+  gboolean (* get_locked) (
+    ValentSessionAdapter* adapter
+  );
+  void (* set_locked) (
+    ValentSessionAdapter* adapter,
+    gboolean state
+  );
+  
+}
+
+ +
+

The virtual function table for ValentSessionAdapter.

+
+ + +
+
Class members
+ +
+ +
parent_class: ValentExtensionClass
+
No description available.
+ +
get_active: gboolean (* get_active) ( + ValentSessionAdapter* adapter + )
+
No description available.
+ +
get_locked: gboolean (* get_locked) ( + ValentSessionAdapter* adapter + )
+
No description available.
+ +
set_locked: void (* set_locked) ( + ValentSessionAdapter* adapter, + gboolean state + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.SessionAdapterClass.get_active
+
+

Get whether the session is active.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.SessionAdapterClass.get_locked
+
+

Get whether the session is locked.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.SessionAdapterClass.set_locked
+
+

Set whether the session is locked.

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/class.Transfer.html b/documentation/class.Transfer.html new file mode 100644 index 00000000000..690b98f5068 --- /dev/null +++ b/documentation/class.Transfer.html @@ -0,0 +1,740 @@ + + + + + + Valent.Transfer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Class

+

ValentTransfer

+
+ +
+ +
+

unstable since: 1.0

+
+ +
+

+ Description + + + [src] + +

+ +
abstract class Valent.Transfer : Valent.Object
+{
+  /* No available fields */
+}
+ +
+

An abstract base class for data transfers.

+

ValentTransfer is a generic class for transfers.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+
+ + +
+

+ Hierarchy + +

+
+ + + + + + +hierarchy + + +this + + +ValentTransfer + + + + + +ancestor_0 + + +ValentObject + + + + + +ancestor_0--this + + + + +ancestor_1 + + +GObject + + + + + +ancestor_1--ancestor_0 + + + + + +
+
+ + + +
+

+ Ancestors + +

+ +
+ +
+
+ + + +
+

Descendants

+ +
+ + + + + + + + + +
+

+ Instance methods + +

+ +
+ +
+
valent_transfer_cancel
+
+

Cancel the transfer operation.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_check_status
+
+

Check the transfer status.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_dup_id
+
+

Get the transfer ID.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_execute
+
+

Start the transfer operation.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_execute_finish
+
+

Finish an operation started by valent_transfer_execute().

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_get_progress
+
+

Get the transfer progress.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_get_state
+
+

Get the transfer state.

+
+
+

unstable since: 1.0

+
+
+ +
+
valent_transfer_set_progress
+
+

Set the transfer progress.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + +
+
Methods inherited from ValentObject (8)
+ +
valent_object_chain_cancellable
+

Chain a cancellable to the object’s cancellable.

+
+
+

unstable since: 1.0

+
+ +
valent_object_destroy
+

Destroy the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_in_destruction
+

Get whether the object is destroyed or in destruction.

+
+
+

unstable since: 1.0

+
+ +
valent_object_lock
+

Acquire a lock on object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_notify_by_pspec
+

Emit GObject::notify on object, on the main thread.

+
+
+

unstable since: 1.0

+
+ +
valent_object_ref_cancellable
+

Get a GCancellable for the object.

+
+
+

unstable since: 1.0

+
+ +
valent_object_unlock
+

Release a lock on object.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Methods inherited from GObject (43)
+
+ +
+

Please see GObject for a full list of methods.

+
+ +
+
+ + + + +
+ + + +
+

+ Properties + +

+ + +
+ +
+
Valent.Transfer:id
+
+

A unique identifier for the transfer.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Transfer:progress
+
+

The progress of the transfer.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.Transfer:state
+
+

The ValentTransferState of the transfer.

+
+
+

unstable since: 1.0

+
+
+ +
+ + + + +
+
Properties inherited from ValentObject (1)
+ +
Valent.Object:cancellable
+

The object GCancellable.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + + + + + +
+ + + +
+

+ Signals + +

+ + + + + +
+
Signals inherited from ValentObject (1)
+ +
ValentObject::destroy
+

Emitted when the object is being destroyed.

+
+
+

unstable since: 1.0

+
+ +
+
+ + + +
Signals inherited from GObject (1)
+
+
GObject::notify
+
+

The notify signal is emitted on an object when one of its properties has +its value set through g_object_set_property(), g_object_set(), et al.

+
+
+

+
+ +
+
+ + + + + +
+ + + +
+

+ Class structure + +

+ +
+
struct ValentTransferClass {
+  ValentObjectClass parent_class;
+  void (* execute) (
+    ValentTransfer* transfer,
+    GCancellable* cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data
+  );
+  gboolean (* execute_finish) (
+    ValentTransfer* transfer,
+    GAsyncResult* result,
+    GError** error
+  );
+  
+}
+
+ +
+ No description available. +
+ + +
+
Class members
+ +
+ +
parent_class: ValentObjectClass
+
No description available.
+ +
execute: void (* execute) ( + ValentTransfer* transfer, + GCancellable* cancellable, + GAsyncReadyCallback callback, + gpointer user_data + )
+
No description available.
+ +
execute_finish: gboolean (* execute_finish) ( + ValentTransfer* transfer, + GAsyncResult* result, + GError** error + )
+
No description available.
+ + +
+ +
+ + + +
+

+ Virtual methods + +

+ +
+ +
+
Valent.TransferClass.execute
+
+

Start the transfer operation.

+
+
+

unstable since: 1.0

+
+
+ +
+
Valent.TransferClass.execute_finish
+
+

Finish an operation started by valent_transfer_execute().

+
+
+

unstable since: 1.0

+
+
+ +
+
+ + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/classes_hierarchy.html b/documentation/classes_hierarchy.html new file mode 100644 index 00000000000..cd0fadfa52c --- /dev/null +++ b/documentation/classes_hierarchy.html @@ -0,0 +1,229 @@ + + + + + + Valent – 1: Classes Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ +

+ Classes Hierarchy + + +

+ +
+ +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.API_VERSION.html b/documentation/const.API_VERSION.html new file mode 100644 index 00000000000..3b6b9f6d169 --- /dev/null +++ b/documentation/const.API_VERSION.html @@ -0,0 +1,153 @@ + + + + + + Valent.API_VERSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentAPI_VERSION

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_API_VERSION "1"
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The API version of libvalent, encoded as a string (eg. "1.0").

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.ENABLE_DEBUG.html b/documentation/const.ENABLE_DEBUG.html new file mode 100644 index 00000000000..9224b1d74cc --- /dev/null +++ b/documentation/const.ENABLE_DEBUG.html @@ -0,0 +1,156 @@ + + + + + + Valent.ENABLE_DEBUG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentENABLE_DEBUG

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_ENABLE_DEBUG 1
+
+
+
+
+ +
+

+ Description + + +

+ +
+

Whether debugging is enabled.

+

If TRUE, the macros for debugging will write messages to the log that are +only appropriate during development. If FALSE, these macros will be compiled out.

+

The macros include VALENT_JSON.

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.ENABLE_TRACE.html b/documentation/const.ENABLE_TRACE.html new file mode 100644 index 00000000000..a15638faad2 --- /dev/null +++ b/documentation/const.ENABLE_TRACE.html @@ -0,0 +1,158 @@ + + + + + + Valent.ENABLE_TRACE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentENABLE_TRACE

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_ENABLE_TRACE 0
+
+
+
+
+ +
+

+ Description + + +

+ +
+

Whether tracing is enabled.

+

If TRUE, the macros for tracing function entry, exit and jump labels will +write to the log and pass events to sysprof, if it’s available. If FALSE, +these macros will be compiled out.

+

The macros include VALENT_ENTRY, VALENT_EXIT, VALENT_RETURN, VALENT_GOTO, +VALENT_NOTE and VALENT_PROBE.

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.LOG_LEVEL_TRACE.html b/documentation/const.LOG_LEVEL_TRACE.html new file mode 100644 index 00000000000..c654592d7c1 --- /dev/null +++ b/documentation/const.LOG_LEVEL_TRACE.html @@ -0,0 +1,153 @@ + + + + + + Valent.LOG_LEVEL_TRACE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentLOG_LEVEL_TRACE

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_LOG_LEVEL_TRACE 1
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The Glib.GLogLevelFlags log level for trace messages in Valent.

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.MAJOR_VERSION.html b/documentation/const.MAJOR_VERSION.html new file mode 100644 index 00000000000..6e5630aa8ba --- /dev/null +++ b/documentation/const.MAJOR_VERSION.html @@ -0,0 +1,153 @@ + + + + + + Valent.MAJOR_VERSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentMAJOR_VERSION

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_MAJOR_VERSION 1
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The major version component of libvalent (e.g. 1 if for 1.2.3)

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.MICRO_VERSION.html b/documentation/const.MICRO_VERSION.html new file mode 100644 index 00000000000..9398cd8018c --- /dev/null +++ b/documentation/const.MICRO_VERSION.html @@ -0,0 +1,153 @@ + + + + + + Valent.MICRO_VERSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentMICRO_VERSION

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_MICRO_VERSION 0
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The micro version component of libvalent (e.g. 3 if for 1.2.3)

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.MINOR_VERSION.html b/documentation/const.MINOR_VERSION.html new file mode 100644 index 00000000000..58c673c8dcc --- /dev/null +++ b/documentation/const.MINOR_VERSION.html @@ -0,0 +1,153 @@ + + + + + + Valent.MINOR_VERSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentMINOR_VERSION

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_MINOR_VERSION 0
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The minor version component of libvalent (e.g. 2 if for 1.2.3)

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.POINTER_MIDDLE.html b/documentation/const.POINTER_MIDDLE.html new file mode 100644 index 00000000000..0f31d3d51c4 --- /dev/null +++ b/documentation/const.POINTER_MIDDLE.html @@ -0,0 +1,154 @@ + + + + + + Valent.POINTER_MIDDLE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentPOINTER_MIDDLE

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_POINTER_MIDDLE 2
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The middle button.

+

This is typically the button activated when the mouse wheel is pressed.

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.POINTER_PRIMARY.html b/documentation/const.POINTER_PRIMARY.html new file mode 100644 index 00000000000..767297247d2 --- /dev/null +++ b/documentation/const.POINTER_PRIMARY.html @@ -0,0 +1,154 @@ + + + + + + Valent.POINTER_PRIMARY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentPOINTER_PRIMARY

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_POINTER_PRIMARY 1
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The primary button.

+

This is typically the left mouse button, or the right button in a left-handed setup.

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.POINTER_SECONDARY.html b/documentation/const.POINTER_SECONDARY.html new file mode 100644 index 00000000000..fb14cbfd8c0 --- /dev/null +++ b/documentation/const.POINTER_SECONDARY.html @@ -0,0 +1,154 @@ + + + + + + Valent.POINTER_SECONDARY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentPOINTER_SECONDARY

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_POINTER_SECONDARY 3
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The primary button.

+

This is typically the right mouse button, or the left button in a left-handed setup.

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.VCS_TAG.html b/documentation/const.VCS_TAG.html new file mode 100644 index 00000000000..2eb5dd3b5d7 --- /dev/null +++ b/documentation/const.VCS_TAG.html @@ -0,0 +1,153 @@ + + + + + + Valent.VCS_TAG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentVCS_TAG

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_VCS_TAG "devel"
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/const.VERSION.html b/documentation/const.VERSION.html new file mode 100644 index 00000000000..82a440bd01b --- /dev/null +++ b/documentation/const.VERSION.html @@ -0,0 +1,153 @@ + + + + + + Valent.VERSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constant

+

ValentVERSION

+
+ +
+
+

+
+ +
+

+ Declaration + + +

+ +
+
#define VALENT_VERSION "1.0.0.alpha.45"
+
+
+
+
+ +
+

+ Description + + +

+ +
+

The full version of libvalent, encoded as a string (eg. "1.0.0.alpha").

+
+ +
+ + + +
+ + +
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/ctor.Device.new.html b/documentation/ctor.Device.new.html new file mode 100644 index 00000000000..8be708be5b7 --- /dev/null +++ b/documentation/ctor.Device.new.html @@ -0,0 +1,229 @@ + + + + + + Valent.Device.new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constructor

+

ValentDevicenew

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentDevice*
+valent_device_new (
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new device for id.

+
+ +
+ +

Available since: 1.0

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

A device ID.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentDevice

+

A new ValentDevice

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/ctor.DeviceTransfer.new.html b/documentation/ctor.DeviceTransfer.new.html new file mode 100644 index 00000000000..9045b49e479 --- /dev/null +++ b/documentation/ctor.DeviceTransfer.new.html @@ -0,0 +1,265 @@ + + + + + + Valent.DeviceTransfer.new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constructor

+

ValentDeviceTransfernew

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentTransfer*
+valent_device_transfer_new (
+  ValentDevice* device,
+  JsonNode* packet,
+  GFile* file
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience for creating a simple file transfer.

+
+ +
+ +

Available since: 1.0

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
device
+
+

Type: ValentDevice

+

A ValentDevice

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
file
+
+

Type: GFile

+

A GFile

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentTransfer

+

A ValentDeviceTransfer

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/ctor.Notification.new.html b/documentation/ctor.Notification.new.html new file mode 100644 index 00000000000..2183fad5eaa --- /dev/null +++ b/documentation/ctor.Notification.new.html @@ -0,0 +1,232 @@ + + + + + + Valent.Notification.new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Constructor

+

ValentNotificationnew

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentNotification*
+valent_notification_new (
+  const char* title
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new ValentNotification.

+

A notification without a title (or primary text) is not strictly possible, +but this is allowed during construction for the case where it is more +convenient to set it later.

+
+ +
+ +

Available since: 1.0

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
title
+
+

Type: const char*

+

A notification title.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentNotification

+

A ValentNotification

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/enum.MediaRepeat.html b/documentation/enum.MediaRepeat.html new file mode 100644 index 00000000000..fdd383ff49f --- /dev/null +++ b/documentation/enum.MediaRepeat.html @@ -0,0 +1,219 @@ + + + + + + Valent.MediaRepeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentMediaRepeat

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
enum Valent.MediaRepeat
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Enumeration of loop modes.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_MEDIA_REPEAT_NONE
+
+

Repeat off.

+
    +
  • Value: 0
  • +
  • Nickname: none
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_REPEAT_ALL
+
+

Repeat all items.

+
    +
  • Value: 1
  • +
  • Nickname: all
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_REPEAT_ONE
+
+

Repeat one items.

+
    +
  • Value: 2
  • +
  • Nickname: one
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/enum.MediaState.html b/documentation/enum.MediaState.html new file mode 100644 index 00000000000..419c7ab1ebb --- /dev/null +++ b/documentation/enum.MediaState.html @@ -0,0 +1,219 @@ + + + + + + Valent.MediaState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentMediaState

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
enum Valent.MediaState
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Media state flags.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_MEDIA_STATE_STOPPED
+
+

The player state is unknown.

+
    +
  • Value: 0
  • +
  • Nickname: stopped
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_STATE_PLAYING
+
+

Playback is active.

+
    +
  • Value: 1
  • +
  • Nickname: playing
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_STATE_PAUSED
+
+

Playback is paused.

+
    +
  • Value: 2
  • +
  • Nickname: paused
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/enum.MixerDirection.html b/documentation/enum.MixerDirection.html new file mode 100644 index 00000000000..9f56101db51 --- /dev/null +++ b/documentation/enum.MixerDirection.html @@ -0,0 +1,209 @@ + + + + + + Valent.MixerDirection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentMixerDirection

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
enum Valent.MixerDirection
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Enumeration of stream directions.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_MIXER_INPUT
+
+

An input stream or “source” (eg. microphone)

+
    +
  • Value: 0
  • +
  • Nickname: input
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MIXER_OUTPUT
+
+

An output stream or “sink” (eg. speakers)

+
    +
  • Value: 1
  • +
  • Nickname: output
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/enum.PluginState.html b/documentation/enum.PluginState.html new file mode 100644 index 00000000000..3bf38c21ffd --- /dev/null +++ b/documentation/enum.PluginState.html @@ -0,0 +1,217 @@ + + + + + + Valent.PluginState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentPluginState

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
enum Valent.PluginState
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_PLUGIN_STATE_ACTIVE
+
+

The plugin functionality is available.

+
    +
  • Value: 0
  • +
  • Nickname: active
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_PLUGIN_STATE_INACTIVE
+
+

The plugin functionality is unavailable.

+
    +
  • Value: 1
  • +
  • Nickname: inactive
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_PLUGIN_STATE_ERROR
+
+

The plugin encountered an unrecoverable error.

+
    +
  • Value: 2
  • +
  • Nickname: error
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/enum.TransferState.html b/documentation/enum.TransferState.html new file mode 100644 index 00000000000..3eef1528a1e --- /dev/null +++ b/documentation/enum.TransferState.html @@ -0,0 +1,229 @@ + + + + + + Valent.TransferState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentTransferState

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
enum Valent.TransferState
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Enumeration of transfer states.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_TRANSFER_STATE_PENDING
+
+

The transfer is pending.

+
    +
  • Value: 0
  • +
  • Nickname: pending
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_TRANSFER_STATE_ACTIVE
+
+

The transfer is in progress.

+
    +
  • Value: 1
  • +
  • Nickname: active
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_TRANSFER_STATE_COMPLETE
+
+

The transfer succeeded.

+
    +
  • Value: 2
  • +
  • Nickname: complete
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_TRANSFER_STATE_FAILED
+
+

The transfer failed.

+
    +
  • Value: 3
  • +
  • Nickname: failed
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/error.PacketError.html b/documentation/error.PacketError.html new file mode 100644 index 00000000000..631c1657716 --- /dev/null +++ b/documentation/error.PacketError.html @@ -0,0 +1,240 @@ + + + + + + Valent.PacketError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentPacketError

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
error-domain Valent.PacketError
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Error enumeration for KDE Connect packet validation.

+

This enumeration can be extended at later date.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_PACKET_ERROR_UNKNOWN
+
+

An unknown error.

+
    +
  • Value: 0
  • +
  • Nickname: None
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_PACKET_ERROR_INVALID_DATA
+
+

The packet is NULL or not JSON.

+
    +
  • Value: 1
  • +
  • Nickname: None
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_PACKET_ERROR_MALFORMED
+
+

The packet structure is malformed.

+
    +
  • Value: 2
  • +
  • Nickname: None
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_PACKET_ERROR_INVALID_FIELD
+
+

An expected field holds an invalid type.

+
    +
  • Value: 3
  • +
  • Nickname: None
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_PACKET_ERROR_MISSING_FIELD
+
+

An expected field is missing.

+
    +
  • Value: 4
  • +
  • Nickname: None
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/flags.DeviceState.html b/documentation/flags.DeviceState.html new file mode 100644 index 00000000000..51027378920 --- /dev/null +++ b/documentation/flags.DeviceState.html @@ -0,0 +1,239 @@ + + + + + + Valent.DeviceState + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentDeviceState

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
flags Valent.DeviceState
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Device state flags.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_DEVICE_STATE_NONE
+
+

Device is unpaired and disconnected.

+
    +
  • Value: 0
  • +
  • Nickname: none
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_DEVICE_STATE_CONNECTED
+
+

Device is connected.

+
    +
  • Value: 1
  • +
  • Nickname: connected
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_DEVICE_STATE_PAIRED
+
+

Device is paired.

+
    +
  • Value: 2
  • +
  • Nickname: paired
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_DEVICE_STATE_PAIR_INCOMING
+
+

Pair request received from device.

+
    +
  • Value: 4
  • +
  • Nickname: pair-incoming
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_DEVICE_STATE_PAIR_OUTGOING
+
+

Pair request sent to device.

+
    +
  • Value: 8
  • +
  • Nickname: pair-outgoing
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/flags.MediaActions.html b/documentation/flags.MediaActions.html new file mode 100644 index 00000000000..62994ec2240 --- /dev/null +++ b/documentation/flags.MediaActions.html @@ -0,0 +1,279 @@ + + + + + + Valent.MediaActions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Enumeration

+

ValentMediaActions

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + +

+ +
+
flags Valent.MediaActions
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Media action flags.

+
+ +
+ + +

Available since: 1.0

+ + +
+ + +
+ +
+

+ Members + +

+ +
+
+ +
VALENT_MEDIA_ACTION_NONE
+
+

The player can not be controlled.

+
    +
  • Value: 0
  • +
  • Nickname: none
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_ACTION_PLAY
+
+

Start or resume playback.

+
    +
  • Value: 1
  • +
  • Nickname: play
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_ACTION_PAUSE
+
+

Pause playback.

+
    +
  • Value: 2
  • +
  • Nickname: pause
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_ACTION_STOP
+
+

Stop playback.

+
    +
  • Value: 4
  • +
  • Nickname: stop
  • +
  • Available since: 1.0
  • +
+
+ +
+
+

Next track.

+
    +
  • Value: 8
  • +
  • Nickname: next
  • +
  • Available since: 1.0
  • +
+
+ +
+
+

Previous track.

+
    +
  • Value: 16
  • +
  • Nickname: previous
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_ACTION_SEEK
+
+

Change the playback position.

+
    +
  • Value: 32
  • +
  • Nickname: seek
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_ACTION_RESERVED1
+
+

Reserved.

+
    +
  • Value: 64
  • +
  • Nickname: reserved1
  • +
  • Available since: 1.0
  • +
+
+ +
VALENT_MEDIA_ACTION_RESERVED2
+
+

Reserved.

+
    +
  • Value: 128
  • +
  • Nickname: reserved2
  • +
  • Available since: 1.0
  • +
+
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/fonts.css b/documentation/fonts.css new file mode 100644 index 00000000000..98f2ea45068 --- /dev/null +++ b/documentation/fonts.css @@ -0,0 +1,150 @@ +/* + * SPDX-FileCopyrightText: 2021 GNOME Foundation + * + * SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later + */ + +/** + * RedHat Fonts taken from https://github.com/RedHatOfficial/RedHatFont + * License: SIL Open Font License 1.1 http://scripts.sil.org/OFL + * + * SourceCodePro Fonts + * License: SIL Open Font License 1.1 https://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-Regular'); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-RegularItalic'); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-Medium'); + font-style: normal; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-MediumItalic'); + font-style: italic; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-Bold'); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-BoldItalic'); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-Black'); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplay-BlackItalic'); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatText-Regular'); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatText-Italic'); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatText-Medium'); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatText-MediumItalic'); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatText-Bold'); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatText-BoldItalic'); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local('SourceCodePro-Regular'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: italic; + font-weight: 400; + src: local('SourceCodePro-It'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local('SourceCodePro-Semibold'); + font-display: swap; +} diff --git a/documentation/func.CHECK_VERSION.html b/documentation/func.CHECK_VERSION.html new file mode 100644 index 00000000000..725d8137aca --- /dev/null +++ b/documentation/func.CHECK_VERSION.html @@ -0,0 +1,218 @@ + + + + + + Valent.CHECK_VERSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function Macro

+

ValentCHECK_VERSION

+
+ +
+
+

+
+
+

+ Declaration + + + [src] + +

+ +
+
#define VALENT_CHECK_VERSION (
+  major,
+  minor
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Compile-time version check.

+

Evaluates to TRUE if the API version of libvalent is greater than or equal +to the required one.

+
+ +
+ + + +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
major
+
+

Type: -

+

Required major version.

+ + + + + + + + + + +
+
+ +
minor
+
+

Type: -

+

Required minor version.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.GOTO.html b/documentation/func.GOTO.html new file mode 100644 index 00000000000..a2db1ab5ac2 --- /dev/null +++ b/documentation/func.GOTO.html @@ -0,0 +1,199 @@ + + + + + + Valent.GOTO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function Macro

+

ValentGOTO

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
#define VALENT_GOTO (
+  _l
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Traces the jump to a label in a function. Use this instead of goto to jump +to _l and log the label.

+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
_l
+
+

Type: -

+

The label to jump to.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.JSON.html b/documentation/func.JSON.html new file mode 100644 index 00000000000..80f5e43a4c4 --- /dev/null +++ b/documentation/func.JSON.html @@ -0,0 +1,217 @@ + + + + + + Valent.JSON + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function Macro

+

ValentJSON

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
#define VALENT_JSON (
+  _node,
+  _ctx
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Logs _node as pretty-printed JSON at G_LOG_LEVEL_DEBUG, prefixed with +_ctx for context.

+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
_node
+
+

Type: -

+

A JsonNode

+ + + + + + + + + + +
+
+ +
_ctx
+
+

Type: -

+

A prefix for context.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.NOTE.html b/documentation/func.NOTE.html new file mode 100644 index 00000000000..31ad68be5b5 --- /dev/null +++ b/documentation/func.NOTE.html @@ -0,0 +1,216 @@ + + + + + + Valent.NOTE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function Macro

+

ValentNOTE

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
#define VALENT_NOTE (
+  fmt,
+  ...
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Logs a formatted message at VALENT_LOG_LEVEL_TRACE.

+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
fmt
+
+

Type: -

+

The message format (a la printf())

+ + + + + + + + + + +
+
+ +
...
+
+

Type: -

+

The message parameters.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.RETURN.html b/documentation/func.RETURN.html new file mode 100644 index 00000000000..d6f15a2c1d8 --- /dev/null +++ b/documentation/func.RETURN.html @@ -0,0 +1,199 @@ + + + + + + Valent.RETURN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function Macro

+

ValentRETURN

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
#define VALENT_RETURN (
+  _r
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Traces the exit from a function. Use this instead of return to return _r +and log the function exiting.

+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
_r
+
+

Type: -

+

The return value.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.certificate_get_common_name.html b/documentation/func.certificate_get_common_name.html new file mode 100644 index 00000000000..ca42ce89d5c --- /dev/null +++ b/documentation/func.certificate_get_common_name.html @@ -0,0 +1,226 @@ + + + + + + Valent.certificate_get_common_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcertificate_get_common_name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_certificate_get_common_name (
+  GTlsCertificate* certificate
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the common name from certificate, which by convention in KDE Connect is +the single source of truth for a device’s ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
certificate
+
+

Type: GTlsCertificate

+

A GTlsCertificate

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The certificate ID.

+
+
+ + + + + + + +
The data is owned by the called function.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.certificate_get_fingerprint.html b/documentation/func.certificate_get_fingerprint.html new file mode 100644 index 00000000000..c6452056c18 --- /dev/null +++ b/documentation/func.certificate_get_fingerprint.html @@ -0,0 +1,225 @@ + + + + + + Valent.certificate_get_fingerprint + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcertificate_get_fingerprint

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_certificate_get_fingerprint (
+  GTlsCertificate* certificate
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a SHA256 fingerprint hash of certificate.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
certificate
+
+

Type: GTlsCertificate

+

A GTlsCertificate

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A SHA256 hash.

+
+
+ + + + + + + +
The data is owned by the called function.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.certificate_get_public_key.html b/documentation/func.certificate_get_public_key.html new file mode 100644 index 00000000000..0e69660228d --- /dev/null +++ b/documentation/func.certificate_get_public_key.html @@ -0,0 +1,225 @@ + + + + + + Valent.certificate_get_public_key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcertificate_get_public_key

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
GByteArray*
+valent_certificate_get_public_key (
+  GTlsCertificate* certificate
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the public key of certificate.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
certificate
+
+

Type: GTlsCertificate

+

A GTlsCertificate

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: An array of guint8

+

A DER-encoded publickey.

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.certificate_new.html b/documentation/func.certificate_new.html new file mode 100644 index 00000000000..f8b010bd626 --- /dev/null +++ b/documentation/func.certificate_new.html @@ -0,0 +1,259 @@ + + + + + + Valent.certificate_new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcertificate_new

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_certificate_new (
+  const char* path,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a TLS certificate and private key pair.

+

This ensures a TLS certificate with the filename certificate.pem and +private key with filename private.pem exist in a directory at path.

+

If either one doesn’t exist, a new certificate and private key pair will be +generated. The common name will be set to a string returned by +g_uuid_string_random().

+

Get the result with valent_certificate_new_finish().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
path
+
+

Type: const char*

+

A directory path.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a file system path, using the OS encoding.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.certificate_new_finish.html b/documentation/func.certificate_new_finish.html new file mode 100644 index 00000000000..18f30a72784 --- /dev/null +++ b/documentation/func.certificate_new_finish.html @@ -0,0 +1,240 @@ + + + + + + Valent.certificate_new_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcertificate_new_finish

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
GTlsCertificate*
+valent_certificate_new_finish (
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_certificate_new().

+

If either generating or loading the certificate failed, NULL will be +returned with error set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult provided to callback.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GTlsCertificate

+

A GTlsCertificate

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.certificate_new_sync.html b/documentation/func.certificate_new_sync.html new file mode 100644 index 00000000000..cce3cde13d9 --- /dev/null +++ b/documentation/func.certificate_new_sync.html @@ -0,0 +1,245 @@ + + + + + + Valent.certificate_new_sync + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcertificate_new_sync

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
GTlsCertificate*
+valent_certificate_new_sync (
+  const char* path,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a TLS certificate and private key pair.

+

This ensures a TLS certificate with the filename certificate.pem and +private key with filename private.pem exist in a directory at path.

+

If either one doesn’t exist, a new certificate and private key pair will be +generated. The common name will be set to a string returned by +g_uuid_string_random().

+

If either generating or loading the certificate fails, NULL will be returned +with error set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
path
+
+

Type: const char*

+

A directory path.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a file system path, using the OS encoding.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GTlsCertificate

+

A GTlsCertificate

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.check_version.html b/documentation/func.check_version.html new file mode 100644 index 00000000000..b87bd294b54 --- /dev/null +++ b/documentation/func.check_version.html @@ -0,0 +1,245 @@ + + + + + + Valent.check_version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentcheck_version

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_check_version (
+  unsigned int major,
+  unsigned int minor
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Run-time version check.

+

Evaluates to TRUE if the API version of libvalent is greater than or equal +to the required one.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
major
+
+

Type: unsigned int

+

Required major version.

+ + + + + + + + + + +
+
+ +
minor
+
+

Type: unsigned int

+

Required minor version.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if the requirement is met, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.debug_clear.html b/documentation/func.debug_clear.html new file mode 100644 index 00000000000..5916e7004e9 --- /dev/null +++ b/documentation/func.debug_clear.html @@ -0,0 +1,169 @@ + + + + + + Valent.debug_clear + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentdebug_clear

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_debug_clear (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Shutdown logging for Valent.

+

This should be called after the application stops, which is typically when +the call to g_application_run() returns.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.debug_init.html b/documentation/func.debug_init.html new file mode 100644 index 00000000000..7f190ad3d0b --- /dev/null +++ b/documentation/func.debug_init.html @@ -0,0 +1,174 @@ + + + + + + Valent.debug_init + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentdebug_init

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_debug_init (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Initializes logging for Valent.

+

This should be called before the application starts, which is typically when +g_application_run() is invoked.

+

If VALENT_DEBUG_ENABLE is defined, debugging messages only useful for +development will be printed to the log.

+

If VALENT_TRACE_ENABLE is defined, tracing will be performed at the log +level VALENT_LOG_LEVEL_TRACE. These will be passed to sysprof for profiling, +if available.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_main_thread.html b/documentation/func.get_main_thread.html new file mode 100644 index 00000000000..f5d92d5be75 --- /dev/null +++ b/documentation/func.get_main_thread.html @@ -0,0 +1,195 @@ + + + + + + Valent.get_main_thread + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_main_thread

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
GThread*
+valent_get_main_thread (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the main thread.

+

Use the macro VALENT_IS_MAIN_THREAD() to determine whether or not the code +is currently running on the main thread.

+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GThread

+

A GThread

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_major_version.html b/documentation/func.get_major_version.html new file mode 100644 index 00000000000..26685a19dea --- /dev/null +++ b/documentation/func.get_major_version.html @@ -0,0 +1,194 @@ + + + + + + Valent.get_major_version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_major_version

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
unsigned int
+valent_get_major_version (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the major version component of the Valent library.

+

For example, if the version 1.2 this is 1.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: unsigned int

+

The major version component of libvalent.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_micro_version.html b/documentation/func.get_micro_version.html new file mode 100644 index 00000000000..46f8a4bd2da --- /dev/null +++ b/documentation/func.get_micro_version.html @@ -0,0 +1,194 @@ + + + + + + Valent.get_micro_version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_micro_version

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
unsigned int
+valent_get_micro_version (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the micro version component of the Valent library.

+

For example, if the version 1.2.3 this is 3.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: unsigned int

+

The micro version component of libvalent.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_minor_version.html b/documentation/func.get_minor_version.html new file mode 100644 index 00000000000..9ad824ead9a --- /dev/null +++ b/documentation/func.get_minor_version.html @@ -0,0 +1,194 @@ + + + + + + Valent.get_minor_version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_minor_version

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
unsigned int
+valent_get_minor_version (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the minor version component of the Valent library.

+

For example, if the version 1.2 this is 2.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: unsigned int

+

The minor version component of libvalent.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_plugin_engine.html b/documentation/func.get_plugin_engine.html new file mode 100644 index 00000000000..e2d012e34d4 --- /dev/null +++ b/documentation/func.get_plugin_engine.html @@ -0,0 +1,197 @@ + + + + + + Valent.get_plugin_engine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_plugin_engine

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
PeasEngine*
+valent_get_plugin_engine (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the global PeasEngine.

+

The first call to this function initializes the PeasEngine and adds +resource:///plugins to the search path, where embedded plugins should be +registered. If running in a Flatpak, /app/extensions/lib/valent/plugins +will also be added to the search path for Flatpak extensions.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: PeasEngine

+

A PeasEngine

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_user_directory.html b/documentation/func.get_user_directory.html new file mode 100644 index 00000000000..3dd082c2846 --- /dev/null +++ b/documentation/func.get_user_directory.html @@ -0,0 +1,228 @@ + + + + + + Valent.get_user_directory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_user_directory

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_get_user_directory (
+  GUserDirectory directory
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Returns the full path of a special directory using its logical id.

+

This function is a safe wrapper around g_get_user_special_dir() that +always returns a valid path to an existing directory. The fallback path used +is the return value of g_get_home_dir().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
directory
+
+

Type: GUserDirectory

+

A GUserDirectory

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The path to the specified special directory.

+
+
+ + + + + + + +
The data is owned by the called function.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.get_user_file.html b/documentation/func.get_user_file.html new file mode 100644 index 00000000000..35b33287ff8 --- /dev/null +++ b/documentation/func.get_user_file.html @@ -0,0 +1,264 @@ + + + + + + Valent.get_user_file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentget_user_file

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
GFile*
+valent_get_user_file (
+  const char* dirname,
+  const char* basename,
+  gboolean unique
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience for creating a GFile.

+

If unique is true, the returned file is guaranteed not to exist. If +basename exists in dirname, the resulting file’s name will have a +parenthesized number appended to it (e.g. image.png (2)).

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dirname
+
+

Type: const char*

+

A directory path.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
basename
+
+

Type: const char*

+

A file name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a file system path, using the OS encoding.
+
+ +
unique
+
+

Type: gboolean

+

Whether the resulting filepath should be unique.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GFile

+

A GFile

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_check_field.html b/documentation/func.packet_check_field.html new file mode 100644 index 00000000000..51e4fc95580 --- /dev/null +++ b/documentation/func.packet_check_field.html @@ -0,0 +1,247 @@ + + + + + + Valent.packet_check_field + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_check_field

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_check_field (
+  JsonNode* packet,
+  const char* field
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Check packet for field and return TRUE if present, with two exceptions:

+
    +
  1. If field is a G_TYPE_BOOLEAN, its value is returned
  2. +
  3. If field is a G_TYPE_STRING, FALSE is returned if the string is empty.
  4. +
+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_deserialize.html b/documentation/func.packet_deserialize.html new file mode 100644 index 00000000000..9861be9b92e --- /dev/null +++ b/documentation/func.packet_deserialize.html @@ -0,0 +1,240 @@ + + + + + + Valent.packet_deserialize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_deserialize

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_packet_deserialize (
+  const char* json,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Convenience function that deserializes a KDE Connect packet from a string +with basic validation. If str is empty, this function will return NULL.

+

If parsing or validation fails, error will be set and NULL returned.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
json
+
+

Type: const char*

+

A complete KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_dup_strv.html b/documentation/func.packet_dup_strv.html new file mode 100644 index 00000000000..bfe6cba1940 --- /dev/null +++ b/documentation/func.packet_dup_strv.html @@ -0,0 +1,245 @@ + + + + + + Valent.packet_dup_strv + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_dup_strv

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
GStrv
+valent_packet_dup_strv (
+  JsonNode* packet,
+  const char* field
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and return a newly allocated list of strings.

+

If field is not found, it is not a JsonArray or any of its elements are not +strings, NULL will be returned.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: An array of utf8

+

A list of strings.

+
+
+ + + + + + + +
The array is NULL-terminated.
Each element is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_end.html b/documentation/func.packet_end.html new file mode 100644 index 00000000000..a8c4227f314 --- /dev/null +++ b/documentation/func.packet_end.html @@ -0,0 +1,228 @@ + + + + + + Valent.packet_end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_end

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_packet_end (
+  JsonBuilder** builder
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish a packet created with valent_packet_init().

+

This function closes the body and root objects, then calls +json_builder_get_root(). Then the reference count of builder is +decreased and the pointer is set to NULL, before returning the packet.

+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
builder
+
+

Type: JsonBuilder

+

A pointer to a JsonBuilder

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_error_quark.html b/documentation/func.packet_error_quark.html new file mode 100644 index 00000000000..8ec85f11acf --- /dev/null +++ b/documentation/func.packet_error_quark.html @@ -0,0 +1,189 @@ + + + + + + Valent.packet_error_quark + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_error_quark

+
+ +
+
+

+
+
+

+ Declaration + + +

+ +
+
GQuark
+valent_packet_error_quark (
+  void
+)
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GQuark

+

No description available. +

+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_from_stream.html b/documentation/func.packet_from_stream.html new file mode 100644 index 00000000000..f6f9ff86071 --- /dev/null +++ b/documentation/func.packet_from_stream.html @@ -0,0 +1,279 @@ + + + + + + Valent.packet_from_stream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_from_stream

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_packet_from_stream (
+  GInputStream* stream,
+  gssize max_len,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Read a KDE Connect packet from an input stream.

+

If reading fails or the packet does not conform to the minimum structure of +a KDE Connect packet, NULL will be returned with error set.

+

If max_len is greater than -1, then at most max_len bytes will be read. +If max_len bytes are read without encountering a line-feed character, NULL +will be returned with error set to G_IO_ERROR_MESSAGE_TOO_LARGE.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: GInputStream

+

A GInputStream

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
max_len
+
+

Type: gssize

+

The maximum number bytes to read, or -1 for no limit.

+ + + + + + + + + + +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet, or NULL with error set.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_array.html b/documentation/func.packet_get_array.html new file mode 100644 index 00000000000..47edadc761e --- /dev/null +++ b/documentation/func.packet_get_array.html @@ -0,0 +1,263 @@ + + + + + + Valent.packet_get_array + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_array

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_get_array (
+  JsonNode* packet,
+  const char* field,
+  JsonArray** value
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and assign it to value.

+

If field is not found or it is not a JsonArray, FALSE will be returned and +value will not be set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
value
+
+

Type: JsonArray

+

A JsonArray

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_body.html b/documentation/func.packet_get_body.html new file mode 100644 index 00000000000..6c3c5d34eb9 --- /dev/null +++ b/documentation/func.packet_get_body.html @@ -0,0 +1,225 @@ + + + + + + Valent.packet_get_body + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_body

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonObject*
+valent_packet_get_body (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Convenience function for getting the packet body of a KDE Connect packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonObject

+

A JsonObject

+
+
+ + + + + + + +
The data is owned by the called function.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_boolean.html b/documentation/func.packet_get_boolean.html new file mode 100644 index 00000000000..8eab9254e85 --- /dev/null +++ b/documentation/func.packet_get_boolean.html @@ -0,0 +1,263 @@ + + + + + + Valent.packet_get_boolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_boolean

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_get_boolean (
+  JsonNode* packet,
+  const char* field,
+  gboolean* value
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and assign it to value.

+

If field is not found or it is not a boolean, FALSE will be returned and +value will not be set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
value
+
+

Type: gboolean*

+

A boolean.

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_double.html b/documentation/func.packet_get_double.html new file mode 100644 index 00000000000..766965f01da --- /dev/null +++ b/documentation/func.packet_get_double.html @@ -0,0 +1,263 @@ + + + + + + Valent.packet_get_double + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_double

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_get_double (
+  JsonNode* packet,
+  const char* field,
+  double* value
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and assign it to value.

+

If field is not found or it is not a double, FALSE will be returned and +value will not be set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
value
+
+

Type: double*

+

A double.

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_id.html b/documentation/func.packet_get_id.html new file mode 100644 index 00000000000..334e9b1c285 --- /dev/null +++ b/documentation/func.packet_get_id.html @@ -0,0 +1,225 @@ + + + + + + Valent.packet_get_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_id

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
int64_t
+valent_packet_get_id (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Convenience function for getting the timestamp of a KDE Connect packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: int64_t

+

A UNIX epoch timestamp.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_int.html b/documentation/func.packet_get_int.html new file mode 100644 index 00000000000..c21a4c789ba --- /dev/null +++ b/documentation/func.packet_get_int.html @@ -0,0 +1,263 @@ + + + + + + Valent.packet_get_int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_int

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_get_int (
+  JsonNode* packet,
+  const char* field,
+  int64_t* value
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and assign it to value.

+

If field is not found or it is not an integer, FALSE will be returned and +value will not be set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
value
+
+

Type: int64_t*

+

An int64

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_object.html b/documentation/func.packet_get_object.html new file mode 100644 index 00000000000..b70696d7bb6 --- /dev/null +++ b/documentation/func.packet_get_object.html @@ -0,0 +1,263 @@ + + + + + + Valent.packet_get_object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_object

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_get_object (
+  JsonNode* packet,
+  const char* field,
+  JsonObject** value
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and assign it to value.

+

If field is not found or it is not a JsonObject, FALSE will be returned +and value will not be set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
value
+
+

Type: JsonObject

+

A JsonObject

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_payload_full.html b/documentation/func.packet_get_payload_full.html new file mode 100644 index 00000000000..28d89ac6799 --- /dev/null +++ b/documentation/func.packet_get_payload_full.html @@ -0,0 +1,259 @@ + + + + + + Valent.packet_get_payload_full + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_payload_full

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonObject*
+valent_packet_get_payload_full (
+  JsonNode* packet,
+  goffset* size,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience for retrieving the payloadTransferInfo and payloadSize +fields from packet.

+

If packet is malformed or missing payload information, NULL will be +returned with error set. See valent_packet_has_payload() for validation criteria.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
size
+
+

Type: goffset*

+

The payload size.

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonObject

+

A JsonObject

+
+
+ + + + + + + +
The data is owned by the called function.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_payload_info.html b/documentation/func.packet_get_payload_info.html new file mode 100644 index 00000000000..586e641c19b --- /dev/null +++ b/documentation/func.packet_get_payload_info.html @@ -0,0 +1,225 @@ + + + + + + Valent.packet_get_payload_info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_payload_info

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonObject*
+valent_packet_get_payload_info (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience for retrieve the ‘payloadTransferInfofield frompacket`.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonObject

+

A JsonObject

+
+
+ + + + + + + +
The data is owned by the called function.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_payload_size.html b/documentation/func.packet_get_payload_size.html new file mode 100644 index 00000000000..6b692b0f874 --- /dev/null +++ b/documentation/func.packet_get_payload_size.html @@ -0,0 +1,225 @@ + + + + + + Valent.packet_get_payload_size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_payload_size

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
goffset
+valent_packet_get_payload_size (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the payloadSize field of packet in bytes.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: goffset

+

The payload size.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_string.html b/documentation/func.packet_get_string.html new file mode 100644 index 00000000000..79f3438fb0b --- /dev/null +++ b/documentation/func.packet_get_string.html @@ -0,0 +1,263 @@ + + + + + + Valent.packet_get_string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_string

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_get_string (
+  JsonNode* packet,
+  const char* field,
+  const char** value
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Lookup field in the body of packet and assign it to value.

+

If field is not found or it is not a non-empty string, FALSE will be +returned and value will not be set.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
field
+
+

Type: const char*

+

Field name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
value
+
+

Type: const char**

+

A string.

+ + + + + + + + + + +
The argument will be set by the function.
The argument can be set to NULL by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_get_type.html b/documentation/func.packet_get_type.html new file mode 100644 index 00000000000..576ee112068 --- /dev/null +++ b/documentation/func.packet_get_type.html @@ -0,0 +1,225 @@ + + + + + + Valent.packet_get_type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_get_type

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_packet_get_type (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Convenience function for getting the capability type of a KDE Connect packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A KDE Connect capability.

+
+
+ + + + + + + +
The data is owned by the called function.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_has_payload.html b/documentation/func.packet_has_payload.html new file mode 100644 index 00000000000..438ad6b0093 --- /dev/null +++ b/documentation/func.packet_has_payload.html @@ -0,0 +1,231 @@ + + + + + + Valent.packet_has_payload + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_has_payload

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_has_payload (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Return TRUE if the packet holds valid transfer information. Payload +information is considered invalid in the following cases:

+
    +
  • The payloadSize field is present, but not a G_TYPE_INT64
  • +
  • The payloadTransferInfo field is missing from the root object
  • +
  • The payloadTransferInfo field is not a JSON_NODE_OBJECT.
  • +
+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if packet has a payload.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_init.html b/documentation/func.packet_init.html new file mode 100644 index 00000000000..a413e74f6cd --- /dev/null +++ b/documentation/func.packet_init.html @@ -0,0 +1,228 @@ + + + + + + Valent.packet_init + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_init

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_packet_init (
+  JsonBuilder** builder,
+  const char* type
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Initialize a JsonBuilder and KDE Connect packet.

+

Creates a new JsonBuilder and initializes a packet for type, +leaving the builder in the body object. Call valent_packet_end() +to finish the packet and get the result.

+
g_autoptr (JsonBuilder) builder = NULL;
+g_autoptr (JsonNode) packet = NULL;
+
+valent_packet_init (&builder, "kdeconnect.ping");
+json_builder_set_member_name (builder, "message");
+json_builder_add_string_value (builder, "Ping!");
+packet = valent_packet_end (&builder);
+
+
+ +
+ +

Available since: 1.0

+ +

This function is not directly available to language bindings.

+ + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
builder
+
+

Type: JsonBuilder

+

A location to initialize a JsonBuilder

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
type
+
+

Type: const char*

+

A KDE Connect packet type.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_new.html b/documentation/func.packet_new.html new file mode 100644 index 00000000000..d92ff425002 --- /dev/null +++ b/documentation/func.packet_new.html @@ -0,0 +1,226 @@ + + + + + + Valent.packet_new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_new

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_packet_new (
+  const char* type
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience function for creating a new KDE Connect packet with the type +field set to type.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
type
+
+

Type: const char*

+

A KDE Connect packet type.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_serialize.html b/documentation/func.packet_serialize.html new file mode 100644 index 00000000000..c9bbe5e1852 --- /dev/null +++ b/documentation/func.packet_serialize.html @@ -0,0 +1,226 @@ + + + + + + Valent.packet_serialize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_serialize

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
char*
+valent_packet_serialize (
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Convenience function that updates the timestamp of a packet before returning +a serialized string with newline ending, ready to be written to a stream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A complete KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: char*

+

The serialized packet.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_set_payload_full.html b/documentation/func.packet_set_payload_full.html new file mode 100644 index 00000000000..2e7197288a4 --- /dev/null +++ b/documentation/func.packet_set_payload_full.html @@ -0,0 +1,236 @@ + + + + + + Valent.packet_set_payload_full + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_set_payload_full

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_packet_set_payload_full (
+  JsonNode* packet,
+  JsonObject* info,
+  goffset size
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience method for setting the payloadTransferInfo and payloadSize +fields on packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
info
+
+

Type: JsonObject

+

A JsonObject

+ + + + + + + + + + +
The called function takes ownership of the data, and is responsible for freeing it.
+
+ +
size
+
+

Type: goffset

+

The payload size in bytes.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_set_payload_info.html b/documentation/func.packet_set_payload_info.html new file mode 100644 index 00000000000..423b52fcc59 --- /dev/null +++ b/documentation/func.packet_set_payload_info.html @@ -0,0 +1,217 @@ + + + + + + Valent.packet_set_payload_info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_set_payload_info

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_packet_set_payload_info (
+  JsonNode* packet,
+  JsonObject* info
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience method for setting the payloadTransferInfo field on packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
info
+
+

Type: JsonObject

+

A JsonObject

+ + + + + + + + + + +
The called function takes ownership of the data, and is responsible for freeing it.
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_set_payload_size.html b/documentation/func.packet_set_payload_size.html new file mode 100644 index 00000000000..36b0ea45822 --- /dev/null +++ b/documentation/func.packet_set_payload_size.html @@ -0,0 +1,217 @@ + + + + + + Valent.packet_set_payload_size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_set_payload_size

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_packet_set_payload_size (
+  JsonNode* packet,
+  goffset size
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the payloadSize field of packet to size.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
size
+
+

Type: goffset

+

The payload size in bytes.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_to_stream.html b/documentation/func.packet_to_stream.html new file mode 100644 index 00000000000..9c877549beb --- /dev/null +++ b/documentation/func.packet_to_stream.html @@ -0,0 +1,274 @@ + + + + + + Valent.packet_to_stream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_to_stream

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_to_stream (
+  GOutputStream* stream,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience function for writing a packet to a connection.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: GOutputStream

+

A GOutputStream

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.packet_validate.html b/documentation/func.packet_validate.html new file mode 100644 index 00000000000..57840203d7d --- /dev/null +++ b/documentation/func.packet_validate.html @@ -0,0 +1,238 @@ + + + + + + Valent.packet_validate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentpacket_validate

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_packet_validate (
+  JsonNode* packet,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Check if packet is a well-formed KDE Connect packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if packet is valid, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.string_to_markup.html b/documentation/func.string_to_markup.html new file mode 100644 index 00000000000..cdc19d83f00 --- /dev/null +++ b/documentation/func.string_to_markup.html @@ -0,0 +1,228 @@ + + + + + + Valent.string_to_markup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentstring_to_markup

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
char*
+valent_string_to_markup (
+  const char* text
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Add markup to text for recognized elements.

+

This function currently scans for URLs and e-mail addresses, then amends each +element with anchor tags (<a>).

+

If text is NULL, this function will return NULL.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
text
+
+

Type: const char*

+

Input text.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: char*

+

A string of Pango markup.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.timestamp_ms.html b/documentation/func.timestamp_ms.html new file mode 100644 index 00000000000..418dcdc08b4 --- /dev/null +++ b/documentation/func.timestamp_ms.html @@ -0,0 +1,194 @@ + + + + + + Valent.timestamp_ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valenttimestamp_ms

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
int64_t
+valent_timestamp_ms (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a current UNIX epoch timestamp in milliseconds.

+

This timestamp format is used in several parts of the KDE Connect protocol.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: int64_t

+

A 64-bit timestamp.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.ui_get_resource.html b/documentation/func.ui_get_resource.html new file mode 100644 index 00000000000..6c2f9ce344d --- /dev/null +++ b/documentation/func.ui_get_resource.html @@ -0,0 +1,191 @@ + + + + + + Valent.ui_get_resource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentui_get_resource

+
+ +
+
+

+
+
+

+ Declaration + + + [src] + +

+ +
+
GResource*
+valent_ui_get_resource (
+  void
+)
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GResource

+

No description available. +

+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/func.ui_init.html b/documentation/func.ui_init.html new file mode 100644 index 00000000000..ef89a769786 --- /dev/null +++ b/documentation/func.ui_init.html @@ -0,0 +1,193 @@ + + + + + + Valent.ui_init + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

Valentui_init

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_ui_init (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Initialize Valent’s default user interface.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE on failure.

+
+
+ + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/fzy.js b/documentation/fzy.js new file mode 100644 index 00000000000..89e4666dd6c --- /dev/null +++ b/documentation/fzy.js @@ -0,0 +1,222 @@ +// SPDX-FileCopyrightText: 2014 John Hawthorn +// +// SPDX-License-Identifier: MIT + +window.fzy = (function() { + var SCORE_MIN = -Infinity; + var SCORE_MAX = Infinity; + + var SCORE_GAP_LEADING = -0.005 + var SCORE_GAP_TRAILING = -0.005 + var SCORE_GAP_INNER = -0.01 + var SCORE_MATCH_CONSECUTIVE = 1.0 + var SCORE_MATCH_SLASH = 0.9 + var SCORE_MATCH_WORD = 0.8 + var SCORE_MATCH_CAPITAL = 0.7 + var SCORE_MATCH_DOT = 0.6 + + function islower(s) { + return s.toLowerCase() === s; + } + + function isupper(s) { + return s.toUpperCase() === s; + } + + function precompute_bonus(haystack) { + /* Which positions are beginning of words */ + var m = haystack.length; + var match_bonus = new Array(m); + + var last_ch = '/'; + for (var i = 0; i < m; i++) { + var ch = haystack[i]; + + if (last_ch === '/') { + match_bonus[i] = SCORE_MATCH_SLASH; + } else if (last_ch === '-' || last_ch === '_' || last_ch === ' ') { + match_bonus[i] = SCORE_MATCH_WORD; + } else if (last_ch === '.') { + match_bonus[i] = SCORE_MATCH_DOT; + } else if (islower(last_ch) && isupper(ch)) { + match_bonus[i] = SCORE_MATCH_CAPITAL; + } else { + match_bonus[i] = 0; + } + + last_ch = ch; + } + + return match_bonus; + } + + function compute(needle, haystack, D, M) { + var n = needle.length; + var m = haystack.length; + + var match_bonus = precompute_bonus(haystack, match_bonus); + + /* + * D[][] Stores the best score for this position ending with a match. + * M[][] Stores the best possible score at this position. + */ + + for (var i = 0; i < n; i++) { + D[i] = new Array(m); + M[i] = new Array(m); + + var prev_score = SCORE_MIN; + var gap_score = i === n - 1 ? SCORE_GAP_TRAILING : SCORE_GAP_INNER; + + for (var j = 0; j < m; j++) { + if (needle[i] === haystack[j]) { + var score = SCORE_MIN; + if (!i) { + score = (j * SCORE_GAP_LEADING) + match_bonus[j]; + } else if (j) { /* i > 0 && j > 0*/ + score = Math.max( + M[i - 1][j - 1] + match_bonus[j], + + /* consecutive match, doesn't stack with match_bonus */ + D[i - 1][j - 1] + SCORE_MATCH_CONSECUTIVE); + } + D[i][j] = score; + M[i][j] = prev_score = Math.max(score, prev_score + gap_score); + } else { + D[i][j] = SCORE_MIN; + M[i][j] = prev_score = prev_score + gap_score; + } + } + } + } + + function score(needle, haystack) { + var n = needle.length; + var m = haystack.length; + + if (!n || !m) + return SCORE_MIN; + + if (n === m) { + /* Since this method can only be called with a haystack which + * matches needle. If the lengths of the strings are equal the + * strings themselves must also be equal (ignoring case). + */ + return SCORE_MAX; + } + + if (m > 1024) { + /* + * Unreasonably large candidate: return no score + * If it is a valid match it will still be returned, it will + * just be ranked below any reasonably sized candidates + */ + return SCORE_MIN; + } + + var D = new Array(n); + var M = new Array(n); + + compute(needle, haystack, D, M) + + return M[n - 1][m - 1]; + } + + function positions(needle, haystack) { + var n = needle.length; + var m = haystack.length; + + var positions = new Array(n); + + if (!n || !m) + return positions; + + if (n === m) { + for (var i = 0; i < n; i++) + positions[i] = i; + return positions; + } + + if (m > 1024) { + return positions; + } + + var D = new Array(n); + var M = new Array(n); + + compute(needle, haystack, D, M) + + /* backtrack to find the positions of optimal matching */ + var match_required = false; + + for (var i = n - 1, j = m - 1; i >= 0; i--) { + for (; j >= 0; j--) { + /* + * There may be multiple paths which result in + * the optimal weight. + * + * For simplicity, we will pick the first one + * we encounter, the latest in the candidate + * string. + */ + if (D[i][j] !== SCORE_MIN && + (match_required || D[i][j] === M[i][j])) { + /* If this score was determined using + * SCORE_MATCH_CONSECUTIVE, the + * previous character MUST be a match + */ + match_required = + i && j && + M[i][j] === D[i - 1][j - 1] + SCORE_MATCH_CONSECUTIVE; + positions[i] = j--; + break; + } + } + } + + return positions; + } + + function hasMatch(needle, haystack) { + var l = needle.length + for (var i = 0, j = 0; i < l; i += 1) { + j = haystack.indexOf(needle[i], j) + 1 + if (j === 0) return false + } + return true + } + + function filter(needle, items, selector) { + const isCaseSensitive = needle.toLowerCase() !== needle; + const actualNeedle = isCaseSensitive ? needle : needle.toLowerCase(); + const filteredItems = items.reduce((results, item) => { + const haystack = isCaseSensitive ? selector(item) : selector(item).toLowerCase(); + if (hasMatch(actualNeedle, haystack)) + results.push({ item, score: score(needle, haystack) }) + return results; + }, []) + filteredItems.sort((a, b) => b.score - a.score) + return filteredItems; + } + + return { + /* constants */ + SCORE_MIN, + SCORE_MAX, + + SCORE_GAP_LEADING, + SCORE_GAP_TRAILING, + SCORE_GAP_INNER, + SCORE_MATCH_CONSECUTIVE, + SCORE_MATCH_SLASH, + SCORE_MATCH_WORD, + SCORE_MATCH_CAPITAL, + SCORE_MATCH_DOT, + + /* functions */ + score, + positions, + hasMatch, + filter, + } +})(); diff --git a/documentation/go-up-symbolic.png b/documentation/go-up-symbolic.png new file mode 100644 index 00000000000..a827b9ad259 Binary files /dev/null and b/documentation/go-up-symbolic.png differ diff --git a/documentation/index.html b/documentation/index.html new file mode 100644 index 00000000000..578e96977fe --- /dev/null +++ b/documentation/index.html @@ -0,0 +1,1547 @@ + + + + + + Valent – 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Namespace

+

Valent – 1

+ +
+

Connect, control and sync devices

+
+ +
+ + + + + + +
Version1.0.0.alpha.45
AuthorsAndy Holmes
LicenseGPL-3.0-or-later
Websitehttps://valent.andyholmes.ca/
Sourcehttps://github.com/andyholmes/valent/
+
+ + +
+

Build

+ +
+ + + + + + + +
C headersvalent.h
pkg-config fileslibvalent-1
+
+
+ +
+ + +
+
+

+ Dependencies + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GObject—2.0The base type system library
Browse documentation
EBook—1.2A library for contacts and address books
Browse documentation
Peas—2A GObject-based plugin engine
Browse documentation
+
+
+
+ + + + + +
+
+

+ Additional documentation + +

+ + +
+
+ + + + + +
+
+

+ Classes + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Application +

The primary application class of Valent.

+

unstable since: 1.0

+
ApplicationPlugin +

An abstract base class for application plugins.

+

unstable since: 1.0

+
Channel +

A base class for device connections.

+

unstable since: 1.0

+
ChannelService +

An abstract base class for connection backends.

+

unstable since: 1.0

+
Clipboard +

A class for reading and writing the desktop clipboard.

+

unstable since: 1.0

+
ClipboardAdapter +

An abstract base class for clipboard selections.

+

unstable since: 1.0

+
Component +

An abstract base class for components.

+

unstable since: 1.0

+
Contacts +

A class for managing address books.

+

unstable since: 1.0

+
ContactsAdapter +

An abstract base class for address book providers.

+

unstable since: 1.0

+
ContactStore +

An abstract base class for address books.

+

unstable since: 1.0

+
Context +

A class representing a abstract data context.

+

unstable since: 1.0

+
Device +

A class representing a remote device, such as a smartphone or desktop.

+

unstable since: 1.0

+
DeviceGadget +

An abstract base class for device plugin gadgets.

+

unstable since: 1.0

+
DeviceManager +

A class for discovering and managing devices.

+

unstable since: 1.0

+
DevicePlugin +

An abstract base class for device plugins.

+

unstable since: 1.0

+
DevicePreferencesGroup +

An abstract base class for device plugin preferences.

+

unstable since: 1.0

+
DeviceTransfer +

A class for device file transfers.

+

unstable since: 1.0

+
Extension +

An abstract base class for extensions.

+

unstable since: 1.0

+
Input +

A class for controlling pointer and keyboard devices.

+

unstable since: 1.0

+
InputAdapter +

An abstract base class for virtual input devices.

+

unstable since: 1.0

+
Media +

A class for monitoring and controlling media players.

+

unstable since: 1.0

+
MediaAdapter +

An abstract base class for media player adapters.

+

unstable since: 1.0

+
MediaPlayer +

A base class for media players.

+

unstable since: 1.0

+
Mixer +

A class for monitoring and controlling the system volume.

+

unstable since: 1.0

+
MixerAdapter +

An abstract base class for audio mixers.

+

unstable since: 1.0

+
MixerStream +

A base class for mixer streams.

+

unstable since: 1.0

+
Notification +

A class representing a notification.

+

unstable since: 1.0

+
Notifications +

A class for sending and receiving notifications.

+

unstable since: 1.0

+
NotificationsAdapter +

An abstract base class for notification servers.

+

unstable since: 1.0

+
Object +

A base class for objects.

+

unstable since: 1.0

+
PreferencesPage +

An abstract base class for plugin preferences.

+

unstable since: 1.0

+
Session +

A class for monitoring the session state.

+

unstable since: 1.0

+
SessionAdapter +

An abstract base class for session managers.

+

unstable since: 1.0

+
Transfer +

An abstract base class for data transfers.

+

unstable since: 1.0

+
+
+
+
+ + + + + + +
+
+

+ Enumerations + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MediaRepeat +

Enumeration of loop modes.

+

unstable since: 1.0

+
MediaState +

Media state flags.

+

unstable since: 1.0

+
MixerDirection +

Enumeration of stream directions.

+

unstable since: 1.0

+
PluginState + +

unstable since: 1.0

+
TransferState +

Enumeration of transfer states.

+

unstable since: 1.0

+
+
+
+
+ + +
+
+

+ Bitfields + +

+ +
+ + + + + + + + + + + + + + + + + + +
DeviceState +

Device state flags.

+

unstable since: 1.0

+
MediaActions +

Media action flags.

+

unstable since: 1.0

+
+
+
+
+ + +
+
+

+ Error Domains + +

+ +
+ + + + + + + + + + + +
PacketError +

Error enumeration for KDE Connect packet validation.

+

unstable since: 1.0

+
+
+
+
+ + + +
+
+

+ Functions + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
certificate_get_common_name +

Get the common name from certificate, which by convention in KDE Connect is +the single source of truth for a device’s ID.

+

unstable since: 1.0

+
certificate_get_fingerprint +

Get a SHA256 fingerprint hash of certificate.

+

unstable since: 1.0

+
certificate_get_public_key +

Get the public key of certificate.

+

unstable since: 1.0

+
certificate_new +

Get a TLS certificate and private key pair.

+

unstable since: 1.0

+
certificate_new_finish +

Finish an operation started by valent_certificate_new().

+

unstable since: 1.0

+
certificate_new_sync +

Get a TLS certificate and private key pair.

+

unstable since: 1.0

+
check_version +

Run-time version check.

+

unstable since: 1.0

+
debug_clear +

Shutdown logging for Valent.

+

unstable since: 1.0

+
debug_init +

Initializes logging for Valent.

+

unstable since: 1.0

+
get_main_thread +

Get the main thread.

+

unstable since: 1.0

+
get_major_version +

Get the major version component of the Valent library.

+

unstable since: 1.0

+
get_micro_version +

Get the micro version component of the Valent library.

+

unstable since: 1.0

+
get_minor_version +

Get the minor version component of the Valent library.

+

unstable since: 1.0

+
get_plugin_engine +

Get the global PeasEngine.

+

unstable since: 1.0

+
get_user_directory +

Returns the full path of a special directory using its logical id.

+

unstable since: 1.0

+
get_user_file +

A convenience for creating a GFile.

+

unstable since: 1.0

+
packet_check_field +

Check packet for field and return TRUE if present, with two exceptions:

+

unstable since: 1.0

+
packet_deserialize +

Convenience function that deserializes a KDE Connect packet from a string +with basic validation. If str is empty, this function will return NULL.

+

unstable since: 1.0

+
packet_dup_strv +

Lookup field in the body of packet and return a newly allocated list of strings.

+

unstable since: 1.0

+
packet_end +

Finish a packet created with valent_packet_init().

+

unstable since: 1.0

+
packet_error_quark + +

+
packet_from_stream +

Read a KDE Connect packet from an input stream.

+

unstable since: 1.0

+
packet_get_array +

Lookup field in the body of packet and assign it to value.

+

unstable since: 1.0

+
packet_get_body +

Convenience function for getting the packet body of a KDE Connect packet.

+

unstable since: 1.0

+
packet_get_boolean +

Lookup field in the body of packet and assign it to value.

+

unstable since: 1.0

+
packet_get_double +

Lookup field in the body of packet and assign it to value.

+

unstable since: 1.0

+
packet_get_id +

Convenience function for getting the timestamp of a KDE Connect packet.

+

unstable since: 1.0

+
packet_get_int +

Lookup field in the body of packet and assign it to value.

+

unstable since: 1.0

+
packet_get_object +

Lookup field in the body of packet and assign it to value.

+

unstable since: 1.0

+
packet_get_payload_full +

A convenience for retrieving the payloadTransferInfo and payloadSize +fields from packet.

+

unstable since: 1.0

+
packet_get_payload_info +

A convenience for retrieve the ‘payloadTransferInfofield frompacket`.

+

unstable since: 1.0

+
packet_get_payload_size +

Get the payloadSize field of packet in bytes.

+

unstable since: 1.0

+
packet_get_string +

Lookup field in the body of packet and assign it to value.

+

unstable since: 1.0

+
packet_get_type +

Convenience function for getting the capability type of a KDE Connect packet.

+

unstable since: 1.0

+
packet_has_payload +

Return TRUE if the packet holds valid transfer information. Payload +information is considered invalid in the following cases:

+

unstable since: 1.0

+
packet_init +

Initialize a JsonBuilder and KDE Connect packet.

+

unstable since: 1.0

+
packet_new +

A convenience function for creating a new KDE Connect packet with the type +field set to type.

+

unstable since: 1.0

+
packet_serialize +

Convenience function that updates the timestamp of a packet before returning +a serialized string with newline ending, ready to be written to a stream.

+

unstable since: 1.0

+
packet_set_payload_full +

A convenience method for setting the payloadTransferInfo and payloadSize +fields on packet.

+

unstable since: 1.0

+
packet_set_payload_info +

A convenience method for setting the payloadTransferInfo field on packet.

+

unstable since: 1.0

+
packet_set_payload_size +

Set the payloadSize field of packet to size.

+

unstable since: 1.0

+
packet_to_stream +

A convenience function for writing a packet to a connection.

+

unstable since: 1.0

+
packet_validate +

Check if packet is a well-formed KDE Connect packet.

+

unstable since: 1.0

+
string_to_markup +

Add markup to text for recognized elements.

+

unstable since: 1.0

+
timestamp_ms +

Get a current UNIX epoch timestamp in milliseconds.

+

unstable since: 1.0

+
ui_get_resource + +

+
ui_init +

Initialize Valent’s default user interface.

+

unstable since: 1.0

+
+
+
+
+ + +
+
+

+ Function Macros + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CHECK_VERSION +

Compile-time version check.

+

+
GOTO +

Traces the jump to a label in a function. Use this instead of goto to jump +to _l and log the label.

+

unstable since: 1.0

+
JSON +

Logs _node as pretty-printed JSON at G_LOG_LEVEL_DEBUG, prefixed with +_ctx for context.

+

unstable since: 1.0

+
NOTE +

Logs a formatted message at VALENT_LOG_LEVEL_TRACE.

+

unstable since: 1.0

+
RETURN +

Traces the exit from a function. Use this instead of return to return _r +and log the function exiting.

+

unstable since: 1.0

+
+
+
+
+ + +
+
+

+ Constants + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
API_VERSION +

The API version of libvalent, encoded as a string (eg. "1.0").

+

+
ENABLE_DEBUG +

Whether debugging is enabled.

+

+
ENABLE_TRACE +

Whether tracing is enabled.

+

+
LOG_LEVEL_TRACE +

The Glib.GLogLevelFlags log level for trace messages in Valent.

+

+
MAJOR_VERSION +

The major version component of libvalent (e.g. 1 if for 1.2.3)

+

+
MICRO_VERSION +

The micro version component of libvalent (e.g. 3 if for 1.2.3)

+

+
MINOR_VERSION +

The minor version component of libvalent (e.g. 2 if for 1.2.3)

+

+
POINTER_MIDDLE +

The middle button.

+

+
POINTER_PRIMARY +

The primary button.

+

+
POINTER_SECONDARY +

The primary button.

+

+
VCS_TAG + +

+
VERSION +

The full version of libvalent, encoded as a string (eg. "1.0.0.alpha").

+

+
+
+
+
+ +
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/index.json b/documentation/index.json new file mode 100644 index 00000000000..7b98b2da20c --- /dev/null +++ b/documentation/index.json @@ -0,0 +1 @@ +{"meta":{"ns":"Valent","version":"1","generator":"gi-docgen","generator-version":"2023.3"},"symbols":[{"type":"bitfield","name":"DeviceState","ctype":"ValentDeviceState","summary":"Device state flags.","deprecated":null},{"type":"bitfield","name":"MediaActions","ctype":"ValentMediaActions","summary":"Media action flags.","deprecated":null},{"type":"class","name":"Application","ctype":"ValentApplication","summary":"The primary application class of Valent. `ValentApplication` is the primary application class for Valent.","deprecated":null},{"type":"class","name":"ApplicationPlugin","ctype":"ValentApplicationPlugin","summary":"An abstract base class for application plugins. `ValentApplicationPlugin` is a base class for plugins that operate in the ...","deprecated":null},{"type":"class","name":"Channel","ctype":"ValentChannel","summary":"A base class for device connections. `ValentChannel` is a base class for the primary communication channel in Valent. ...","deprecated":null},{"type":"class","name":"ChannelService","ctype":"ValentChannelService","summary":"An abstract base class for connection backends. `ValentChannelService` is a base class for plugins that implement an interface ...","deprecated":null},{"type":"class","name":"Clipboard","ctype":"ValentClipboard","summary":"A class for reading and writing the desktop clipboard. `ValentClipboard` is an abstraction of clipboard selections, intended for ...","deprecated":null},{"type":"class","name":"ClipboardAdapter","ctype":"ValentClipboardAdapter","summary":"An abstract base class for clipboard selections. `ValentClipboardAdapter` is a base class for plugins that provide an interface ...","deprecated":null},{"type":"class","name":"Component","ctype":"ValentComponent","summary":"An abstract base class for components. `ValentComponent` is a base class for session and system components, such as ...","deprecated":null},{"type":"class","name":"ContactStore","ctype":"ValentContactStore","summary":"An abstract base class for address books. `ValentContactStore` is a base class to provide an interface to an ...","deprecated":null},{"type":"class","name":"Contacts","ctype":"ValentContacts","summary":"A class for managing address books. `ValentContacts` is an address book manager, intended for use by [class@Valent.DevicePlugin] implementations. ...","deprecated":null},{"type":"class","name":"ContactsAdapter","ctype":"ValentContactsAdapter","summary":"An abstract base class for address book providers. `ValentContactsAdapter` is a base class for plugins that provide an ...","deprecated":null},{"type":"class","name":"Context","ctype":"ValentContext","summary":"A class representing a abstract data context. `ValentContext` is an abstraction of a data context, with a loose ...","deprecated":null},{"type":"class","name":"Device","ctype":"ValentDevice","summary":"A class representing a remote device, such as a smartphone or desktop. Device functionality is limited to pairing ...","deprecated":null},{"type":"class","name":"DeviceGadget","ctype":"ValentDeviceGadget","summary":"An abstract base class for device plugin gadgets. `ValentDeviceGadget` is an base class for [class@Valent.DevicePlugin] implementations that want ...","deprecated":null},{"type":"class","name":"DeviceManager","ctype":"ValentDeviceManager","summary":"A class for discovering and managing devices. `ValentDeviceManager` manages the available [class@Valent.Device] objects, connecting them when [signal@Valent.ChannelService::channel] is ...","deprecated":null},{"type":"class","name":"DevicePlugin","ctype":"ValentDevicePlugin","summary":"An abstract base class for device plugins. `ValentDevicePlugin` is a base class for plugins that operate in the ...","deprecated":null},{"type":"class","name":"DevicePreferencesGroup","ctype":"ValentDevicePreferencesGroup","summary":"An abstract base class for device plugin preferences. `ValentDevicePreferencesGroup` is a base class for [class@Valent.DevicePlugin] implementations that want ...","deprecated":null},{"type":"class","name":"DeviceTransfer","ctype":"ValentDeviceTransfer","summary":"A class for device file transfers. `ValentDeviceTransfer` is an implementation of [class@Valent.Transfer] for the common case of transferring ...","deprecated":null},{"type":"class","name":"Extension","ctype":"ValentExtension","summary":"An abstract base class for extensions. `ValentExtension` is a base class for extensions with conveniences for [iface@Gio.Action], [class@Gio.Settings] ...","deprecated":null},{"type":"class","name":"Input","ctype":"ValentInput","summary":"A class for controlling pointer and keyboard devices. `ValentInput` is an abstraction of virtual input devices, intended for ...","deprecated":null},{"type":"class","name":"InputAdapter","ctype":"ValentInputAdapter","summary":"An abstract base class for virtual input devices. `ValentInputAdapter` is a base class for plugins that provide an ...","deprecated":null},{"type":"class","name":"Media","ctype":"ValentMedia","summary":"A class for monitoring and controlling media players. `ValentMedia` is an aggregator of media players, intended for use ...","deprecated":null},{"type":"class","name":"MediaAdapter","ctype":"ValentMediaAdapter","summary":"An abstract base class for media player adapters. `ValentMediaAdapter` is a base class for plugins that provide an ...","deprecated":null},{"type":"class","name":"MediaPlayer","ctype":"ValentMediaPlayer","summary":"A base class for media players. A `ValentMediaPlayer` is a base class for plugins to providing an interface ...","deprecated":null},{"type":"class","name":"Mixer","ctype":"ValentMixer","summary":"A class for monitoring and controlling the system volume. `ValentMixer` is an abstraction of volume mixers, intended for ...","deprecated":null},{"type":"class","name":"MixerAdapter","ctype":"ValentMixerAdapter","summary":"An abstract base class for audio mixers. `ValentMixerAdapter` is a base class for plugins that provide an interface ...","deprecated":null},{"type":"class","name":"MixerStream","ctype":"ValentMixerStream","summary":"A base class for mixer streams. `ValentMixerStream` is a base class for mixer streams, intended for use by ...","deprecated":null},{"type":"class","name":"Notification","ctype":"ValentNotification","summary":"A class representing a notification. `ValentNotification` is a derivable, generic class for a notification.","deprecated":null},{"type":"class","name":"Notifications","ctype":"ValentNotifications","summary":"A class for sending and receiving notifications. `ValentNotifications` is an aggregator of notifications, intended for use by [class@Valent.DevicePlugin] ...","deprecated":null},{"type":"class","name":"NotificationsAdapter","ctype":"ValentNotificationsAdapter","summary":"An abstract base class for notification servers. `ValentNotificationsAdapter` is a base class for notification servers. This usually means ...","deprecated":null},{"type":"class","name":"Object","ctype":"ValentObject","summary":"A base class for objects. `ValentObject` is a specialized `GObject` class, based on GNOME Builder's `IdeObject`. It provides ...","deprecated":null},{"type":"class","name":"PreferencesPage","ctype":"ValentPreferencesPage","summary":"An abstract base class for plugin preferences. `ValentPreferencesPage` is a base class for plugins that want to provide ...","deprecated":null},{"type":"class","name":"Session","ctype":"ValentSession","summary":"A class for monitoring the session state. `ValentSession` is an abstraction of session managers, intended for use by ...","deprecated":null},{"type":"class","name":"SessionAdapter","ctype":"ValentSessionAdapter","summary":"An abstract base class for session managers. `ValentSessionAdapter` is a base class for plugins that provide an interface ...","deprecated":null},{"type":"class","name":"Transfer","ctype":"ValentTransfer","summary":"An abstract base class for data transfers. `ValentTransfer` is a generic class for transfers.","deprecated":null},{"type":"constant","name":"API_VERSION","ident":"VALENT_API_VERSION","summary":"The API version of libvalent, encoded as a string (eg. `\"1.0\"`).","deprecated":null},{"type":"constant","name":"ENABLE_DEBUG","ident":"VALENT_ENABLE_DEBUG","summary":"Whether debugging is enabled. If %TRUE, the macros for debugging will write messages to the log that are ...","deprecated":null},{"type":"constant","name":"ENABLE_TRACE","ident":"VALENT_ENABLE_TRACE","summary":"Whether tracing is enabled. If %TRUE, the macros for tracing function entry, exit and jump labels will write ...","deprecated":null},{"type":"constant","name":"LOG_LEVEL_TRACE","ident":"VALENT_LOG_LEVEL_TRACE","summary":"The [flags@Glib.GLogLevelFlags] log level for trace messages in Valent.","deprecated":null},{"type":"constant","name":"MAJOR_VERSION","ident":"VALENT_MAJOR_VERSION","summary":"The major version component of libvalent (e.g. `1` if for `1.2.3`)","deprecated":null},{"type":"constant","name":"MICRO_VERSION","ident":"VALENT_MICRO_VERSION","summary":"The micro version component of libvalent (e.g. `3` if for `1.2.3`)","deprecated":null},{"type":"constant","name":"MINOR_VERSION","ident":"VALENT_MINOR_VERSION","summary":"The minor version component of libvalent (e.g. `2` if for `1.2.3`)","deprecated":null},{"type":"constant","name":"POINTER_MIDDLE","ident":"VALENT_POINTER_MIDDLE","summary":"The middle button. This is typically the button activated when the mouse wheel is pressed.","deprecated":null},{"type":"constant","name":"POINTER_PRIMARY","ident":"VALENT_POINTER_PRIMARY","summary":"The primary button. This is typically the left mouse button, or the right button in a left-handed setup.","deprecated":null},{"type":"constant","name":"POINTER_SECONDARY","ident":"VALENT_POINTER_SECONDARY","summary":"The primary button. This is typically the right mouse button, or the left button in a left-handed setup.","deprecated":null},{"type":"constant","name":"VCS_TAG","ident":"VALENT_VCS_TAG","summary":"No description available.","deprecated":null},{"type":"constant","name":"VERSION","ident":"VALENT_VERSION","summary":"The full version of libvalent, encoded as a string (eg. `\"1.0.0.alpha\"`).","deprecated":null},{"type":"content","name":"Protocol Reference","href":"protocol.html","summary":" # Protocol Reference This reference is generated from JSON Schemas used in the testing and development of ..."},{"type":"ctor","name":"new","type_name":"Device","ident":"valent_device_new","summary":"Create a new device for @id.","deprecated":null},{"type":"ctor","name":"new","type_name":"DeviceTransfer","ident":"valent_device_transfer_new","summary":"A convenience for creating a simple file transfer.","deprecated":null},{"type":"ctor","name":"new","type_name":"Notification","ident":"valent_notification_new","summary":"Create a new `ValentNotification`. A notification without a title (or primary text) is not strictly possible, but this ...","deprecated":null},{"type":"domain","name":"PacketError","ctype":"ValentPacketError","summary":"Error enumeration for KDE Connect packet validation. This enumeration can be extended at later date","deprecated":null},{"type":"enum","name":"MediaRepeat","ctype":"ValentMediaRepeat","summary":"Enumeration of loop modes.","deprecated":null},{"type":"enum","name":"MediaState","ctype":"ValentMediaState","summary":"Media state flags.","deprecated":null},{"type":"enum","name":"MixerDirection","ctype":"ValentMixerDirection","summary":"Enumeration of stream directions.","deprecated":null},{"type":"enum","name":"PluginState","ctype":"ValentPluginState","summary":"No description available.","deprecated":null},{"type":"enum","name":"TransferState","ctype":"ValentTransferState","summary":"Enumeration of transfer states.","deprecated":null},{"type":"function","name":"certificate_get_common_name","ident":"valent_certificate_get_common_name","summary":"Get the common name from @certificate, which by convention in KDE Connect is the single source of truth for ...","deprecated":null},{"type":"function","name":"certificate_get_fingerprint","ident":"valent_certificate_get_fingerprint","summary":"Get a SHA256 fingerprint hash of @certificate.","deprecated":null},{"type":"function","name":"certificate_get_public_key","ident":"valent_certificate_get_public_key","summary":"Get the public key of @certificate.","deprecated":null},{"type":"function","name":"certificate_new","ident":"valent_certificate_new","summary":"Get a TLS certificate and private key pair. This ensures a TLS certificate with the filename `certificate.pem` and ...","deprecated":null},{"type":"function","name":"certificate_new_finish","ident":"valent_certificate_new_finish","summary":"Finish an operation started by [func@Valent.certificate_new]. If either generating or loading the certificate failed, %NULL will be returned ...","deprecated":null},{"type":"function","name":"certificate_new_sync","ident":"valent_certificate_new_sync","summary":"Get a TLS certificate and private key pair. This ensures a TLS certificate with the filename `certificate.pem` and ...","deprecated":null},{"type":"function","name":"check_version","ident":"valent_check_version","summary":"Run-time version check. Evaluates to %TRUE if the API version of libvalent is greater than or equal to ...","deprecated":null},{"type":"function","name":"debug_clear","ident":"valent_debug_clear","summary":"Shutdown logging for Valent. This should be called after the application stops, which is typically when the call ...","deprecated":null},{"type":"function","name":"debug_init","ident":"valent_debug_init","summary":"Initializes logging for Valent. This should be called before the application starts, which is typically when [method@Gio.Application.run] is ...","deprecated":null},{"type":"function","name":"get_main_thread","ident":"valent_get_main_thread","summary":"Get the main thread. Use the macro `VALENT_IS_MAIN_THREAD()` to determine whether or not the code is currently running ...","deprecated":null},{"type":"function","name":"get_major_version","ident":"valent_get_major_version","summary":"Get the major version component of the Valent library. For example, if the version `1.2` this is `1`.","deprecated":null},{"type":"function","name":"get_micro_version","ident":"valent_get_micro_version","summary":"Get the micro version component of the Valent library. For example, if the version `1.2.3` this is `3`.","deprecated":null},{"type":"function","name":"get_minor_version","ident":"valent_get_minor_version","summary":"Get the minor version component of the Valent library. For example, if the version `1.2` this is `2`.","deprecated":null},{"type":"function","name":"get_plugin_engine","ident":"valent_get_plugin_engine","summary":"Get the global `PeasEngine`. The first call to this function initializes the `PeasEngine` and adds `resource:///plugins` to the ...","deprecated":null},{"type":"function","name":"get_user_directory","ident":"valent_get_user_directory","summary":"Returns the full path of a special directory using its logical id. This function is a safe wrapper ...","deprecated":null},{"type":"function","name":"get_user_file","ident":"valent_get_user_file","summary":"A convenience for creating a [iface@Gio.File]. If @unique is true, the returned file is guaranteed not to exist. ...","deprecated":null},{"type":"function","name":"packet_check_field","ident":"valent_packet_check_field","summary":"Check @packet for @field and return %TRUE if present, with two exceptions: 1. If @field is a %G_TYPE_BOOLEAN, ...","deprecated":null},{"type":"function","name":"packet_deserialize","ident":"valent_packet_deserialize","summary":"Convenience function that deserializes a KDE Connect packet from a string with basic validation. If @str is empty, this ...","deprecated":null},{"type":"function","name":"packet_dup_strv","ident":"valent_packet_dup_strv","summary":"Lookup @field in the body of @packet and return a newly allocated list of strings. If @field is ...","deprecated":null},{"type":"function","name":"packet_end","ident":"valent_packet_end","summary":"Finish a packet created with [func@Valent.packet_init]. This function closes the `body` and root objects, then calls [method@Json.Builder.get_root]. Then ...","deprecated":null},{"type":"function","name":"packet_error_quark","ident":"valent_packet_error_quark","summary":"No description available.","deprecated":null},{"type":"function","name":"packet_from_stream","ident":"valent_packet_from_stream","summary":"Read a KDE Connect packet from an input stream. If reading fails or the packet does not conform ...","deprecated":null},{"type":"function","name":"packet_get_array","ident":"valent_packet_get_array","summary":"Lookup @field in the body of @packet and assign it to @value. If @field is not found or ...","deprecated":null},{"type":"function","name":"packet_get_body","ident":"valent_packet_get_body","summary":"Convenience function for getting the packet body of a KDE Connect packet.","deprecated":null},{"type":"function","name":"packet_get_boolean","ident":"valent_packet_get_boolean","summary":"Lookup @field in the body of @packet and assign it to @value. If @field is not found or ...","deprecated":null},{"type":"function","name":"packet_get_double","ident":"valent_packet_get_double","summary":"Lookup @field in the body of @packet and assign it to @value. If @field is not found or ...","deprecated":null},{"type":"function","name":"packet_get_id","ident":"valent_packet_get_id","summary":"Convenience function for getting the timestamp of a KDE Connect packet.","deprecated":null},{"type":"function","name":"packet_get_int","ident":"valent_packet_get_int","summary":"Lookup @field in the body of @packet and assign it to @value. If @field is not found or ...","deprecated":null},{"type":"function","name":"packet_get_object","ident":"valent_packet_get_object","summary":"Lookup @field in the body of @packet and assign it to @value. If @field is not found or ...","deprecated":null},{"type":"function","name":"packet_get_payload_full","ident":"valent_packet_get_payload_full","summary":"A convenience for retrieving the `payloadTransferInfo` and `payloadSize` fields from @packet. If @packet is malformed or missing payload ...","deprecated":null},{"type":"function","name":"packet_get_payload_info","ident":"valent_packet_get_payload_info","summary":"A convenience for retrieve the 'payloadTransferInfo` field from @packet.","deprecated":null},{"type":"function","name":"packet_get_payload_size","ident":"valent_packet_get_payload_size","summary":"Get the `payloadSize` field of @packet in bytes.","deprecated":null},{"type":"function","name":"packet_get_string","ident":"valent_packet_get_string","summary":"Lookup @field in the body of @packet and assign it to @value. If @field is not found or ...","deprecated":null},{"type":"function","name":"packet_get_type","ident":"valent_packet_get_type","summary":"Convenience function for getting the capability type of a KDE Connect packet.","deprecated":null},{"type":"function","name":"packet_has_payload","ident":"valent_packet_has_payload","summary":"Return %TRUE if the packet holds valid transfer information. Payload information is considered invalid in the following cases: ...","deprecated":null},{"type":"function","name":"packet_init","ident":"valent_packet_init","summary":"Initialize a [class@Json.Builder] and KDE Connect packet. Creates a new [class@Json.Builder] and initializes a packet for @type, leaving ...","deprecated":null},{"type":"function","name":"packet_new","ident":"valent_packet_new","summary":"A convenience function for creating a new KDE Connect packet with the type field set to @type.","deprecated":null},{"type":"function","name":"packet_serialize","ident":"valent_packet_serialize","summary":"Convenience function that updates the timestamp of a packet before returning a serialized string with newline ending, ready to ...","deprecated":null},{"type":"function","name":"packet_set_payload_full","ident":"valent_packet_set_payload_full","summary":"A convenience method for setting the `payloadTransferInfo` and `payloadSize` fields on @packet.","deprecated":null},{"type":"function","name":"packet_set_payload_info","ident":"valent_packet_set_payload_info","summary":"A convenience method for setting the `payloadTransferInfo` field on @packet.","deprecated":null},{"type":"function","name":"packet_set_payload_size","ident":"valent_packet_set_payload_size","summary":"Set the `payloadSize` field of @packet to @size.","deprecated":null},{"type":"function","name":"packet_to_stream","ident":"valent_packet_to_stream","summary":"A convenience function for writing a packet to a connection.","deprecated":null},{"type":"function","name":"packet_validate","ident":"valent_packet_validate","summary":"Check if @packet is a well-formed KDE Connect packet.","deprecated":null},{"type":"function","name":"string_to_markup","ident":"valent_string_to_markup","summary":"Add markup to text for recognized elements. This function currently scans for URLs and e-mail addresses, then amends ...","deprecated":null},{"type":"function","name":"timestamp_ms","ident":"valent_timestamp_ms","summary":"Get a current UNIX epoch timestamp in milliseconds. This timestamp format is used in several parts of the ...","deprecated":null},{"type":"function","name":"ui_get_resource","ident":"valent_ui_get_resource","summary":"No description available.","deprecated":null},{"type":"function","name":"ui_init","ident":"valent_ui_init","summary":"Initialize Valent's default user interface.","deprecated":null},{"type":"function_macro","name":"CHECK_VERSION","ident":"VALENT_CHECK_VERSION","summary":"Compile-time version check. Evaluates to %TRUE if the API version of libvalent is greater than or equal to ...","deprecated":null},{"type":"function_macro","name":"GOTO","ident":"VALENT_GOTO","summary":"Traces the jump to a label in a function. Use this instead of `goto` to jump to @_l and ...","deprecated":null},{"type":"function_macro","name":"JSON","ident":"VALENT_JSON","summary":"Logs @_node as pretty-printed JSON at %G_LOG_LEVEL_DEBUG, prefixed with @_ctx for context.","deprecated":null},{"type":"function_macro","name":"NOTE","ident":"VALENT_NOTE","summary":"Logs a formatted message at %VALENT_LOG_LEVEL_TRACE.","deprecated":null},{"type":"function_macro","name":"RETURN","ident":"VALENT_RETURN","summary":"Traces the exit from a function. Use this instead of `return` to return @_r and log the function exiting.","deprecated":null},{"type":"method","name":"activate","type_name":"ApplicationPlugin","ident":"valent_application_plugin_activate","summary":"Handle activation of the application. Implementations should override this method to handle activation, as a result of [signal@Gio.Application::activate] ...","deprecated":null},{"type":"method","name":"add_button","type_name":"Notification","ident":"valent_notification_add_button","summary":"Add a notification button.","deprecated":null},{"type":"method","name":"add_button_with_target","type_name":"Notification","ident":"valent_notification_add_button_with_target","summary":"Add a notification button.","deprecated":null},{"type":"method","name":"add_contact","type_name":"ContactStore","ident":"valent_contact_store_add_contact","summary":"A convenience wrapper around [method@Valent.ContactStore.add_contacts] for adding a single contact. Call [method@Valent.ContactStore.add_contacts_finish] to get the result.","deprecated":null},{"type":"method","name":"add_contacts","type_name":"ContactStore","ident":"valent_contact_store_add_contacts","summary":"Add @contacts to @store. Call [method@Valent.ContactStore.add_contacts_finish] to get the result.","deprecated":null},{"type":"method","name":"add_contacts_finish","type_name":"ContactStore","ident":"valent_contact_store_add_contacts_finish","summary":"Finish an operation started by [method@Valent.ContactStore.add_contact] or [method@Valent.ContactStore.add_contacts].","deprecated":null},{"type":"method","name":"add_notification","type_name":"NotificationsAdapter","ident":"valent_notifications_adapter_add_notification","summary":"Send @notification to the @adapter.","deprecated":null},{"type":"method","name":"build_identity","type_name":"ChannelService","ident":"valent_channel_service_build_identity","summary":"Rebuild the local KDE Connect identity packet. This method is called to rebuild the identity packet used to ...","deprecated":null},{"type":"method","name":"cancel","type_name":"Transfer","ident":"valent_transfer_cancel","summary":"Cancel the transfer operation. If this is called before [method@Valent.Transfer.execute] the transfer will fail unconditionally.","deprecated":null},{"type":"method","name":"chain_cancellable","type_name":"Object","ident":"valent_object_chain_cancellable","summary":"Chain a cancellable to the object's cancellable. This connects @cancellable to @objects's [signal@Gio.Cancellable::cancelled] so that if @object is ...","deprecated":null},{"type":"method","name":"changed","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_changed","summary":"Emits [signal@Valent.ClipboardAdapter::changed] signal on @adapter. The default handler for this signal updates the value returned by the default ...","deprecated":null},{"type":"method","name":"channel","type_name":"ChannelService","ident":"valent_channel_service_channel","summary":"Emit [signal@Valent.ChannelService::channel] on @service. This method should only be called by implementations of [class@Valent.ChannelService].","deprecated":null},{"type":"method","name":"check_status","type_name":"Transfer","ident":"valent_transfer_check_status","summary":"Check the transfer status. Returns %TRUE if the transfer operation is in progress or completed successfully. Returns %FALSE ...","deprecated":null},{"type":"method","name":"clear","type_name":"Context","ident":"valent_context_clear","summary":"Clear cache and configuration data. The method will remove all files in the cache and configuration directories.","deprecated":null},{"type":"method","name":"clear_cache","type_name":"Context","ident":"valent_context_clear_cache","summary":"Clear cache data. The method will remove all files in the cache directory.","deprecated":null},{"type":"method","name":"close","type_name":"Channel","ident":"valent_channel_close","summary":"Close the channel.","deprecated":null},{"type":"method","name":"close_async","type_name":"Channel","ident":"valent_channel_close_async","summary":"Close the channel asynchronously. Call [method@Valent.Channel.close_finish] to get the result.","deprecated":null},{"type":"method","name":"close_finish","type_name":"Channel","ident":"valent_channel_close_finish","summary":"Finish an operation started by [method@Valent.Channel.close_async].","deprecated":null},{"type":"method","name":"command_line","type_name":"ApplicationPlugin","ident":"valent_application_plugin_command_line","summary":"Handle the given command-line options. Implementations should override this method to handle command-line options, as a result of ...","deprecated":null},{"type":"method","name":"contact_added","type_name":"ContactStore","ident":"valent_contact_store_contact_added","summary":"Emits [signal@Valent.ContactStore::contact-added] signal on @store. This method should only be called by implementations of [class@Valent.ContactStore]. Signal handlers may ...","deprecated":null},{"type":"method","name":"contact_removed","type_name":"ContactStore","ident":"valent_contact_store_contact_removed","summary":"Emits [signal@Valent.ContactStore::contact-removed] on @store. This method should only be called by implementations of [class@Valent.ContactStore]. Signal handlers may query ...","deprecated":null},{"type":"method","name":"create_settings","type_name":"Context","ident":"valent_context_create_settings","summary":"Create a [class@Gio.Settings] object. This is a simple wrapper around [ctor@Gio.Settings.new_full] that creates a `GSettings` object for the ...","deprecated":null},{"type":"method","name":"dbus_register","type_name":"ApplicationPlugin","ident":"valent_application_plugin_dbus_register","summary":"Handle the D-Bus registration phase of the application. Implementations may override this method to export extra objects on ...","deprecated":null},{"type":"method","name":"dbus_unregister","type_name":"ApplicationPlugin","ident":"valent_application_plugin_dbus_unregister","summary":"Handle the D-Bus unregistration phase of the application. Implementations should override this method to unexport anything exported in [vfunc@Valent.ApplicationPlugin.dbus_register].","deprecated":null},{"type":"method","name":"destroy","type_name":"Object","ident":"valent_object_destroy","summary":"Destroy the object. If called from the main thread, it calls [method@GObject.Object.run_dispose], which activates the object [class@Gio.Cancellable] and ...","deprecated":null},{"type":"method","name":"download","type_name":"Channel","ident":"valent_channel_download","summary":"Open an auxiliary connection, usually to download data. Implementations should use information from the `payloadTransferInfo` field to open ...","deprecated":null},{"type":"method","name":"download_async","type_name":"Channel","ident":"valent_channel_download_async","summary":"Open an auxiliary connection, usually to download data. This is a non-blocking variant of [method@Valent.Channel.download]. Call [method@Valent.Channel.download_finish] to ...","deprecated":null},{"type":"method","name":"download_finish","type_name":"Channel","ident":"valent_channel_download_finish","summary":"Finish an operation started with [method@Valent.Channel.download_async].","deprecated":null},{"type":"method","name":"dup_id","type_name":"ChannelService","ident":"valent_channel_service_dup_id","summary":"Get the local ID.","deprecated":null},{"type":"method","name":"dup_id","type_name":"Transfer","ident":"valent_transfer_dup_id","summary":"Get the transfer ID.","deprecated":null},{"type":"method","name":"ensure_store","type_name":"Contacts","ident":"valent_contacts_ensure_store","summary":"Get a `ValentContactStore` for @uid. If the contact store does not exist, one will be created using the ...","deprecated":null},{"type":"method","name":"equal","type_name":"Notification","ident":"valent_notification_equal","summary":"Compare two notifications for equality by ID.","deprecated":null},{"type":"method","name":"execute","type_name":"Transfer","ident":"valent_transfer_execute","summary":"Start the transfer operation. Get the result with [method@Valent.Transfer.execute_finish]. If the transfer operation has already started, this ...","deprecated":null},{"type":"method","name":"execute_finish","type_name":"Transfer","ident":"valent_transfer_execute_finish","summary":"Finish an operation started by [method@Valent.Transfer.execute].","deprecated":null},{"type":"method","name":"export_adapter","type_name":"Input","ident":"valent_input_export_adapter","summary":"Export @adapter on all adapters that support it.","deprecated":null},{"type":"method","name":"export_player","type_name":"Media","ident":"valent_media_export_player","summary":"Export @player on all adapters that support it.","deprecated":null},{"type":"method","name":"export_player","type_name":"MediaAdapter","ident":"valent_media_adapter_export_player","summary":"Export @player on @adapter. This method is intended to allow device plugins to expose remote media players to ...","deprecated":null},{"type":"method","name":"get_active","type_name":"Session","ident":"valent_session_get_active","summary":"Get the active state of the primary [class@Valent.SessionAdapter].","deprecated":null},{"type":"method","name":"get_active","type_name":"SessionAdapter","ident":"valent_session_adapter_get_active","summary":"Get whether the session is active.","deprecated":null},{"type":"method","name":"get_application","type_name":"Notification","ident":"valent_notification_get_application","summary":"Get the notifying application.","deprecated":null},{"type":"method","name":"get_applications","type_name":"Notifications","ident":"valent_notifications_get_applications","summary":"Get a dictionary of applications that are known to send notifications.","deprecated":null},{"type":"method","name":"get_body","type_name":"Notification","ident":"valent_notification_get_body","summary":"Get the notification body.","deprecated":null},{"type":"method","name":"get_cache_file","type_name":"Context","ident":"valent_context_get_cache_file","summary":"Create a new cache file. This method creates a new [iface@Gio.File] for @filename in the cache directory.","deprecated":null},{"type":"method","name":"get_config_file","type_name":"Context","ident":"valent_context_get_config_file","summary":"Create a new config file. This method creates a new [iface@Gio.File] for @filename in the config directory.","deprecated":null},{"type":"method","name":"get_contact","type_name":"ContactStore","ident":"valent_contact_store_get_contact","summary":"Get a contact by UID. Call [method@Valent.ContactStore.get_contact_finish] to get the result.","deprecated":null},{"type":"method","name":"get_contact_finish","type_name":"ContactStore","ident":"valent_contact_store_get_contact_finish","summary":"Finish an operation started by valent_contact_store_get_contact().","deprecated":null},{"type":"method","name":"get_contacts","type_name":"ContactStore","ident":"valent_contact_store_get_contacts","summary":"A convenience wrapper around [method@Valent.ContactStore.query] for searching contacts by UID. Call [method@Valent.ContactStore.query_finish] to get the result.","deprecated":null},{"type":"method","name":"get_context","type_name":"Device","ident":"valent_device_get_context","summary":"Get the data context.","deprecated":null},{"type":"method","name":"get_context","type_name":"DevicePreferencesGroup","ident":"valent_device_preferences_group_get_context","summary":"Get the [class@Valent.Context] for the [class@Valent.DevicePlugin].","deprecated":null},{"type":"method","name":"get_context","type_name":"Extension","ident":"valent_extension_get_context","summary":"Get the settings for this plugin.","deprecated":null},{"type":"method","name":"get_data_file","type_name":"Context","ident":"valent_context_get_data_file","summary":"Create a new data file. This method creates a new [iface@Gio.File] for @filename in the data directory.","deprecated":null},{"type":"method","name":"get_default_input","type_name":"Mixer","ident":"valent_mixer_get_default_input","summary":"Get the default input stream for the primary [class@Valent.MixerAdapter].","deprecated":null},{"type":"method","name":"get_default_input","type_name":"MixerAdapter","ident":"valent_mixer_adapter_get_default_input","summary":"Get the default input stream for @adapter.","deprecated":null},{"type":"method","name":"get_default_output","type_name":"Mixer","ident":"valent_mixer_get_default_output","summary":"Get the default output stream for the primary [class@Valent.MixerAdapter].","deprecated":null},{"type":"method","name":"get_default_output","type_name":"MixerAdapter","ident":"valent_mixer_adapter_get_default_output","summary":"Get the default output stream for @adapter.","deprecated":null},{"type":"method","name":"get_description","type_name":"MixerStream","ident":"valent_mixer_stream_get_description","summary":"Get the human-readable label of @stream.","deprecated":null},{"type":"method","name":"get_direction","type_name":"MixerStream","ident":"valent_mixer_stream_get_direction","summary":"Get the port direction of @stream.","deprecated":null},{"type":"method","name":"get_domain","type_name":"Context","ident":"valent_context_get_domain","summary":"Get the context domain.","deprecated":null},{"type":"method","name":"get_flags","type_name":"MediaPlayer","ident":"valent_media_player_get_flags","summary":"Get flags describing the available actions of @player.","deprecated":null},{"type":"method","name":"get_icon","type_name":"Notification","ident":"valent_notification_get_icon","summary":"Get the notification icon.","deprecated":null},{"type":"method","name":"get_icon_name","type_name":"Device","ident":"valent_device_get_icon_name","summary":"Get the symbolic icon name.","deprecated":null},{"type":"method","name":"get_id","type_name":"Context","ident":"valent_context_get_id","summary":"Get the context ID.","deprecated":null},{"type":"method","name":"get_id","type_name":"Device","ident":"valent_device_get_id","summary":"Get the unique ID.","deprecated":null},{"type":"method","name":"get_id","type_name":"Notification","ident":"valent_notification_get_id","summary":"Get the notification ID.","deprecated":null},{"type":"method","name":"get_identity","type_name":"Channel","ident":"valent_channel_get_identity","summary":"Get the local identity packet.","deprecated":null},{"type":"method","name":"get_level","type_name":"MixerStream","ident":"valent_mixer_stream_get_level","summary":"Get the level of @stream (eg. speaker volume, microphone sensitivity). Implementations that override this method should also override [vfunc@Valent.MixerStream.set_level].","deprecated":null},{"type":"method","name":"get_locked","type_name":"Session","ident":"valent_session_get_locked","summary":"Get the locked state of the primary [class@Valent.SessionAdapter].","deprecated":null},{"type":"method","name":"get_locked","type_name":"SessionAdapter","ident":"valent_session_adapter_get_locked","summary":"Get whether the session is locked.","deprecated":null},{"type":"method","name":"get_menu","type_name":"Device","ident":"valent_device_get_menu","summary":"Get the [class@Gio.MenuModel] of the device. Plugins may add items and submenus to this when they want to ...","deprecated":null},{"type":"method","name":"get_metadata","type_name":"MediaPlayer","ident":"valent_media_player_get_metadata","summary":"Get the metadata of the active media items. Implementations should typically have an entry for the `mpris:length` field. ...","deprecated":null},{"type":"method","name":"get_mimetypes","type_name":"Clipboard","ident":"valent_clipboard_get_mimetypes","summary":"Get the mime-types of the primary clipboard content.","deprecated":null},{"type":"method","name":"get_mimetypes","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_get_mimetypes","summary":"Get the mime-types of the current clipboard content.","deprecated":null},{"type":"method","name":"get_muted","type_name":"MixerStream","ident":"valent_mixer_stream_get_muted","summary":"Get the muted state of @stream. Implementations that override this method should also override [vfunc@Valent.MixerStream.set_muted].","deprecated":null},{"type":"method","name":"get_name","type_name":"ChannelService","ident":"valent_channel_service_get_name","summary":"Get the local display name.","deprecated":null},{"type":"method","name":"get_name","type_name":"ContactStore","ident":"valent_contact_store_get_name","summary":"Get the display name of @store.","deprecated":null},{"type":"method","name":"get_name","type_name":"Device","ident":"valent_device_get_name","summary":"Get the display name of the device.","deprecated":null},{"type":"method","name":"get_name","type_name":"DeviceManager","ident":"valent_device_manager_get_name","summary":"Get the display name of the local device.","deprecated":null},{"type":"method","name":"get_name","type_name":"MediaPlayer","ident":"valent_media_player_get_name","summary":"Get the display name of the @player.","deprecated":null},{"type":"method","name":"get_name","type_name":"MixerStream","ident":"valent_mixer_stream_get_name","summary":"Get the unique name of @stream.","deprecated":null},{"type":"method","name":"get_object","type_name":"Extension","ident":"valent_extension_get_object","summary":"Get the object this plugin is bound to.","deprecated":null},{"type":"method","name":"get_parent","type_name":"Context","ident":"valent_context_get_parent","summary":"Get the parent context.","deprecated":null},{"type":"method","name":"get_path","type_name":"Context","ident":"valent_context_get_path","summary":"Get the virtual path.","deprecated":null},{"type":"method","name":"get_peer_identity","type_name":"Channel","ident":"valent_channel_get_peer_identity","summary":"Get the peer identity packet.","deprecated":null},{"type":"method","name":"get_plugin_context","type_name":"Context","ident":"valent_context_get_plugin_context","summary":"Create a new `ValentContext` for a plugin. If given, @domain should be an identifier describing the scope of ...","deprecated":null},{"type":"method","name":"get_plugin_settings","type_name":"Context","ident":"valent_context_get_plugin_settings","summary":"Create a [class@Gio.Settings] object for a plugin. If the plugin is not built-in, an attempt will be made ...","deprecated":null},{"type":"method","name":"get_plugins","type_name":"Device","ident":"valent_device_get_plugins","summary":"Get a list of the loaded plugins.","deprecated":null},{"type":"method","name":"get_position","type_name":"MediaPlayer","ident":"valent_media_player_get_position","summary":"Get the current position in seconds.","deprecated":null},{"type":"method","name":"get_priority","type_name":"Notification","ident":"valent_notification_get_priority","summary":"Get the notification priority.","deprecated":null},{"type":"method","name":"get_progress","type_name":"Transfer","ident":"valent_transfer_get_progress","summary":"Get the transfer progress.","deprecated":null},{"type":"method","name":"get_repeat","type_name":"MediaPlayer","ident":"valent_media_player_get_repeat","summary":"Get the repeat mode for @player.","deprecated":null},{"type":"method","name":"get_root","type_name":"Context","ident":"valent_context_get_root","summary":"Get the root context.","deprecated":null},{"type":"method","name":"get_settings","type_name":"DevicePreferencesGroup","ident":"valent_device_preferences_group_get_settings","summary":"Get the [class@Gio.Settings] for the [class@Valent.DevicePlugin].","deprecated":null},{"type":"method","name":"get_settings","type_name":"Extension","ident":"valent_extension_get_settings","summary":"Get the settings for this plugin.","deprecated":null},{"type":"method","name":"get_shuffle","type_name":"MediaPlayer","ident":"valent_media_player_get_shuffle","summary":"Get whether playback order is shuffled.","deprecated":null},{"type":"method","name":"get_source","type_name":"ContactStore","ident":"valent_contact_store_get_source","summary":"Get the `ESource` backing @store.","deprecated":null},{"type":"method","name":"get_state","type_name":"Device","ident":"valent_device_get_state","summary":"Get the state of the device.","deprecated":null},{"type":"method","name":"get_state","type_name":"MediaPlayer","ident":"valent_media_player_get_state","summary":"Get the playback state for @player.","deprecated":null},{"type":"method","name":"get_state","type_name":"Transfer","ident":"valent_transfer_get_state","summary":"Get the transfer state.","deprecated":null},{"type":"method","name":"get_time","type_name":"Notification","ident":"valent_notification_get_time","summary":"Get the notification time.","deprecated":null},{"type":"method","name":"get_timestamp","type_name":"Clipboard","ident":"valent_clipboard_get_timestamp","summary":"Get the timestamp of the current clipboard content, in milliseconds since the UNIX epoch.","deprecated":null},{"type":"method","name":"get_timestamp","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_get_timestamp","summary":"Get the timestamp of the current clipboard content. The default implementation of this method returns the last time ...","deprecated":null},{"type":"method","name":"get_title","type_name":"Notification","ident":"valent_notification_get_title","summary":"Get the notification title.","deprecated":null},{"type":"method","name":"get_uid","type_name":"ContactStore","ident":"valent_contact_store_get_uid","summary":"Get the UID of @store.","deprecated":null},{"type":"method","name":"get_verification_key","type_name":"Channel","ident":"valent_channel_get_verification_key","summary":"Get a verification key for the connection. Implementations that involve exchanging a key should return a string for ...","deprecated":null},{"type":"method","name":"get_volume","type_name":"MediaPlayer","ident":"valent_media_player_get_volume","summary":"Get the volume level.","deprecated":null},{"type":"method","name":"handle_packet","type_name":"DevicePlugin","ident":"valent_device_plugin_handle_packet","summary":"Handle a packet from the device the plugin is bound to. This is called when the device receives ...","deprecated":null},{"type":"method","name":"hash","type_name":"Notification","ident":"valent_notification_hash","summary":"Converts a notification to a hash value, using g_str_hash() on the ID.","deprecated":null},{"type":"method","name":"hide_notification","type_name":"DevicePlugin","ident":"valent_device_plugin_hide_notification","summary":"A convenience for withdrawing a notification. This method will withdraw a notification shown with [method@Valent.DevicePlugin.show_notification].","deprecated":null},{"type":"method","name":"identify","type_name":"ChannelService","ident":"valent_channel_service_identify","summary":"Identify the host device to the network. This method is called to announce the availability of the host ...","deprecated":null},{"type":"method","name":"in_destruction","type_name":"Object","ident":"valent_object_in_destruction","summary":"Get whether the object is destroyed or in destruction.","deprecated":null},{"type":"method","name":"keyboard_keysym","type_name":"Input","ident":"valent_input_keyboard_keysym","summary":"Press or release @keysym.","deprecated":null},{"type":"method","name":"keyboard_keysym","type_name":"InputAdapter","ident":"valent_input_adapter_keyboard_keysym","summary":"Press or release @keysym.","deprecated":null},{"type":"method","name":"lock","type_name":"Object","ident":"valent_object_lock","summary":"Acquire a lock on @object. Call [method@Valent.Object.unlock] to release the lock.","deprecated":null},{"type":"method","name":"new","type_name":"Context","ident":"valent_context_new","summary":"Create a new `ValentContext`. If given, @parent will be taken into consideration when building paths. If given, ...","deprecated":null},{"type":"method","name":"next","type_name":"MediaPlayer","ident":"valent_media_player_next","summary":"Skip to the next media item. If there is no next track (and endless playback and track repeat ...","deprecated":null},{"type":"method","name":"notification_added","type_name":"NotificationsAdapter","ident":"valent_notifications_adapter_notification_added","summary":"Emit [signal@Valent.NotificationsAdapter::notification-added] on @adapter. This method should only be called by implementations of [class@Valent.NotificationsAdapter].","deprecated":null},{"type":"method","name":"notification_removed","type_name":"NotificationsAdapter","ident":"valent_notifications_adapter_notification_removed","summary":"Emit [signal@Valent.NotificationsAdapter::notification-removed] on @adapter. This method should only be called by implementations of [class@Valent.NotificationsAdapter].","deprecated":null},{"type":"method","name":"notify","type_name":"Object","ident":"valent_object_notify","summary":"Emit [signal@GObject.Object::notify] on @object, on the main thread. Like [method@GObject.Object.notify] if the caller is in the main thread, ...","deprecated":null},{"type":"method","name":"notify_by_pspec","type_name":"Object","ident":"valent_object_notify_by_pspec","summary":"Emit [signal@GObject.Object::notify] on @object, on the main thread. Like [method@GObject.Object.notify_by_pspec] if the caller is in the main thread, ...","deprecated":null},{"type":"method","name":"open","type_name":"ApplicationPlugin","ident":"valent_application_plugin_open","summary":"Open the given files. Implementations should override this method to handle files and URIs, as a result of ...","deprecated":null},{"type":"method","name":"pause","type_name":"Media","ident":"valent_media_pause","summary":"Pause any playing media players. Any player whose playback status is changed will be tracked so that playback may ...","deprecated":null},{"type":"method","name":"pause","type_name":"MediaPlayer","ident":"valent_media_player_pause","summary":"Pauses playback. If playback is already paused, this has no effect. Calling [method@Valent.MediaPlayer.pause] after this should cause playback ...","deprecated":null},{"type":"method","name":"play","type_name":"MediaPlayer","ident":"valent_media_player_play","summary":"Start playback. If already playing, this has no effect. If paused, playback resumes from the current position. If ...","deprecated":null},{"type":"method","name":"player_added","type_name":"MediaAdapter","ident":"valent_media_adapter_player_added","summary":"Called when @player has been added to @adapter. This method should only be called by implementations of [class@Valent.MediaAdapter]. ...","deprecated":null},{"type":"method","name":"player_removed","type_name":"MediaAdapter","ident":"valent_media_adapter_player_removed","summary":"Called when @player has been removed from @adapter. This method should only be called by implementations of [class@Valent.MediaAdapter]. ...","deprecated":null},{"type":"method","name":"plugin_state_changed","type_name":"Extension","ident":"valent_extension_plugin_state_changed","summary":"Emits [signal@GObject.Object::notify] for [property@Valent.Extension:plugin-state]. Implementations should call this method to inform the managing object of changes to the ...","deprecated":null},{"type":"method","name":"plugin_state_check","type_name":"Extension","ident":"valent_extension_plugin_state_check","summary":"Get the extension state, while propagating any errors that describe it.","deprecated":null},{"type":"method","name":"pointer_axis","type_name":"Input","ident":"valent_input_pointer_axis","summary":"Scroll the surface under the pointer (@dx, @dy), relative to its current position.","deprecated":null},{"type":"method","name":"pointer_axis","type_name":"InputAdapter","ident":"valent_input_adapter_pointer_axis","summary":"Scroll the surface under the pointer (@dx, @dy), relative to its current position. Implementations should handle any necessary scaling.","deprecated":null},{"type":"method","name":"pointer_button","type_name":"Input","ident":"valent_input_pointer_button","summary":"Press or release @button.","deprecated":null},{"type":"method","name":"pointer_button","type_name":"InputAdapter","ident":"valent_input_adapter_pointer_button","summary":"Press or release @button.","deprecated":null},{"type":"method","name":"pointer_motion","type_name":"Input","ident":"valent_input_pointer_motion","summary":"Move the pointer (@dx, @dy), relative to its current position.","deprecated":null},{"type":"method","name":"pointer_motion","type_name":"InputAdapter","ident":"valent_input_adapter_pointer_motion","summary":"Move the pointer (@dx, @dy), relative to its current position. Implementation should handle any necessary scaling","deprecated":null},{"type":"method","name":"previous","type_name":"MediaPlayer","ident":"valent_media_player_previous","summary":"Skip to the previous media item. If there is no previous track (and endless playback and track repeat ...","deprecated":null},{"type":"method","name":"query","type_name":"ContactStore","ident":"valent_contact_store_query","summary":"Query @store for contacts matching @query. Call [method@Valent.ContactStore.query_finish] to get the result.","deprecated":null},{"type":"method","name":"query_finish","type_name":"ContactStore","ident":"valent_contact_store_query_finish","summary":"Finish an operation started by [method@Valent.ContactStore.query].","deprecated":null},{"type":"method","name":"queue_packet","type_name":"DevicePlugin","ident":"valent_device_plugin_queue_packet","summary":"Queue a KDE Connect packet to be sent to the device this plugin is bound to. For notification ...","deprecated":null},{"type":"method","name":"read_bytes","type_name":"Clipboard","ident":"valent_clipboard_read_bytes","summary":"Get the content of the primary clipboard adapter. Call [method@Valent.Clipboard.read_bytes_finish] to get the result.","deprecated":null},{"type":"method","name":"read_bytes","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_read_bytes","summary":"Get the content of @adapter. Call [method@Valent.ClipboardAdapter.read_bytes_finish] to get the result.","deprecated":null},{"type":"method","name":"read_bytes_finish","type_name":"Clipboard","ident":"valent_clipboard_read_bytes_finish","summary":"Finish an operation started by [method@Valent.Clipboard.read_bytes].","deprecated":null},{"type":"method","name":"read_bytes_finish","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_read_bytes_finish","summary":"Finish an operation started by [method@Valent.ClipboardAdapter.read_bytes].","deprecated":null},{"type":"method","name":"read_packet","type_name":"Channel","ident":"valent_channel_read_packet","summary":"Read the next KDE Connect packet from @channel. Call [method@Valent.Channel.read_packet_finish] to get the result.","deprecated":null},{"type":"method","name":"read_packet_finish","type_name":"Channel","ident":"valent_channel_read_packet_finish","summary":"Finish an operation started by [method@Valent.Channel.read_packet].","deprecated":null},{"type":"method","name":"read_text","type_name":"Clipboard","ident":"valent_clipboard_read_text","summary":"Get the text content of the primary clipboard adapter. Call [method@Valent.Clipboard.read_text_finish] to get the result.","deprecated":null},{"type":"method","name":"read_text_finish","type_name":"Clipboard","ident":"valent_clipboard_read_text_finish","summary":"Finish an operation started by [method@Valent.Clipboard.read_text].","deprecated":null},{"type":"method","name":"ref_base_stream","type_name":"Channel","ident":"valent_channel_ref_base_stream","summary":"Get the base [class@Gio.IOStream].","deprecated":null},{"type":"method","name":"ref_cancellable","type_name":"Object","ident":"valent_object_ref_cancellable","summary":"Get a [class@Gio.Cancellable] for the object.","deprecated":null},{"type":"method","name":"ref_certificate","type_name":"ChannelService","ident":"valent_channel_service_ref_certificate","summary":"Get the TLS certificate for the service.","deprecated":null},{"type":"method","name":"ref_channel","type_name":"Device","ident":"valent_device_ref_channel","summary":"Get the active channel.","deprecated":null},{"type":"method","name":"ref_device","type_name":"DeviceTransfer","ident":"valent_device_transfer_ref_device","summary":"Get the [class@Valent.Device].","deprecated":null},{"type":"method","name":"ref_file","type_name":"DeviceTransfer","ident":"valent_device_transfer_ref_file","summary":"Get the local [iface@Gio.File].","deprecated":null},{"type":"method","name":"ref_identity","type_name":"ChannelService","ident":"valent_channel_service_ref_identity","summary":"Get the local identity packet.","deprecated":null},{"type":"method","name":"ref_packet","type_name":"DeviceTransfer","ident":"valent_device_transfer_ref_packet","summary":"Get the KDE Connect packet.","deprecated":null},{"type":"method","name":"refresh","type_name":"DeviceManager","ident":"valent_device_manager_refresh","summary":"Refresh the available devices. This method calls [method@Valent.ChannelService.identify] for each enabled service, requesting it to announce itself on ...","deprecated":null},{"type":"method","name":"remove_contact","type_name":"ContactStore","ident":"valent_contact_store_remove_contact","summary":"Remove contact @uid from @store. A convenience wrapper around [method@Valent.ContactStore.remove_contacts] for removing a single contact. Call [method@Valent.ContactStore.remove_contacts_finish] ...","deprecated":null},{"type":"method","name":"remove_contacts","type_name":"ContactStore","ident":"valent_contact_store_remove_contacts","summary":"Remove contact @uid from @store. Call [method@Valent.ContactStore.remove_contacts_finish] to get the result.","deprecated":null},{"type":"method","name":"remove_contacts_finish","type_name":"ContactStore","ident":"valent_contact_store_remove_contacts_finish","summary":"Finish an operation started by [method@Valent.ContactStore.remove_contact] or [method@Valent.ContactStore.remove_contacts].","deprecated":null},{"type":"method","name":"remove_notification","type_name":"NotificationsAdapter","ident":"valent_notifications_adapter_remove_notification","summary":"Withdraw @id from @adapter.","deprecated":null},{"type":"method","name":"seek","type_name":"MediaPlayer","ident":"valent_media_player_seek","summary":"Seek in the current media item by @offset seconds. A negative value seeks back. If this would mean ...","deprecated":null},{"type":"method","name":"send_packet","type_name":"Device","ident":"valent_device_send_packet","summary":"Send a KDE Connect packet to the device. Call [method@Valent.Device.send_packet_finish] to get the result. If @device is ...","deprecated":null},{"type":"method","name":"send_packet_finish","type_name":"Device","ident":"valent_device_send_packet_finish","summary":"Finish an operation started by [method@Valent.Device.send_packet].","deprecated":null},{"type":"method","name":"serialize","type_name":"Notification","ident":"valent_notification_serialize","summary":"Serialize the notification into a variant of type `a{sv}`.","deprecated":null},{"type":"method","name":"set_action","type_name":"Notification","ident":"valent_notification_set_action","summary":"Sets the default notification action. @action may be a detailed action as parsed by [func@Gio.Action.parse_detailed_name].","deprecated":null},{"type":"method","name":"set_action_and_target","type_name":"Notification","ident":"valent_notification_set_action_and_target","summary":"Set the default notification action. If @target is non-%NULL, @action will be activated with @target as its parameter.","deprecated":null},{"type":"method","name":"set_application","type_name":"Notification","ident":"valent_notification_set_application","summary":"Set the notifying application.","deprecated":null},{"type":"method","name":"set_body","type_name":"Notification","ident":"valent_notification_set_body","summary":"Set the notification body.","deprecated":null},{"type":"method","name":"set_default_input","type_name":"Mixer","ident":"valent_mixer_set_default_input","summary":"Set the default input stream for the primary [class@Valent.MixerAdapter].","deprecated":null},{"type":"method","name":"set_default_input","type_name":"MixerAdapter","ident":"valent_mixer_adapter_set_default_input","summary":"Set the default input stream for @adapter to @stream.","deprecated":null},{"type":"method","name":"set_default_output","type_name":"Mixer","ident":"valent_mixer_set_default_output","summary":"Set the default output stream for the primary [class@Valent.MixerAdapter].","deprecated":null},{"type":"method","name":"set_default_output","type_name":"MixerAdapter","ident":"valent_mixer_adapter_set_default_output","summary":"Set the default output stream for @adapter to @stream.","deprecated":null},{"type":"method","name":"set_icon","type_name":"Notification","ident":"valent_notification_set_icon","summary":"Set the notification icon.","deprecated":null},{"type":"method","name":"set_id","type_name":"Notification","ident":"valent_notification_set_id","summary":"Set the notification ID.","deprecated":null},{"type":"method","name":"set_level","type_name":"MixerStream","ident":"valent_mixer_stream_set_level","summary":"Set the level of @stream (eg. speaker volume, microphone sensitivity). Implementations that override this method should also override [vfunc@Valent.MixerStream.get_level].","deprecated":null},{"type":"method","name":"set_locked","type_name":"Session","ident":"valent_session_set_locked","summary":"Set the locked state of the primary [class@Valent.SessionAdapter].","deprecated":null},{"type":"method","name":"set_locked","type_name":"SessionAdapter","ident":"valent_session_adapter_set_locked","summary":"Set whether the session is locked.","deprecated":null},{"type":"method","name":"set_menu_action","type_name":"DevicePlugin","ident":"valent_device_plugin_set_menu_action","summary":"Set or remove a device menu action by [iface@Gio.Action] name. If @label and @icon are %NULL, @action will ...","deprecated":null},{"type":"method","name":"set_menu_item","type_name":"DevicePlugin","ident":"valent_device_plugin_set_menu_item","summary":"Set or remove a device [class@Gio.MenuItem] by [iface@Gio.Action] name. If @item is %NULL, @action will be removed from ...","deprecated":null},{"type":"method","name":"set_muted","type_name":"MixerStream","ident":"valent_mixer_stream_set_muted","summary":"Set the muted state of @stream. Implementations that override this method should also override [vfunc@Valent.MixerStream.get_muted].","deprecated":null},{"type":"method","name":"set_name","type_name":"ChannelService","ident":"valent_channel_service_set_name","summary":"Set the local display name.","deprecated":null},{"type":"method","name":"set_name","type_name":"ContactStore","ident":"valent_contact_store_set_name","summary":"Set the display name of @store to @name.","deprecated":null},{"type":"method","name":"set_name","type_name":"DeviceManager","ident":"valent_device_manager_set_name","summary":"Set the display name of the local device to @name.","deprecated":null},{"type":"method","name":"set_position","type_name":"MediaPlayer","ident":"valent_media_player_set_position","summary":"Set the current position in seconds.","deprecated":null},{"type":"method","name":"set_priority","type_name":"Notification","ident":"valent_notification_set_priority","summary":"Set the notification priority.","deprecated":null},{"type":"method","name":"set_progress","type_name":"Transfer","ident":"valent_transfer_set_progress","summary":"Set the transfer progress. This method should only be called by implementations of [class@Valent.Transfer].","deprecated":null},{"type":"method","name":"set_repeat","type_name":"MediaPlayer","ident":"valent_media_player_set_repeat","summary":"Set the repeat mode of @player to @repeat.","deprecated":null},{"type":"method","name":"set_shuffle","type_name":"MediaPlayer","ident":"valent_media_player_set_shuffle","summary":"Set whether playback order is shuffled.","deprecated":null},{"type":"method","name":"set_time","type_name":"Notification","ident":"valent_notification_set_time","summary":"Set the notification time.","deprecated":null},{"type":"method","name":"set_title","type_name":"Notification","ident":"valent_notification_set_title","summary":"Set the notification title.","deprecated":null},{"type":"method","name":"set_volume","type_name":"MediaPlayer","ident":"valent_media_player_set_volume","summary":"Set the volume level of @player.","deprecated":null},{"type":"method","name":"show_notification","type_name":"DevicePlugin","ident":"valent_device_plugin_show_notification","summary":"A convenience for showing a local notification. @id will be automatically prepended with the device ID and plugin ...","deprecated":null},{"type":"method","name":"shutdown","type_name":"ApplicationPlugin","ident":"valent_application_plugin_shutdown","summary":"Handle the shutdown phase of the application. Implementations should override this method to reverse anything done in [vfunc@Valent.ApplicationPlugin.startup].","deprecated":null},{"type":"method","name":"startup","type_name":"ApplicationPlugin","ident":"valent_application_plugin_startup","summary":"Handle the startup phase of the application. Implementations may override this method to perform setup task that should ...","deprecated":null},{"type":"method","name":"stop","type_name":"MediaPlayer","ident":"valent_media_player_stop","summary":"Stop playback. If playback is already stopped, this has no effect. Calling valent_media_player_play() after this should cause playback ...","deprecated":null},{"type":"method","name":"store_added","type_name":"ContactsAdapter","ident":"valent_contacts_adapter_store_added","summary":"Called when @store has been added to @adapter. This method should only be called by implementations of [class@Valent.ContactsAdapter]. ...","deprecated":null},{"type":"method","name":"store_data","type_name":"Channel","ident":"valent_channel_store_data","summary":"Store channel metadata. This method is called to store channel specific data. Implementations can override this method to ...","deprecated":null},{"type":"method","name":"store_removed","type_name":"ContactsAdapter","ident":"valent_contacts_adapter_store_removed","summary":"Called when @store has been removed from @adapter. This method should only be called by implementations of [class@Valent.ContactsAdapter]. ...","deprecated":null},{"type":"method","name":"stream_added","type_name":"MixerAdapter","ident":"valent_mixer_adapter_stream_added","summary":"Called when @stream has been added to the mixer. This method should only be called by implementations of ...","deprecated":null},{"type":"method","name":"stream_removed","type_name":"MixerAdapter","ident":"valent_mixer_adapter_stream_removed","summary":"Called when @stream has been removed from the mixer. This method should only be called by implementations of ...","deprecated":null},{"type":"method","name":"toggle_actions","type_name":"Extension","ident":"valent_extension_toggle_actions","summary":"Enable or disable all actions. Set the [property@Gio.Action:enabled] property of the actions for @extension to @enabled.","deprecated":null},{"type":"method","name":"unexport_adapter","type_name":"Input","ident":"valent_input_unexport_adapter","summary":"Unexport @adapter from all adapters that support it.","deprecated":null},{"type":"method","name":"unexport_player","type_name":"Media","ident":"valent_media_unexport_player","summary":"Unexport @player from all adapters that support it.","deprecated":null},{"type":"method","name":"unexport_player","type_name":"MediaAdapter","ident":"valent_media_adapter_unexport_player","summary":"Unexport @player from @adapter.","deprecated":null},{"type":"method","name":"unlock","type_name":"Object","ident":"valent_object_unlock","summary":"Release a lock on @object. The lock must have previously been acquired by [method@Valent.Object.lock].","deprecated":null},{"type":"method","name":"unpause","type_name":"Media","ident":"valent_media_unpause","summary":"Unpause any media players we previously paused.","deprecated":null},{"type":"method","name":"update_state","type_name":"DevicePlugin","ident":"valent_device_plugin_update_state","summary":"Update the plugin based on the new state of the device. This function is called when the connected ...","deprecated":null},{"type":"method","name":"upload","type_name":"Channel","ident":"valent_channel_upload","summary":"Accept an auxiliary connection, usually to upload data. Implementations should set the `payloadTransferInfo` field with information the peer ...","deprecated":null},{"type":"method","name":"upload_async","type_name":"Channel","ident":"valent_channel_upload_async","summary":"Accept an auxiliary connection, usually to upload data. This is a non-blocking variant of [method@Valent.Channel.upload]. Call [method@Valent.Channel.upload_finish] to ...","deprecated":null},{"type":"method","name":"upload_finish","type_name":"Channel","ident":"valent_channel_upload_finish","summary":"Finish an operation started with [method@Valent.Channel.upload_async].","deprecated":null},{"type":"method","name":"write_bytes","type_name":"Clipboard","ident":"valent_clipboard_write_bytes","summary":"Set the content of the primary clipboard adapter. Call [method@Valent.Clipboard.write_bytes_finish] to get the result.","deprecated":null},{"type":"method","name":"write_bytes","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_write_bytes","summary":"Set the content of the clipboard. Call [method@Valent.ClipboardAdapter.write_bytes_finish] to get the result.","deprecated":null},{"type":"method","name":"write_bytes_finish","type_name":"Clipboard","ident":"valent_clipboard_write_bytes_finish","summary":"Finish an operation started by [method@Valent.Clipboard.write_bytes].","deprecated":null},{"type":"method","name":"write_bytes_finish","type_name":"ClipboardAdapter","ident":"valent_clipboard_adapter_write_bytes_finish","summary":"Finish an operation started by [method@Valent.ClipboardAdapter.write_bytes].","deprecated":null},{"type":"method","name":"write_packet","type_name":"Channel","ident":"valent_channel_write_packet","summary":"Send a packet over the channel. Internally [class@Valent.Channel] uses an outgoing packet buffer, so multiple requests can be ...","deprecated":null},{"type":"method","name":"write_packet_finish","type_name":"Channel","ident":"valent_channel_write_packet_finish","summary":"Finish an operation started by [method@Valent.Channel.write_packet].","deprecated":null},{"type":"method","name":"write_text","type_name":"Clipboard","ident":"valent_clipboard_write_text","summary":"Set the text content of the primary clipboard adapter. Call [method@Valent.Clipboard.write_text_finish] to get the result.","deprecated":null},{"type":"method","name":"write_text_finish","type_name":"Clipboard","ident":"valent_clipboard_write_text_finish","summary":"Finish an operation started by [method@Valent.Clipboard.write_text].","deprecated":null},{"type":"property","name":"action","type_name":"Notification","summary":"The default notification action.","deprecated":null},{"type":"property","name":"active","type_name":"Session","summary":"Whether the session is active.","deprecated":null},{"type":"property","name":"active","type_name":"SessionAdapter","summary":"Whether the session is active.","deprecated":null},{"type":"property","name":"application","type_name":"Notification","summary":"The notifying application. The semantics of this property are not well-defined. It may be the application name (i.e. ...","deprecated":null},{"type":"property","name":"base-stream","type_name":"Channel","summary":"The base [class@Gio.IOStream] for the channel. Implementations of [class@Valent.ChannelService] must set this property during construction.","deprecated":null},{"type":"property","name":"body","type_name":"Notification","summary":"The notification body.","deprecated":null},{"type":"property","name":"cancellable","type_name":"Object","summary":"The object [class@Gio.Cancellable]. A `GCancellable` that can be used by operations that should be cancelled when the object ...","deprecated":null},{"type":"property","name":"certificate","type_name":"ChannelService","summary":"The TLS certificate the service uses to authenticate with other devices.","deprecated":null},{"type":"property","name":"context","type_name":"Device","summary":"The data context.","deprecated":null},{"type":"property","name":"context","type_name":"DevicePreferencesGroup","summary":"The [class@Valent.Context] for the [class@Valent.DevicePlugin].","deprecated":null},{"type":"property","name":"context","type_name":"Extension","summary":"The [class@Valent.Device] this plugin is bound to.","deprecated":null},{"type":"property","name":"default-input","type_name":"Mixer","summary":"The active input stream.","deprecated":null},{"type":"property","name":"default-input","type_name":"MixerAdapter","summary":"The active input stream. Implementations should emit [signal@GObject.Object::notify] for this property when the default stream changes.","deprecated":null},{"type":"property","name":"default-output","type_name":"Mixer","summary":"The active output stream.","deprecated":null},{"type":"property","name":"default-output","type_name":"MixerAdapter","summary":"The active output stream. Implementations should emit [signal@GObject.Object::notify] for this property when the default stream changes.","deprecated":null},{"type":"property","name":"description","type_name":"MixerStream","summary":"The human-readable label of the stream. Implementation may emit [signal@GObject.Object::notify] for this property if it changes.","deprecated":null},{"type":"property","name":"device","type_name":"DeviceGadget","summary":"The [class@Valent.Device] this gadget is for.","deprecated":null},{"type":"property","name":"device","type_name":"DeviceTransfer","summary":"The [class@Valent.Device] this transfer is for.","deprecated":null},{"type":"property","name":"direction","type_name":"MixerStream","summary":"The port direction of the stream.","deprecated":null},{"type":"property","name":"domain","type_name":"Context","summary":"The domain for this context.","deprecated":null},{"type":"property","name":"file","type_name":"DeviceTransfer","summary":"The local [iface@Gio.File]. If this a download, then this is the destination. If it's upload, this is the source.","deprecated":null},{"type":"property","name":"flags","type_name":"MediaPlayer","summary":"The available actions. Implementations should emit [signal@GObject.Object::notify] when they change the internal representation of this property.","deprecated":null},{"type":"property","name":"icon","type_name":"Notification","summary":"The notification [iface@Gio.Icon].","deprecated":null},{"type":"property","name":"icon-name","type_name":"Device","summary":"A symbolic icon name for the device.","deprecated":null},{"type":"property","name":"id","type_name":"ChannelService","summary":"The local ID. This is the ID used to identify the local device, which should be unique among ...","deprecated":null},{"type":"property","name":"id","type_name":"Context","summary":"The ID for this context.","deprecated":null},{"type":"property","name":"id","type_name":"Device","summary":"A unique ID for the device. By convention, the single source of truth for a device ID in ...","deprecated":null},{"type":"property","name":"id","type_name":"Notification","summary":"The unique ID of the notification.","deprecated":null},{"type":"property","name":"id","type_name":"Transfer","summary":"A unique identifier for the transfer. If not specified at construction, a random UUID will be generated on-demand ...","deprecated":null},{"type":"property","name":"identity","type_name":"Channel","summary":"The local identity packet. This is the identity packet sent by the [class@Valent.ChannelService] implementation to identify the host ...","deprecated":null},{"type":"property","name":"identity","type_name":"ChannelService","summary":"The local identity packet. This is the identity packet sent by the [class@Valent.ChannelService] implementation to describe the local ...","deprecated":null},{"type":"property","name":"level","type_name":"MixerStream","summary":"The input or output level of the stream.","deprecated":null},{"type":"property","name":"locked","type_name":"Session","summary":"Whether the session is locked.","deprecated":null},{"type":"property","name":"locked","type_name":"SessionAdapter","summary":"Whether the session is locked.","deprecated":null},{"type":"property","name":"metadata","type_name":"MediaPlayer","summary":"The metadata of the active media item. The content of the variant should be in the same format ...","deprecated":null},{"type":"property","name":"muted","type_name":"MixerStream","summary":"Whether the stream is muted.","deprecated":null},{"type":"property","name":"name","type_name":"ChannelService","summary":"The local display name. This is the user-visible label packet used to identify the local device in user ...","deprecated":null},{"type":"property","name":"name","type_name":"ContactStore","summary":"The display name.","deprecated":null},{"type":"property","name":"name","type_name":"Device","summary":"A display name for the device.","deprecated":null},{"type":"property","name":"name","type_name":"DeviceManager","summary":"The display name of the local device.","deprecated":null},{"type":"property","name":"name","type_name":"MediaPlayer","summary":"The display name of the media player. Typically, this property should remain constant through the lifetime of the ...","deprecated":null},{"type":"property","name":"name","type_name":"MixerStream","summary":"The unique name of the stream.","deprecated":null},{"type":"property","name":"object","type_name":"Extension","summary":"The [class@GObject.Object] this plugin is bound to.","deprecated":null},{"type":"property","name":"packet","type_name":"DeviceTransfer","summary":"The KDE Connect packet describing the payload.","deprecated":null},{"type":"property","name":"parent","type_name":"Context","summary":"The parent context.","deprecated":null},{"type":"property","name":"peer-identity","type_name":"Channel","summary":"The peer identity packet. This is the identity packet sent by the peer to identify itself. Implementations ...","deprecated":null},{"type":"property","name":"plugin-domain","type_name":"Component","summary":"No description available.","deprecated":null},{"type":"property","name":"plugin-info","type_name":"DevicePreferencesGroup","summary":"The [class@Peas.PluginInfo] describing this plugin.","deprecated":null},{"type":"property","name":"plugin-info","type_name":"Extension","summary":"The [class@Peas.PluginInfo] describing this plugin.","deprecated":null},{"type":"property","name":"plugin-info","type_name":"PreferencesPage","summary":"The [class@Peas.PluginInfo] describing the plugin this page configures.","deprecated":null},{"type":"property","name":"plugin-state","type_name":"Extension","summary":"The [enum@Valent.PluginState] describing the state of the extension.","deprecated":null},{"type":"property","name":"plugin-type","type_name":"Component","summary":"The extension point [alias@GObject.Type].","deprecated":null},{"type":"property","name":"plugins","type_name":"Device","summary":"A list of loaded plugin names.","deprecated":null},{"type":"property","name":"position","type_name":"MediaPlayer","summary":"The current track position in seconds. Acceptable values are between `0` and the `mpris:length` metadata entry (see [property@Valent.MediaPlayer:metadata]). ...","deprecated":null},{"type":"property","name":"priority","type_name":"Notification","summary":"The notification priority.","deprecated":null},{"type":"property","name":"progress","type_name":"Transfer","summary":"The progress of the transfer. This value will change from `0.0` to `1.0` during the course of the ...","deprecated":null},{"type":"property","name":"repeat","type_name":"MediaPlayer","summary":"The repeat mode. If the player does not have the appropriate bitmask in [property@Valent.MediaPlayer:flags], setting this property should ...","deprecated":null},{"type":"property","name":"settings","type_name":"DevicePreferencesGroup","summary":"The [class@Gio.Settings] for the [class@Valent.DevicePlugin].","deprecated":null},{"type":"property","name":"settings","type_name":"Extension","summary":"The [class@Gio.Settings] for this plugin.","deprecated":null},{"type":"property","name":"shuffle","type_name":"MediaPlayer","summary":"Whether playback order is shuffled. A value of %FALSE indicates that playback is progressing linearly through a playlist, ...","deprecated":null},{"type":"property","name":"source","type_name":"ContactStore","summary":"The store [class@EDataServer.Source].","deprecated":null},{"type":"property","name":"state","type_name":"Device","summary":"The state of the device.","deprecated":null},{"type":"property","name":"state","type_name":"MediaPlayer","summary":"The playback state. Implementations should emit [signal@GObject.Object::notify] when they change the internal representation of this property.","deprecated":null},{"type":"property","name":"state","type_name":"Transfer","summary":"The [enum@Valent.TransferState] of the transfer. The value will change from %VALENT_TRANSFER_STATE_PENDING to %VALENT_TRANSFER_STATE_ACTIVE when [method@Valent.Transfer.execute] is called. When ...","deprecated":null},{"type":"property","name":"time","type_name":"Notification","summary":"The posting time of the notification in milliseconds.","deprecated":null},{"type":"property","name":"title","type_name":"Notification","summary":"The title of the notification","deprecated":null},{"type":"property","name":"uid","type_name":"ContactStore","summary":"The unique identifier.","deprecated":null},{"type":"property","name":"volume","type_name":"MediaPlayer","summary":"The volume level. Attempts to change this property may be ignored by some implementations. Implementations should emit ...","deprecated":null},{"type":"signal","name":"changed","type_name":"Clipboard","summary":"Emitted when the content of the primary [class@Valent.ClipboardAdapter] changes.","deprecated":null},{"type":"signal","name":"changed","type_name":"ClipboardAdapter","summary":"Emitted when the content of @adapter changes. The default handler for this signal updates the value returned by ...","deprecated":null},{"type":"signal","name":"channel","type_name":"ChannelService","summary":"Emitted when a new channel has been negotiated. In practice, when this is emitted a [class@Valent.DeviceManager] will ensure ...","deprecated":null},{"type":"signal","name":"contact-added","type_name":"ContactStore","summary":"Emitted when an [class@EBookContacts.Contact] is added to @store.","deprecated":null},{"type":"signal","name":"contact-removed","type_name":"ContactStore","summary":"Emitted when an [class@EBookContacts.Contact] is removed from @store.","deprecated":null},{"type":"signal","name":"destroy","type_name":"Object","summary":"Emitted when the object is being destroyed. This signal is emitted when the object enters disposal and always ...","deprecated":null},{"type":"signal","name":"notification-added","type_name":"Notifications","summary":"Emitted when a notification is added to a [class@Valent.NotificationsAdapter].","deprecated":null},{"type":"signal","name":"notification-added","type_name":"NotificationsAdapter","summary":"Emitted when a [class@Valent.Notification] is added to @adapter. Implementations must chain up if they override [vfunc@Valent.NotificationsAdapter.notification_added].","deprecated":null},{"type":"signal","name":"notification-removed","type_name":"Notifications","summary":"Emitted when a notification is removed from a [class@Valent.NotificationsAdapter].","deprecated":null},{"type":"signal","name":"notification-removed","type_name":"NotificationsAdapter","summary":"Emitted when a [class@Valent.Notification] is removed from @adapter. Implementations must chain up if they override [vfunc@Valent.NotificationsAdapter.notification_removed].","deprecated":null},{"type":"type_func","name":"add_device_button","type_name":"Notification","ident":"valent_notification_add_device_button","summary":"Add an action button to @notification. @action is wrapped in the special `device` action for @device, which allows it ...","deprecated":null},{"type":"type_func","name":"deserialize","type_name":"Notification","ident":"valent_notification_deserialize","summary":"Deserializes @variant into a `ValentNotification`. Since `ValentNotification` is effectively a super-set of `GNotification`, @variant may be a serialized `GNotification` ...","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Clipboard","ident":"valent_clipboard_get_default","summary":"Get the default [class@Valent.Clipboard].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Contacts","ident":"valent_contacts_get_default","summary":"Get the default [class@Valent.Contacts].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"DeviceManager","ident":"valent_device_manager_get_default","summary":"Get the default [class@Valent.DeviceManager].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Input","ident":"valent_input_get_default","summary":"Get the default [class@Valent.Input].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Media","ident":"valent_media_get_default","summary":"Get the default [class@Valent.Media].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Mixer","ident":"valent_mixer_get_default","summary":"Get the default [class@Valent.Mixer].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Notifications","ident":"valent_notifications_get_default","summary":"Get the default [class@Valent.Notifications].","deprecated":null},{"type":"type_func","name":"get_default","type_name":"Session","ident":"valent_session_get_default","summary":"Get the default [class@Valent.Session].","deprecated":null},{"type":"type_func","name":"get_resource","type_name":"Device","ident":"valent_device_get_resource","summary":"No description available.","deprecated":null},{"type":"type_func","name":"set_device_action","type_name":"Notification","ident":"valent_notification_set_device_action","summary":"Set the default action for @notification. @action is wrapped in the special `device` action for @device, which allows it ...","deprecated":null},{"type":"vfunc","name":"activate","type_name":"ApplicationPlugin","summary":"Handle activation of the application. Implementations should override this method to handle activation, as a result of [signal@Gio.Application::activate] ...","deprecated":null},{"type":"vfunc","name":"add_contacts","type_name":"ContactStore","summary":"Add @contacts to @store. Call [method@Valent.ContactStore.add_contacts_finish] to get the result.","deprecated":null},{"type":"vfunc","name":"add_notification","type_name":"NotificationsAdapter","summary":"Send @notification to the @adapter.","deprecated":null},{"type":"vfunc","name":"bind_extension","type_name":"Component","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"bind_preferred","type_name":"Component","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"build_identity","type_name":"ChannelService","summary":"Rebuild the local KDE Connect identity packet. This method is called to rebuild the identity packet used to ...","deprecated":null},{"type":"vfunc","name":"changed","type_name":"ClipboardAdapter","summary":"Emits [signal@Valent.ClipboardAdapter::changed] signal on @adapter. The default handler for this signal updates the value returned by the default ...","deprecated":null},{"type":"vfunc","name":"channel","type_name":"ChannelService","summary":"Emit [signal@Valent.ChannelService::channel] on @service. This method should only be called by implementations of [class@Valent.ChannelService].","deprecated":null},{"type":"vfunc","name":"command_line","type_name":"ApplicationPlugin","summary":"Handle the given command-line options. Implementations should override this method to handle command-line options, as a result of ...","deprecated":null},{"type":"vfunc","name":"contact_added","type_name":"ContactStore","summary":"Emits [signal@Valent.ContactStore::contact-added] signal on @store. This method should only be called by implementations of [class@Valent.ContactStore]. Signal handlers may ...","deprecated":null},{"type":"vfunc","name":"contact_removed","type_name":"ContactStore","summary":"Emits [signal@Valent.ContactStore::contact-removed] on @store. This method should only be called by implementations of [class@Valent.ContactStore]. Signal handlers may query ...","deprecated":null},{"type":"vfunc","name":"dbus_register","type_name":"ApplicationPlugin","summary":"Handle the D-Bus registration phase of the application. Implementations may override this method to export extra objects on ...","deprecated":null},{"type":"vfunc","name":"dbus_unregister","type_name":"ApplicationPlugin","summary":"Handle the D-Bus unregistration phase of the application. Implementations should override this method to unexport anything exported in [vfunc@Valent.ApplicationPlugin.dbus_register].","deprecated":null},{"type":"vfunc","name":"destroy","type_name":"Object","summary":"Destroy the object. If called from the main thread, it calls [method@GObject.Object.run_dispose], which activates the object [class@Gio.Cancellable] and ...","deprecated":null},{"type":"vfunc","name":"download","type_name":"Channel","summary":"Open an auxiliary connection, usually to download data. Implementations should use information from the `payloadTransferInfo` field to open ...","deprecated":null},{"type":"vfunc","name":"download_async","type_name":"Channel","summary":"Open an auxiliary connection, usually to download data. This is a non-blocking variant of [method@Valent.Channel.download]. Call [method@Valent.Channel.download_finish] to ...","deprecated":null},{"type":"vfunc","name":"download_finish","type_name":"Channel","summary":"Finish an operation started with [method@Valent.Channel.download_async].","deprecated":null},{"type":"vfunc","name":"execute","type_name":"Transfer","summary":"Start the transfer operation. Get the result with [method@Valent.Transfer.execute_finish]. If the transfer operation has already started, this ...","deprecated":null},{"type":"vfunc","name":"execute_finish","type_name":"Transfer","summary":"Finish an operation started by [method@Valent.Transfer.execute].","deprecated":null},{"type":"vfunc","name":"export_player","type_name":"MediaAdapter","summary":"Export @player on @adapter. This method is intended to allow device plugins to expose remote media players to ...","deprecated":null},{"type":"vfunc","name":"get_active","type_name":"SessionAdapter","summary":"Get whether the session is active.","deprecated":null},{"type":"vfunc","name":"get_contact","type_name":"ContactStore","summary":"Get a contact by UID. Call [method@Valent.ContactStore.get_contact_finish] to get the result.","deprecated":null},{"type":"vfunc","name":"get_default_input","type_name":"MixerAdapter","summary":"Get the default input stream for @adapter.","deprecated":null},{"type":"vfunc","name":"get_default_output","type_name":"MixerAdapter","summary":"Get the default output stream for @adapter.","deprecated":null},{"type":"vfunc","name":"get_description","type_name":"MixerStream","summary":"Get the human-readable label of @stream.","deprecated":null},{"type":"vfunc","name":"get_direction","type_name":"MixerStream","summary":"Get the port direction of @stream.","deprecated":null},{"type":"vfunc","name":"get_flags","type_name":"MediaPlayer","summary":"Get flags describing the available actions of @player.","deprecated":null},{"type":"vfunc","name":"get_level","type_name":"MixerStream","summary":"Get the level of @stream (eg. speaker volume, microphone sensitivity). Implementations that override this method should also override [vfunc@Valent.MixerStream.set_level].","deprecated":null},{"type":"vfunc","name":"get_locked","type_name":"SessionAdapter","summary":"Get whether the session is locked.","deprecated":null},{"type":"vfunc","name":"get_metadata","type_name":"MediaPlayer","summary":"Get the metadata of the active media items. Implementations should typically have an entry for the `mpris:length` field. ...","deprecated":null},{"type":"vfunc","name":"get_mimetypes","type_name":"ClipboardAdapter","summary":"Get the mime-types of the current clipboard content.","deprecated":null},{"type":"vfunc","name":"get_muted","type_name":"MixerStream","summary":"Get the muted state of @stream. Implementations that override this method should also override [vfunc@Valent.MixerStream.set_muted].","deprecated":null},{"type":"vfunc","name":"get_name","type_name":"MediaPlayer","summary":"Get the display name of the @player.","deprecated":null},{"type":"vfunc","name":"get_name","type_name":"MixerStream","summary":"Get the unique name of @stream.","deprecated":null},{"type":"vfunc","name":"get_position","type_name":"MediaPlayer","summary":"Get the current position in seconds.","deprecated":null},{"type":"vfunc","name":"get_repeat","type_name":"MediaPlayer","summary":"Get the repeat mode for @player.","deprecated":null},{"type":"vfunc","name":"get_shuffle","type_name":"MediaPlayer","summary":"Get whether playback order is shuffled.","deprecated":null},{"type":"vfunc","name":"get_state","type_name":"MediaPlayer","summary":"Get the playback state for @player.","deprecated":null},{"type":"vfunc","name":"get_timestamp","type_name":"ClipboardAdapter","summary":"Get the timestamp of the current clipboard content. The default implementation of this method returns the last time ...","deprecated":null},{"type":"vfunc","name":"get_verification_key","type_name":"Channel","summary":"Get a verification key for the connection. Implementations that involve exchanging a key should return a string for ...","deprecated":null},{"type":"vfunc","name":"get_volume","type_name":"MediaPlayer","summary":"Get the volume level.","deprecated":null},{"type":"vfunc","name":"handle_packet","type_name":"DevicePlugin","summary":"Handle a packet from the device the plugin is bound to. This is called when the device receives ...","deprecated":null},{"type":"vfunc","name":"identify","type_name":"ChannelService","summary":"Identify the host device to the network. This method is called to announce the availability of the host ...","deprecated":null},{"type":"vfunc","name":"keyboard_keysym","type_name":"InputAdapter","summary":"Press or release @keysym.","deprecated":null},{"type":"vfunc","name":"next","type_name":"MediaPlayer","summary":"Skip to the next media item. If there is no next track (and endless playback and track repeat ...","deprecated":null},{"type":"vfunc","name":"notification_added","type_name":"NotificationsAdapter","summary":"Emit [signal@Valent.NotificationsAdapter::notification-added] on @adapter. This method should only be called by implementations of [class@Valent.NotificationsAdapter].","deprecated":null},{"type":"vfunc","name":"notification_removed","type_name":"NotificationsAdapter","summary":"Emit [signal@Valent.NotificationsAdapter::notification-removed] on @adapter. This method should only be called by implementations of [class@Valent.NotificationsAdapter].","deprecated":null},{"type":"vfunc","name":"open","type_name":"ApplicationPlugin","summary":"Open the given files. Implementations should override this method to handle files and URIs, as a result of ...","deprecated":null},{"type":"vfunc","name":"pause","type_name":"MediaPlayer","summary":"Pauses playback. If playback is already paused, this has no effect. Calling [method@Valent.MediaPlayer.pause] after this should cause playback ...","deprecated":null},{"type":"vfunc","name":"play","type_name":"MediaPlayer","summary":"Start playback. If already playing, this has no effect. If paused, playback resumes from the current position. If ...","deprecated":null},{"type":"vfunc","name":"pointer_axis","type_name":"InputAdapter","summary":"Scroll the surface under the pointer (@dx, @dy), relative to its current position. Implementations should handle any necessary scaling.","deprecated":null},{"type":"vfunc","name":"pointer_button","type_name":"InputAdapter","summary":"Press or release @button.","deprecated":null},{"type":"vfunc","name":"pointer_motion","type_name":"InputAdapter","summary":"Move the pointer (@dx, @dy), relative to its current position. Implementation should handle any necessary scaling","deprecated":null},{"type":"vfunc","name":"previous","type_name":"MediaPlayer","summary":"Skip to the previous media item. If there is no previous track (and endless playback and track repeat ...","deprecated":null},{"type":"vfunc","name":"query","type_name":"ContactStore","summary":"Query @store for contacts matching @query. Call [method@Valent.ContactStore.query_finish] to get the result.","deprecated":null},{"type":"vfunc","name":"read_bytes","type_name":"ClipboardAdapter","summary":"Get the content of @adapter. Call [method@Valent.ClipboardAdapter.read_bytes_finish] to get the result.","deprecated":null},{"type":"vfunc","name":"read_bytes_finish","type_name":"ClipboardAdapter","summary":"Finish an operation started by [method@Valent.ClipboardAdapter.read_bytes].","deprecated":null},{"type":"vfunc","name":"remove_contacts","type_name":"ContactStore","summary":"Remove contact @uid from @store. Call [method@Valent.ContactStore.remove_contacts_finish] to get the result.","deprecated":null},{"type":"vfunc","name":"remove_notification","type_name":"NotificationsAdapter","summary":"Withdraw @id from @adapter.","deprecated":null},{"type":"vfunc","name":"seek","type_name":"MediaPlayer","summary":"Seek in the current media item by @offset seconds. A negative value seeks back. If this would mean ...","deprecated":null},{"type":"vfunc","name":"set_default_input","type_name":"MixerAdapter","summary":"Set the default input stream for @adapter to @stream.","deprecated":null},{"type":"vfunc","name":"set_default_output","type_name":"MixerAdapter","summary":"Set the default output stream for @adapter to @stream.","deprecated":null},{"type":"vfunc","name":"set_level","type_name":"MixerStream","summary":"Set the level of @stream (eg. speaker volume, microphone sensitivity). Implementations that override this method should also override [vfunc@Valent.MixerStream.get_level].","deprecated":null},{"type":"vfunc","name":"set_locked","type_name":"SessionAdapter","summary":"Set whether the session is locked.","deprecated":null},{"type":"vfunc","name":"set_muted","type_name":"MixerStream","summary":"Set the muted state of @stream. Implementations that override this method should also override [vfunc@Valent.MixerStream.get_muted].","deprecated":null},{"type":"vfunc","name":"set_position","type_name":"MediaPlayer","summary":"Set the current position in seconds.","deprecated":null},{"type":"vfunc","name":"set_repeat","type_name":"MediaPlayer","summary":"Set the repeat mode of @player to @repeat.","deprecated":null},{"type":"vfunc","name":"set_shuffle","type_name":"MediaPlayer","summary":"Set whether playback order is shuffled.","deprecated":null},{"type":"vfunc","name":"set_volume","type_name":"MediaPlayer","summary":"Set the volume level of @player.","deprecated":null},{"type":"vfunc","name":"shutdown","type_name":"ApplicationPlugin","summary":"Handle the shutdown phase of the application. Implementations should override this method to reverse anything done in [vfunc@Valent.ApplicationPlugin.startup].","deprecated":null},{"type":"vfunc","name":"startup","type_name":"ApplicationPlugin","summary":"Handle the startup phase of the application. Implementations may override this method to perform setup task that should ...","deprecated":null},{"type":"vfunc","name":"stop","type_name":"MediaPlayer","summary":"Stop playback. If playback is already stopped, this has no effect. Calling valent_media_player_play() after this should cause playback ...","deprecated":null},{"type":"vfunc","name":"store_data","type_name":"Channel","summary":"Store channel metadata. This method is called to store channel specific data. Implementations can override this method to ...","deprecated":null},{"type":"vfunc","name":"unbind_extension","type_name":"Component","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"unexport_player","type_name":"MediaAdapter","summary":"Unexport @player from @adapter.","deprecated":null},{"type":"vfunc","name":"update_state","type_name":"DevicePlugin","summary":"Update the plugin based on the new state of the device. This function is called when the connected ...","deprecated":null},{"type":"vfunc","name":"upload","type_name":"Channel","summary":"Accept an auxiliary connection, usually to upload data. Implementations should set the `payloadTransferInfo` field with information the peer ...","deprecated":null},{"type":"vfunc","name":"upload_async","type_name":"Channel","summary":"Accept an auxiliary connection, usually to upload data. This is a non-blocking variant of [method@Valent.Channel.upload]. Call [method@Valent.Channel.upload_finish] to ...","deprecated":null},{"type":"vfunc","name":"upload_finish","type_name":"Channel","summary":"Finish an operation started with [method@Valent.Channel.upload_async].","deprecated":null},{"type":"vfunc","name":"write_bytes","type_name":"ClipboardAdapter","summary":"Set the content of the clipboard. Call [method@Valent.ClipboardAdapter.write_bytes_finish] to get the result.","deprecated":null},{"type":"vfunc","name":"write_bytes_finish","type_name":"ClipboardAdapter","summary":"Finish an operation started by [method@Valent.ClipboardAdapter.write_bytes].","deprecated":null}],"terms":{}} \ No newline at end of file diff --git a/documentation/logo.svg b/documentation/logo.svg new file mode 100644 index 00000000000..fdb63296c6e --- /dev/null +++ b/documentation/logo.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/main.js b/documentation/main.js new file mode 100644 index 00000000000..4bb0582ed38 --- /dev/null +++ b/documentation/main.js @@ -0,0 +1,177 @@ +// SPDX-FileCopyrightText: 2021 GNOME Foundation +// +// SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later +"use strict"; + + +const urlMap = new Map(typeof baseURLs !== 'undefined' ? baseURLs : []); + +window.addEventListener("hashchange", onDidHashChange); +window.addEventListener("load", onDidLoad, false); +window.addEventListener("keydown", onKeyDown); + +function onDidLoad() { + attachScrollHandlers() + attachToggleHandlers() + attachCopyHandlers() + + if (window.onInitSearch) { + window.onInitSearch() + } +} + +function onDidHashChange() { + // When URL fragment changes to ID of a collapsible section, + // expand it when it is collapsed. + // This is useful for clicking section links in the sidebar on the index page. + const sectionHeader = document.querySelector(".section-header" + location.hash); + if (sectionHeader !== null) { + const parent = sectionHeader.parentNode; + if (hasClass(parent, "toggle-wrapper")) { + const toggle = parent.querySelector(".collapse-toggle"); + if (hasClass(toggle, "collapsed")) { + toggle.click(); + } + } + } +} + + +function attachScrollHandlers() { + const btnToTop = document.getElementById("btn-to-top"); + + btnToTop.addEventListener('click', onClick); + window.addEventListener('scroll', onScroll); + + function onClick(e) { + e.preventDefault(); + window.scroll({ top: 0, behavior: 'smooth' }); + } + + function onScroll() { + if (window.scrollY < 400) { + addClass(btnToTop, "hidden"); + } else { + removeClass(btnToTop, "hidden"); + } + } +} + +function attachToggleHandlers() { + function label(isCollapsed) { + return ( + "[" + + (isCollapsed ? "+" : "\u2212") + + "]" + ) + } + + function createToggle(isCollapsed) { + const toggle = document.createElement("a"); + toggle.href = "javascript:void(0)"; + toggle.className = "collapse-toggle"; + toggle.innerHTML = label(isCollapsed); + toggle.addEventListener('click', onClickToggle); + return toggle; + } + + function onClickToggle() { + if (hasClass(this, "collapsed")) { + removeClass(this, "collapsed"); + this.innerHTML = label(false); + forEach(this.parentNode.querySelectorAll(".docblock"), function(e) { + removeClass(e, "hidden"); + }); + } else { + addClass(this, "collapsed"); + this.innerHTML = label(true); + forEach(this.parentNode.querySelectorAll(".docblock"), function(e) { + addClass(e, "hidden"); + }); + } + } + + forEach(document.querySelectorAll(".toggle-wrapper"), function(e) { + const sectionHeader = e.querySelector(".section-header"); + const fragmentMatches = sectionHeader !== null && location.hash === "#" + sectionHeader.getAttribute('id'); + const collapsedByDefault = hasClass(e, "default-hide") && !fragmentMatches; + const toggle = createToggle(collapsedByDefault); + e.insertBefore(toggle, e.firstChild); + if (collapsedByDefault) { + addClass(toggle, "collapsed"); + forEach(e.querySelectorAll(".docblock"), function(d) { + addClass(d, "hidden"); + }); + } + }); + + function resolveNamespaceLink(namespace) { + return urlMap.get(namespace); + } + + forEach(document.querySelectorAll(".external"), function(e) { + if (e.tagName == "A" && e.dataset.hasOwnProperty('namespace')) { + var data_namespace = e.dataset.namespace + var data_link = e.dataset.link + var base_url = resolveNamespaceLink(data_namespace) + if (base_url !== undefined) { + e.href = base_url + data_link; + } else { + e.title = "No reference to the " + data_namespace + " namespace"; + } + } + }) +} + +function attachCopyHandlers() { + if (!navigator.clipboard) + return; + + forEach(document.querySelectorAll(".codehilite"), function(e) { + const button = document.createElement("button"); + button.className = "copy-button"; + button.innerText = "Copy"; + button.title = "Copy code to clipboard"; + + const text = e.innerText; + button.addEventListener("click", () => { + navigator.clipboard.writeText(text); + }); + + e.appendChild(button); + }) +} + +function onKeyDown(event) { + let search_input = document.querySelector("#search-input"); + // We don't want to try to focus the search input if it isn't visible. That way + // we avoid the preventDefault(), hence allowing devhelp to use S as mnemonic. + let potentially_hidden_parent = search_input.closest('.hidden, .devhelp-hidden'); + + if (window.getComputedStyle(potentially_hidden_parent).display !== 'none' && + (event.key === "s" || event.key === "S") && + document.activeElement !== search_input) { + event.preventDefault(); + search_input.focus(); + } +} + +// Helpers + +function hasClass(elem, className) { + return elem && elem.classList && elem.classList.contains(className); +} + +function addClass(elem, className) { + return elem && elem.classList && elem.classList.add(className); +} + +function removeClass(elem, className) { + return elem && elem.classList && elem.classList.remove(className); +} + +function forEach(arr, func) { + for (let i = 0; i < arr.length; ++i) { + func(arr[i]) + } +} diff --git a/documentation/method.ApplicationPlugin.activate.html b/documentation/method.ApplicationPlugin.activate.html new file mode 100644 index 00000000000..0389a6aeb1a --- /dev/null +++ b/documentation/method.ApplicationPlugin.activate.html @@ -0,0 +1,216 @@ + + + + + + Valent.ApplicationPlugin.activate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPluginactivate

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_application_plugin_activate (
+  ValentApplicationPlugin* plugin
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle activation of the application.

+

Implementations should override this method to handle activation, as +a result of GApplication::activate being emitted on the primary +instance of the application.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if handled, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ApplicationPlugin.command_line.html b/documentation/method.ApplicationPlugin.command_line.html new file mode 100644 index 00000000000..f3197786601 --- /dev/null +++ b/documentation/method.ApplicationPlugin.command_line.html @@ -0,0 +1,249 @@ + + + + + + Valent.ApplicationPlugin.command_line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPlugincommand_line

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
int
+valent_application_plugin_command_line (
+  ValentApplicationPlugin* plugin,
+  GApplicationCommandLine* command_line
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the given command-line options.

+

Implementations should override this method to handle command-line options, +as a result of GApplication::command-line being emitted on the +primary instance of the application.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
command_line
+
+

Type: GApplicationCommandLine

+

A GApplicationCommandLine

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: int

+

An integer that is set as the exit status for the calling process.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ApplicationPlugin.dbus_register.html b/documentation/method.ApplicationPlugin.dbus_register.html new file mode 100644 index 00000000000..5e131e854e9 --- /dev/null +++ b/documentation/method.ApplicationPlugin.dbus_register.html @@ -0,0 +1,282 @@ + + + + + + Valent.ApplicationPlugin.dbus_register + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPlugindbus_register

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_application_plugin_dbus_register (
+  ValentApplicationPlugin* plugin,
+  GDBusConnection* connection,
+  const char* object_path,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the D-Bus registration phase of the application.

+

Implementations may override this method to export extra objects on the +bus, that need to exist before the application tries to own the bus name.

+

D-Bus registration will be aborted if FALSE is returned, so implementations +may return TRUE and report the error by other means if it is not intended +to be fatal.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
connection
+
+

Type: GDBusConnection

+

A Gio.DBusCOnnection

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
object_path
+
+

Type: const char*

+

A D-Bus object path.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ApplicationPlugin.dbus_unregister.html b/documentation/method.ApplicationPlugin.dbus_unregister.html new file mode 100644 index 00000000000..738d192dc09 --- /dev/null +++ b/documentation/method.ApplicationPlugin.dbus_unregister.html @@ -0,0 +1,240 @@ + + + + + + Valent.ApplicationPlugin.dbus_unregister + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPlugindbus_unregister

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_application_plugin_dbus_unregister (
+  ValentApplicationPlugin* plugin,
+  GDBusConnection* connection,
+  const char* object_path
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the D-Bus unregistration phase of the application.

+

Implementations should override this method to unexport anything exported in +Valent.ApplicationPluginClass.dbus_register.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
connection
+
+

Type: GDBusConnection

+

A Gio.DBusCOnnection

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
object_path
+
+

Type: const char*

+

A D.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ApplicationPlugin.open.html b/documentation/method.ApplicationPlugin.open.html new file mode 100644 index 00000000000..30724e83e33 --- /dev/null +++ b/documentation/method.ApplicationPlugin.open.html @@ -0,0 +1,285 @@ + + + + + + Valent.ApplicationPlugin.open + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPluginopen

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_application_plugin_open (
+  ValentApplicationPlugin* plugin,
+  GFile** files,
+  int n_files,
+  const char* hint
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Open the given files.

+

Implementations should override this method to handle files and URIs, as +a result of GApplication::open being emitted on the primary +instance of the application.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
files
+
+

Type: An array of GFile*

+

An array of GFiles to open.

+ + + + + + + + + + +
The length of the array is specified in the n_files argument.
The data is owned by the caller of the method.
+
+ +
n_files
+
+

Type: int

+

The length of the files array.

+ + + + + + + + + + +
+
+ +
hint
+
+

Type: const char*

+

A hint (or “”)

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if handled, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ApplicationPlugin.shutdown.html b/documentation/method.ApplicationPlugin.shutdown.html new file mode 100644 index 00000000000..cf0e7f3360c --- /dev/null +++ b/documentation/method.ApplicationPlugin.shutdown.html @@ -0,0 +1,189 @@ + + + + + + Valent.ApplicationPlugin.shutdown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPluginshutdown

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_application_plugin_shutdown (
+  ValentApplicationPlugin* plugin
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the shutdown phase of the application.

+

Implementations should override this method to reverse anything done in +Valent.ApplicationPluginClass.startup.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ApplicationPlugin.startup.html b/documentation/method.ApplicationPlugin.startup.html new file mode 100644 index 00000000000..d89845c5b85 --- /dev/null +++ b/documentation/method.ApplicationPlugin.startup.html @@ -0,0 +1,189 @@ + + + + + + Valent.ApplicationPlugin.startup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentApplicationPluginstartup

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_application_plugin_startup (
+  ValentApplicationPlugin* plugin
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the startup phase of the application.

+

Implementations may override this method to perform setup task that should +only happen on the primary instance.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.close.html b/documentation/method.Channel.close.html new file mode 100644 index 00000000000..114fd016d69 --- /dev/null +++ b/documentation/method.Channel.close.html @@ -0,0 +1,281 @@ + + + + + + Valent.Channel.close + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelclose

+
+ +
+
+

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_channel_close (
+  ValentChannel* channel,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Close the channel.

+
+ +
+ + + + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.close_async.html b/documentation/method.Channel.close_async.html new file mode 100644 index 00000000000..b1b3fe3383a --- /dev/null +++ b/documentation/method.Channel.close_async.html @@ -0,0 +1,279 @@ + + + + + + Valent.Channel.close_async + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelclose_async

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_close_async (
+  ValentChannel* channel,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Close the channel asynchronously.

+

Call valent_channel_close_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.close_finish.html b/documentation/method.Channel.close_finish.html new file mode 100644 index 00000000000..6e280620258 --- /dev/null +++ b/documentation/method.Channel.close_finish.html @@ -0,0 +1,281 @@ + + + + + + Valent.Channel.close_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelclose_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_channel_close_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_channel_close_async().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.download.html b/documentation/method.Channel.download.html new file mode 100644 index 00000000000..25baed143ab --- /dev/null +++ b/documentation/method.Channel.download.html @@ -0,0 +1,305 @@ + + + + + + Valent.Channel.download + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChanneldownload

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+valent_channel_download (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Open an auxiliary connection, usually to download data.

+

Implementations should use information from the payloadTransferInfo field +to open a connection and wait for it to be accepted. In most cases the remote +device will write data to the stream and then close it when finished.

+

For example, a TCP-based implementation could connect to a port in the +payloadTransferInfo dictionary on the same host as the channel. When the +connection is accepted the caller can perform operations on it as required.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.download_async.html b/documentation/method.Channel.download_async.html new file mode 100644 index 00000000000..78ea48e0c96 --- /dev/null +++ b/documentation/method.Channel.download_async.html @@ -0,0 +1,300 @@ + + + + + + Valent.Channel.download_async + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChanneldownload_async

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_download_async (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Open an auxiliary connection, usually to download data.

+

This is a non-blocking variant of valent_channel_download(). Call +valent_channel_download_finish() to get the result.

+

The default implementation of this method invokes +Valent.ChannelClass.download in a thread.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.download_finish.html b/documentation/method.Channel.download_finish.html new file mode 100644 index 00000000000..d2acd288fec --- /dev/null +++ b/documentation/method.Channel.download_finish.html @@ -0,0 +1,281 @@ + + + + + + Valent.Channel.download_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChanneldownload_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+valent_channel_download_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started with valent_channel_download_async().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.get_identity.html b/documentation/method.Channel.get_identity.html new file mode 100644 index 00000000000..5886cf35f7d --- /dev/null +++ b/documentation/method.Channel.get_identity.html @@ -0,0 +1,243 @@ + + + + + + Valent.Channel.get_identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelget_identity

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_channel_get_identity (
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the local identity packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Channel:identity
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.get_peer_identity.html b/documentation/method.Channel.get_peer_identity.html new file mode 100644 index 00000000000..fb04762a32d --- /dev/null +++ b/documentation/method.Channel.get_peer_identity.html @@ -0,0 +1,243 @@ + + + + + + Valent.Channel.get_peer_identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelget_peer_identity

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_channel_get_peer_identity (
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the peer identity packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Channel:peer-identity
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.get_verification_key.html b/documentation/method.Channel.get_verification_key.html new file mode 100644 index 00000000000..0bd28fbb7a8 --- /dev/null +++ b/documentation/method.Channel.get_verification_key.html @@ -0,0 +1,237 @@ + + + + + + Valent.Channel.get_verification_key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelget_verification_key

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_channel_get_verification_key (
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a verification key for the connection.

+

Implementations that involve exchanging a key should return a string for the +user to authenticate the connection, similar to a Bluetooth PIN.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A verification key.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.read_packet.html b/documentation/method.Channel.read_packet.html new file mode 100644 index 00000000000..c21d76e29c5 --- /dev/null +++ b/documentation/method.Channel.read_packet.html @@ -0,0 +1,279 @@ + + + + + + Valent.Channel.read_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelread_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_read_packet (
+  ValentChannel* channel,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Read the next KDE Connect packet from channel.

+

Call valent_channel_read_packet_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.read_packet_finish.html b/documentation/method.Channel.read_packet_finish.html new file mode 100644 index 00000000000..7c86f9f7fd0 --- /dev/null +++ b/documentation/method.Channel.read_packet_finish.html @@ -0,0 +1,281 @@ + + + + + + Valent.Channel.read_packet_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelread_packet_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_channel_read_packet_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_channel_read_packet().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet, or NULL with error set.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.ref_base_stream.html b/documentation/method.Channel.ref_base_stream.html new file mode 100644 index 00000000000..097b9cf0a5c --- /dev/null +++ b/documentation/method.Channel.ref_base_stream.html @@ -0,0 +1,243 @@ + + + + + + Valent.Channel.ref_base_stream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelref_base_stream

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+valent_channel_ref_base_stream (
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the base GIOStream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Channel:base-stream
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

The base stream.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.store_data.html b/documentation/method.Channel.store_data.html new file mode 100644 index 00000000000..d73a5212a42 --- /dev/null +++ b/documentation/method.Channel.store_data.html @@ -0,0 +1,245 @@ + + + + + + Valent.Channel.store_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelstore_data

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_store_data (
+  ValentChannel* channel,
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Store channel metadata.

+

This method is called to store channel specific data. Implementations can +override this method to store extra data (eg. TLS Certificate).

+

Implementations that override Valent.ChannelClass.store_data must chain-up.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
context
+
+

Type: ValentContext

+

A ValentContext

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.upload.html b/documentation/method.Channel.upload.html new file mode 100644 index 00000000000..cb8ee266371 --- /dev/null +++ b/documentation/method.Channel.upload.html @@ -0,0 +1,306 @@ + + + + + + Valent.Channel.upload + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelupload

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+valent_channel_upload (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Accept an auxiliary connection, usually to upload data.

+

Implementations should set the payloadTransferInfo field with information +the peer can use to open a connection and wait to accept that connection. In +most cases the remote device with expect the caller to write to the stream +and then close it when finished.

+

For example, a TCP-based implementation could start listening on a port then +send the packet with that port in the payloadTransferInfo dictionary. When +a connection is accepted the caller can perform operations on it as required.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.upload_async.html b/documentation/method.Channel.upload_async.html new file mode 100644 index 00000000000..4700293a74d --- /dev/null +++ b/documentation/method.Channel.upload_async.html @@ -0,0 +1,300 @@ + + + + + + Valent.Channel.upload_async + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelupload_async

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_upload_async (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Accept an auxiliary connection, usually to upload data.

+

This is a non-blocking variant of valent_channel_upload(). Call +valent_channel_upload_finish() to get the result.

+

The default implementation of this method invokes +Valent.ChannelClass.upload in a thread.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.upload_finish.html b/documentation/method.Channel.upload_finish.html new file mode 100644 index 00000000000..866492fe73e --- /dev/null +++ b/documentation/method.Channel.upload_finish.html @@ -0,0 +1,281 @@ + + + + + + Valent.Channel.upload_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelupload_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+valent_channel_upload_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started with valent_channel_upload_async().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.write_packet.html b/documentation/method.Channel.write_packet.html new file mode 100644 index 00000000000..11626db4294 --- /dev/null +++ b/documentation/method.Channel.write_packet.html @@ -0,0 +1,299 @@ + + + + + + Valent.Channel.write_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelwrite_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_write_packet (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Send a packet over the channel.

+

Internally ValentChannel uses an outgoing packet buffer, so +multiple requests can be started safely from any thread.

+

Call valent_channel_write_packet_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Channel.write_packet_finish.html b/documentation/method.Channel.write_packet_finish.html new file mode 100644 index 00000000000..c7c004f67c2 --- /dev/null +++ b/documentation/method.Channel.write_packet_finish.html @@ -0,0 +1,281 @@ + + + + + + Valent.Channel.write_packet_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelwrite_packet_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_channel_write_packet_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_channel_write_packet().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.build_identity.html b/documentation/method.ChannelService.build_identity.html new file mode 100644 index 00000000000..1f5fd4c0b72 --- /dev/null +++ b/documentation/method.ChannelService.build_identity.html @@ -0,0 +1,194 @@ + + + + + + Valent.ChannelService.build_identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServicebuild_identity

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_service_build_identity (
+  ValentChannelService* service
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Rebuild the local KDE Connect identity packet.

+

This method is called to rebuild the identity packet used to identify the +host device to remote devices.

+

Implementations that override Valent.ChannelServiceClass.build_identity +should chain-up first, then call valent_channel_service_ref_identity() +and modify that.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.channel.html b/documentation/method.ChannelService.channel.html new file mode 100644 index 00000000000..a00ccff966f --- /dev/null +++ b/documentation/method.ChannelService.channel.html @@ -0,0 +1,224 @@ + + + + + + Valent.ChannelService.channel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServicechannel

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_service_channel (
+  ValentChannelService* service,
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit ValentChannelService::channel on service.

+

This method should only be called by implementations of +ValentChannelService.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
channel
+
+

Type: ValentChannel

+

A ValentChannel

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.dup_id.html b/documentation/method.ChannelService.dup_id.html new file mode 100644 index 00000000000..10d4ed7b35a --- /dev/null +++ b/documentation/method.ChannelService.dup_id.html @@ -0,0 +1,223 @@ + + + + + + Valent.ChannelService.dup_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServicedup_id

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
char*
+valent_channel_service_dup_id (
+  ValentChannelService* service
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the local ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.ChannelService:id
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: char*

+

The service ID.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.get_name.html b/documentation/method.ChannelService.get_name.html new file mode 100644 index 00000000000..f9b96ef4953 --- /dev/null +++ b/documentation/method.ChannelService.get_name.html @@ -0,0 +1,223 @@ + + + + + + Valent.ChannelService.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServiceget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_channel_service_get_name (
+  ValentChannelService* service
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the local display name.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.ChannelService:name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The local display name.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.identify.html b/documentation/method.ChannelService.identify.html new file mode 100644 index 00000000000..ecdd3ce9d54 --- /dev/null +++ b/documentation/method.ChannelService.identify.html @@ -0,0 +1,226 @@ + + + + + + Valent.ChannelService.identify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServiceidentify

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_service_identify (
+  ValentChannelService* service,
+  const char* target
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Identify the host device to the network.

+

This method is called to announce the availability of the host device to +other devices.

+

Implementations that override Valent.ChannelServiceClass.identify may +ignore target or use it to address a particular device.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
target
+
+

Type: const char*

+

A target string.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.ref_certificate.html b/documentation/method.ChannelService.ref_certificate.html new file mode 100644 index 00000000000..535e4eddb7b --- /dev/null +++ b/documentation/method.ChannelService.ref_certificate.html @@ -0,0 +1,223 @@ + + + + + + Valent.ChannelService.ref_certificate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServiceref_certificate

+
+ +
+
+

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GTlsCertificate*
+valent_channel_service_ref_certificate (
+  ValentChannelService* self
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the TLS certificate for the service.

+
+ +
+ + + + + + +
+ + +
+ + + + +
Gets propertyValent.ChannelService:certificate
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GTlsCertificate

+

The service TLS certificate.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.ref_identity.html b/documentation/method.ChannelService.ref_identity.html new file mode 100644 index 00000000000..d92ab4d0016 --- /dev/null +++ b/documentation/method.ChannelService.ref_identity.html @@ -0,0 +1,223 @@ + + + + + + Valent.ChannelService.ref_identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServiceref_identity

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_channel_service_ref_identity (
+  ValentChannelService* service
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the local identity packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.ChannelService:identity
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ChannelService.set_name.html b/documentation/method.ChannelService.set_name.html new file mode 100644 index 00000000000..1ff713581a3 --- /dev/null +++ b/documentation/method.ChannelService.set_name.html @@ -0,0 +1,230 @@ + + + + + + Valent.ChannelService.set_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentChannelServiceset_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_channel_service_set_name (
+  ValentChannelService* service,
+  const char* name
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the local display name.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.ChannelService:name
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
name
+
+

Type: const char*

+

A display name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.get_mimetypes.html b/documentation/method.Clipboard.get_mimetypes.html new file mode 100644 index 00000000000..b43f68016c0 --- /dev/null +++ b/documentation/method.Clipboard.get_mimetypes.html @@ -0,0 +1,219 @@ + + + + + + Valent.Clipboard.get_mimetypes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardget_mimetypes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GStrv
+valent_clipboard_get_mimetypes (
+  ValentClipboard* clipboard
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the mime-types of the primary clipboard content.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: An array of utf8

+

A list of mime-types.

+
+
+ + + + + + + +
The array is NULL-terminated.
Each element is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.get_timestamp.html b/documentation/method.Clipboard.get_timestamp.html new file mode 100644 index 00000000000..9159cb078fc --- /dev/null +++ b/documentation/method.Clipboard.get_timestamp.html @@ -0,0 +1,220 @@ + + + + + + Valent.Clipboard.get_timestamp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardget_timestamp

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
int64_t
+valent_clipboard_get_timestamp (
+  ValentClipboard* clipboard
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the timestamp of the current clipboard content, in milliseconds since the +UNIX epoch.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: int64_t

+

A UNIX epoch timestamp (ms)

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.read_bytes.html b/documentation/method.Clipboard.read_bytes.html new file mode 100644 index 00000000000..aa0f642d727 --- /dev/null +++ b/documentation/method.Clipboard.read_bytes.html @@ -0,0 +1,281 @@ + + + + + + Valent.Clipboard.read_bytes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardread_bytes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_read_bytes (
+  ValentClipboard* clipboard,
+  const char* mimetype,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the content of the primary clipboard adapter.

+

Call valent_clipboard_read_bytes_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
mimetype
+
+

Type: const char*

+

A mime-type.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.read_bytes_finish.html b/documentation/method.Clipboard.read_bytes_finish.html new file mode 100644 index 00000000000..0b309314b13 --- /dev/null +++ b/documentation/method.Clipboard.read_bytes_finish.html @@ -0,0 +1,265 @@ + + + + + + Valent.Clipboard.read_bytes_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardread_bytes_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GBytes*
+valent_clipboard_read_bytes_finish (
+  ValentClipboard* clipboard,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_read_bytes().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GBytes

+

The content.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.read_text.html b/documentation/method.Clipboard.read_text.html new file mode 100644 index 00000000000..ee81aa60954 --- /dev/null +++ b/documentation/method.Clipboard.read_text.html @@ -0,0 +1,263 @@ + + + + + + Valent.Clipboard.read_text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardread_text

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_read_text (
+  ValentClipboard* clipboard,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the text content of the primary clipboard adapter.

+

Call valent_clipboard_read_text_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.read_text_finish.html b/documentation/method.Clipboard.read_text_finish.html new file mode 100644 index 00000000000..0cdc93cc89b --- /dev/null +++ b/documentation/method.Clipboard.read_text_finish.html @@ -0,0 +1,265 @@ + + + + + + Valent.Clipboard.read_text_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardread_text_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
char*
+valent_clipboard_read_text_finish (
+  ValentClipboard* clipboard,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_read_text().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: char*

+

The text content.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.write_bytes.html b/documentation/method.Clipboard.write_bytes.html new file mode 100644 index 00000000000..a2dc4ba405d --- /dev/null +++ b/documentation/method.Clipboard.write_bytes.html @@ -0,0 +1,299 @@ + + + + + + Valent.Clipboard.write_bytes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardwrite_bytes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_write_bytes (
+  ValentClipboard* clipboard,
+  const char* mimetype,
+  GBytes* bytes,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the content of the primary clipboard adapter.

+

Call valent_clipboard_write_bytes_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
mimetype
+
+

Type: const char*

+

A mime-type, or NULL if bytes is NULL.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
bytes
+
+

Type: GBytes

+

A GBytes, or NULL if mimetype is NULL.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.write_bytes_finish.html b/documentation/method.Clipboard.write_bytes_finish.html new file mode 100644 index 00000000000..3d29f191016 --- /dev/null +++ b/documentation/method.Clipboard.write_bytes_finish.html @@ -0,0 +1,265 @@ + + + + + + Valent.Clipboard.write_bytes_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardwrite_bytes_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_clipboard_write_bytes_finish (
+  ValentClipboard* clipboard,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_write_bytes().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.write_text.html b/documentation/method.Clipboard.write_text.html new file mode 100644 index 00000000000..cf7f91a424d --- /dev/null +++ b/documentation/method.Clipboard.write_text.html @@ -0,0 +1,281 @@ + + + + + + Valent.Clipboard.write_text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardwrite_text

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_write_text (
+  ValentClipboard* clipboard,
+  const char* text,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the text content of the primary clipboard adapter.

+

Call valent_clipboard_write_text_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
text
+
+

Type: const char*

+

Text content.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Clipboard.write_text_finish.html b/documentation/method.Clipboard.write_text_finish.html new file mode 100644 index 00000000000..a762506a40a --- /dev/null +++ b/documentation/method.Clipboard.write_text_finish.html @@ -0,0 +1,265 @@ + + + + + + Valent.Clipboard.write_text_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardwrite_text_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_clipboard_write_text_finish (
+  ValentClipboard* clipboard,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_write_text().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.changed.html b/documentation/method.ClipboardAdapter.changed.html new file mode 100644 index 00000000000..74f490ec928 --- /dev/null +++ b/documentation/method.ClipboardAdapter.changed.html @@ -0,0 +1,191 @@ + + + + + + Valent.ClipboardAdapter.changed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterchanged

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_adapter_changed (
+  ValentClipboardAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits ValentClipboardAdapter::changed signal on adapter.

+

The default handler for this signal updates the value returned by the default +implementation of Valent.ClipboardAdapterClass.get_timestamp.

+

This method should only be called by implementations of +ValentClipboardAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.get_mimetypes.html b/documentation/method.ClipboardAdapter.get_mimetypes.html new file mode 100644 index 00000000000..3f964876e1a --- /dev/null +++ b/documentation/method.ClipboardAdapter.get_mimetypes.html @@ -0,0 +1,213 @@ + + + + + + Valent.ClipboardAdapter.get_mimetypes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterget_mimetypes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GStrv
+valent_clipboard_adapter_get_mimetypes (
+  ValentClipboardAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the mime-types of the current clipboard content.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: An array of utf8

+

A list of mime-types.

+
+
+ + + + + + + +
The array is NULL-terminated.
Each element is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.get_timestamp.html b/documentation/method.ClipboardAdapter.get_timestamp.html new file mode 100644 index 00000000000..a0321774d6b --- /dev/null +++ b/documentation/method.ClipboardAdapter.get_timestamp.html @@ -0,0 +1,215 @@ + + + + + + Valent.ClipboardAdapter.get_timestamp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterget_timestamp

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
int64_t
+valent_clipboard_adapter_get_timestamp (
+  ValentClipboardAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the timestamp of the current clipboard content.

+

The default implementation of this method returns the last time +ValentClipboardAdapter::changed was emitted.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: int64_t

+

A UNIX epoch timestamp (ms)

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.read_bytes.html b/documentation/method.ClipboardAdapter.read_bytes.html new file mode 100644 index 00000000000..0b0e3c31a1b --- /dev/null +++ b/documentation/method.ClipboardAdapter.read_bytes.html @@ -0,0 +1,275 @@ + + + + + + Valent.ClipboardAdapter.read_bytes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterread_bytes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_adapter_read_bytes (
+  ValentClipboardAdapter* adapter,
+  const char* mimetype,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the content of adapter.

+

Call valent_clipboard_adapter_read_bytes_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
mimetype
+
+

Type: const char*

+

A mime-type.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.read_bytes_finish.html b/documentation/method.ClipboardAdapter.read_bytes_finish.html new file mode 100644 index 00000000000..8e07e6ca2f7 --- /dev/null +++ b/documentation/method.ClipboardAdapter.read_bytes_finish.html @@ -0,0 +1,259 @@ + + + + + + Valent.ClipboardAdapter.read_bytes_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterread_bytes_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GBytes*
+valent_clipboard_adapter_read_bytes_finish (
+  ValentClipboardAdapter* adapter,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_adapter_read_bytes().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GBytes

+

A GBytes, or NULL with error set.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.write_bytes.html b/documentation/method.ClipboardAdapter.write_bytes.html new file mode 100644 index 00000000000..56b9c6ca1a2 --- /dev/null +++ b/documentation/method.ClipboardAdapter.write_bytes.html @@ -0,0 +1,293 @@ + + + + + + Valent.ClipboardAdapter.write_bytes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterwrite_bytes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_clipboard_adapter_write_bytes (
+  ValentClipboardAdapter* adapter,
+  const char* mimetype,
+  GBytes* bytes,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the content of the clipboard.

+

Call valent_clipboard_adapter_write_bytes_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
mimetype
+
+

Type: const char*

+

A mime-type, or NULL if bytes is NULL.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
bytes
+
+

Type: GBytes

+

A GBytes, or NULL if mimetype is NULL.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ClipboardAdapter.write_bytes_finish.html b/documentation/method.ClipboardAdapter.write_bytes_finish.html new file mode 100644 index 00000000000..b229fdc5156 --- /dev/null +++ b/documentation/method.ClipboardAdapter.write_bytes_finish.html @@ -0,0 +1,259 @@ + + + + + + Valent.ClipboardAdapter.write_bytes_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentClipboardAdapterwrite_bytes_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_clipboard_adapter_write_bytes_finish (
+  ValentClipboardAdapter* adapter,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_adapter_write_bytes().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.add_contact.html b/documentation/method.ContactStore.add_contact.html new file mode 100644 index 00000000000..06fb550eaa9 --- /dev/null +++ b/documentation/method.ContactStore.add_contact.html @@ -0,0 +1,296 @@ + + + + + + Valent.ContactStore.add_contact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreadd_contact

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_add_contact (
+  ValentContactStore* store,
+  EContact* contact,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience wrapper around valent_contact_store_add_contacts() for +adding a single contact.

+

Call valent_contact_store_add_contacts_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
contact
+
+

Type: EContact

+

A EContact

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.add_contacts.html b/documentation/method.ContactStore.add_contacts.html new file mode 100644 index 00000000000..28bcbc3a4bb --- /dev/null +++ b/documentation/method.ContactStore.add_contacts.html @@ -0,0 +1,295 @@ + + + + + + Valent.ContactStore.add_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreadd_contacts

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_add_contacts (
+  ValentContactStore* store,
+  GSList* contacts,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Add contacts to store.

+

Call valent_contact_store_add_contacts_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
contacts
+
+

Type: A list of EContact*

+

A GSList

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.add_contacts_finish.html b/documentation/method.ContactStore.add_contacts_finish.html new file mode 100644 index 00000000000..6c68dcb7429 --- /dev/null +++ b/documentation/method.ContactStore.add_contacts_finish.html @@ -0,0 +1,280 @@ + + + + + + Valent.ContactStore.add_contacts_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreadd_contacts_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_contact_store_add_contacts_finish (
+  ValentContactStore* store,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ + + +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.contact_added.html b/documentation/method.ContactStore.contact_added.html new file mode 100644 index 00000000000..e43568cdc4a --- /dev/null +++ b/documentation/method.ContactStore.contact_added.html @@ -0,0 +1,243 @@ + + + + + + Valent.ContactStore.contact_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStorecontact_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_contact_added (
+  ValentContactStore* store,
+  EContact* contact
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits ValentContactStore::contact-added signal on store.

+

This method should only be called by implementations of +ValentContactStore. Signal handlers may query the state, so it must +emitted after the internal representation has been updated.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
contact
+
+

Type: EContact

+

The EContact

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.contact_removed.html b/documentation/method.ContactStore.contact_removed.html new file mode 100644 index 00000000000..4fd373f7abc --- /dev/null +++ b/documentation/method.ContactStore.contact_removed.html @@ -0,0 +1,243 @@ + + + + + + Valent.ContactStore.contact_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStorecontact_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_contact_removed (
+  ValentContactStore* store,
+  const char* uid
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits ValentContactStore::contact-removed on store.

+

This method should only be called by implementations of +ValentContactStore. Signal handlers may query the state, so it must +emitted after the internal representation has been updated.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: const char*

+

The UID of contact.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.get_contact.html b/documentation/method.ContactStore.get_contact.html new file mode 100644 index 00000000000..417bb539339 --- /dev/null +++ b/documentation/method.ContactStore.get_contact.html @@ -0,0 +1,295 @@ + + + + + + Valent.ContactStore.get_contact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreget_contact

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_get_contact (
+  ValentContactStore* store,
+  const char* uid,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a contact by UID.

+

Call valent_contact_store_get_contact_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: const char*

+

A contact UID.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.get_contact_finish.html b/documentation/method.ContactStore.get_contact_finish.html new file mode 100644 index 00000000000..ced2a1a7ec4 --- /dev/null +++ b/documentation/method.ContactStore.get_contact_finish.html @@ -0,0 +1,279 @@ + + + + + + Valent.ContactStore.get_contact_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreget_contact_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
EContact*
+valent_contact_store_get_contact_finish (
+  ValentContactStore* store,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_contact_store_get_contact().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: EContact

+

A EContact

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.get_contacts.html b/documentation/method.ContactStore.get_contacts.html new file mode 100644 index 00000000000..6417083fb6e --- /dev/null +++ b/documentation/method.ContactStore.get_contacts.html @@ -0,0 +1,296 @@ + + + + + + Valent.ContactStore.get_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreget_contacts

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_get_contacts (
+  ValentContactStore* store,
+  char** uids,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience wrapper around valent_contact_store_query() for searching +contacts by UID.

+

Call valent_contact_store_query_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uids
+
+

Type: char**

+

A list of UIDs.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.get_name.html b/documentation/method.ContactStore.get_name.html new file mode 100644 index 00000000000..70b840101ce --- /dev/null +++ b/documentation/method.ContactStore.get_name.html @@ -0,0 +1,241 @@ + + + + + + Valent.ContactStore.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_contact_store_get_name (
+  ValentContactStore* store
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the display name of store.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.ContactStore:name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A display name.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.get_source.html b/documentation/method.ContactStore.get_source.html new file mode 100644 index 00000000000..6eae4f3503b --- /dev/null +++ b/documentation/method.ContactStore.get_source.html @@ -0,0 +1,241 @@ + + + + + + Valent.ContactStore.get_source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreget_source

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ESource*
+valent_contact_store_get_source (
+  ValentContactStore* store
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the ESource backing store.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.ContactStore:source
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ESource

+

An ESource

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.get_uid.html b/documentation/method.ContactStore.get_uid.html new file mode 100644 index 00000000000..0cbc6c784ec --- /dev/null +++ b/documentation/method.ContactStore.get_uid.html @@ -0,0 +1,241 @@ + + + + + + Valent.ContactStore.get_uid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreget_uid

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_contact_store_get_uid (
+  ValentContactStore* store
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the UID of store.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.ContactStore:uid
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A UID.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.query.html b/documentation/method.ContactStore.query.html new file mode 100644 index 00000000000..1009d514439 --- /dev/null +++ b/documentation/method.ContactStore.query.html @@ -0,0 +1,295 @@ + + + + + + Valent.ContactStore.query + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStorequery

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_query (
+  ValentContactStore* store,
+  const char* query,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Query store for contacts matching query.

+

Call valent_contact_store_query_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
query
+
+

Type: const char*

+

A search expression.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.query_finish.html b/documentation/method.ContactStore.query_finish.html new file mode 100644 index 00000000000..5f0ad79d8c4 --- /dev/null +++ b/documentation/method.ContactStore.query_finish.html @@ -0,0 +1,279 @@ + + + + + + Valent.ContactStore.query_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStorequery_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GSList*
+valent_contact_store_query_finish (
+  ValentContactStore* store,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_contact_store_query().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: A list of EContact*

+

A GSList

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.remove_contact.html b/documentation/method.ContactStore.remove_contact.html new file mode 100644 index 00000000000..223adf70e3a --- /dev/null +++ b/documentation/method.ContactStore.remove_contact.html @@ -0,0 +1,297 @@ + + + + + + Valent.ContactStore.remove_contact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreremove_contact

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_remove_contact (
+  ValentContactStore* store,
+  const char* uid,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Remove contact uid from store.

+

A convenience wrapper around valent_contact_store_remove_contacts() for +removing a single contact.

+

Call valent_contact_store_remove_contacts_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: const char*

+

A contact UID.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.remove_contacts.html b/documentation/method.ContactStore.remove_contacts.html new file mode 100644 index 00000000000..c3c75af7bbd --- /dev/null +++ b/documentation/method.ContactStore.remove_contacts.html @@ -0,0 +1,295 @@ + + + + + + Valent.ContactStore.remove_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreremove_contacts

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_remove_contacts (
+  ValentContactStore* store,
+  GSList* uids,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Remove contact uid from store.

+

Call valent_contact_store_remove_contacts_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uids
+
+

Type: A list of utf8

+

A GSList of contact UIDs.

+ + + + + + + + + + +
The data is owned by the caller of the method.
Each element is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.remove_contacts_finish.html b/documentation/method.ContactStore.remove_contacts_finish.html new file mode 100644 index 00000000000..63b5736782a --- /dev/null +++ b/documentation/method.ContactStore.remove_contacts_finish.html @@ -0,0 +1,280 @@ + + + + + + Valent.ContactStore.remove_contacts_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreremove_contacts_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_contact_store_remove_contacts_finish (
+  ValentContactStore* store,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ + + +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactStore.set_name.html b/documentation/method.ContactStore.set_name.html new file mode 100644 index 00000000000..ab4b29281cf --- /dev/null +++ b/documentation/method.ContactStore.set_name.html @@ -0,0 +1,248 @@ + + + + + + Valent.ContactStore.set_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactStoreset_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contact_store_set_name (
+  ValentContactStore* store,
+  const char* name
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the display name of store to name.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.ContactStore:name
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
name
+
+

Type: const char*

+

A display name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Contacts.ensure_store.html b/documentation/method.Contacts.ensure_store.html new file mode 100644 index 00000000000..92a927e98d9 --- /dev/null +++ b/documentation/method.Contacts.ensure_store.html @@ -0,0 +1,255 @@ + + + + + + Valent.Contacts.ensure_store + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactsensure_store

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContactStore*
+valent_contacts_ensure_store (
+  ValentContacts* contacts,
+  const char* uid,
+  const char* name
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a ValentContactStore for uid.

+

If the contact store does not exist, one will be created using the default +adapter and passed name and description. If no adapter is available, a new +file-based store will be created.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: const char*

+

A unique id.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
name
+
+

Type: const char*

+

A display name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContactStore

+

An address book.

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactsAdapter.store_added.html b/documentation/method.ContactsAdapter.store_added.html new file mode 100644 index 00000000000..53c3c003c05 --- /dev/null +++ b/documentation/method.ContactsAdapter.store_added.html @@ -0,0 +1,213 @@ + + + + + + Valent.ContactsAdapter.store_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactsAdapterstore_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contacts_adapter_store_added (
+  ValentContactsAdapter* adapter,
+  ValentContactStore* store
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Called when store has been added to adapter.

+

This method should only be called by implementations of +ValentContactsAdapter. adapter will hold a reference on store and +emit GListModel::items-changed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
store
+
+

Type: ValentContactStore

+

A ValentContactStore

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.ContactsAdapter.store_removed.html b/documentation/method.ContactsAdapter.store_removed.html new file mode 100644 index 00000000000..f3fb80e6624 --- /dev/null +++ b/documentation/method.ContactsAdapter.store_removed.html @@ -0,0 +1,213 @@ + + + + + + Valent.ContactsAdapter.store_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContactsAdapterstore_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_contacts_adapter_store_removed (
+  ValentContactsAdapter* adapter,
+  ValentContactStore* store
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Called when store has been removed from adapter.

+

This method should only be called by implementations of +ValentContactsAdapter. adapter will drop its reference on store +and emit GListModel::items-changed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
store
+
+

Type: ValentContactStore

+

A ValentContactStore

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.clear.html b/documentation/method.Context.clear.html new file mode 100644 index 00000000000..545c487a777 --- /dev/null +++ b/documentation/method.Context.clear.html @@ -0,0 +1,202 @@ + + + + + + Valent.Context.clear + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextclear

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_context_clear (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Clear cache and configuration data.

+

The method will remove all files in the cache and configuration directories.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.clear_cache.html b/documentation/method.Context.clear_cache.html new file mode 100644 index 00000000000..95c56cd9443 --- /dev/null +++ b/documentation/method.Context.clear_cache.html @@ -0,0 +1,202 @@ + + + + + + Valent.Context.clear_cache + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextclear_cache

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_context_clear_cache (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Clear cache data.

+

The method will remove all files in the cache directory.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.create_settings.html b/documentation/method.Context.create_settings.html new file mode 100644 index 00000000000..dd090cc2f0a --- /dev/null +++ b/documentation/method.Context.create_settings.html @@ -0,0 +1,263 @@ + + + + + + Valent.Context.create_settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextcreate_settings

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GSettings*
+valent_context_create_settings (
+  ValentContext* context,
+  const char* schema_id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a GSettings object.

+

This is a simple wrapper around g_settings_new_full() that creates a +GSettings object for the path of context. No attempt will be made to +find or compile missing schemas.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
schema_id
+
+

Type: const char*

+

A GSettings schema ID.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GSettings

+

The new GSettings object.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_cache_file.html b/documentation/method.Context.get_cache_file.html new file mode 100644 index 00000000000..722f417fdd4 --- /dev/null +++ b/documentation/method.Context.get_cache_file.html @@ -0,0 +1,261 @@ + + + + + + Valent.Context.get_cache_file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_cache_file

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GFile*
+valent_context_get_cache_file (
+  ValentContext* context,
+  const char* filename
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new cache file.

+

This method creates a new GFile for filename in the cache directory.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
filename
+
+

Type: const char*

+

A filename.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a file system path, using the OS encoding.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GFile

+

A new GFile

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_config_file.html b/documentation/method.Context.get_config_file.html new file mode 100644 index 00000000000..40d57fa6ff6 --- /dev/null +++ b/documentation/method.Context.get_config_file.html @@ -0,0 +1,261 @@ + + + + + + Valent.Context.get_config_file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_config_file

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GFile*
+valent_context_get_config_file (
+  ValentContext* context,
+  const char* filename
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new config file.

+

This method creates a new GFile for filename in the config directory.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
filename
+
+

Type: const char*

+

A filename.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a file system path, using the OS encoding.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GFile

+

A new GFile

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_data_file.html b/documentation/method.Context.get_data_file.html new file mode 100644 index 00000000000..da41c37d242 --- /dev/null +++ b/documentation/method.Context.get_data_file.html @@ -0,0 +1,261 @@ + + + + + + Valent.Context.get_data_file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_data_file

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GFile*
+valent_context_get_data_file (
+  ValentContext* context,
+  const char* filename
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new data file.

+

This method creates a new GFile for filename in the data directory.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
filename
+
+

Type: const char*

+

A filename.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a file system path, using the OS encoding.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GFile

+

A new GFile

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_domain.html b/documentation/method.Context.get_domain.html new file mode 100644 index 00000000000..0ae34a61099 --- /dev/null +++ b/documentation/method.Context.get_domain.html @@ -0,0 +1,235 @@ + + + + + + Valent.Context.get_domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_domain

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_context_get_domain (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the context domain.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Context:domain
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The context domain.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_id.html b/documentation/method.Context.get_id.html new file mode 100644 index 00000000000..c9a8732ec6b --- /dev/null +++ b/documentation/method.Context.get_id.html @@ -0,0 +1,235 @@ + + + + + + Valent.Context.get_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_id

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_context_get_id (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the context ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Context:id
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The context ID.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_parent.html b/documentation/method.Context.get_parent.html new file mode 100644 index 00000000000..07fa0b19c55 --- /dev/null +++ b/documentation/method.Context.get_parent.html @@ -0,0 +1,235 @@ + + + + + + Valent.Context.get_parent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_parent

+
+ +
+
+

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_context_get_parent (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the parent context.

+
+ +
+ + + + + + +
+ + +
+ + + + +
Gets propertyValent.Context:parent
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A ValentContext

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_path.html b/documentation/method.Context.get_path.html new file mode 100644 index 00000000000..a4b0816a73e --- /dev/null +++ b/documentation/method.Context.get_path.html @@ -0,0 +1,227 @@ + + + + + + Valent.Context.get_path + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_path

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_context_get_path (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the virtual path.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A relative path.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_plugin_context.html b/documentation/method.Context.get_plugin_context.html new file mode 100644 index 00000000000..6fd8385cb65 --- /dev/null +++ b/documentation/method.Context.get_plugin_context.html @@ -0,0 +1,264 @@ + + + + + + Valent.Context.get_plugin_context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_plugin_context

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_context_get_plugin_context (
+  ValentContext* context,
+  PeasPluginInfo* plugin_info
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new ValentContext for a plugin.

+

If given, domain should be an identifier describing the scope of the +contexts that will share it.

+

If given, id should be an identifier that is at least unique to domain, +even if domain is NULL.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
plugin_info
+
+

Type: PeasPluginInfo

+

A PeasPluginInfo

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A new ValentContext.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_plugin_settings.html b/documentation/method.Context.get_plugin_settings.html new file mode 100644 index 00000000000..55676356e96 --- /dev/null +++ b/documentation/method.Context.get_plugin_settings.html @@ -0,0 +1,281 @@ + + + + + + Valent.Context.get_plugin_settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_plugin_settings

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GSettings*
+valent_context_get_plugin_settings (
+  ValentContext* context,
+  PeasPluginInfo* plugin_info,
+  const char* plugin_key
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a GSettings object for a plugin.

+

If the plugin is not built-in, an attempt will be made to compile a +GSettingsSchema for schema_id, in the module directory of +plugin_info.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
plugin_info
+
+

Type: PeasPluginInfo

+

A PeasPluginInfo

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
plugin_key
+
+

Type: const char*

+

An external data key.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GSettings

+

The new GSettings object.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.get_root.html b/documentation/method.Context.get_root.html new file mode 100644 index 00000000000..fda27dd3d53 --- /dev/null +++ b/documentation/method.Context.get_root.html @@ -0,0 +1,227 @@ + + + + + + Valent.Context.get_root + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextget_root

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_context_get_root (
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the root context.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A ValentContext

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Context.new.html b/documentation/method.Context.new.html new file mode 100644 index 00000000000..4476f5275b6 --- /dev/null +++ b/documentation/method.Context.new.html @@ -0,0 +1,283 @@ + + + + + + Valent.Context.new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentContextnew

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_context_new (
+  ValentContext* parent,
+  const char* domain,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Create a new ValentContext.

+

If given, parent will be taken into consideration when building paths.

+

If given, domain should be an identifier describing the scope of the +contexts that will share it.

+

If given, id should be an identifier that is at least unique to domain, +even if domain is NULL.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
domain
+
+

Type: const char*

+

A domain.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
id
+
+

Type: const char*

+

A unique identifier.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A new ValentContext.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_context.html b/documentation/method.Device.get_context.html new file mode 100644 index 00000000000..ed06bcb8a17 --- /dev/null +++ b/documentation/method.Device.get_context.html @@ -0,0 +1,227 @@ + + + + + + Valent.Device.get_context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_context

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_device_get_context (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the data context.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Device:context
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A ValentContext

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_icon_name.html b/documentation/method.Device.get_icon_name.html new file mode 100644 index 00000000000..aa84ec0324e --- /dev/null +++ b/documentation/method.Device.get_icon_name.html @@ -0,0 +1,227 @@ + + + + + + Valent.Device.get_icon_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_icon_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_device_get_icon_name (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the symbolic icon name.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Device:icon-name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The icon name.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_id.html b/documentation/method.Device.get_id.html new file mode 100644 index 00000000000..d732d077411 --- /dev/null +++ b/documentation/method.Device.get_id.html @@ -0,0 +1,227 @@ + + + + + + Valent.Device.get_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_id

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_device_get_id (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the unique ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Device:id
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The device id.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_menu.html b/documentation/method.Device.get_menu.html new file mode 100644 index 00000000000..1c7f0449b62 --- /dev/null +++ b/documentation/method.Device.get_menu.html @@ -0,0 +1,221 @@ + + + + + + Valent.Device.get_menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_menu

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GMenuModel*
+valent_device_get_menu (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the GMenuModel of the device.

+

Plugins may add items and submenus to this when they want to expose actions +with presentation details like a label or icon.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GMenuModel

+

A GMenuModel

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_name.html b/documentation/method.Device.get_name.html new file mode 100644 index 00000000000..926a57f7286 --- /dev/null +++ b/documentation/method.Device.get_name.html @@ -0,0 +1,227 @@ + + + + + + Valent.Device.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_device_get_name (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the display name of the device.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Device:name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A display name, or NULL if unset.

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_plugins.html b/documentation/method.Device.get_plugins.html new file mode 100644 index 00000000000..a08159b4b77 --- /dev/null +++ b/documentation/method.Device.get_plugins.html @@ -0,0 +1,227 @@ + + + + + + Valent.Device.get_plugins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_plugins

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GStrv
+valent_device_get_plugins (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a list of the loaded plugins.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Device:plugins
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: An array of utf8

+

A list of loaded plugins.

+
+
+ + + + + + + +
The array is NULL-terminated.
Each element is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.get_state.html b/documentation/method.Device.get_state.html new file mode 100644 index 00000000000..3b30a62648e --- /dev/null +++ b/documentation/method.Device.get_state.html @@ -0,0 +1,227 @@ + + + + + + Valent.Device.get_state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceget_state

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentDeviceState
+valent_device_get_state (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the state of the device.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Device:state
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentDeviceState

+

ValentDeviceState flags describing the state of the device.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.ref_channel.html b/documentation/method.Device.ref_channel.html new file mode 100644 index 00000000000..4536ef1b100 --- /dev/null +++ b/documentation/method.Device.ref_channel.html @@ -0,0 +1,219 @@ + + + + + + Valent.Device.ref_channel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceref_channel

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentChannel*
+valent_device_ref_channel (
+  ValentDevice* device
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the active channel.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentChannel

+

A ValentChannel, or NULL if disconnected.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.send_packet.html b/documentation/method.Device.send_packet.html new file mode 100644 index 00000000000..1ea1f56b03b --- /dev/null +++ b/documentation/method.Device.send_packet.html @@ -0,0 +1,284 @@ + + + + + + Valent.Device.send_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicesend_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_send_packet (
+  ValentDevice* device,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Send a KDE Connect packet to the device.

+

Call valent_device_send_packet_finish() to get the result.

+

If device is disconnected or unpaired when this method is called, +G_IO_ERROR_NOT_CONNECTED or G_IO_ERROR_PERMISSION_DENIED will be set on the +result, respectively.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Device.send_packet_finish.html b/documentation/method.Device.send_packet_finish.html new file mode 100644 index 00000000000..a41309f3ee5 --- /dev/null +++ b/documentation/method.Device.send_packet_finish.html @@ -0,0 +1,265 @@ + + + + + + Valent.Device.send_packet_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicesend_packet_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_device_send_packet_finish (
+  ValentDevice* device,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_device_send_packet().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DeviceManager.get_name.html b/documentation/method.DeviceManager.get_name.html new file mode 100644 index 00000000000..9f70ba0d136 --- /dev/null +++ b/documentation/method.DeviceManager.get_name.html @@ -0,0 +1,213 @@ + + + + + + Valent.DeviceManager.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceManagerget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_device_manager_get_name (
+  ValentDeviceManager* manager
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the display name of the local device.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.DeviceManager:name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The local display name.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DeviceManager.refresh.html b/documentation/method.DeviceManager.refresh.html new file mode 100644 index 00000000000..6b2888e8fda --- /dev/null +++ b/documentation/method.DeviceManager.refresh.html @@ -0,0 +1,181 @@ + + + + + + Valent.DeviceManager.refresh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceManagerrefresh

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_manager_refresh (
+  ValentDeviceManager* manager
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Refresh the available devices.

+

This method calls valent_channel_service_identify() for each enabled +service, requesting it to announce itself on its respective network.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DeviceManager.set_name.html b/documentation/method.DeviceManager.set_name.html new file mode 100644 index 00000000000..bf1433b2abe --- /dev/null +++ b/documentation/method.DeviceManager.set_name.html @@ -0,0 +1,220 @@ + + + + + + Valent.DeviceManager.set_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceManagerset_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_manager_set_name (
+  ValentDeviceManager* manager,
+  const char* name
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the display name of the local device to name.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.DeviceManager:name
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
name
+
+

Type: const char*

+

A display name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.handle_packet.html b/documentation/method.DevicePlugin.handle_packet.html new file mode 100644 index 00000000000..f75755da5d4 --- /dev/null +++ b/documentation/method.DevicePlugin.handle_packet.html @@ -0,0 +1,242 @@ + + + + + + Valent.DevicePlugin.handle_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginhandle_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_handle_packet (
+  ValentDevicePlugin* plugin,
+  const char* type,
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle a packet from the device the plugin is bound to.

+

This is called when the device receives a packet type included in the +X-DevicePluginIncoming field of the .plugin file.

+

This is optional for implementations which do not register any incoming +capabilities, such as plugins that do not provide packet-based functionality.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
type
+
+

Type: const char*

+

A KDE Connect packet type.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.hide_notification.html b/documentation/method.DevicePlugin.hide_notification.html new file mode 100644 index 00000000000..b2d3b84638f --- /dev/null +++ b/documentation/method.DevicePlugin.hide_notification.html @@ -0,0 +1,222 @@ + + + + + + Valent.DevicePlugin.hide_notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginhide_notification

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_hide_notification (
+  ValentDevicePlugin* plugin,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience for withdrawing a notification.

+

This method will withdraw a notification shown with +valent_device_plugin_show_notification().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

An id for the notification.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.queue_packet.html b/documentation/method.DevicePlugin.queue_packet.html new file mode 100644 index 00000000000..3d93617043e --- /dev/null +++ b/documentation/method.DevicePlugin.queue_packet.html @@ -0,0 +1,222 @@ + + + + + + Valent.DevicePlugin.queue_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginqueue_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_queue_packet (
+  ValentDevicePlugin* plugin,
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Queue a KDE Connect packet to be sent to the device this plugin is bound to.

+

For notification of success call valent_extension_get_object() and +then valent_device_send_packet().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.set_menu_action.html b/documentation/method.DevicePlugin.set_menu_action.html new file mode 100644 index 00000000000..3584f1978c7 --- /dev/null +++ b/documentation/method.DevicePlugin.set_menu_action.html @@ -0,0 +1,257 @@ + + + + + + Valent.DevicePlugin.set_menu_action + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginset_menu_action

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_set_menu_action (
+  ValentDevicePlugin* plugin,
+  const char* action,
+  const char* label,
+  const char* icon_name
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set or remove a device menu action by GAction name.

+

If label and icon are NULL, action will be removed from the menu.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
action
+
+

Type: const char*

+

A GAction name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
label
+
+

Type: const char*

+

A label for the action.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
icon_name
+
+

Type: const char*

+

An icon for the action.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.set_menu_item.html b/documentation/method.DevicePlugin.set_menu_item.html new file mode 100644 index 00000000000..ee82ac6d9b5 --- /dev/null +++ b/documentation/method.DevicePlugin.set_menu_item.html @@ -0,0 +1,239 @@ + + + + + + Valent.DevicePlugin.set_menu_item + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginset_menu_item

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_set_menu_item (
+  ValentDevicePlugin* plugin,
+  const char* action,
+  GMenuItem* item
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set or remove a device GMenuItem by GAction name.

+

If item is NULL, action will be removed from the menu.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
action
+
+

Type: const char*

+

A GAction name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
item
+
+

Type: GMenuItem

+

A GMenuItem

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.show_notification.html b/documentation/method.DevicePlugin.show_notification.html new file mode 100644 index 00000000000..69bda286c61 --- /dev/null +++ b/documentation/method.DevicePlugin.show_notification.html @@ -0,0 +1,242 @@ + + + + + + Valent.DevicePlugin.show_notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginshow_notification

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_show_notification (
+  ValentDevicePlugin* plugin,
+  const char* id,
+  GNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A convenience for showing a local notification.

+

id will be automatically prepended with the device ID and plugin module to +prevent conflicting with other devices and plugins.

+

Call valent_device_plugin_hide_notification() to make the same +transformation on id and withdraw the notification.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

An id for the notification.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
notification
+
+

Type: GNotification

+

A GNotification

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePlugin.update_state.html b/documentation/method.DevicePlugin.update_state.html new file mode 100644 index 00000000000..4ca261914e3 --- /dev/null +++ b/documentation/method.DevicePlugin.update_state.html @@ -0,0 +1,225 @@ + + + + + + Valent.DevicePlugin.update_state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePluginupdate_state

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_device_plugin_update_state (
+  ValentDevicePlugin* plugin,
+  ValentDeviceState state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Update the plugin based on the new state of the device.

+

This function is called when the connected or paired state of the device +changes. This may be used to configure actions, event handlers that may +trigger outgoing packets and exchange connect-time data with the device.

+

This is optional for all implementations as plugins aren’t required to be +dependent on the device state.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: ValentDeviceState

+

A ValentDeviceState

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePreferencesGroup.get_context.html b/documentation/method.DevicePreferencesGroup.get_context.html new file mode 100644 index 00000000000..3043af61ece --- /dev/null +++ b/documentation/method.DevicePreferencesGroup.get_context.html @@ -0,0 +1,211 @@ + + + + + + Valent.DevicePreferencesGroup.get_context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePreferencesGroupget_context

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_device_preferences_group_get_context (
+  ValentDevicePreferencesGroup* group
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the ValentContext for the ValentDevicePlugin.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.DevicePreferencesGroup:context
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A ValentContext

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DevicePreferencesGroup.get_settings.html b/documentation/method.DevicePreferencesGroup.get_settings.html new file mode 100644 index 00000000000..e760b2daa48 --- /dev/null +++ b/documentation/method.DevicePreferencesGroup.get_settings.html @@ -0,0 +1,211 @@ + + + + + + Valent.DevicePreferencesGroup.get_settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDevicePreferencesGroupget_settings

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GSettings*
+valent_device_preferences_group_get_settings (
+  ValentDevicePreferencesGroup* group
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the GSettings for the ValentDevicePlugin.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.DevicePreferencesGroup:settings
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GSettings

+

A GSettings

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DeviceTransfer.ref_device.html b/documentation/method.DeviceTransfer.ref_device.html new file mode 100644 index 00000000000..e205ddd4add --- /dev/null +++ b/documentation/method.DeviceTransfer.ref_device.html @@ -0,0 +1,213 @@ + + + + + + Valent.DeviceTransfer.ref_device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceTransferref_device

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentDevice*
+valent_device_transfer_ref_device (
+  ValentDeviceTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the ValentDevice.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.DeviceTransfer:device
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentDevice

+

A ValentDevice

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DeviceTransfer.ref_file.html b/documentation/method.DeviceTransfer.ref_file.html new file mode 100644 index 00000000000..127487fa22b --- /dev/null +++ b/documentation/method.DeviceTransfer.ref_file.html @@ -0,0 +1,213 @@ + + + + + + Valent.DeviceTransfer.ref_file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceTransferref_file

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GFile*
+valent_device_transfer_ref_file (
+  ValentDeviceTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the local GFile.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.DeviceTransfer:file
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GFile

+

A GFile

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.DeviceTransfer.ref_packet.html b/documentation/method.DeviceTransfer.ref_packet.html new file mode 100644 index 00000000000..93634e600eb --- /dev/null +++ b/documentation/method.DeviceTransfer.ref_packet.html @@ -0,0 +1,213 @@ + + + + + + Valent.DeviceTransfer.ref_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentDeviceTransferref_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
JsonNode*
+valent_device_transfer_ref_packet (
+  ValentDeviceTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the KDE Connect packet.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.DeviceTransfer:packet
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: JsonNode

+

A KDE Connect packet.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Extension.get_context.html b/documentation/method.Extension.get_context.html new file mode 100644 index 00000000000..c2d9c211061 --- /dev/null +++ b/documentation/method.Extension.get_context.html @@ -0,0 +1,219 @@ + + + + + + Valent.Extension.get_context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentExtensionget_context

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentContext*
+valent_extension_get_context (
+  ValentExtension* extension
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the settings for this plugin.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Extension:context
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContext

+

A ValentContext

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Extension.get_object.html b/documentation/method.Extension.get_object.html new file mode 100644 index 00000000000..0e04e658bcd --- /dev/null +++ b/documentation/method.Extension.get_object.html @@ -0,0 +1,219 @@ + + + + + + Valent.Extension.get_object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentExtensionget_object

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GObject*
+valent_extension_get_object (
+  ValentExtension* extension
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the object this plugin is bound to.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Extension:object
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GObject

+

A GObject

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Extension.get_settings.html b/documentation/method.Extension.get_settings.html new file mode 100644 index 00000000000..fa71044f59f --- /dev/null +++ b/documentation/method.Extension.get_settings.html @@ -0,0 +1,219 @@ + + + + + + Valent.Extension.get_settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentExtensionget_settings

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GSettings*
+valent_extension_get_settings (
+  ValentExtension* extension
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the settings for this plugin.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Extension:settings
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GSettings

+

A GSettings

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Extension.plugin_state_changed.html b/documentation/method.Extension.plugin_state_changed.html new file mode 100644 index 00000000000..a126613f048 --- /dev/null +++ b/documentation/method.Extension.plugin_state_changed.html @@ -0,0 +1,239 @@ + + + + + + Valent.Extension.plugin_state_changed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentExtensionplugin_state_changed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_extension_plugin_state_changed (
+  ValentExtension* extension,
+  ValentPluginState state,
+  GError* error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits GObject::notify for +ValentExtension:plugin-state.

+

Implementations should call this method to inform the managing object of +changes to the state of the extension, especially unrecoverable errors.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: ValentPluginState

+

A ValentPluginState

+ + + + + + + + + + +
+
+ +
error
+
+

Type: GError

+

A GError

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Extension.plugin_state_check.html b/documentation/method.Extension.plugin_state_check.html new file mode 100644 index 00000000000..f16b28e5c59 --- /dev/null +++ b/documentation/method.Extension.plugin_state_check.html @@ -0,0 +1,212 @@ + + + + + + Valent.Extension.plugin_state_check + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentExtensionplugin_state_check

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentPluginState
+valent_extension_plugin_state_check (
+  ValentExtension* extension
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the extension state, while propagating any errors that describe it.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentPluginState

+

A ValentPluginState

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Extension.toggle_actions.html b/documentation/method.Extension.toggle_actions.html new file mode 100644 index 00000000000..e95af97c2a7 --- /dev/null +++ b/documentation/method.Extension.toggle_actions.html @@ -0,0 +1,220 @@ + + + + + + Valent.Extension.toggle_actions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentExtensiontoggle_actions

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_extension_toggle_actions (
+  ValentExtension* extension,
+  gboolean enabled
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Enable or disable all actions.

+

Set the GAction:enabled property of the actions for extension to +enabled.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
enabled
+
+

Type: gboolean

+

Boolean.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Input.export_adapter.html b/documentation/method.Input.export_adapter.html new file mode 100644 index 00000000000..da4b5244008 --- /dev/null +++ b/documentation/method.Input.export_adapter.html @@ -0,0 +1,218 @@ + + + + + + Valent.Input.export_adapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputexport_adapter

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_export_adapter (
+  ValentInput* input,
+  ValentInputAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Export adapter on all adapters that support it.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
adapter
+
+

Type: ValentInputAdapter

+

A ValentInputAdapter

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Input.keyboard_keysym.html b/documentation/method.Input.keyboard_keysym.html new file mode 100644 index 00000000000..5af3d95884b --- /dev/null +++ b/documentation/method.Input.keyboard_keysym.html @@ -0,0 +1,236 @@ + + + + + + Valent.Input.keyboard_keysym + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputkeyboard_keysym

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_keyboard_keysym (
+  ValentInput* input,
+  uint32_t keysym,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Press or release keysym.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
keysym
+
+

Type: uint32_t

+

A keysym.

+ + + + + + + + + + +
+
+ +
state
+
+

Type: gboolean

+

TRUE to press, or FALSE to release.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Input.pointer_axis.html b/documentation/method.Input.pointer_axis.html new file mode 100644 index 00000000000..963d7a99610 --- /dev/null +++ b/documentation/method.Input.pointer_axis.html @@ -0,0 +1,236 @@ + + + + + + Valent.Input.pointer_axis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputpointer_axis

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_pointer_axis (
+  ValentInput* input,
+  double dx,
+  double dy
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Scroll the surface under the pointer (dx, dy), relative to its current position.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dx
+
+

Type: double

+

Movement on x-axis.

+ + + + + + + + + + +
+
+ +
dy
+
+

Type: double

+

Movement on y-axis.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Input.pointer_button.html b/documentation/method.Input.pointer_button.html new file mode 100644 index 00000000000..dd1fcb092d1 --- /dev/null +++ b/documentation/method.Input.pointer_button.html @@ -0,0 +1,236 @@ + + + + + + Valent.Input.pointer_button + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputpointer_button

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_pointer_button (
+  ValentInput* input,
+  unsigned int button,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Press or release button.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
button
+
+

Type: unsigned int

+

A button.

+ + + + + + + + + + +
+
+ +
state
+
+

Type: gboolean

+

TRUE to press, or FALSE to release.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Input.pointer_motion.html b/documentation/method.Input.pointer_motion.html new file mode 100644 index 00000000000..d80014d5c23 --- /dev/null +++ b/documentation/method.Input.pointer_motion.html @@ -0,0 +1,236 @@ + + + + + + Valent.Input.pointer_motion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputpointer_motion

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_pointer_motion (
+  ValentInput* input,
+  double dx,
+  double dy
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Move the pointer (dx, dy), relative to its current position.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dx
+
+

Type: double

+

Position on x-axis.

+ + + + + + + + + + +
+
+ +
dy
+
+

Type: double

+

Position on y-axis.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Input.unexport_adapter.html b/documentation/method.Input.unexport_adapter.html new file mode 100644 index 00000000000..15e41c14913 --- /dev/null +++ b/documentation/method.Input.unexport_adapter.html @@ -0,0 +1,218 @@ + + + + + + Valent.Input.unexport_adapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputunexport_adapter

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_unexport_adapter (
+  ValentInput* input,
+  ValentInputAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Unexport adapter from all adapters that support it.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
adapter
+
+

Type: ValentInputAdapter

+

A ValentInputAdapter

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.InputAdapter.keyboard_keysym.html b/documentation/method.InputAdapter.keyboard_keysym.html new file mode 100644 index 00000000000..6b8f0d6564e --- /dev/null +++ b/documentation/method.InputAdapter.keyboard_keysym.html @@ -0,0 +1,232 @@ + + + + + + Valent.InputAdapter.keyboard_keysym + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputAdapterkeyboard_keysym

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_adapter_keyboard_keysym (
+  ValentInputAdapter* adapter,
+  uint32_t keysym,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Press or release keysym.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
keysym
+
+

Type: uint32_t

+

A keysym.

+ + + + + + + + + + +
+
+ +
state
+
+

Type: gboolean

+

TRUE to press, or FALSE to release.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.InputAdapter.pointer_axis.html b/documentation/method.InputAdapter.pointer_axis.html new file mode 100644 index 00000000000..d984e1a1998 --- /dev/null +++ b/documentation/method.InputAdapter.pointer_axis.html @@ -0,0 +1,233 @@ + + + + + + Valent.InputAdapter.pointer_axis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputAdapterpointer_axis

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_adapter_pointer_axis (
+  ValentInputAdapter* adapter,
+  double dx,
+  double dy
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Scroll the surface under the pointer (dx, dy), relative to its current position.

+

Implementations should handle any necessary scaling.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dx
+
+

Type: double

+

Movement on x-axis.

+ + + + + + + + + + +
+
+ +
dy
+
+

Type: double

+

Movement on y-axis.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.InputAdapter.pointer_button.html b/documentation/method.InputAdapter.pointer_button.html new file mode 100644 index 00000000000..432c04b811b --- /dev/null +++ b/documentation/method.InputAdapter.pointer_button.html @@ -0,0 +1,232 @@ + + + + + + Valent.InputAdapter.pointer_button + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputAdapterpointer_button

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_adapter_pointer_button (
+  ValentInputAdapter* adapter,
+  unsigned int button,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Press or release button.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
button
+
+

Type: unsigned int

+

A button number.

+ + + + + + + + + + +
+
+ +
state
+
+

Type: gboolean

+

TRUE to press, or FALSE to release.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.InputAdapter.pointer_motion.html b/documentation/method.InputAdapter.pointer_motion.html new file mode 100644 index 00000000000..87db3d593f4 --- /dev/null +++ b/documentation/method.InputAdapter.pointer_motion.html @@ -0,0 +1,233 @@ + + + + + + Valent.InputAdapter.pointer_motion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentInputAdapterpointer_motion

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_input_adapter_pointer_motion (
+  ValentInputAdapter* adapter,
+  double dx,
+  double dy
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Move the pointer (dx, dy), relative to its current position.

+

Implementation should handle any necessary scaling.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dx
+
+

Type: double

+

Movement on x-axis.

+ + + + + + + + + + +
+
+ +
dy
+
+

Type: double

+

Movement on y-axis.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Media.export_player.html b/documentation/method.Media.export_player.html new file mode 100644 index 00000000000..eba931a88a6 --- /dev/null +++ b/documentation/method.Media.export_player.html @@ -0,0 +1,214 @@ + + + + + + Valent.Media.export_player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaexport_player

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_export_player (
+  ValentMedia* media,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Export player on all adapters that support it.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Media.pause.html b/documentation/method.Media.pause.html new file mode 100644 index 00000000000..7df500251c9 --- /dev/null +++ b/documentation/method.Media.pause.html @@ -0,0 +1,182 @@ + + + + + + Valent.Media.pause + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediapause

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_pause (
+  ValentMedia* media
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Pause any playing media players. Any player whose playback status is changed +will be tracked so that playback may be resumed with valent_media_play().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Media.unexport_player.html b/documentation/method.Media.unexport_player.html new file mode 100644 index 00000000000..ada2445fe95 --- /dev/null +++ b/documentation/method.Media.unexport_player.html @@ -0,0 +1,214 @@ + + + + + + Valent.Media.unexport_player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaunexport_player

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_unexport_player (
+  ValentMedia* media,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Unexport player from all adapters that support it.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Media.unpause.html b/documentation/method.Media.unpause.html new file mode 100644 index 00000000000..291d108059f --- /dev/null +++ b/documentation/method.Media.unpause.html @@ -0,0 +1,181 @@ + + + + + + Valent.Media.unpause + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaunpause

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_unpause (
+  ValentMedia* media
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Unpause any media players we previously paused.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaAdapter.export_player.html b/documentation/method.MediaAdapter.export_player.html new file mode 100644 index 00000000000..fb667702f12 --- /dev/null +++ b/documentation/method.MediaAdapter.export_player.html @@ -0,0 +1,218 @@ + + + + + + Valent.MediaAdapter.export_player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaAdapterexport_player

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_adapter_export_player (
+  ValentMediaAdapter* adapter,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Export player on adapter.

+

This method is intended to allow device plugins to expose remote media +players to the host system. Usually this means exporting an interface on +D-Bus or an mDNS service.

+

Implementations must automatically unexport any players when destroyed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaAdapter.player_added.html b/documentation/method.MediaAdapter.player_added.html new file mode 100644 index 00000000000..681f1a7c75e --- /dev/null +++ b/documentation/method.MediaAdapter.player_added.html @@ -0,0 +1,217 @@ + + + + + + Valent.MediaAdapter.player_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaAdapterplayer_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_adapter_player_added (
+  ValentMediaAdapter* adapter,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Called when player has been added to adapter.

+

This method should only be called by implementations of +ValentMediaAdapter. adapter will hold a reference on player and +emit GListModel::items-changed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaAdapter.player_removed.html b/documentation/method.MediaAdapter.player_removed.html new file mode 100644 index 00000000000..35511e3017e --- /dev/null +++ b/documentation/method.MediaAdapter.player_removed.html @@ -0,0 +1,217 @@ + + + + + + Valent.MediaAdapter.player_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaAdapterplayer_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_adapter_player_removed (
+  ValentMediaAdapter* adapter,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Called when player has been removed from adapter.

+

This method should only be called by implementations of +ValentMediaAdapter. adapter will drop its reference on player +and emit GListModel::items-changed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaAdapter.unexport_player.html b/documentation/method.MediaAdapter.unexport_player.html new file mode 100644 index 00000000000..3672f51567f --- /dev/null +++ b/documentation/method.MediaAdapter.unexport_player.html @@ -0,0 +1,214 @@ + + + + + + Valent.MediaAdapter.unexport_player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaAdapterunexport_player

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_adapter_unexport_player (
+  ValentMediaAdapter* adapter,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Unexport player from adapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_flags.html b/documentation/method.MediaPlayer.get_flags.html new file mode 100644 index 00000000000..0af3823b04b --- /dev/null +++ b/documentation/method.MediaPlayer.get_flags.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_flags + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_flags

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMediaActions
+valent_media_player_get_flags (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get flags describing the available actions of player.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:flags
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMediaActions

+

A bitmask of ValentMediaActions

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_metadata.html b/documentation/method.MediaPlayer.get_metadata.html new file mode 100644 index 00000000000..d81aa87773d --- /dev/null +++ b/documentation/method.MediaPlayer.get_metadata.html @@ -0,0 +1,246 @@ + + + + + + Valent.MediaPlayer.get_metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_metadata

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GVariant*
+valent_media_player_get_metadata (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the metadata of the active media items.

+

Implementations should typically have an entry for the mpris:length field. +Other fields generally supported by KDE Connect clients include +mpris:artUrl, xesam:artist, xesam:album and xesam:title.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:metadata
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GVariant

+

A GVariant of type a{sv}

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_name.html b/documentation/method.MediaPlayer.get_name.html new file mode 100644 index 00000000000..c8cf7f585d2 --- /dev/null +++ b/documentation/method.MediaPlayer.get_name.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_media_player_get_name (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the display name of the player.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

Player name.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_position.html b/documentation/method.MediaPlayer.get_position.html new file mode 100644 index 00000000000..0cb35365a87 --- /dev/null +++ b/documentation/method.MediaPlayer.get_position.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_position

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
double
+valent_media_player_get_position (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the current position in seconds.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:position
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: double

+

Position in seconds.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_repeat.html b/documentation/method.MediaPlayer.get_repeat.html new file mode 100644 index 00000000000..1df6a8b701b --- /dev/null +++ b/documentation/method.MediaPlayer.get_repeat.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_repeat

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMediaRepeat
+valent_media_player_get_repeat (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the repeat mode for player.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:repeat
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMediaRepeat

+

ValentMediaRepeat

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_shuffle.html b/documentation/method.MediaPlayer.get_shuffle.html new file mode 100644 index 00000000000..8f70fe91d52 --- /dev/null +++ b/documentation/method.MediaPlayer.get_shuffle.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_shuffle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_shuffle

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_media_player_get_shuffle (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether playback order is shuffled.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:shuffle
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

The shuffle state.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_state.html b/documentation/method.MediaPlayer.get_state.html new file mode 100644 index 00000000000..c0cf6f485f9 --- /dev/null +++ b/documentation/method.MediaPlayer.get_state.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_state

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMediaState
+valent_media_player_get_state (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the playback state for player.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:state
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMediaState

+

ValentMediaState

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.get_volume.html b/documentation/method.MediaPlayer.get_volume.html new file mode 100644 index 00000000000..f4b2917b75f --- /dev/null +++ b/documentation/method.MediaPlayer.get_volume.html @@ -0,0 +1,243 @@ + + + + + + Valent.MediaPlayer.get_volume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerget_volume

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
double
+valent_media_player_get_volume (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the volume level.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MediaPlayer:volume
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: double

+

The volume of player.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.next.html b/documentation/method.MediaPlayer.next.html new file mode 100644 index 00000000000..1e1e4b9c78f --- /dev/null +++ b/documentation/method.MediaPlayer.next.html @@ -0,0 +1,213 @@ + + + + + + Valent.MediaPlayer.next + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayernext

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_next (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Skip to the next media item.

+

If there is no next track (and endless playback and track repeat are both +off), stop playback. If playback is paused or stopped, it remains that way.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_NEXT, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.pause.html b/documentation/method.MediaPlayer.pause.html new file mode 100644 index 00000000000..760eb562bc8 --- /dev/null +++ b/documentation/method.MediaPlayer.pause.html @@ -0,0 +1,214 @@ + + + + + + Valent.MediaPlayer.pause + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerpause

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_pause (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Pauses playback.

+

If playback is already paused, this has no effect. Calling +valent_media_player_pause() after this should cause playback to start +again from the same position.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_PAUSE, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.play.html b/documentation/method.MediaPlayer.play.html new file mode 100644 index 00000000000..844cdc8e107 --- /dev/null +++ b/documentation/method.MediaPlayer.play.html @@ -0,0 +1,213 @@ + + + + + + Valent.MediaPlayer.play + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerplay

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_play (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Start playback.

+

If already playing, this has no effect. If paused, playback resumes from the +current position. If there is no track to play, this has no effect.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_PLAY, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.previous.html b/documentation/method.MediaPlayer.previous.html new file mode 100644 index 00000000000..459f7ea1421 --- /dev/null +++ b/documentation/method.MediaPlayer.previous.html @@ -0,0 +1,213 @@ + + + + + + Valent.MediaPlayer.previous + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerprevious

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_previous (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Skip to the previous media item.

+

If there is no previous track (and endless playback and track repeat are both +off), stop playback. If playback is paused or stopped, it remains that way.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_PREVIOUS, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.seek.html b/documentation/method.MediaPlayer.seek.html new file mode 100644 index 00000000000..6d0f8032df2 --- /dev/null +++ b/documentation/method.MediaPlayer.seek.html @@ -0,0 +1,247 @@ + + + + + + Valent.MediaPlayer.seek + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerseek

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_seek (
+  ValentMediaPlayer* player,
+  double offset
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Seek in the current media item by offset seconds.

+

A negative value seeks back. If this would mean seeking back further than the +start of the track, the position is set to 0. If the value passed in would +mean seeking beyond the end of the track, acts like a call to valent_media_player_seek().

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_SEEK, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
offset
+
+

Type: double

+

Number of seconds to seek forward.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.set_position.html b/documentation/method.MediaPlayer.set_position.html new file mode 100644 index 00000000000..fc00c145a2a --- /dev/null +++ b/documentation/method.MediaPlayer.set_position.html @@ -0,0 +1,250 @@ + + + + + + Valent.MediaPlayer.set_position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerset_position

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_set_position (
+  ValentMediaPlayer* player,
+  double position
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the current position in seconds.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MediaPlayer:position
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
position
+
+

Type: double

+

Position in seconds.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.set_repeat.html b/documentation/method.MediaPlayer.set_repeat.html new file mode 100644 index 00000000000..fa85a84debd --- /dev/null +++ b/documentation/method.MediaPlayer.set_repeat.html @@ -0,0 +1,250 @@ + + + + + + Valent.MediaPlayer.set_repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerset_repeat

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_set_repeat (
+  ValentMediaPlayer* player,
+  ValentMediaRepeat repeat
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the repeat mode of player to repeat.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MediaPlayer:repeat
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
repeat
+
+

Type: ValentMediaRepeat

+

A ValentMediaRepeat

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.set_shuffle.html b/documentation/method.MediaPlayer.set_shuffle.html new file mode 100644 index 00000000000..2ba0a5a5579 --- /dev/null +++ b/documentation/method.MediaPlayer.set_shuffle.html @@ -0,0 +1,250 @@ + + + + + + Valent.MediaPlayer.set_shuffle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerset_shuffle

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_set_shuffle (
+  ValentMediaPlayer* player,
+  gboolean shuffle
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set whether playback order is shuffled.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MediaPlayer:shuffle
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
shuffle
+
+

Type: gboolean

+

Shuffle state.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.set_volume.html b/documentation/method.MediaPlayer.set_volume.html new file mode 100644 index 00000000000..7b8613c6090 --- /dev/null +++ b/documentation/method.MediaPlayer.set_volume.html @@ -0,0 +1,250 @@ + + + + + + Valent.MediaPlayer.set_volume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerset_volume

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_set_volume (
+  ValentMediaPlayer* player,
+  double volume
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the volume level of player.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MediaPlayer:volume
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
volume
+
+

Type: double

+

Volume level.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MediaPlayer.stop.html b/documentation/method.MediaPlayer.stop.html new file mode 100644 index 00000000000..07c163dea41 --- /dev/null +++ b/documentation/method.MediaPlayer.stop.html @@ -0,0 +1,214 @@ + + + + + + Valent.MediaPlayer.stop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMediaPlayerstop

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_media_player_stop (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Stop playback.

+

If playback is already stopped, this has no effect. Calling +valent_media_player_play() after this should cause playback to start again +from the beginning of the track.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_STOP, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Mixer.get_default_input.html b/documentation/method.Mixer.get_default_input.html new file mode 100644 index 00000000000..b1e4cc076bb --- /dev/null +++ b/documentation/method.Mixer.get_default_input.html @@ -0,0 +1,215 @@ + + + + + + Valent.Mixer.get_default_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerget_default_input

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerStream*
+valent_mixer_get_default_input (
+  ValentMixer* mixer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default input stream for the primary ValentMixerAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Mixer:default-input
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Mixer.get_default_output.html b/documentation/method.Mixer.get_default_output.html new file mode 100644 index 00000000000..281f79ece05 --- /dev/null +++ b/documentation/method.Mixer.get_default_output.html @@ -0,0 +1,215 @@ + + + + + + Valent.Mixer.get_default_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerget_default_output

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerStream*
+valent_mixer_get_default_output (
+  ValentMixer* mixer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default output stream for the primary ValentMixerAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Mixer:default-output
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Mixer.set_default_input.html b/documentation/method.Mixer.set_default_input.html new file mode 100644 index 00000000000..948c8cbcdd0 --- /dev/null +++ b/documentation/method.Mixer.set_default_input.html @@ -0,0 +1,222 @@ + + + + + + Valent.Mixer.set_default_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerset_default_input

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_set_default_input (
+  ValentMixer* mixer,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default input stream for the primary ValentMixerAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Mixer:default-input
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Mixer.set_default_output.html b/documentation/method.Mixer.set_default_output.html new file mode 100644 index 00000000000..a97280f9c6d --- /dev/null +++ b/documentation/method.Mixer.set_default_output.html @@ -0,0 +1,222 @@ + + + + + + Valent.Mixer.set_default_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerset_default_output

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_set_default_output (
+  ValentMixer* mixer,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default output stream for the primary ValentMixerAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Mixer:default-output
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerAdapter.get_default_input.html b/documentation/method.MixerAdapter.get_default_input.html new file mode 100644 index 00000000000..67e8c4633f7 --- /dev/null +++ b/documentation/method.MixerAdapter.get_default_input.html @@ -0,0 +1,219 @@ + + + + + + Valent.MixerAdapter.get_default_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerAdapterget_default_input

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerStream*
+valent_mixer_adapter_get_default_input (
+  ValentMixerAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default input stream for adapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerAdapter:default-input
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerAdapter.get_default_output.html b/documentation/method.MixerAdapter.get_default_output.html new file mode 100644 index 00000000000..ad700b30594 --- /dev/null +++ b/documentation/method.MixerAdapter.get_default_output.html @@ -0,0 +1,219 @@ + + + + + + Valent.MixerAdapter.get_default_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerAdapterget_default_output

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerStream*
+valent_mixer_adapter_get_default_output (
+  ValentMixerAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default output stream for adapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerAdapter:default-output
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerAdapter.set_default_input.html b/documentation/method.MixerAdapter.set_default_input.html new file mode 100644 index 00000000000..234a6a778b2 --- /dev/null +++ b/documentation/method.MixerAdapter.set_default_input.html @@ -0,0 +1,226 @@ + + + + + + Valent.MixerAdapter.set_default_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerAdapterset_default_input

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_adapter_set_default_input (
+  ValentMixerAdapter* adapter,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default input stream for adapter to stream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MixerAdapter:default-input
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerAdapter.set_default_output.html b/documentation/method.MixerAdapter.set_default_output.html new file mode 100644 index 00000000000..f5c21320037 --- /dev/null +++ b/documentation/method.MixerAdapter.set_default_output.html @@ -0,0 +1,226 @@ + + + + + + Valent.MixerAdapter.set_default_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerAdapterset_default_output

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_adapter_set_default_output (
+  ValentMixerAdapter* adapter,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default output stream for adapter to stream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MixerAdapter:default-output
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerAdapter.stream_added.html b/documentation/method.MixerAdapter.stream_added.html new file mode 100644 index 00000000000..6847fb03645 --- /dev/null +++ b/documentation/method.MixerAdapter.stream_added.html @@ -0,0 +1,221 @@ + + + + + + Valent.MixerAdapter.stream_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerAdapterstream_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_adapter_stream_added (
+  ValentMixerAdapter* adapter,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Called when stream has been added to the mixer.

+

This method should only be called by implementations of +ValentMixerAdapter. adapter will hold a reference on stream and +emit GListModel::items-changed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerAdapter.stream_removed.html b/documentation/method.MixerAdapter.stream_removed.html new file mode 100644 index 00000000000..0d414b35ba6 --- /dev/null +++ b/documentation/method.MixerAdapter.stream_removed.html @@ -0,0 +1,221 @@ + + + + + + Valent.MixerAdapter.stream_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerAdapterstream_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_adapter_stream_removed (
+  ValentMixerAdapter* adapter,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Called when stream has been removed from the mixer.

+

This method should only be called by implementations of +ValentMixerAdapter. adapter will drop its reference on stream and +emit GListModel::items-changed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.get_description.html b/documentation/method.MixerStream.get_description.html new file mode 100644 index 00000000000..051abbd554b --- /dev/null +++ b/documentation/method.MixerStream.get_description.html @@ -0,0 +1,221 @@ + + + + + + Valent.MixerStream.get_description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamget_description

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_mixer_stream_get_description (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the human-readable label of stream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerStream:description
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A stream description.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.get_direction.html b/documentation/method.MixerStream.get_direction.html new file mode 100644 index 00000000000..9f2312fe8ef --- /dev/null +++ b/documentation/method.MixerStream.get_direction.html @@ -0,0 +1,221 @@ + + + + + + Valent.MixerStream.get_direction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamget_direction

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerDirection
+valent_mixer_stream_get_direction (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the port direction of stream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerStream:direction
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerDirection

+

The ValentMixerDirection of stream.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.get_level.html b/documentation/method.MixerStream.get_level.html new file mode 100644 index 00000000000..204d33da5da --- /dev/null +++ b/documentation/method.MixerStream.get_level.html @@ -0,0 +1,223 @@ + + + + + + Valent.MixerStream.get_level + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamget_level

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
unsigned int
+valent_mixer_stream_get_level (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the level of stream (eg. speaker volume, microphone sensitivity).

+

Implementations that override this method should also override +Valent.MixerStreamClass.set_level.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerStream:level
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: unsigned int

+

A volume level between 0 and 100

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.get_muted.html b/documentation/method.MixerStream.get_muted.html new file mode 100644 index 00000000000..e25a6758d40 --- /dev/null +++ b/documentation/method.MixerStream.get_muted.html @@ -0,0 +1,223 @@ + + + + + + Valent.MixerStream.get_muted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamget_muted

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_mixer_stream_get_muted (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the muted state of stream.

+

Implementations that override this method should also override +Valent.MixerStreamClass.set_muted.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerStream:muted
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if the stream is muted, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.get_name.html b/documentation/method.MixerStream.get_name.html new file mode 100644 index 00000000000..45319426ed4 --- /dev/null +++ b/documentation/method.MixerStream.get_name.html @@ -0,0 +1,221 @@ + + + + + + Valent.MixerStream.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_mixer_stream_get_name (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the unique name of stream.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.MixerStream:name
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A unique name.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.set_level.html b/documentation/method.MixerStream.set_level.html new file mode 100644 index 00000000000..dc798970076 --- /dev/null +++ b/documentation/method.MixerStream.set_level.html @@ -0,0 +1,230 @@ + + + + + + Valent.MixerStream.set_level + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamset_level

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_stream_set_level (
+  ValentMixerStream* stream,
+  unsigned int level
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the level of stream (eg. speaker volume, microphone sensitivity).

+

Implementations that override this method should also override +Valent.MixerStreamClass.get_level.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MixerStream:level
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
level
+
+

Type: unsigned int

+

A volume level between 0 and 100

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.MixerStream.set_muted.html b/documentation/method.MixerStream.set_muted.html new file mode 100644 index 00000000000..fd738d046b2 --- /dev/null +++ b/documentation/method.MixerStream.set_muted.html @@ -0,0 +1,230 @@ + + + + + + Valent.MixerStream.set_muted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentMixerStreamset_muted

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_mixer_stream_set_muted (
+  ValentMixerStream* stream,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the muted state of stream.

+

Implementations that override this method should also override +Valent.MixerStreamClass.get_muted.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.MixerStream:muted
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: gboolean

+

Whether the stream should be muted.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.add_button.html b/documentation/method.Notification.add_button.html new file mode 100644 index 00000000000..e9c8f8186a2 --- /dev/null +++ b/documentation/method.Notification.add_button.html @@ -0,0 +1,266 @@ + + + + + + Valent.Notification.add_button + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationadd_button

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_add_button (
+  ValentNotification* notification,
+  const char* label,
+  const char* action
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Add a notification button.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
label
+
+

Type: const char*

+

A button label.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
action
+
+

Type: const char*

+

An action name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.add_button_with_target.html b/documentation/method.Notification.add_button_with_target.html new file mode 100644 index 00000000000..b7f56da17b9 --- /dev/null +++ b/documentation/method.Notification.add_button_with_target.html @@ -0,0 +1,284 @@ + + + + + + Valent.Notification.add_button_with_target + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationadd_button_with_target

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_add_button_with_target (
+  ValentNotification* notification,
+  const char* label,
+  const char* action,
+  GVariant* target
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Add a notification button.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
label
+
+

Type: const char*

+

A button label.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
action
+
+

Type: const char*

+

An action name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
target
+
+

Type: GVariant

+

An action target.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.equal.html b/documentation/method.Notification.equal.html new file mode 100644 index 00000000000..e11c74468b3 --- /dev/null +++ b/documentation/method.Notification.equal.html @@ -0,0 +1,274 @@ + + + + + + Valent.Notification.equal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationequal

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_notification_equal (
+  gconstpointer notification1,
+  gconstpointer notification2
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Compare two notifications for equality by ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification2
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if equal, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_application.html b/documentation/method.Notification.get_application.html new file mode 100644 index 00000000000..3825be01e0c --- /dev/null +++ b/documentation/method.Notification.get_application.html @@ -0,0 +1,249 @@ + + + + + + Valent.Notification.get_application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_application

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_notification_get_application (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notifying application.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Notification:application
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The notifying application name.

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_body.html b/documentation/method.Notification.get_body.html new file mode 100644 index 00000000000..c6dd9a488fc --- /dev/null +++ b/documentation/method.Notification.get_body.html @@ -0,0 +1,249 @@ + + + + + + Valent.Notification.get_body + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_body

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_notification_get_body (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notification body.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Notification:body
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The notification body.

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_icon.html b/documentation/method.Notification.get_icon.html new file mode 100644 index 00000000000..90055036200 --- /dev/null +++ b/documentation/method.Notification.get_icon.html @@ -0,0 +1,251 @@ + + + + + + Valent.Notification.get_icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_icon

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIcon*
+valent_notification_get_icon (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notification icon.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + + +
Gets propertyValent.Notification:icon
Sets propertyValent.Notification:icon
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GIcon

+

A GIcon

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_id.html b/documentation/method.Notification.get_id.html new file mode 100644 index 00000000000..f81119d9ab1 --- /dev/null +++ b/documentation/method.Notification.get_id.html @@ -0,0 +1,249 @@ + + + + + + Valent.Notification.get_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_id

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_notification_get_id (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notification ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Notification:id
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A unique ID.

+
+
+ + + + + + + +
The data is owned by the instance.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_priority.html b/documentation/method.Notification.get_priority.html new file mode 100644 index 00000000000..470214c9a2c --- /dev/null +++ b/documentation/method.Notification.get_priority.html @@ -0,0 +1,249 @@ + + + + + + Valent.Notification.get_priority + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_priority

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GNotificationPriority
+valent_notification_get_priority (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notification priority.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Notification:priority
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GNotificationPriority

+

A GNotificationPriority

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_time.html b/documentation/method.Notification.get_time.html new file mode 100644 index 00000000000..1dafb85398a --- /dev/null +++ b/documentation/method.Notification.get_time.html @@ -0,0 +1,249 @@ + + + + + + Valent.Notification.get_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_time

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
int64_t
+valent_notification_get_time (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notification time.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Notification:time
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: int64_t

+

A UNIX epoch timestamp (ms)

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.get_title.html b/documentation/method.Notification.get_title.html new file mode 100644 index 00000000000..59f058c875c --- /dev/null +++ b/documentation/method.Notification.get_title.html @@ -0,0 +1,249 @@ + + + + + + Valent.Notification.get_title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationget_title

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+valent_notification_get_title (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the notification title.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Notification:title
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

The notification title.

+
+
+ + + + + + + +
The data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.hash.html b/documentation/method.Notification.hash.html new file mode 100644 index 00000000000..e522ff0b9b2 --- /dev/null +++ b/documentation/method.Notification.hash.html @@ -0,0 +1,241 @@ + + + + + + Valent.Notification.hash + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationhash

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
unsigned int
+valent_notification_hash (
+  gconstpointer notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Converts a notification to a hash value, using g_str_hash() on the ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: unsigned int

+

A hash value.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.serialize.html b/documentation/method.Notification.serialize.html new file mode 100644 index 00000000000..1cda94dd3a5 --- /dev/null +++ b/documentation/method.Notification.serialize.html @@ -0,0 +1,241 @@ + + + + + + Valent.Notification.serialize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationserialize

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GVariant*
+valent_notification_serialize (
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Serialize the notification into a variant of type a{sv}.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GVariant

+

A floating GVariant

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_action.html b/documentation/method.Notification.set_action.html new file mode 100644 index 00000000000..654b56afe99 --- /dev/null +++ b/documentation/method.Notification.set_action.html @@ -0,0 +1,258 @@ + + + + + + Valent.Notification.set_action + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_action

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_action (
+  ValentNotification* notification,
+  const char* action
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Sets the default notification action.

+

action may be a detailed action as parsed by +g_action_parse_detailed_name().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:action
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
action
+
+

Type: const char*

+

A detailed action.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_action_and_target.html b/documentation/method.Notification.set_action_and_target.html new file mode 100644 index 00000000000..5bccb04d29e --- /dev/null +++ b/documentation/method.Notification.set_action_and_target.html @@ -0,0 +1,267 @@ + + + + + + Valent.Notification.set_action_and_target + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_action_and_target

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_action_and_target (
+  ValentNotification* notification,
+  const char* action,
+  GVariant* target
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default notification action.

+

If target is non-NULL, action will be activated with target as its parameter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
action
+
+

Type: const char*

+

An action name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ +
target
+
+

Type: GVariant

+

A GVariant to use as actions parameter.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_application.html b/documentation/method.Notification.set_application.html new file mode 100644 index 00000000000..4173403b445 --- /dev/null +++ b/documentation/method.Notification.set_application.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_application

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_application (
+  ValentNotification* notification,
+  const char* application
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notifying application.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:application
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
application
+
+

Type: const char*

+

The notifying application.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_body.html b/documentation/method.Notification.set_body.html new file mode 100644 index 00000000000..88eea1cf1e4 --- /dev/null +++ b/documentation/method.Notification.set_body.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_body + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_body

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_body (
+  ValentNotification* notification,
+  const char* body
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notification body.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:body
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
body
+
+

Type: const char*

+

A notification body.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_icon.html b/documentation/method.Notification.set_icon.html new file mode 100644 index 00000000000..1df1ff64cd0 --- /dev/null +++ b/documentation/method.Notification.set_icon.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_icon

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_icon (
+  ValentNotification* notification,
+  GIcon* icon
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notification icon.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:icon
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
icon
+
+

Type: GIcon

+

A GIcon

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_id.html b/documentation/method.Notification.set_id.html new file mode 100644 index 00000000000..99fc671bd58 --- /dev/null +++ b/documentation/method.Notification.set_id.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_id

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_id (
+  ValentNotification* notification,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notification ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:id
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

A unique ID.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_priority.html b/documentation/method.Notification.set_priority.html new file mode 100644 index 00000000000..d1adc92a219 --- /dev/null +++ b/documentation/method.Notification.set_priority.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_priority + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_priority

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_priority (
+  ValentNotification* notification,
+  GNotificationPriority priority
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notification priority.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:priority
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
priority
+
+

Type: GNotificationPriority

+

A GNotificationPriority

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_time.html b/documentation/method.Notification.set_time.html new file mode 100644 index 00000000000..cfcd23c6848 --- /dev/null +++ b/documentation/method.Notification.set_time.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_time

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_time (
+  ValentNotification* notification,
+  int64_t time
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notification time.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:time
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
time
+
+

Type: int64_t

+

A UNIX epoch timestamp (ms)

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notification.set_title.html b/documentation/method.Notification.set_title.html new file mode 100644 index 00000000000..3ae7e3f5871 --- /dev/null +++ b/documentation/method.Notification.set_title.html @@ -0,0 +1,256 @@ + + + + + + Valent.Notification.set_title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationset_title

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_title (
+  ValentNotification* notification,
+  const char* title
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the notification title.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Notification:title
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
title
+
+

Type: const char*

+

A notification title.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Notifications.get_applications.html b/documentation/method.Notifications.get_applications.html new file mode 100644 index 00000000000..7ee7ef408d8 --- /dev/null +++ b/documentation/method.Notifications.get_applications.html @@ -0,0 +1,201 @@ + + + + + + Valent.Notifications.get_applications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationsget_applications

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GVariant*
+valent_notifications_get_applications (
+  ValentNotifications* notifications
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a dictionary of applications that are known to send notifications.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GVariant

+

A GVariant

+
+
+ + + + + + + +
The data is owned by the instance.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.NotificationsAdapter.add_notification.html b/documentation/method.NotificationsAdapter.add_notification.html new file mode 100644 index 00000000000..c33bbfc4ca4 --- /dev/null +++ b/documentation/method.NotificationsAdapter.add_notification.html @@ -0,0 +1,214 @@ + + + + + + Valent.NotificationsAdapter.add_notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationsAdapteradd_notification

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notifications_adapter_add_notification (
+  ValentNotificationsAdapter* adapter,
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Send notification to the adapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.NotificationsAdapter.notification_added.html b/documentation/method.NotificationsAdapter.notification_added.html new file mode 100644 index 00000000000..58766e72d22 --- /dev/null +++ b/documentation/method.NotificationsAdapter.notification_added.html @@ -0,0 +1,216 @@ + + + + + + Valent.NotificationsAdapter.notification_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationsAdapternotification_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notifications_adapter_notification_added (
+  ValentNotificationsAdapter* adapter,
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit ValentNotificationsAdapter::notification-added on adapter.

+

This method should only be called by implementations of +ValentNotificationsAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.NotificationsAdapter.notification_removed.html b/documentation/method.NotificationsAdapter.notification_removed.html new file mode 100644 index 00000000000..efad4dd04a4 --- /dev/null +++ b/documentation/method.NotificationsAdapter.notification_removed.html @@ -0,0 +1,216 @@ + + + + + + Valent.NotificationsAdapter.notification_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationsAdapternotification_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notifications_adapter_notification_removed (
+  ValentNotificationsAdapter* adapter,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit ValentNotificationsAdapter::notification-removed on adapter.

+

This method should only be called by implementations of +ValentNotificationsAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

A notification id.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.NotificationsAdapter.remove_notification.html b/documentation/method.NotificationsAdapter.remove_notification.html new file mode 100644 index 00000000000..9d6dd678fea --- /dev/null +++ b/documentation/method.NotificationsAdapter.remove_notification.html @@ -0,0 +1,214 @@ + + + + + + Valent.NotificationsAdapter.remove_notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentNotificationsAdapterremove_notification

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notifications_adapter_remove_notification (
+  ValentNotificationsAdapter* adapter,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Withdraw id from adapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

A notification id.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.chain_cancellable.html b/documentation/method.Object.chain_cancellable.html new file mode 100644 index 00000000000..24a9267dede --- /dev/null +++ b/documentation/method.Object.chain_cancellable.html @@ -0,0 +1,256 @@ + + + + + + Valent.Object.chain_cancellable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectchain_cancellable

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GCancellable*
+valent_object_chain_cancellable (
+  ValentObject* object,
+  GCancellable* cancellable
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Chain a cancellable to the object’s cancellable.

+

This connects cancellable to objectss GCancellable::cancelled +so that if object is destroyed, cancellable will be cancelled. If +cancellable is NULL, this method will return a new reference to +ValentObject:cancellable, otherwise it returns a new reference to +cancellable.

+

Typically the returned GCancellable is passed to an internal +asynchronous operation, to ensure it is cancelled if cancellable is +triggered or object is destroyed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GCancellable

+

A GCancellable

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.destroy.html b/documentation/method.Object.destroy.html new file mode 100644 index 00000000000..14e50a41d09 --- /dev/null +++ b/documentation/method.Object.destroy.html @@ -0,0 +1,194 @@ + + + + + + Valent.Object.destroy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectdestroy

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_object_destroy (
+  ValentObject* object
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Destroy the object.

+

If called from the main thread, it calls g_object_run_dispose(), +which activates the object GCancellable and emits +ValentObject::destroy.

+

If called from another thread, an idle source will be added to invoke it on +the main thread.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.in_destruction.html b/documentation/method.Object.in_destruction.html new file mode 100644 index 00000000000..ab55a3b2158 --- /dev/null +++ b/documentation/method.Object.in_destruction.html @@ -0,0 +1,215 @@ + + + + + + Valent.Object.in_destruction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectin_destruction

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_object_in_destruction (
+  ValentObject* object
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether the object is destroyed or in destruction.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if destroyed, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.lock.html b/documentation/method.Object.lock.html new file mode 100644 index 00000000000..73c2c0311f5 --- /dev/null +++ b/documentation/method.Object.lock.html @@ -0,0 +1,190 @@ + + + + + + Valent.Object.lock + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectlock

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_object_lock (
+  ValentObject* object
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Acquire a lock on object.

+

Call valent_object_unlock() to release the lock.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.notify.html b/documentation/method.Object.notify.html new file mode 100644 index 00000000000..a0db2cc5036 --- /dev/null +++ b/documentation/method.Object.notify.html @@ -0,0 +1,224 @@ + + + + + + Valent.Object.notify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectnotify

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_object_notify (
+  ValentObject* object,
+  const char* property_name
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit GObject::notify on object, on the main thread.

+

Like g_object_notify() if the caller is in the main thread, +otherwise the invocation is deferred to the main thread.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
property_name
+
+

Type: const char*

+

A property name.

+ + + + + + + + + + +
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.notify_by_pspec.html b/documentation/method.Object.notify_by_pspec.html new file mode 100644 index 00000000000..58b5a905bcd --- /dev/null +++ b/documentation/method.Object.notify_by_pspec.html @@ -0,0 +1,224 @@ + + + + + + Valent.Object.notify_by_pspec + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectnotify_by_pspec

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_object_notify_by_pspec (
+  ValentObject* object,
+  GParamSpec* pspec
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit GObject::notify on object, on the main thread.

+

Like g_object_notify_by_pspec() if the caller is in the main +thread, otherwise the invocation is deferred to the main thread.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
pspec
+
+

Type: GParamSpec

+

A GParamSpec

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.ref_cancellable.html b/documentation/method.Object.ref_cancellable.html new file mode 100644 index 00000000000..cb944b90bda --- /dev/null +++ b/documentation/method.Object.ref_cancellable.html @@ -0,0 +1,223 @@ + + + + + + Valent.Object.ref_cancellable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectref_cancellable

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GCancellable*
+valent_object_ref_cancellable (
+  ValentObject* object
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a GCancellable for the object.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Object:cancellable
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GCancellable

+

objects GCancellable

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Object.unlock.html b/documentation/method.Object.unlock.html new file mode 100644 index 00000000000..c67ec28ad7b --- /dev/null +++ b/documentation/method.Object.unlock.html @@ -0,0 +1,190 @@ + + + + + + Valent.Object.unlock + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentObjectunlock

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_object_unlock (
+  ValentObject* object
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Release a lock on object.

+

The lock must have previously been acquired by valent_object_lock().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Session.get_active.html b/documentation/method.Session.get_active.html new file mode 100644 index 00000000000..c5e3686a60a --- /dev/null +++ b/documentation/method.Session.get_active.html @@ -0,0 +1,213 @@ + + + + + + Valent.Session.get_active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentSessionget_active

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_session_get_active (
+  ValentSession* session
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the active state of the primary ValentSessionAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Session:active
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if the session is active, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Session.get_locked.html b/documentation/method.Session.get_locked.html new file mode 100644 index 00000000000..553fde639c8 --- /dev/null +++ b/documentation/method.Session.get_locked.html @@ -0,0 +1,213 @@ + + + + + + Valent.Session.get_locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentSessionget_locked

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_session_get_locked (
+  ValentSession* session
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the locked state of the primary ValentSessionAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Session:locked
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if the session is locked, or FALSE if unlocked.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Session.set_locked.html b/documentation/method.Session.set_locked.html new file mode 100644 index 00000000000..23ff0a80488 --- /dev/null +++ b/documentation/method.Session.set_locked.html @@ -0,0 +1,220 @@ + + + + + + Valent.Session.set_locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentSessionset_locked

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_session_set_locked (
+  ValentSession* session,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the locked state of the primary ValentSessionAdapter.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Session:locked
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: gboolean

+

TRUE to lock, or FALSE to unlock.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.SessionAdapter.get_active.html b/documentation/method.SessionAdapter.get_active.html new file mode 100644 index 00000000000..ded10e553f0 --- /dev/null +++ b/documentation/method.SessionAdapter.get_active.html @@ -0,0 +1,213 @@ + + + + + + Valent.SessionAdapter.get_active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentSessionAdapterget_active

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_session_adapter_get_active (
+  ValentSessionAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether the session is active.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.SessionAdapter:active
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if active, FALSE if idle.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.SessionAdapter.get_locked.html b/documentation/method.SessionAdapter.get_locked.html new file mode 100644 index 00000000000..324dbdc4da5 --- /dev/null +++ b/documentation/method.SessionAdapter.get_locked.html @@ -0,0 +1,213 @@ + + + + + + Valent.SessionAdapter.get_locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentSessionAdapterget_locked

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_session_adapter_get_locked (
+  ValentSessionAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether the session is locked.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.SessionAdapter:locked
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if locked, FALSE if unlocked.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.SessionAdapter.set_locked.html b/documentation/method.SessionAdapter.set_locked.html new file mode 100644 index 00000000000..cbfe94ffebb --- /dev/null +++ b/documentation/method.SessionAdapter.set_locked.html @@ -0,0 +1,220 @@ + + + + + + Valent.SessionAdapter.set_locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentSessionAdapterset_locked

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_session_adapter_set_locked (
+  ValentSessionAdapter* adapter,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set whether the session is locked.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.SessionAdapter:locked
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: gboolean

+

TRUE to lock, FALSE to unlock.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.cancel.html b/documentation/method.Transfer.cancel.html new file mode 100644 index 00000000000..b96a723a068 --- /dev/null +++ b/documentation/method.Transfer.cancel.html @@ -0,0 +1,191 @@ + + + + + + Valent.Transfer.cancel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransfercancel

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_transfer_cancel (
+  ValentTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Cancel the transfer operation.

+

If this is called before valent_transfer_execute() the transfer will +fail unconditionally.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.check_status.html b/documentation/method.Transfer.check_status.html new file mode 100644 index 00000000000..64f8ece58c5 --- /dev/null +++ b/documentation/method.Transfer.check_status.html @@ -0,0 +1,218 @@ + + + + + + Valent.Transfer.check_status + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransfercheck_status

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_transfer_check_status (
+  ValentTransfer* transfer
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Check the transfer status.

+

Returns TRUE if the transfer operation is in progress or completed +successfully. Returns FALSE with error set if the transfer failed.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.dup_id.html b/documentation/method.Transfer.dup_id.html new file mode 100644 index 00000000000..8388b9de8c1 --- /dev/null +++ b/documentation/method.Transfer.dup_id.html @@ -0,0 +1,223 @@ + + + + + + Valent.Transfer.dup_id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransferdup_id

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
char*
+valent_transfer_dup_id (
+  ValentTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the transfer ID.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Transfer:id
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: char*

+

A unique ID.

+
+
+ + + + + + + +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.execute.html b/documentation/method.Transfer.execute.html new file mode 100644 index 00000000000..e661ec60d04 --- /dev/null +++ b/documentation/method.Transfer.execute.html @@ -0,0 +1,261 @@ + + + + + + Valent.Transfer.execute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransferexecute

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_transfer_execute (
+  ValentTransfer* transfer,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Start the transfer operation.

+

Get the result with valent_transfer_execute_finish().

+

If the transfer operation has already started, this call will fail and +valent_transfer_execute_finish() will return G_IO_ERROR_PENDING.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
The argument can be NULL.
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the method.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.execute_finish.html b/documentation/method.Transfer.execute_finish.html new file mode 100644 index 00000000000..3eca755fed2 --- /dev/null +++ b/documentation/method.Transfer.execute_finish.html @@ -0,0 +1,261 @@ + + + + + + Valent.Transfer.execute_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransferexecute_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+valent_transfer_execute_finish (
+  ValentTransfer* transfer,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_transfer_execute().

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the method.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the method if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.get_progress.html b/documentation/method.Transfer.get_progress.html new file mode 100644 index 00000000000..98707b02d0f --- /dev/null +++ b/documentation/method.Transfer.get_progress.html @@ -0,0 +1,223 @@ + + + + + + Valent.Transfer.get_progress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransferget_progress

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
double
+valent_transfer_get_progress (
+  ValentTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the transfer progress.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Transfer:progress
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: double

+

A number from 0.0 to 1.0

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.get_state.html b/documentation/method.Transfer.get_state.html new file mode 100644 index 00000000000..d080f278fa8 --- /dev/null +++ b/documentation/method.Transfer.get_state.html @@ -0,0 +1,223 @@ + + + + + + Valent.Transfer.get_state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransferget_state

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentTransferState
+valent_transfer_get_state (
+  ValentTransfer* transfer
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the transfer state.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Gets propertyValent.Transfer:state
+
+ +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentTransferState

+

A ValentTransferState

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/method.Transfer.set_progress.html b/documentation/method.Transfer.set_progress.html new file mode 100644 index 00000000000..acaff30b9de --- /dev/null +++ b/documentation/method.Transfer.set_progress.html @@ -0,0 +1,232 @@ + + + + + + Valent.Transfer.set_progress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Method

+

ValentTransferset_progress

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_transfer_set_progress (
+  ValentTransfer* transfer,
+  double progress
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the transfer progress.

+

This method should only be called by implementations of +ValentTransfer.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
Sets propertyValent.Transfer:progress
+
+ +
+ + +
+

+ Parameters + +

+ +
+
+ +
progress
+
+

Type: double

+

A number from 0.0 to 1.0

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/opensearch.xml b/documentation/opensearch.xml new file mode 100644 index 00000000000..ee28c103d2c --- /dev/null +++ b/documentation/opensearch.xml @@ -0,0 +1 @@ +ValentValent-1 Reference ManualUTF-8logo.svghttps://valent.andyholmes.ca/documentation/ \ No newline at end of file diff --git a/documentation/property.Channel.base-stream.html b/documentation/property.Channel.base-stream.html new file mode 100644 index 00000000000..bbf5b9616c4 --- /dev/null +++ b/documentation/property.Channel.base-stream.html @@ -0,0 +1,196 @@ + + + + + + Valent.Channel:base-stream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannel:base-stream

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property base-stream: Gio.IOStream [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The base GIOStream for the channel.

+

Implementations of ValentChannelService must set this property +during construction.

+
+ +
+ + + + + + + + + +
Type:GIOStream
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_channel_ref_base_stream()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Channel.identity.html b/documentation/property.Channel.identity.html new file mode 100644 index 00000000000..249a1e88ca1 --- /dev/null +++ b/documentation/property.Channel.identity.html @@ -0,0 +1,198 @@ + + + + + + Valent.Channel:identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannel:identity

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property identity: Json.Node [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The local identity packet.

+

This is the identity packet sent by the ValentChannelService +implementation to identify the host system.

+

Implementations of ValentChannelService must set this property +during construction.

+
+ +
+ + + + + + + + + +
Type:JsonNode
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_channel_get_identity()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Channel.peer-identity.html b/documentation/property.Channel.peer-identity.html new file mode 100644 index 00000000000..2040e3f23d1 --- /dev/null +++ b/documentation/property.Channel.peer-identity.html @@ -0,0 +1,197 @@ + + + + + + Valent.Channel:peer-identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannel:peer-identity

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property peer-identity: Json.Node [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The peer identity packet.

+

This is the identity packet sent by the peer to identify itself.

+

Implementations of ValentChannelService must set this property +during construction.

+
+ +
+ + + + + + + + + +
Type:JsonNode
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_channel_get_peer_identity()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ChannelService.certificate.html b/documentation/property.ChannelService.certificate.html new file mode 100644 index 00000000000..68e36123f4f --- /dev/null +++ b/documentation/property.ChannelService.certificate.html @@ -0,0 +1,194 @@ + + + + + + Valent.ChannelService:certificate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannelService:certificate

+
+ +
+
+

+
+
+

+ Declaration + +

+ +
+
property certificate: Gio.TlsCertificate [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The TLS certificate the service uses to authenticate with other devices.

+
+ +
+ + + + + + + +
Type:GTlsCertificate
+
+ + +
+ + + + +
Getter methodvalent_channel_service_ref_certificate()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ChannelService.id.html b/documentation/property.ChannelService.id.html new file mode 100644 index 00000000000..468cdb67ee9 --- /dev/null +++ b/documentation/property.ChannelService.id.html @@ -0,0 +1,202 @@ + + + + + + Valent.ChannelService:id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannelService:id

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property id: utf8 [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The local ID.

+

This is the ID used to identify the local device, which should be unique +among devices in a given network.

+

This property is thread-safe. Emissions of GObject::notify +are guaranteed to happen in the main thread.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_channel_service_dup_id()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ChannelService.identity.html b/documentation/property.ChannelService.identity.html new file mode 100644 index 00000000000..c99eae29906 --- /dev/null +++ b/documentation/property.ChannelService.identity.html @@ -0,0 +1,200 @@ + + + + + + Valent.ChannelService:identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannelService:identity

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property identity: Json.Node [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The local identity packet.

+

This is the identity packet sent by the ValentChannelService +implementation to describe the local device.

+

This property is thread-safe. Emissions of GObject::notify +are guaranteed to happen in the main thread.

+
+ +
+ + + + + + + + + +
Type:JsonNode
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_channel_service_ref_identity()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ChannelService.name.html b/documentation/property.ChannelService.name.html new file mode 100644 index 00000000000..5cab021c3e7 --- /dev/null +++ b/documentation/property.ChannelService.name.html @@ -0,0 +1,204 @@ + + + + + + Valent.ChannelService:name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentChannelService:name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property name: utf8 [ read, write, construct ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The local display name.

+

This is the user-visible label packet used to identify the local device in +user interfaces.

+

This property is thread-safe. Emissions of GObject::notify +are guaranteed to happen in the main thread.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueValent
Getter methodvalent_channel_service_get_name()
Setter methodvalent_channel_service_set_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructyes
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Component.plugin-domain.html b/documentation/property.Component.plugin-domain.html new file mode 100644 index 00000000000..de66e994be2 --- /dev/null +++ b/documentation/property.Component.plugin-domain.html @@ -0,0 +1,188 @@ + + + + + + Valent.Component:plugin-domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentComponent:plugin-domain

+
+ +
+
+

+
+
+

+ Declaration + +

+ +
+
property plugin-domain: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + + + + + +
Type:gchar*
+
+ + +
+ + + + +
Default valueNULL
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Component.plugin-type.html b/documentation/property.Component.plugin-type.html new file mode 100644 index 00000000000..ce5f5c67542 --- /dev/null +++ b/documentation/property.Component.plugin-type.html @@ -0,0 +1,184 @@ + + + + + + Valent.Component:plugin-type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentComponent:plugin-type

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property plugin-type: GObject.Type [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The extension point GType.

+
+ +
+ + + + + + + + + +
Type:GType
Available since:1.0
+
+ + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ContactStore.name.html b/documentation/property.ContactStore.name.html new file mode 100644 index 00000000000..04aa8db2324 --- /dev/null +++ b/documentation/property.ContactStore.name.html @@ -0,0 +1,198 @@ + + + + + + Valent.ContactStore:name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentContactStore:name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property name: utf8 [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The display name.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueNULL
Getter methodvalent_contact_store_get_name()
Setter methodvalent_contact_store_set_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ContactStore.source.html b/documentation/property.ContactStore.source.html new file mode 100644 index 00000000000..8ce06b036dc --- /dev/null +++ b/documentation/property.ContactStore.source.html @@ -0,0 +1,194 @@ + + + + + + Valent.ContactStore:source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentContactStore:source

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property source: EDataServer.Source [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The store ESource.

+
+ +
+ + + + + + + + + +
Type:ESource
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_contact_store_get_source()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.ContactStore.uid.html b/documentation/property.ContactStore.uid.html new file mode 100644 index 00000000000..57276494dfe --- /dev/null +++ b/documentation/property.ContactStore.uid.html @@ -0,0 +1,196 @@ + + + + + + Valent.ContactStore:uid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentContactStore:uid

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property uid: utf8 [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The unique identifier.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_contact_store_get_uid()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Context.domain.html b/documentation/property.Context.domain.html new file mode 100644 index 00000000000..c383ab3be96 --- /dev/null +++ b/documentation/property.Context.domain.html @@ -0,0 +1,196 @@ + + + + + + Valent.Context:domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentContext:domain

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property domain: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The domain for this context.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_context_get_domain()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Context.id.html b/documentation/property.Context.id.html new file mode 100644 index 00000000000..b38fc60d307 --- /dev/null +++ b/documentation/property.Context.id.html @@ -0,0 +1,196 @@ + + + + + + Valent.Context:id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentContext:id

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property id: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The ID for this context.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_context_get_id()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Context.parent.html b/documentation/property.Context.parent.html new file mode 100644 index 00000000000..1a55ee4b62c --- /dev/null +++ b/documentation/property.Context.parent.html @@ -0,0 +1,194 @@ + + + + + + Valent.Context:parent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentContext:parent

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property parent: Valent.Context [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The parent context.

+
+ +
+ + + + + + + + + +
Type:ValentContext
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_context_get_parent()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Device.context.html b/documentation/property.Device.context.html new file mode 100644 index 00000000000..227167a839a --- /dev/null +++ b/documentation/property.Device.context.html @@ -0,0 +1,200 @@ + + + + + + Valent.Device:context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevice:context

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property context: Valent.Context [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The data context.

+
+ +
+ + + + + + + + + +
Type:ValentContext
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_device_get_context()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Device.icon-name.html b/documentation/property.Device.icon-name.html new file mode 100644 index 00000000000..a6e6d6758db --- /dev/null +++ b/documentation/property.Device.icon-name.html @@ -0,0 +1,202 @@ + + + + + + Valent.Device:icon-name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevice:icon-name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property icon-name: utf8 [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A symbolic icon name for the device.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valuecomputer-symbolic
Getter methodvalent_device_get_icon_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Device.id.html b/documentation/property.Device.id.html new file mode 100644 index 00000000000..e2012d3a64c --- /dev/null +++ b/documentation/property.Device.id.html @@ -0,0 +1,205 @@ + + + + + + Valent.Device:id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevice:id

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property id: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A unique ID for the device.

+

By convention, the single source of truth for a device ID in KDE Connect is +the common name of its TLS certificate. It is not well-defined how this ID +is generated, however.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_device_get_id()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Device.name.html b/documentation/property.Device.name.html new file mode 100644 index 00000000000..8cf40da5fc4 --- /dev/null +++ b/documentation/property.Device.name.html @@ -0,0 +1,202 @@ + + + + + + Valent.Device:name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevice:name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property name: utf8 [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A display name for the device.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_device_get_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Device.plugins.html b/documentation/property.Device.plugins.html new file mode 100644 index 00000000000..8c6ffc05956 --- /dev/null +++ b/documentation/property.Device.plugins.html @@ -0,0 +1,200 @@ + + + + + + Valent.Device:plugins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevice:plugins

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property plugins: string[] [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A list of loaded plugin names.

+
+ +
+ + + + + + + + + +
Type:An array of char*
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_device_get_plugins()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Device.state.html b/documentation/property.Device.state.html new file mode 100644 index 00000000000..2ea94ac4051 --- /dev/null +++ b/documentation/property.Device.state.html @@ -0,0 +1,202 @@ + + + + + + Valent.Device:state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevice:state

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property state: Valent.DeviceState [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The state of the device.

+
+ +
+ + + + + + + + + +
Type:ValentDeviceState
Available since:1.0
+
+ + +
+ + + + + + +
Default valueVALENT_DEVICE_STATE_NONE
Getter methodvalent_device_get_state()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DeviceGadget.device.html b/documentation/property.DeviceGadget.device.html new file mode 100644 index 00000000000..95a72ee72ad --- /dev/null +++ b/documentation/property.DeviceGadget.device.html @@ -0,0 +1,182 @@ + + + + + + Valent.DeviceGadget:device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDeviceGadget:device

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property device: Valent.Device [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The ValentDevice this gadget is for.

+
+ +
+ + + + + + + + + +
Type:ValentDevice
Available since:1.0
+
+ + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DeviceManager.name.html b/documentation/property.DeviceManager.name.html new file mode 100644 index 00000000000..ee0f5448fdf --- /dev/null +++ b/documentation/property.DeviceManager.name.html @@ -0,0 +1,194 @@ + + + + + + Valent.DeviceManager:name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDeviceManager:name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property name: utf8 [ read, write, construct ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The display name of the local device.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueValent
Getter methodvalent_device_manager_get_name()
Setter methodvalent_device_manager_set_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructyes
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DevicePreferencesGroup.context.html b/documentation/property.DevicePreferencesGroup.context.html new file mode 100644 index 00000000000..6587953dda0 --- /dev/null +++ b/documentation/property.DevicePreferencesGroup.context.html @@ -0,0 +1,194 @@ + + + + + + Valent.DevicePreferencesGroup:context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevicePreferencesGroup:context

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property context: Valent.Context [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ + + +
+ + + + + + + + + +
Type:ValentContext
Available since:1.0
+
+ + + + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DevicePreferencesGroup.plugin-info.html b/documentation/property.DevicePreferencesGroup.plugin-info.html new file mode 100644 index 00000000000..4826126b0a3 --- /dev/null +++ b/documentation/property.DevicePreferencesGroup.plugin-info.html @@ -0,0 +1,186 @@ + + + + + + Valent.DevicePreferencesGroup:plugin-info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevicePreferencesGroup:plugin-info

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property plugin-info: Peas.PluginInfo [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The PeasPluginInfo describing this plugin.

+
+ +
+ + + + + + + + + +
Type:PeasPluginInfo
Available since:1.0
+
+ + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DevicePreferencesGroup.settings.html b/documentation/property.DevicePreferencesGroup.settings.html new file mode 100644 index 00000000000..8f97ffabbc9 --- /dev/null +++ b/documentation/property.DevicePreferencesGroup.settings.html @@ -0,0 +1,194 @@ + + + + + + Valent.DevicePreferencesGroup:settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDevicePreferencesGroup:settings

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property settings: Gio.Settings [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The GSettings for the ValentDevicePlugin.

+
+ +
+ + + + + + + + + +
Type:GSettings
Available since:1.0
+
+ + + + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DeviceTransfer.device.html b/documentation/property.DeviceTransfer.device.html new file mode 100644 index 00000000000..9f2efa97ef4 --- /dev/null +++ b/documentation/property.DeviceTransfer.device.html @@ -0,0 +1,194 @@ + + + + + + Valent.DeviceTransfer:device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDeviceTransfer:device

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property device: Valent.Device [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The ValentDevice this transfer is for.

+
+ +
+ + + + + + + + + +
Type:ValentDevice
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_device_transfer_ref_device()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DeviceTransfer.file.html b/documentation/property.DeviceTransfer.file.html new file mode 100644 index 00000000000..824ca4c586b --- /dev/null +++ b/documentation/property.DeviceTransfer.file.html @@ -0,0 +1,196 @@ + + + + + + Valent.DeviceTransfer:file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDeviceTransfer:file

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property file: Gio.File [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The local GFile.

+

If this a download, then this is the destination. If it’s upload, this is +the source.

+
+ +
+ + + + + + + + + +
Type:GFile
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_device_transfer_ref_file()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.DeviceTransfer.packet.html b/documentation/property.DeviceTransfer.packet.html new file mode 100644 index 00000000000..e4f668bd67e --- /dev/null +++ b/documentation/property.DeviceTransfer.packet.html @@ -0,0 +1,194 @@ + + + + + + Valent.DeviceTransfer:packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentDeviceTransfer:packet

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property packet: Json.Node [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The KDE Connect packet describing the payload.

+
+ +
+ + + + + + + + + +
Type:JsonNode
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_device_transfer_ref_packet()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Extension.context.html b/documentation/property.Extension.context.html new file mode 100644 index 00000000000..60f01111b89 --- /dev/null +++ b/documentation/property.Extension.context.html @@ -0,0 +1,198 @@ + + + + + + Valent.Extension:context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentExtension:context

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property context: Valent.Context [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The ValentDevice this plugin is bound to.

+
+ +
+ + + + + + + + + +
Type:ValentContext
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_extension_get_context()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Extension.object.html b/documentation/property.Extension.object.html new file mode 100644 index 00000000000..c4129fd686e --- /dev/null +++ b/documentation/property.Extension.object.html @@ -0,0 +1,198 @@ + + + + + + Valent.Extension:object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentExtension:object

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property object: GObject.Object [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The GObject this plugin is bound to.

+
+ +
+ + + + + + + + + +
Type:GObject
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_extension_get_object()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Extension.plugin-info.html b/documentation/property.Extension.plugin-info.html new file mode 100644 index 00000000000..586263f9068 --- /dev/null +++ b/documentation/property.Extension.plugin-info.html @@ -0,0 +1,190 @@ + + + + + + Valent.Extension:plugin-info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentExtension:plugin-info

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property plugin-info: Peas.PluginInfo [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The PeasPluginInfo describing this plugin.

+
+ +
+ + + + + + + + + +
Type:PeasPluginInfo
Available since:1.0
+
+ + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Extension.plugin-state.html b/documentation/property.Extension.plugin-state.html new file mode 100644 index 00000000000..d296008a306 --- /dev/null +++ b/documentation/property.Extension.plugin-state.html @@ -0,0 +1,198 @@ + + + + + + Valent.Extension:plugin-state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentExtension:plugin-state

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property plugin-state: Valent.PluginState [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The ValentPluginState describing the state of the extension.

+
+ +
+ + + + + + + + + +
Type:ValentPluginState
Available since:1.0
+
+ + +
+ + + + +
Default valueVALENT_PLUGIN_STATE_ACTIVE
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Extension.settings.html b/documentation/property.Extension.settings.html new file mode 100644 index 00000000000..5bfb02dbd3b --- /dev/null +++ b/documentation/property.Extension.settings.html @@ -0,0 +1,198 @@ + + + + + + Valent.Extension:settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentExtension:settings

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property settings: Gio.Settings [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The GSettings for this plugin.

+
+ +
+ + + + + + + + + +
Type:GSettings
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_extension_get_settings()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.flags.html b/documentation/property.MediaPlayer.flags.html new file mode 100644 index 00000000000..f8ce3cd47f8 --- /dev/null +++ b/documentation/property.MediaPlayer.flags.html @@ -0,0 +1,208 @@ + + + + + + Valent.MediaPlayer:flags + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:flags

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property flags: Valent.MediaActions [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The available actions.

+

Implementations should emit GObject::notify when they +change the internal representation of this property.

+
+ +
+ + + + + + + + + +
Type:ValentMediaActions
Available since:1.0
+
+ + +
+ + + + + + +
Default valueVALENT_MEDIA_ACTION_NONE
Getter methodvalent_media_player_get_flags()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.metadata.html b/documentation/property.MediaPlayer.metadata.html new file mode 100644 index 00000000000..a91b29ed588 --- /dev/null +++ b/documentation/property.MediaPlayer.metadata.html @@ -0,0 +1,207 @@ + + + + + + Valent.MediaPlayer:metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:metadata

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property metadata: GLib.Variant [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The metadata of the active media item.

+

The content of the variant should be in the same format as MPRISv2.

+

Implementations should emit GObject::notify when they +change the internal representation of this property.

+
+ +
+ + + + + + + + + +
Type:GVariant
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_media_player_get_metadata()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.name.html b/documentation/property.MediaPlayer.name.html new file mode 100644 index 00000000000..2956a0c067d --- /dev/null +++ b/documentation/property.MediaPlayer.name.html @@ -0,0 +1,209 @@ + + + + + + Valent.MediaPlayer:name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property name: utf8 [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The display name of the media player.

+

Typically, this property should remain constant through the lifetime of the +media player. Implementations should emit GObject::notify +the internal representation of this property changes, regardless.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_media_player_get_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.position.html b/documentation/property.MediaPlayer.position.html new file mode 100644 index 00000000000..286792dcb7d --- /dev/null +++ b/documentation/property.MediaPlayer.position.html @@ -0,0 +1,212 @@ + + + + + + Valent.MediaPlayer:position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:position

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property position: double [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The current track position in seconds.

+

Acceptable values are between 0 and the mpris:length metadata entry +(see ValentMediaPlayer:metadata). If the player does not have +VALENT_MEDIA_ACTION_SEEK in ValentMediaPlayer:flags, setting +this property should have no effect.

+
+ +
+ + + + + + + + + +
Type:gdouble
Available since:1.0
+
+ + +
+ + + + + + + + +
Default value0.000000
Getter methodvalent_media_player_get_position()
Setter methodvalent_media_player_set_position()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.repeat.html b/documentation/property.MediaPlayer.repeat.html new file mode 100644 index 00000000000..03b5268b633 --- /dev/null +++ b/documentation/property.MediaPlayer.repeat.html @@ -0,0 +1,212 @@ + + + + + + Valent.MediaPlayer:repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:repeat

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property repeat: Valent.MediaRepeat [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The repeat mode.

+

If the player does not have the appropriate bitmask in +ValentMediaPlayer:flags, setting this property should have no effect.

+

Implementations should emit GObject::notify when they +change the internal representation of this property.

+
+ +
+ + + + + + + + + +
Type:ValentMediaRepeat
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueVALENT_MEDIA_REPEAT_NONE
Getter methodvalent_media_player_get_repeat()
Setter methodvalent_media_player_set_repeat()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.shuffle.html b/documentation/property.MediaPlayer.shuffle.html new file mode 100644 index 00000000000..e7dba39dc61 --- /dev/null +++ b/documentation/property.MediaPlayer.shuffle.html @@ -0,0 +1,213 @@ + + + + + + Valent.MediaPlayer:shuffle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:shuffle

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property shuffle: gboolean [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Whether playback order is shuffled.

+

A value of FALSE indicates that playback is progressing linearly through a +playlist, while TRUE means playback is progressing through a playlist in +some other order.

+

Implementations should emit GObject::notify when they +change the internal representation of this property.

+
+ +
+ + + + + + + + + +
Type:gboolean
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueFALSE
Getter methodvalent_media_player_get_shuffle()
Setter methodvalent_media_player_set_shuffle()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.state.html b/documentation/property.MediaPlayer.state.html new file mode 100644 index 00000000000..295338544dd --- /dev/null +++ b/documentation/property.MediaPlayer.state.html @@ -0,0 +1,208 @@ + + + + + + Valent.MediaPlayer:state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:state

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property state: Valent.MediaState [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The playback state.

+

Implementations should emit GObject::notify when they +change the internal representation of this property.

+
+ +
+ + + + + + + + + +
Type:ValentMediaState
Available since:1.0
+
+ + +
+ + + + + + +
Default valueVALENT_MEDIA_STATE_STOPPED
Getter methodvalent_media_player_get_state()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MediaPlayer.volume.html b/documentation/property.MediaPlayer.volume.html new file mode 100644 index 00000000000..77af992b068 --- /dev/null +++ b/documentation/property.MediaPlayer.volume.html @@ -0,0 +1,211 @@ + + + + + + Valent.MediaPlayer:volume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMediaPlayer:volume

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property volume: double [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The volume level.

+

Attempts to change this property may be ignored by some implementations.

+

Implementations should emit GObject::notify when they +change the internal representation of this property.

+
+ +
+ + + + + + + + + +
Type:gdouble
Available since:1.0
+
+ + +
+ + + + + + + + +
Default value0.000000
Getter methodvalent_media_player_get_volume()
Setter methodvalent_media_player_set_volume()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Mixer.default-input.html b/documentation/property.Mixer.default-input.html new file mode 100644 index 00000000000..52b5dc27030 --- /dev/null +++ b/documentation/property.Mixer.default-input.html @@ -0,0 +1,194 @@ + + + + + + Valent.Mixer:default-input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixer:default-input

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property default-input: Valent.MixerStream [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The active input stream.

+
+ +
+ + + + + + + + + +
Type:ValentMixerStream
Available since:1.0
+
+ + +
+ + + + + + +
Getter methodvalent_mixer_get_default_input()
Setter methodvalent_mixer_set_default_input()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Mixer.default-output.html b/documentation/property.Mixer.default-output.html new file mode 100644 index 00000000000..389a9a66a67 --- /dev/null +++ b/documentation/property.Mixer.default-output.html @@ -0,0 +1,194 @@ + + + + + + Valent.Mixer:default-output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixer:default-output

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property default-output: Valent.MixerStream [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The active output stream.

+
+ +
+ + + + + + + + + +
Type:ValentMixerStream
Available since:1.0
+
+ + +
+ + + + + + +
Getter methodvalent_mixer_get_default_output()
Setter methodvalent_mixer_set_default_output()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerAdapter.default-input.html b/documentation/property.MixerAdapter.default-input.html new file mode 100644 index 00000000000..b6899503fa5 --- /dev/null +++ b/documentation/property.MixerAdapter.default-input.html @@ -0,0 +1,196 @@ + + + + + + Valent.MixerAdapter:default-input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerAdapter:default-input

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property default-input: Valent.MixerStream [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The active input stream.

+

Implementations should emit GObject::notify for this +property when the default stream changes.

+
+ +
+ + + + + + + + + +
Type:ValentMixerStream
Available since:1.0
+
+ + + + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerAdapter.default-output.html b/documentation/property.MixerAdapter.default-output.html new file mode 100644 index 00000000000..671f1d6d63b --- /dev/null +++ b/documentation/property.MixerAdapter.default-output.html @@ -0,0 +1,196 @@ + + + + + + Valent.MixerAdapter:default-output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerAdapter:default-output

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property default-output: Valent.MixerStream [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The active output stream.

+

Implementations should emit GObject::notify for this +property when the default stream changes.

+
+ +
+ + + + + + + + + +
Type:ValentMixerStream
Available since:1.0
+
+ + + + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerStream.description.html b/documentation/property.MixerStream.description.html new file mode 100644 index 00000000000..30e07a9de76 --- /dev/null +++ b/documentation/property.MixerStream.description.html @@ -0,0 +1,202 @@ + + + + + + Valent.MixerStream:description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerStream:description

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property description: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The human-readable label of the stream.

+

Implementation may emit GObject::notify for this property +if it changes.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_mixer_stream_get_description()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerStream.direction.html b/documentation/property.MixerStream.direction.html new file mode 100644 index 00000000000..5dba268fa15 --- /dev/null +++ b/documentation/property.MixerStream.direction.html @@ -0,0 +1,200 @@ + + + + + + Valent.MixerStream:direction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerStream:direction

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property direction: Valent.MixerDirection [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The port direction of the stream.

+
+ +
+ + + + + + + + + +
Type:ValentMixerDirection
Available since:1.0
+
+ + +
+ + + + + + +
Default valueVALENT_MIXER_INPUT
Getter methodvalent_mixer_stream_get_direction()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerStream.level.html b/documentation/property.MixerStream.level.html new file mode 100644 index 00000000000..bc0e2ed0394 --- /dev/null +++ b/documentation/property.MixerStream.level.html @@ -0,0 +1,202 @@ + + + + + + Valent.MixerStream:level + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerStream:level

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property level: guint [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The input or output level of the stream.

+
+ +
+ + + + + + + + + +
Type:guint
Available since:1.0
+
+ + +
+ + + + + + + + +
Default value0
Getter methodvalent_mixer_stream_get_level()
Setter methodvalent_mixer_stream_set_level()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerStream.muted.html b/documentation/property.MixerStream.muted.html new file mode 100644 index 00000000000..d69d2210e27 --- /dev/null +++ b/documentation/property.MixerStream.muted.html @@ -0,0 +1,202 @@ + + + + + + Valent.MixerStream:muted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerStream:muted

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property muted: gboolean [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Whether the stream is muted.

+
+ +
+ + + + + + + + + +
Type:gboolean
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueFALSE
Getter methodvalent_mixer_stream_get_muted()
Setter methodvalent_mixer_stream_set_muted()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.MixerStream.name.html b/documentation/property.MixerStream.name.html new file mode 100644 index 00000000000..6cd765e0a3a --- /dev/null +++ b/documentation/property.MixerStream.name.html @@ -0,0 +1,200 @@ + + + + + + Valent.MixerStream:name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentMixerStream:name

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property name: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The unique name of the stream.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Getter methodvalent_mixer_stream_get_name()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.action.html b/documentation/property.Notification.action.html new file mode 100644 index 00000000000..3b13914ee50 --- /dev/null +++ b/documentation/property.Notification.action.html @@ -0,0 +1,206 @@ + + + + + + Valent.Notification:action + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:action

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property action: utf8 [ write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The default notification action.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + +
Default valueNULL
Setter methodvalent_notification_set_action()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableno
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.application.html b/documentation/property.Notification.application.html new file mode 100644 index 00000000000..03bb83c6ccd --- /dev/null +++ b/documentation/property.Notification.application.html @@ -0,0 +1,212 @@ + + + + + + Valent.Notification:application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:application

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property application: utf8 [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The notifying application.

+

The semantics of this property are not well-defined. It may be the +application name (i.e. the appName argument passed to +org.freedesktop.Notifications.Notify()), the desktop application ID (i.e. +from org.gtk.Notifications.AddNotification()) or some other identifying string.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueNULL
Getter methodvalent_notification_get_application()
Setter methodvalent_notification_set_application()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.body.html b/documentation/property.Notification.body.html new file mode 100644 index 00000000000..1a47a705189 --- /dev/null +++ b/documentation/property.Notification.body.html @@ -0,0 +1,208 @@ + + + + + + Valent.Notification:body + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:body

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property body: utf8 [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The notification body.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueNULL
Getter methodvalent_notification_get_body()
Setter methodvalent_notification_set_body()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.icon.html b/documentation/property.Notification.icon.html new file mode 100644 index 00000000000..fcce69a2256 --- /dev/null +++ b/documentation/property.Notification.icon.html @@ -0,0 +1,206 @@ + + + + + + Valent.Notification:icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:icon

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property icon: Gio.Icon [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The notification GIcon.

+
+ +
+ + + + + + + + + +
Type:GIcon
Available since:1.0
+
+ + +
+ + + + + + +
Getter methodvalent_notification_get_icon()
Setter methodvalent_notification_set_icon()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.id.html b/documentation/property.Notification.id.html new file mode 100644 index 00000000000..636fd4bb75e --- /dev/null +++ b/documentation/property.Notification.id.html @@ -0,0 +1,208 @@ + + + + + + Valent.Notification:id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:id

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property id: utf8 [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The unique ID of the notification.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueNULL
Getter methodvalent_notification_get_id()
Setter methodvalent_notification_set_id()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.priority.html b/documentation/property.Notification.priority.html new file mode 100644 index 00000000000..4c618dfc60a --- /dev/null +++ b/documentation/property.Notification.priority.html @@ -0,0 +1,208 @@ + + + + + + Valent.Notification:priority + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:priority

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property priority: Gio.NotificationPriority [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The notification priority.

+
+ +
+ + + + + + + + + +
Type:GNotificationPriority
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueG_NOTIFICATION_PRIORITY_NORMAL
Getter methodvalent_notification_get_priority()
Setter methodvalent_notification_set_priority()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.time.html b/documentation/property.Notification.time.html new file mode 100644 index 00000000000..da66021dc4e --- /dev/null +++ b/documentation/property.Notification.time.html @@ -0,0 +1,208 @@ + + + + + + Valent.Notification:time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:time

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property time: gint64 [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The posting time of the notification in milliseconds.

+
+ +
+ + + + + + + + + +
Type:gint64
Available since:1.0
+
+ + +
+ + + + + + + + +
Default value0
Getter methodvalent_notification_get_time()
Setter methodvalent_notification_set_time()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Notification.title.html b/documentation/property.Notification.title.html new file mode 100644 index 00000000000..fa6c58279d1 --- /dev/null +++ b/documentation/property.Notification.title.html @@ -0,0 +1,208 @@ + + + + + + Valent.Notification:title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentNotification:title

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property title: utf8 [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The title of the notification.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueNULL
Getter methodvalent_notification_get_title()
Setter methodvalent_notification_set_title()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Object.cancellable.html b/documentation/property.Object.cancellable.html new file mode 100644 index 00000000000..77af43e7f29 --- /dev/null +++ b/documentation/property.Object.cancellable.html @@ -0,0 +1,192 @@ + + + + + + Valent.Object:cancellable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentObject:cancellable

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property cancellable: Gio.Cancellable [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The object GCancellable.

+

A GCancellable that can be used by operations that should be cancelled +when the object is destroyed (i.e. enters disposal).

+
+ +
+ + + + + + + + + +
Type:GCancellable
Available since:1.0
+
+ + +
+ + + + +
Getter methodvalent_object_ref_cancellable()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.PreferencesPage.plugin-info.html b/documentation/property.PreferencesPage.plugin-info.html new file mode 100644 index 00000000000..7c6fb279a04 --- /dev/null +++ b/documentation/property.PreferencesPage.plugin-info.html @@ -0,0 +1,182 @@ + + + + + + Valent.PreferencesPage:plugin-info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentPreferencesPage:plugin-info

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property plugin-info: Peas.PluginInfo [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The PeasPluginInfo describing the plugin this page configures.

+
+ +
+ + + + + + + + + +
Type:PeasPluginInfo
Available since:1.0
+
+ + +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Session.active.html b/documentation/property.Session.active.html new file mode 100644 index 00000000000..843ccdfd8d1 --- /dev/null +++ b/documentation/property.Session.active.html @@ -0,0 +1,194 @@ + + + + + + Valent.Session:active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentSession:active

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property active: gboolean [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Whether the session is active.

+
+ +
+ + + + + + + + + +
Type:gboolean
Available since:1.0
+
+ + +
+ + + + + + +
Default valueFALSE
Getter methodvalent_session_get_active()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Session.locked.html b/documentation/property.Session.locked.html new file mode 100644 index 00000000000..ec51adc171c --- /dev/null +++ b/documentation/property.Session.locked.html @@ -0,0 +1,196 @@ + + + + + + Valent.Session:locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentSession:locked

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property locked: gboolean [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Whether the session is locked.

+
+ +
+ + + + + + + + + +
Type:gboolean
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueFALSE
Getter methodvalent_session_get_locked()
Setter methodvalent_session_set_locked()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.SessionAdapter.active.html b/documentation/property.SessionAdapter.active.html new file mode 100644 index 00000000000..ac4d097f0f4 --- /dev/null +++ b/documentation/property.SessionAdapter.active.html @@ -0,0 +1,194 @@ + + + + + + Valent.SessionAdapter:active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentSessionAdapter:active

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property active: gboolean [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Whether the session is active.

+
+ +
+ + + + + + + + + +
Type:gboolean
Available since:1.0
+
+ + +
+ + + + + + +
Default valueFALSE
Getter methodvalent_session_adapter_get_active()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.SessionAdapter.locked.html b/documentation/property.SessionAdapter.locked.html new file mode 100644 index 00000000000..14b42123bc8 --- /dev/null +++ b/documentation/property.SessionAdapter.locked.html @@ -0,0 +1,196 @@ + + + + + + Valent.SessionAdapter:locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentSessionAdapter:locked

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property locked: gboolean [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Whether the session is locked.

+
+ +
+ + + + + + + + + +
Type:gboolean
Available since:1.0
+
+ + +
+ + + + + + + + +
Default valueFALSE
Getter methodvalent_session_adapter_get_locked()
Setter methodvalent_session_adapter_set_locked()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Transfer.id.html b/documentation/property.Transfer.id.html new file mode 100644 index 00000000000..841f8fdeb50 --- /dev/null +++ b/documentation/property.Transfer.id.html @@ -0,0 +1,198 @@ + + + + + + Valent.Transfer:id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentTransfer:id

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property id: utf8 [ read, write, construct-only ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

A unique identifier for the transfer.

+

If not specified at construction, a random UUID will be generated on-demand +with g_uuid_string_random().

+

This property is thread-safe. Emissions of GObject::notify +are guaranteed to happen in the main thread.

+
+ +
+ + + + + + + + + +
Type:gchar*
Available since:1.0
+
+ + +
+ + + + +
Default valueNULL
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyyes
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Transfer.progress.html b/documentation/property.Transfer.progress.html new file mode 100644 index 00000000000..4d74765d6c8 --- /dev/null +++ b/documentation/property.Transfer.progress.html @@ -0,0 +1,203 @@ + + + + + + Valent.Transfer:progress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentTransfer:progress

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property progress: double [ read, write ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The progress of the transfer.

+

This value will change from 0.0 to 1.0 during the course of the +operation. It is guaranteed to change to 1.0 when the transfer operation +completes, but not guaranteed to change before that unless set by an implementation.

+

This property is thread-safe. Emissions of GObject::notify +are guaranteed to happen in the main thread.

+
+ +
+ + + + + + + + + +
Type:gdouble
Available since:1.0
+
+ + +
+ + + + + + + + +
Default value0.000000
Getter methodvalent_transfer_get_progress()
Setter methodvalent_transfer_set_progress()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableyes
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/property.Transfer.state.html b/documentation/property.Transfer.state.html new file mode 100644 index 00000000000..00f9660a007 --- /dev/null +++ b/documentation/property.Transfer.state.html @@ -0,0 +1,202 @@ + + + + + + Valent.Transfer:state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Property

+

ValentTransfer:state

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
property state: Valent.TransferState [ read ]
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

The ValentTransferState of the transfer.

+

The value will change from VALENT_TRANSFER_STATE_PENDING to +VALENT_TRANSFER_STATE_ACTIVE when valent_transfer_execute() is +called. When the operation completes it will change to either +VALENT_TRANSFER_STATE_COMPLETE or VALENT_TRANSFER_STATE_FAILED.

+

This property is thread-safe. Emissions of GObject::notify +are guaranteed to happen in the main thread.

+
+ +
+ + + + + + + + + +
Type:ValentTransferState
Available since:1.0
+
+ + +
+ + + + + + +
Default valueVALENT_TRANSFER_STATE_PENDING
Getter methodvalent_transfer_get_state()
+
+ +
+ +
+

+ Flags + +

+ +
+ + + + + +
Readableyes
Writableno
Constructno
Construct onlyno
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/protocol.html b/documentation/protocol.html new file mode 100644 index 00000000000..4a3fba88e5e --- /dev/null +++ b/documentation/protocol.html @@ -0,0 +1,2242 @@ + + + + + + Valent – 1: Protocol Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ +

+ Protocol Reference + + +

+ +
+
+

Protocol Reference

+

This reference is generated from JSON Schemas used in the testing and development of Valent.

+

This document should not be interpreted as a formal specification of the KDE Connect protocol.

+

Table of Contents

+ +

Core Protocol

+

The core of the KDE Connect protocol is built on the exchange of JSON packets, similar to JSON-RPC.

+

References

+ +

Packets

+

kdeconnect.*

+

The structure of a KDE Connect packet is similar to a JSON-RPC request, although the protocols are quite different. The id field holds a timestamp, the type field holds a type string and the body field holds a dictionary of parameters. While the id field is not used in KDE Connect, the type and body fields are analogous to the method and params members of a JSON-RPC request.

+

Packets are sent by devices with no guarantee that they will be received, or that if received there will be a response. For this reason, plugins consistently handle any incoming packet regardless of whether it was expected or not. In other words, packet handling in KDE Connect is typically idempotent.

+

Payloads are declared by the presence of the payloadSize and payloadTransferInfo fields, which indicate that the packet sender is waiting to transfer payloadSize bytes over the connection described by payloadTransferInfo. For example, the payloadTransferInfo dictionary might have a port entry holding a TCP port the device is listening on for incoming connections.

+
{
+    "id": 0,
+    "type": "kdeconnect.share.request",
+    "body": {
+        "filename": "image.png"
+    },
+    "payloadSize": 882,
+    "payloadTransferInfo": {
+        "port": 1739
+    }
+}
+
+ +
    +
  • +

    id: Number 🔒

    +

    A UNIX epoch timestamp (ms). In some cases KDE Connect clients erroneously set this field as a string.

    +
  • +
  • +

    type: String 🔒

    +

    pattern: /^kdeconnect(\.[a-z_]+)+$/

    +

    A string in the form of kdeconnect.<plugin> or kdeconnect.<plugin>.<action> such as kdeconnect.mpris and kdeconnect.mpris.request.

    +
  • +
  • +

    body: Object 🔒

    +

    A dictionary of parameters appropriate for the packet type.

    +
  • +
+

This packet has no body fields.

+
    +
  • +

    payloadSize: Number

    +

    range: Unrestricted

    +

    The size of the payload to expect. There is a currently unused convention of using -1 to declare a stream of indefinite size.

    +
  • +
  • +

    payloadTransferInfo: Object

    +

    A dictionary of properties necessary for clients to negotiate a transfer channel.

    +
  • +
+

kdeconnect.identity

+

The KDE Connect identity packet is used to identify devices and their capabilities.

+

Each networking module may define additional fields necessary for clients to connect. For example, in the LAN protocol the identity packet is broadcast over UDP with a tcpPort field.

+
{
+    "id": 0,
+    "type": "kdeconnect.identity",
+    "body": {
+        "deviceId": "abcdef0123456789",
+        "deviceName": "FOSS Phone",
+        "deviceType": "phone",
+        "incomingCapabilities": [
+            "kdeconnect.mock.echo",
+            "kdeconnect.mock.transfer"
+        ],
+        "outgoingCapabilities": [
+            "kdeconnect.mock.echo",
+            "kdeconnect.mock.transfer"
+        ],
+        "protocolVersion": 7
+    }
+}
+
+ +
    +
  • +

    deviceId: String 🔒

    +

    A unique ID for the device.

    +
  • +
  • +

    deviceName: String 🔒

    +

    A human-readable label for the device.

    +
  • +
  • +

    deviceType: String 🔒

    +

    enum: 'desktop'|'laptop'|'phone'|'tablet'|'tv'

    +

    A device type string. Since the incomingCapabilities and outgoingCapabilities fields describe the functionality of a device, the deviceType field is typically only used to select an icon.

    +
  • +
  • +

    incomingCapabilities: Array of String 🔒

    +

    A list of packet types the device can consume. Note that this is only an indication a device can consume a packet type, not that it will.

    +
  • +
  • +

    outgoingCapabilities: Array of String 🔒

    +

    A list of packet types the device can provide. Note that this is only an indication a device can provide a packet type, not that it will.

    +
  • +
  • +

    protocolVersion: Number 🔒

    +

    enum: 7

    +

    The protocol version. The only value currently valid is 7

    +
  • +
+

kdeconnect.pair

+

The KDE Connect pair packet is used to negotiate pairing between devices. Devices must be paired before sending any other packets and should reject any incoming packets from unpaired devices.

+

A device sends a packet with pair set to true to request pairing. A response is expected with pair set to true to accept or false to reject. By convention the request times out after 30 seconds.

+

A device sends a packet with pair set to false to unpair or reject a pairing request. No response is expected.

+
{
+    "id": 0,
+    "type": "kdeconnect.pair",
+    "body": {
+        "pair": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.pair",
+    "body": {
+        "pair": false
+    }
+}
+
+ +
    +
  • +

    pair: Boolean 🔒

    +

    If true a pairing request is being accepted or a new one started. If false a pairing request is being rejected or a paired device is unpairing.

    +
  • +
+

Battery Plugin

+

The Battery plugin allows a device to expose the status of its battery.

+

References

+ +

Packets

+

kdeconnect.battery

+

This packet is a battery status update.

+
{
+    "id": 0,
+    "type": "kdeconnect.battery",
+    "body": {
+        "currentCharge": 15,
+        "isCharging": false,
+        "thresholdEvent": 1
+    }
+}
+
+ +
    +
  • +

    currentCharge: Number 🔒

    +

    range: -1–100

    +

    The current battery percentage, typically between 0 and 100. If the value is -1, the device should be treated as though it has no battery.

    +
  • +
  • +

    isCharging: Boolean 🔒

    +

    A boolean value indicating whether the battery is currently charging.

    +
  • +
  • +

    thresholdEvent: Number

    +

    enum: 0|1

    +

    Either 1 if the battery is below the threshold level, 0 otherwise. The threshold is chosen arbitrarily by the reporting device.

    +
  • +
+

kdeconnect.battery.request

+

⚠️ Deprecated: This packet is sent to request a battery status update.

+
{
+    "id": 0,
+    "type": "kdeconnect.battery.request",
+    "body": {
+        "request": true
+    }
+}
+
+ +
    +
  • +

    request: Boolean 🔒

    +

    ⚠️ Deprecated: Whether to request a status update. It only makes sense for this to be true.

    +
  • +
+

Clipboard Plugin

+

The Clipboard plugin allows syncing clipboard text content between devices.

+

References

+ +

Packets

+

kdeconnect.clipboard

+

This packet is sent when the clipboard content changes. In other words, it is typically sent when the selection owner changes.

+
{
+    "id": 0,
+    "type": "kdeconnect.clipboard",
+    "body": {
+        "content": "some text"
+    }
+}
+
+ +
    +
  • +

    content: String 🔒

    +

    Text content of the clipboard.

    +
  • +
+

kdeconnect.clipboard.connect

+

This packet is only sent when a device connects.

+
{
+    "id": 0,
+    "type": "kdeconnect.clipboard",
+    "body": {
+        "content": "some text",
+        "timestamp": 0
+    }
+}
+
+ +
    +
  • +

    content: String 🔒

    +

    Text content of the clipboard.

    +
  • +
  • +

    timestamp: Number 🔒

    +

    UNIX epoch timestamp (ms) for the clipboard content. If the timestamp is 0 or less than the local timestamp, the content should be ignored.

    +
  • +
+

Connectivity Report Plugin

+

The Connectivity Report plugin allows a device to expose the status of its connectivity.

+

References

+ +

Packets

+

kdeconnect.connectivity_report

+

This packet is a connectivity report.

+
{
+    "id": 0,
+    "type": "kdeconnect.connectivity_report",
+    "body": {
+        "signalStrengths": {
+            "6": {
+                "networkType": "4G",
+                "signalStrength": 3
+            },
+            "17": {
+                "networkType": "HSPA",
+                "signalStrength": -1
+            }
+        }
+    }
+}
+
+ +
    +
  • +

    signalStrengths: Object 🔒

    +

    A dictionary of signal states. Each key is an arbitrary, but unique, string and each value is a Signal object.

    +
      +
    • +

      Signal (Object)

      +

      The ID of the attachment.

      +
        +
      • +

        networkType: String 🔒

        +

        enum: 'GSM'|'CDMA'|'iDEN'|'UMTS'|'CDMA2000'|'EDGE'|'GPRS'|'HSPA'|'LTE'|'5G'|'Unknown'

        +

        The network type.

        +
      • +
      • +

        signalStrength: Number 🔒

        +

        range: -1–5

        +

        The signal strength. As with the battery plugin, -1 means the device is not available. Values 0 through 5 describe the coarse strength of the signal.

        +
      • +
      +
    • +
    +
  • +
+

kdeconnect.connectivity_report.request

+

⚠️ Deprecated: This packet is sent to request a connectivity report.

+
{
+    "id": 0,
+    "type": "kdeconnect.connectivity_report.request",
+    "body": {}
+}
+
+ +

This packet has no body fields.

+

Contacts Plugin

+

The Contacts plugin allows devices to share contacts in vCard format.

+

References

+ +

Packets

+

kdeconnect.contacts.request_all_uids_timestamps

+

This packet is a request for a list of contact UIDs with modification timestamps.

+
{
+    "id": 0,
+    "type": "kdeconnect.contacts.request_all_uids_timestamps",
+    "body": {}
+}
+
+ +

This packet has no body fields.

+

kdeconnect.contacts.request_vcards_by_uid

+

This packet is a request for a list of contact UIDs with vCard data.

+
{
+    "id": 0,
+    "type": "kdeconnect.contacts.request_vcards_by_uid",
+    "body": {
+        "uids": [
+            "test-contact1",
+            "test-contact2"
+        ]
+    }
+}
+
+ + +

kdeconnect.contacts.response_uids_timestamps

+

This packet is a list of contact UIDs with modification timestamps.

+
{
+    "id": 0,
+    "type": "kdeconnect.contacts.response_all_uids_timestamps",
+    "body": {
+        "uids": [
+            "test-contact1",
+            "test-contact2"
+        ],
+        "test-contact1": 1608700784336,
+        "test-contact2": 1608700782848
+    }
+}
+
+ +
    +
  • +

    uids: Array of String 🔒

    +

    A list of contact UIDs. Each UID has a corresponding uid-timestamp pair in the body object.

    +
  • +
+

kdeconnect.contacts.response_vcards

+

This packet is a list of contact UIDs with vCard data.

+
{
+    "id": 0,
+    "type": "kdeconnect.contacts.response_vcards",
+    "body": {
+        "uids": [
+            "test-contact1",
+            "test-contact2"
+        ],
+        "test-contact1": "BEGIN:VCARD\nVERSION:2.1\nFN:Contact One\nTEL;CELL:123-456-7890\nX-KDECONNECT-ID-DEV-test-device:test-contact1\nX-KDECONNECT-TIMESTAMP:1608700784336\nEND:VCARD",
+        "test-contact2": "BEGIN:VCARD\nVERSION:2.1\nFN:Contact Two\nTEL;CELL:123-456-7891\nX-KDECONNECT-ID-DEV-test-device:test-contact2\nX-KDECONNECT-TIMESTAMP:1608700782848\nEND:VCARD"
+    }
+}
+
+ +
    +
  • +

    uids: Array of String 🔒

    +

    A list of contact UIDs. Each UID has a corresponding uid-vcard pair in the body object.

    +
  • +
+

FindMyPhone Plugin

+

The FindMyPhone plugin allows requesting a device to announce it’s location, usually by playing a sound like a traditional cordless phone.

+

References

+ +

Packets

+

kdeconnect.findmyphone.request

+

This packet is a request for a device to announce its location. By convention, sending a second packet cancels the request.

+
{
+    "id": 0,
+    "type": "kdeconnect.findmyphone.request",
+    "body": {}
+}
+
+ +

This packet has no body fields.

+

Lock

+

The Lock plugin allows requesting a device to lock or unlock.

+

References

+ +

Packets

+

kdeconnect.lock

+

This packet is a lock status update.

+
{
+    "id": 0,
+    "type": "kdeconnect.lock",
+    "body": {
+        "isLocked": true
+    }
+}
+
+ +
    +
  • +

    isLocked: Boolean 🔒

    +

    Indicates the current locked status of the device. If true the device is locked and false if unlocked.

    +
  • +
+

kdeconnect.lock.request

+

This packet is a request for a lock status update or change.

+
{
+    "id": 0,
+    "type": "kdeconnect.lock.request",
+    "body": {
+        "requestLocked": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.lock.request",
+    "body": {
+        "setLocked": false
+    }
+}
+
+ +
    +
  • +

    requestLocked: Boolean

    +

    enum: True

    +

    Indicates this is a request for the current locked status. Always true, if present.

    +
  • +
  • +

    setLocked: Boolean

    +

    A request to change the locked status. If true the device will be locked or if false unlocked.

    +
  • +
+

MousePad Plugin

+

The MousePad plugin allows remote control of the pointer and keyboard.

+

References

+ +

Packets

+

kdeconnect.mousepad.echo

+

This packet is an echo for a kdeconnect.mousepad.request packet.

+
{
+    "id": 0,
+    "type": "kdeconnect.mousepad.echo",
+    "body": {
+        "key": "a",
+        "isAck": true
+    }
+}
+
+ +
    +
  • +

    key: String

    +

    A request to press-release a single readable character, which may be a unicode character and thus more than one byte.

    +
  • +
  • +

    specialKey: Number

    +

    range: 0–32

    +

    A request to press-release a single non-printable character, usually a control character or function key such as Backspace or F10.

    +
  • +
  • +

    alt: Boolean

    +

    Indicates whether the Alt modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    ctrl: Boolean

    +

    Indicates whether the Control modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    shift: Boolean

    +

    Indicates whether the Shift modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    super: Boolean

    +

    Indicates whether the Super modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    singleclick: Boolean

    +

    A single press-release of the primary pointer button.

    +
  • +
  • +

    doubleclick: Boolean

    +

    A double press-release of the primary pointer button.

    +
  • +
  • +

    middleclick: Boolean

    +

    A single press-release of the middle pointer button.

    +
  • +
  • +

    rightclick: Boolean

    +

    A single press-release of the secondary pointer button.

    +
  • +
  • +

    singlehold: Boolean

    +

    A single press of the primary pointer button.

    +
  • +
  • +

    singlerelease: Boolean

    +

    A single release of the primary pointer button.

    +
  • +
  • +

    dx: Number

    +

    A double precision integer indicating a relative position delta for the pointer on the X-axis.

    +
  • +
  • +

    dy: Number

    +

    A double precision integer indicating a relative position delta for the pointer on the Y-axis.

    +
  • +
  • +

    scroll: Boolean

    +

    Whether the associated dx or dy movement is a scroll event.

    +
  • +
  • +

    isAck: Boolean 🔒

    +

    Indicates the packet is a confirmation of a request. Always true and always present.

    +
  • +
+

kdeconnect.mousepad.keyboardstate

+

This packet is a keyboard status update.

+
{
+    "id": 0,
+    "type": "kdeconnect.mousepad.keyboardstate",
+    "body": {
+        "state": true
+    }
+}
+
+ +
    +
  • +

    state: Boolean 🔒

    +

    Indicates the keyboard is ready to receive keypress events.

    +
  • +
+

kdeconnect.mousepad.request

+

This packet is a request for a pointer or keyboard event.

+
{
+    "id": 0,
+    "type": "kdeconnect.mousepad.request",
+    "body": {
+        "key": "a",
+        "sendAck": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.mousepad.request",
+    "body": {
+        "dx": 1.0,
+        "dy": -1.0
+    }
+}
+
+ +
    +
  • +

    key: String

    +

    A request to press-release a single readable character, which may be a unicode character and thus more than one byte.

    +
  • +
  • +

    specialKey: Number

    +

    range: 0–32

    +

    A request to press-release a single non-printable character, usually a control character or function key such as Backspace or F10.

    +
  • +
  • +

    alt: Boolean

    +

    Indicates whether the Alt modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    ctrl: Boolean

    +

    Indicates whether the Control modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    shift: Boolean

    +

    Indicates whether the Shift modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    super: Boolean

    +

    Indicates whether the Super modifier should be applied to the associated key or specialKey.

    +
  • +
  • +

    singleclick: Boolean

    +

    A single press-release of the primary pointer button.

    +
  • +
  • +

    doubleclick: Boolean

    +

    A double press-release of the primary pointer button.

    +
  • +
  • +

    middleclick: Boolean

    +

    A single press-release of the middle pointer button.

    +
  • +
  • +

    rightclick: Boolean

    +

    A single press-release of the secondary pointer button.

    +
  • +
  • +

    singlehold: Boolean

    +

    A single press of the primary pointer button.

    +
  • +
  • +

    singlerelease: Boolean

    +

    A single release of the primary pointer button.

    +
  • +
  • +

    dx: Number

    +

    A double precision integer indicating a position delta on the X-axis.

    +
  • +
  • +

    dy: Number

    +

    A double precision integer indicating a position delta on the Y-axis.

    +
  • +
  • +

    scroll: Boolean

    +

    Whether the associated dx or dy movement is a scroll event.

    +
  • +
  • +

    sendAck: Boolean

    +

    Indicates that the devices wants a kdeconnect.mousepad.echo packet as confirmation of a keyboard event.

    +
  • +
+

MPRIS Plugin

+

The MPRIS plugin allows sharing control of media players.

+

References

+ +

Packets

+

kdeconnect.mpris

+

This packet is used to expose media players to a remote device and transfer album art.

+
{
+    "id": 0,
+    "type": "kdeconnect.mpris",
+    "body": {
+        "playerList": [
+            "Test Player"
+        ],
+        "supportAlbumArtPayload": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.mpris",
+    "body": {
+        "player": "Test Player",
+        "canPause": true,
+        "canPlay": true,
+        "canGoNext": true,
+        "canGoPrevious": false,
+        "canSeek": true,
+        "isPlaying": true,
+        "pos": 0,
+        "albumArtUrl": "file:///path/to/image.png",
+        "nowPlaying": "Unknown",
+        "artist": "Test Artist",
+        "title": "Test Title",
+        "album": "Test Album",
+        "length": 180000,
+        "volume": 100
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.mpris",
+    "body": {
+        "player": "Test Player",
+        "albumArtUrl": "file:///path/to/image.png",
+        "transferringAlbumArt": true
+    },
+    "payloadSize": 882,
+    "payloadTransferInfo": {
+        "port": 1739
+    }
+}
+
+ +
    +
  • +

    playerList: Array of String

    +

    A list of player names.

    +
  • +
  • +

    player: String

    +

    A player name. This field is used to target a player.

    +
  • +
  • +

    canPause: Boolean

    +

    Can pause.

    +
  • +
  • +

    canPlay: Boolean

    +

    Can play.

    +
  • +
  • +

    canGoNext: Boolean

    +

    Can go next.

    +
  • +
  • +

    canGoPrevious: Boolean

    +

    Can go previous.

    +
  • +
  • +

    canSeek: Boolean

    +

    Can seek.

    +
  • +
  • +

    isPlaying: Boolean

    +

    Whether playback is active.

    +
  • +
  • +

    loopStatus: String

    +

    enum: 'None'|'Track'|'Playlist'

    +

    The loop status.

    +
  • +
  • +

    shuffle: Boolean

    +

    Whether shuffle is enabled.

    +
  • +
  • +

    pos: Number

    +

    range: Unrestricted

    +

    Current track position (ms).

    +
  • +
  • +

    albumArtUrl: String

    +

    Current track album art URL.

    +
  • +
  • +

    nowPlaying: String

    +

    ⚠️ Deprecated: An inclusive string of the format ‘Artist - Title’.

    +
  • +
  • +

    artist: String

    +

    Current track artist.

    +
  • +
  • +

    title: String

    +

    Current track title.

    +
  • +
  • +

    album: String

    +

    Current track album.

    +
  • +
  • +

    length: Number

    +

    Current track length (ms).

    +
  • +
  • +

    volume: Number

    +

    range: 0–100

    +

    Current player volume (%).

    +
  • +
  • +

    supportAlbumArtPayload: Boolean

    +

    Indicates this device supports album art payloads. This field should be set when responding with a list of players.

    +
  • +
  • +

    transferringAlbumArt: Boolean

    +

    Indicates this packet carries an album art payload.

    +
  • +
+

kdeconnect.mpris.request

+

This packet is used to request the status of remote media players, issue commands, and request the transfer of album art payloads.

+
{
+    "id": 0,
+    "type": "kdeconnect.mpris.request",
+    "body": {
+        "requestPlayerList": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.mpris.request",
+    "body": {
+        "player": "Test Player",
+        "requestNowPlaying": true,
+        "requestVolume": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.mpris.request",
+    "body": {
+        "player": "Test Player",
+        "action": "Play"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.mpris.request",
+    "body": {
+        "player": "Test Player",
+        "albumArtUrl": "file:///path/to/image.png"
+    }
+}
+
+ +
    +
  • +

    player: String

    +

    The player name

    +
  • +
  • +

    requestNowPlaying: Boolean

    +

    Whether the current status is requested.

    +
  • +
  • +

    requestPlayerList: Boolean

    +

    Whether the player list is requested.

    +
  • +
  • +

    requestVolume: Boolean

    +

    Whether the current volume is requested.

    +
  • +
  • +

    Seek: Number

    +

    A request to seek relative to the current position (us).

    +
  • +
  • +

    setLoopStatus: String

    +

    enum: 'None'|'Track'|'Playlist'

    +

    A request to set the loop status.

    +
  • +
  • +

    SetPosition: Number

    +

    range: Unrestricted

    +

    A request to set the track position (ms).

    +
  • +
  • +

    setShuffle: Boolean

    +

    A request to set the shuffle mode.

    +
  • +
  • +

    setVolume: Number

    +

    range: 0–100

    +

    A request to set the player volume.

    +
  • +
  • +

    action: String

    +

    enum: 'Pause'|'Play'|'PlayPause'|'Stop'|'Next'|'Previous'

    +

    A request to activate a player action.

    +
  • +
+

Notification Plugin

+

The Notification plugin syncs notifications between devices.

+

References

+ +

Packets

+

kdeconnect.notification

+

This packet is a notification.

+
{
+    "id": 0,
+    "type": "kdeconnect.notification",
+    "body": {
+        "id": "notification-id",
+        "title": "Information",
+        "text": "Something happened",
+        "ticker": "Information: Something happened",
+        "appName": "Terminal",
+        "isClearable": true,
+        "onlyOnce": false,
+        "silent": true,
+        "requestReplyId": "17499937-334b-4704-9c2c-24a0bcd4155a",
+        "time": "1631436143331",
+        "actions": [
+            "Ignore",
+            "Open"
+        ],
+        "payloadHash": "d97f60d052bf11d1e88821e04fff0007"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.notification",
+    "body": {
+        "id": "notification-id",
+        "isCancel": true
+    }
+}
+
+ +
    +
  • +

    id: String 🔒

    +

    The notification ID.

    +
  • +
  • +

    isCancel: Boolean

    +

    If true the notification with the indicated ID has been closed.

    +
  • +
  • +

    isClearable: Boolean

    +

    If true the notification with the indicated ID can be closed.

    +
  • +
  • +

    onlyOnce: Boolean

    +

    If true the notification should only be sent the first time it’s received, otherwise it should be re-sent each time. See the silent field for determining whether a notification is new or not.

    +
  • +
  • +

    silent: Boolean

    +

    If true the notification is preexisting, otherwise the remote device just received it.

    +
  • +
  • +

    time: String

    +

    A UNIX epoch timestamp (ms) in string form.

    +
  • +
  • +

    appName: String 🔒

    +

    The notifying application name.

    +
  • +
  • +

    ticker: String 🔒

    +

    The notification title and text in a single string.

    +
  • +
  • +

    title: String 🔒

    +

    The notification title.

    +
  • +
  • +

    text: String 🔒

    +

    The notification body.

    +
  • +
  • +

    payloadHash: String

    +

    An MD5 hash of the notification icon. If the packet contains this field, it will be accompanied by payload transfer information.

    +
  • +
  • +

    actions: Array of String

    +

    A list of action names for the notification. Respond with kdeconnect.notification.action to activate.

    +
  • +
  • +

    requestReplyId: String

    +

    The UUID for repliable notifications (eg. chat). Respond with kdeconnect.notification.reply to reply.

    +
  • +
+

kdeconnect.notification.action

+

This packet is an activation of a notification action.

+
{
+    "id": 0,
+    "type": "kdeconnect.notification.action",
+    "body": {
+        "key": "notification-id",
+        "action": "Open"
+    }
+}
+
+ +
    +
  • +

    key: String 🔒

    +

    The notification ID.

    +
  • +
  • +

    action: String 🔒

    +

    The notification action name.

    +
  • +
+

kdeconnect.notification.reply

+

This packet is a reply for a repliable notification.

+
{
+    "id": 0,
+    "type": "kdeconnect.notification.reply",
+    "body": {
+        "requestReplyId": "reply-id",
+        "message": "Reply text"
+    }
+}
+
+ +
    +
  • +

    message: String 🔒

    +

    The message to reply with.

    +
  • +
  • +

    requestReplyId: String 🔒

    +

    The reply ID of the notification.

    +
  • +
+

kdeconnect.notification.request

+

This packet is a request for notifications.

+
{
+    "id": 0,
+    "type": "kdeconnect.notification.request",
+    "body": {
+        "cancel": "notification-id"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.notification.request",
+    "body": {
+        "request": true
+    }
+}
+
+ +
    +
  • +

    cancel: String

    +

    If present, holds the ID of a notification that should be closed.

    +
  • +
  • +

    request: Boolean

    +

    Indicates this is a request for the notifications.

    +
  • +
+

Ping Plugin

+

The Ping plugin allows sending and receiving simple ‘pings’, with an optional message. Usually these are displayed as notifications.

+

References

+ +

Packets

+

kdeconnect.ping

+

This packet is a ping request.

+
{
+    "id": 0,
+    "type": "kdeconnect.ping",
+    "body": {
+        "message": "A message"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.ping",
+    "body": {}
+}
+
+ +
    +
  • +

    message: String

    +

    An optional message.

    +
  • +
+

Presenter Plugin

+

The Presenter plugin allows sending and receiving simple ‘pings’, with an optional message. Usually these are displayed as notifications.

+

References

+ +

Packets

+

kdeconnect.presenter

+

This packet is a presentation remote event.

+
{
+    "id": 0,
+    "type": "kdeconnect.presenter",
+    "body": {
+        "dx": 1.0,
+        "dy": 1.0
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.presenter",
+    "body": {
+        "stop": true
+    }
+}
+
+ +
    +
  • +

    dx: Number

    +

    A double precision integer indicating a position delta on the X-axis.

    +
  • +
  • +

    dy: Number

    +

    A double precision integer indicating a position delta on the Y-axis.

    +
  • +
  • +

    stop: Boolean

    +

    Stop controlling the virtual pointer.

    +
  • +
+

RunCommand Plugin

+

The RunCommand plugin allows defining and executing remote commands.

+

References

+ +

Packets

+

kdeconnect.runcommand

+

This packet is a list of available commands.

+
{
+    "id": 0,
+    "type": "kdeconnect.runcommand",
+    "body": {
+        "commandList": "{\"command-id1\": {\"name\": \"Command\",\"command\": \"/path/to/command1\"}}"
+    }
+}
+
+ +
    +
  • +

    commandList: String 🔒

    +

    A serialized dictionary of commands that the device offers. The key is sent in a kdeconnect.runcommand.request packet to execute its corresponding command. Each value has a name field and a command field.

    +
  • +
+

kdeconnect.runcommand.request

+

This packet is a runcommand status update.

+
{
+    "id": 0,
+    "type": "kdeconnect.runcommand.request",
+    "body": {
+        "key": "bea9fb3e-0c80-4d05-afdc-6a8f4156bc03"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.runcommand.request",
+    "body": {
+        "requestCommandList": true
+    }
+}
+
+ +
    +
  • +

    key: String

    +

    If the packet body contains this field it is a request to execute the command with the ID key.

    +
  • +
  • +

    requestCommandList: Boolean

    +

    If the packet body contains this field it is a request for the command list.

    +
  • +
+

SFTP Plugin

+

The SFTP plugin enables secure file sharing with SFTP.

+

References

+ +

Packets

+

kdeconnect.sftp

+

This packet contains SFTP login information.

+
{
+    "id": 0,
+    "type": "kdeconnect.sftp",
+    "body": {
+        "ip": "192.168.1.71",
+        "port": 1743,
+        "user": "kdeconnect",
+        "password": "UzcNCrI7T668JyxUFjOxQncBPNcO",
+        "path": "/storage/emulated/0",
+        "multiPaths": [
+            "/storage/0000-0000",
+            "/storage/0000-0000/DCIM/Camera",
+            "/storage/emulated/0",
+            "/storage/emulated/0/DCIM/Camera"
+        ],
+        "pathNames": [
+            "SD Card",
+            "Camera Pictures (SD Card)",
+            "All files",
+            "Camera pictures"
+        ]
+    }
+}
+
+ +
    +
  • +

    errorMessage: String

    +

    An error message.

    +
  • +
  • +

    ip: String 🔒

    +

    The host address.

    +
  • +
  • +

    port: Number 🔒

    +

    The host port.

    +
  • +
  • +

    user: String 🔒

    +

    The user. Currently always kdeconnect.

    +
  • +
  • +

    password: String 🔒

    +

    The one-time password. Deprecated; use private key authentication via the TLS certificate.

    +
  • +
  • +

    path: String 🔒

    +

    The base path of the remote server. This should generally only be used as a fallback if the multiPaths field is missing.

    +
  • +
  • +

    multiPaths: Array of String 🔒

    +

    An ordered list of paths for the remote server. Usually contains at least a ‘root’ directory and a path the the camera folder, but may contain additional paths to external storage devices.

    +
  • +
  • +

    pathNames: Array of String 🔒

    +

    An ordered list of names associated with the paths in multiPaths, in the same order.

    +
  • +
+

kdeconnect.sftp.request

+

This packet is a request to start SFTP.

+
{
+    "id": 0,
+    "type": "kdeconnect.sftp.request",
+    "body": {
+        "startBrowsing": true
+    }
+}
+
+ +
    +
  • +

    startBrowsing: Boolean 🔒

    +

    A request for the remote device to prepare for SFTP and respond with a kdeconnect.sftp packet.

    +
  • +
+

Share Plugin

+

The Share plugin allows sharing files, text content and URLs.

+

References

+ +

Packets

+

kdeconnect.share.request

+

This packet is an upload request.

+
{
+    "id": 0,
+    "type": "kdeconnect.share.request",
+    "body": {
+        "filename": "image.png"
+    },
+    "payloadSize": 882,
+    "payloadInfo": {
+        "port": 1739
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.share.request",
+    "body": {
+        "text": "Some text"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.share.request",
+    "body": {
+        "url": "https://kdeconnect.kde.org"
+    }
+}
+
+ +
    +
  • +

    filename: String

    +

    Name of the file being transferred. If the packet contains this field, it will be accompanied by payload transfer information.

    +
  • +
  • +

    creationTime: Number

    +

    Creation time of the file being transferred as a UNIX epoch timestamp (ms).

    +
  • +
  • +

    lastModified: Number

    +

    Modification time of the file being transferred as a UNIX epoch timestamp (ms).

    +
  • +
  • +

    open: Boolean

    +

    Whether a received file should be opened when the transfer completes.

    +
  • +
  • +

    numberOfFiles: Number

    +

    Number of files in a composite file transfer.

    +
  • +
  • +

    totalPayloadSize: Number

    +

    Total size in bytes of a composite file transfer.

    +
  • +
  • +

    text: String

    +

    Text content being shared. The receiving device decides how to present to text to the user.

    +
  • +
  • +

    url: String

    +

    URL being shared. The receiving device will typically open the URL with the default handler for the URI scheme.

    +
  • +
+

kdeconnect.share.request.update

+

This packet is the metadata for a multi-file transfer. By convention it is sent in advance of the packets containing the payload, which will include the same fields, potentially with updated totals.

+
{
+    "id": 0,
+    "type": "kdeconnect.share.request.update",
+    "body": {
+        "numberOfFiles": 1,
+        "totalPayloadSize": 4096
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.share.request.update",
+    "body": {
+        "numberOfFiles": 2,
+        "totalPayloadSize": 8192
+    }
+}
+
+ +
    +
  • +

    numberOfFiles: Number

    +

    Number of files in a multi-file transfer.

    +
  • +
  • +

    totalPayloadSize: Number

    +

    Total size in bytes of a multi-file transfer.

    +
  • +
+

SMS Plugin

+

The SMS plugin allows sending and receiving SMS/MMS messages.

+

References

+ +

Packets

+

kdeconnect.sms.attachment_file

+

This packet is a message attachment transfer.

+
{
+    "id": 0,
+    "type": "kdeconnect.sms.attachment_file",
+    "body": {
+        "filename": "image.png"
+    },
+    "payloadSize": 882,
+    "payloadTransferInfo": {
+        "port": 1739
+    }
+}
+
+ +
    +
  • +

    filename: String 🔒

    +

    The name of the file being transferred.

    +
  • +
+

kdeconnect.sms.messages

+

This packet is a list of messages.

+
{
+    "id": 0,
+    "type": "kdeconnect.sms.messages",
+    "body": {
+        "messages": [
+            {
+                "addresses": [
+                    {
+                        "address": "+1-234-567-8912"
+                    }
+                ],
+                "attachments": [
+                    {
+                        "part_id": 190,
+                        "mime_type": "image/jpeg",
+                        "encoded_thumbnail": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AkCAgMHUNVLwAAAAxFJREFUeNrtwYEAAAAAw6D5U1/hAFUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAbwK0AAH/2ARQAAAAAElFTkSuQmCC",
+                        "unique_identifier": "PART_1624666113891_image000000.jpg"
+                    }
+                ],
+                "body": "Thread 1, Message 2",
+                "date": 2,
+                "type": 2,
+                "read": 1,
+                "thread_id": 1,
+                "_id": 2,
+                "sub_id": 1,
+                "event": 1
+            },
+            {
+                "addresses": [
+                    {
+                        "address": "+1-234-567-8914"
+                    }
+                ],
+                "body": "Message one",
+                "date": 3,
+                "type": 2,
+                "read": 1,
+                "thread_id": 2,
+                "_id": 3,
+                "sub_id": 1,
+                "event": 1
+            }
+        ],
+        "version": 2
+    }
+}
+
+ +
    +
  • +

    messages: Array of Message 🔒

    +

    A list of messages.

    +
      +
    • +

      Message (Object)

      +

      A message object.

      +
        +
      • +

        _id: Number 🔒

        +

        The message ID.

        +
      • +
      • +

        addresses: Array of Address 🔒

        +

        A list of participating contacts. If the message is incoming, the first Address will be the sender. If the message is outgoing, every Address will be a recipient.

        +
          +
        • +

          Address (Object)

          +

          An object representing a phone number or other contact method.

          +
            +
          • +

            address: String

            +

            A free-form address string. Usually a phone number or e-mail address.

            +
          • +
          +
        • +
        +
      • +
      • +

        attachments: Array of Attachment

        +

        A list of message attachments.

        +
          +
        • +

          Attachment (Object)

          +

          A file attachment. Send the part_id and unique_identifier with a kdeconnect.sms.request_attachment packet to transfer the full file.

          +
            +
          • +

            part_id: Number 🔒

            +

            The ID of the attachment.

            +
          • +
          • +

            mime_type: String 🔒

            +

            The mime-type of the attachment.

            +
          • +
          • +

            encoded_thumbnail: String 🔒

            +

            A base64 encoded preview of the attachment.

            +
          • +
          • +

            unique_identifier: String 🔒

            +

            Unique name of the file.

            +
          • +
          +
        • +
        +
      • +
      • +

        body: String

        +

        The message body.

        +
      • +
      • +

        date: Number 🔒

        +

        A UNIX epoch timestamp (ms) for the message.

        +
      • +
      • +

        event: Number

        +

        The event type. 1 for ‘text’, 2 for ‘multi-target’.

        +
      • +
      • +

        read: Number

        +

        enum: 0|1

        +

        Whether the message is read or not.

        +
      • +
      • +

        sub_id: Number

        +

        range: Unrestricted

        +

        The SIM card or subscription ID.

        +
      • +
      • +

        thread_id: Number 🔒

        +

        range: Unrestricted

        +

        The thread ID.

        +
      • +
      • +

        type: Number 🔒

        +

        range: 0–6

        +

        The message status. Typically either 1 (inbox) or 2 (sent). See Android’s Telephony.TextBasedSmsColumns message type enumeration.

        +
      • +
      +
    • +
    +
  • +
  • +

    version: Number

    +

    enum: 2

    +

    The version of SMS protocol in use.

    +
  • +
+

kdeconnect.sms.request

+

This packet is a request to send an SMS/MMS message.

+
{
+    "id": 0,
+    "type": "kdeconnect.sms.request",
+    "body": {
+        "addresses": [
+            {
+                "address": "+1-234-567-8901"
+            }
+        ],
+        "attachments": [
+            {
+                "fileName": "image.jpeg",
+                "base64EncodeFile": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AkCAgMHUNVLwAAAAxFJREFUeNrtwYEAAAAAw6D5U1/hAFUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAbwK0AAH/2ARQAAAAAElFTkSuQmCC",
+                "mimeType": "image/jpeg"
+            }
+        ],
+        "messageBody": "Outgoing message",
+        "subID": 1,
+        "version": 2
+    }
+}
+
+ +
    +
  • +

    addresses: Array of Address 🔒

    +

    A list of target contacts.

    +
      +
    • +

      Address (Object)

      +

      An object representing a phone number or other contact method.

      +
        +
      • +

        address: String

        +

        A free-form address string. Usually a phone number or e-mail address.

        +
      • +
      +
    • +
    +
  • +
  • +

    attachments: Array of Outgoing Attachment

    +

    None

    +
      +
    • +

      Outgoing Attachment (Object)

      +

      None

      +
        +
      • +

        fileName: String

        +

        A file name.

        +
      • +
      • +

        base64EncodedFile: String

        +

        Base64 encoded data.

        +
      • +
      • +

        mimeType: String

        +

        A mime-type string.

        +
      • +
      +
    • +
    +
  • +
  • +

    messageBody: String 🔒

    +

    None

    +
  • +
  • +

    subID: Number

    +

    The SIM card or account to send with.

    +
  • +
  • +

    version: Number

    +

    enum: 2

    +

    The version of SMS protocol in use.

    +
  • +
+

kdeconnect.sms.request_attachment

+

This packet is a request for a message attachment.

+
{
+    "id": 0,
+    "type": "kdeconnect.sms.request_attachment",
+    "body": {
+        "part_id": 190,
+        "unique_identifier": "PART_1624666113891_image000000.jpg"
+    }
+}
+
+ +
    +
  • +

    part_id: Number 🔒

    +

    The ID of the attachment.

    +
  • +
  • +

    unique_identifier: String 🔒

    +

    Unique name of the file.

    +
  • +
+

kdeconnect.sms.request_conversation

+

This packet is a request for messages from a thread.

+
{
+    "id": 0,
+    "type": "kdeconnect.sms.request_conversation",
+    "body": {
+        "threadID": 42
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.sms.request_conversation",
+    "body": {
+        "threadID": 42,
+        "rangeStartTimestamp": 1643990699000,
+        "numberToRequest": 10
+    }
+}
+
+ +
    +
  • +

    threadID: Number 🔒

    +

    range: Unrestricted

    +

    The thread ID.

    +
  • +
  • +

    rangeStartTimestamp: Number

    +

    range: Unrestricted

    +

    UNIX epoch timestamp (ms) for the earliest message.

    +
  • +
  • +

    numberToRequest: Number

    +

    range: Unrestricted

    +

    The maximum number of messages to return.

    +
  • +
+

kdeconnect.sms.request_conversations

+

This packet is a request for the latest message in each thread.

+
{
+    "id": 0,
+    "type": "kdeconnect.sms.request_conversations",
+    "body": {}
+}
+
+ +

This packet has no body fields.

+

SystemVolume Plugin

+

The SystemVolume plugin allows sharing volume controls between devices.

+

References

+ +

Packets

+

kdeconnect.systemvolume

+

This packet is a mixer stream state update.

+
{
+    "id": 0,
+    "type": "kdeconnect.systemvolume",
+    "body": {
+        "sinkList": [
+            {
+                "name": "alsa_output.pci-0000_00_1b.0.analog-stereo",
+                "description": "Built-in Audio Analog Stereo",
+                "muted": false,
+                "volume": 32768,
+                "maxVolume": 65536,
+                "enabled": false
+            }
+        ]
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.systemvolume",
+    "body": {
+        "name": "alsa_output.pci-0000_00_1b.0.analog-stereo",
+        "volume": 49,
+        "muted": false,
+        "enabled": true
+    }
+}
+
+ +
    +
  • +

    sinkList: Array of Stream

    +

    The list of audio streams.

    +
      +
    • +

      Stream (Object)

      +

      An audio stream object

      +
        +
      • +

        name: String 🔒

        +

        The stream name.

        +
      • +
      • +

        description: String 🔒

        +

        The stream display name.

        +
      • +
      • +

        enabled: Boolean

        +

        Whether the stream is enabled.

        +
      • +
      • +

        muted: Boolean 🔒

        +

        Whether the stream is muted.

        +
      • +
      • +

        maxVolume: Number

        +

        The stream max volume level.

        +
      • +
      • +

        volume: Number 🔒

        +

        The stream volume level.

        +
      • +
      +
    • +
    +
  • +
  • +

    name: String

    +

    The stream name.

    +
  • +
  • +

    enabled: Boolean

    +

    Whether the stream is enabled.

    +
  • +
  • +

    muted: Boolean

    +

    Whether the stream is muted.

    +
  • +
  • +

    volume: Number

    +

    The stream volume level.

    +
  • +
+

kdeconnect.systemvolume.request

+

This packet is a audio stream request. It is used to request both the list of streams and changes to those streams.

+
{
+    "id": 0,
+    "type": "kdeconnect.systemvolume.request",
+    "body": {
+        "requestSinks": true
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.systemvolume.request",
+    "body": {
+        "name": "alsa_output.pci-0000_00_1b.0.analog-stereo",
+        "volume": 49,
+        "muted": false,
+        "enabled": true
+    }
+}
+
+ +
    +
  • +

    requestSinks: Boolean

    +

    Indicates this is a request for the stream list.

    +
  • +
  • +

    name: String

    +

    The name of a stream. If the packet contains this field, it is a request to adjust a stream.

    +
  • +
  • +

    enabled: Boolean

    +

    Indicates the stream should become the active default. Always true if present.

    +
  • +
  • +

    muted: Boolean

    +

    The requested mute state.

    +
  • +
  • +

    volume: Number

    +

    range: Unrestricted

    +

    The requested volume. The maximum value is provided by the maxVolume field of the stream.

    +
  • +
+

Telephony Plugin

+

The Telephony plugin allows notification of events such as incoming or missed calls.

+

References

+ +

Packets

+

kdeconnect.telephony

+

This packet is a telephony event, such as the phone ringing.

+
{
+    "id": 0,
+    "type": "kdeconnect.telephony",
+    "body": {
+        "event": "talking",
+        "contactName": "John Smith",
+        "messageBody": "A text message",
+        "phoneNumber": "555-555-5555",
+        "phoneThumbnail": "<base64 encoded JPEG>"
+    }
+}
+
+ +
{
+    "id": 0,
+    "type": "kdeconnect.telephony",
+    "body": {
+        "event": "talking",
+        "contactName": "John Smith",
+        "phoneNumber": "555-555-5555",
+        "isCancel": true
+    }
+}
+
+ +
    +
  • +

    event: String 🔒

    +

    enum: 'missedCall'|'ringing'|'talking'|'sms'

    +

    None

    +
  • +
  • +

    contactName: String

    +

    The contact name associated with the event.

    +
  • +
  • +

    messageBody: String

    +

    The message text associated with the event.

    +
  • +
  • +

    phoneNumber: String 🔒

    +

    The phone number associated with the event.

    +
  • +
  • +

    phoneThumbnail: String

    +

    base64 encoded JPEG.

    +
  • +
  • +

    isCancel: Boolean

    +

    If event has stopped.

    +
  • +
+

kdeconnect.telephony.request_mute

+

This packet is sent to request the ringer be muted.

+
{
+    "id": 0,
+    "type": "kdeconnect.telephony.request_mute",
+    "body": {}
+}
+
+ +

This packet has no body fields.

+

Appendix

+

Data Types

+

These are the basic data types in the KDE Connect protocol, as described by the +JSON Schema specification. Note that the integer type defined in some versions +of JSON Schema is never used.

+

Boolean

+

A logical data type that can have only the values true or false.

+

Number

+

A numeric data type in the double-precision 64-bit floating point format +(IEEE 754).

+

String

+

A null-terminated sequence of UTF-8 encoded bytes.

+

Array

+

An ordered collection of values.

+

Object

+

A mapping collection of string keys to values.

+

Symbols

+
    +
  • +

    ⚠️ Deprecated

    +

    Clients are free to ignore these packets and fields, and encouraged to stop +using them when possible.

    +
  • +
  • +

    🔒 Required

    +

    Packets missing these fields may be ignored or result in undefined behaviour.

    +
  • +
+

References

+ +
+
+
+ + + +
+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/documentation/search.js b/documentation/search.js new file mode 100644 index 00000000000..29c204f9d0d --- /dev/null +++ b/documentation/search.js @@ -0,0 +1,417 @@ +// SPDX-FileCopyrightText: 2021 GNOME Foundation +// +// SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later + +(function() { + +const QUERY_TYPES = [ + "alias", + "bitfield", + "callback", + "class", + "constant", + "content", + "ctor", + "domain", + "enum", + "function_macro", + "function", + "interface", + "method", + "property", + "record", + "signal", + "type_func", + "union", + "vfunc", +]; +const QUERY_PATTERN = new RegExp("^(" + QUERY_TYPES.join('|') + ")\\s*:\\s*", 'i'); + +const TYPE_NAMES = { + "alias": "alias", + "bitfield": "flags", + "callback": "callback", + "class": "class", + "constant": "constant", + "content": "content", + "ctor": "constructor", + "domain": "error", + "enum": "enum", + "function_macro": "macro", + "function": "function", + "interface": "interface", + "method": "method", + "property": "property", + "record": "struct", + "signal": "signal", + "type_func": "function", + "union": "union", + "vfunc": "vfunc", +}; + +const TYPE_CLASSES = { + "alias": "alias", + "bitfield": "flags", + "callback": "callback", + "class": "class", + "constant": "constant", + "content": "extra_content", + "ctor": "ctor", + "domain": "domain", + "enum": "enum", + "function_macro": "function_macro", + "function": "function", + "interface": "interface", + "method": "method", + "property": "property", + "record": "record", + "signal": "signal", + "type_func": "type_func", + "union": "union", + "vfunc": "vfunc", +}; + +const fzy = window.fzy; +const searchParams = getSearchParams(); +const refs = { + input: null, + form: null, + search: null, + main: null, + toc: null, +}; + +let searchIndex = undefined; +let searchResults = []; + +// Exports +window.onInitSearch = onInitSearch; + +/* Event handlers */ + +function onInitSearch() { + fetchJSON('index.json', onDidLoadSearchIndex); +} + +function onDidLoadSearchIndex(data) { + searchIndex = new SearchIndex(data) + + refs.input = document.querySelector("#search-input"); + refs.form = document.querySelector("#search-form"); + refs.search = document.querySelector("#search"); + refs.main = document.querySelector("#main"); + refs.toc = document.querySelector("#toc"); + + attachInputHandlers(); + + if (searchParams.q) { + search(searchParams.q); + } +} + +function getNakedUrl() { + return window.location.href.split("?")[0].split("#")[0]; +} + +function onDidSearch() { + const query = refs.input.value; + if (query) { + search(query); + } + else { + hideSearchResults(); + } +} + +function onDidSubmit(ev) { + ev.preventDefault(); + if (searchResults.length == 1) { + window.location.href = searchResults[0].href; + } +} + +function attachInputHandlers() { + if (refs.input.value === "") { + refs.input.value === searchParams.q || ""; + } + + refs.input.addEventListener('keyup', debounce(500, onDidSearch)) + refs.form.addEventListener('submit', onDidSubmit) +} + +/* Searching */ + +function searchQuery(query) { + const q = matchQuery(query); + const docs = searchIndex.searchDocs(q.term, q.type); + + const results = docs.map(function(doc) { + return { + name: doc.name, + type: doc.type, + text: getLabelForDocument(doc, searchIndex.meta), + href: getLinkForDocument(doc), + summary: doc.summary, + deprecated: doc.deprecated, + }; + }); + + return results; +} + +function search(query) { + searchResults = searchQuery(query) + showResults(query, searchResults); +} + +/* Rendering */ + +function showSearchResults() { + addClass(refs.main, "hidden"); + if (refs.toc) { + addClass(refs.toc, "hidden"); + } + removeClass(refs.search, "hidden"); +} + +function hideSearchResults() { + addClass(refs.search, "hidden"); + removeClass(refs.main, "hidden"); + if (refs.toc) { + removeClass(refs.toc, "hidden"); + } +} + +function renderResults(query, results) { + let html = ""; + + html += "

Results for "" + query + "" (" + results.length + ")

" + + "
" + + if (results.length === 0) { + html += "No results found."; + } + else { + html += "
"; + results.forEach(function(item) { + html += "
" + + "" + item.text + "" + + " " + TYPE_NAMES[item.type] + ""; + if (item.deprecated) { + html += " deprecated: " + item.deprecated + ""; + } + html += "
" + + "
" + item.summary + "
"; + }); + html += "
"; + } + + html += "
"; + + return html; +} + +function showResults(query, results) { + if (window.history && typeof window.history.pushState === "function") { + let baseUrl = getNakedUrl(); + let extra = "?q=" + encodeURIComponent(refs.input.value); + window.history.replaceState(refs.input.value, "", baseUrl + extra + window.location.hash); + } + + window.title = "Results for: " + query; + window.scroll({ top: 0 }) + refs.search.innerHTML = renderResults(query, results); + showSearchResults(search); +} + + +/* Search data instance */ + +function SearchIndex(searchIndex) { + this.symbols = searchIndex.symbols; + this.meta = searchIndex.meta; +} +SearchIndex.prototype.searchDocs = function searchDocs(term, type) { + const filteredSymbols = !type ? + this.symbols : + this.symbols.filter(s => s.type === type); + const results = fzy.filter(term, filteredSymbols, doc => getTextForDocument(doc, this.meta)) + return results.map(i => i.item) +} + + +/* Search metadata selectors */ + +function getLinkForDocument(doc) { + switch (doc.type) { + case "alias": return "alias." + doc.name + ".html"; + case "bitfield": return "flags." + doc.name + ".html"; + case "callback": return "callback." + doc.name + ".html"; + case "class": return "class." + doc.name + ".html"; + case "class_method": return "class_method." + doc.struct_for + "." + doc.name + ".html"; + case "constant": return "const." + doc.name + ".html"; + case "content": return doc.href; + case "ctor": return "ctor." + doc.type_name + "." + doc.name + ".html"; + case "domain": return "error." + doc.name + ".html"; + case "enum": return "enum." + doc.name + ".html"; + case "function": return "func." + doc.name + ".html"; + case "function_macro": return "func." + doc.name + ".html"; + case "interface": return "iface." + doc.name + ".html"; + case "method": return "method." + doc.type_name + "." + doc.name + ".html"; + case "property": return "property." + doc.type_name + "." + doc.name + ".html"; + case "record": return "struct." + doc.name + ".html"; + case "signal": return "signal." + doc.type_name + "." + doc.name + ".html"; + case "type_func": return "type_func." + doc.type_name + "." + doc.name + ".html"; + case "union": return "union." + doc.name + ".html"; + case "vfunc": return "vfunc." + doc.type_name + "." + doc.name + ".html"; + } + return null; +} + +function getLabelForDocument(doc, meta) { + switch (doc.type) { + case "alias": + case "bitfield": + case "callback": + case "class": + case "domain": + case "enum": + case "interface": + case "record": + case "union": + return "" + doc.ctype + ""; + + case "class_method": + case "constant": + case "ctor": + case "function": + case "function_macro": + case "method": + case "type_func": + return "" + doc.ident + ""; + + // NOTE: meta.ns added for more consistent results, otherwise + // searching for "Button" would return all signals, properties + // and vfuncs (eg "Button.clicked") before the actual object + // (eg "GtkButton") because "Button" matches higher with starting + // sequences. + case "property": + return "" + meta.ns + doc.type_name + ":" + doc.name + ""; + case "signal": + return "" + meta.ns + doc.type_name + "::" + doc.name + ""; + case "vfunc": + return "" + meta.ns + doc.type_name + "." + doc.name + ""; + + case "content": + return doc.name; + } + + return null; +} + +function getTextForDocument(doc, meta) { + switch (doc.type) { + case "alias": + case "bitfield": + case "callback": + case "class": + case "domain": + case "enum": + case "interface": + case "record": + case "union": + return doc.ctype; + + case "class_method": + case "constant": + case "ctor": + case "function": + case "function_macro": + case "method": + case "type_func": + return doc.ident; + + // NOTE: meta.ns added for more consistent results, otherwise + // searching for "Button" would return all signals, properties + // and vfuncs (eg "Button.clicked") before the actual object + // (eg "GtkButton") because "Button" matches higher with starting + // sequences. + case "property": + return meta.ns + doc.type_name + ":" + doc.name; + case "signal": + return meta.ns + doc.type_name + "::" + doc.name; + case "vfunc": + return meta.ns + doc.type_name + "." + doc.name; + + case "content": + return doc.name; + } + + return null; +} + + +// Helpers + +function fetchJSON(url, callback) { + const request = new XMLHttpRequest(); + request.open('GET', url, true); + request.onreadystatechange = function() { + if (request.readyState === XMLHttpRequest.DONE) { + const status = request.status; + + if (status === 0 || (status >= 200 && status < 400)) { + callback(JSON.parse(request.responseText)); + } + } + } + request.send(null); +} + +function getSearchParams() { + const params = {}; + window.location.search.substring(1).split('&') + .map(function(s) { + const pair = s.split('='); + params[decodeURIComponent(pair[0])] = + typeof pair[1] === 'undefined' ? null : decodeURIComponent(pair[1].replace(/\+/g, '%20')); + }); + return params; +} + +function matchQuery(input) { + let type = null + let term = input + + const matches = term.match(QUERY_PATTERN); + if (matches) { + type = matches[1]; + term = term.substring(matches[0].length); + } + + // Remove all spaces, fzy will handle things gracefully. + term = term.replace(/\s+/g, '') + + return { type: type, term: term } +} + +function debounce(delay, fn) { + let timeout; + let savedArgs + + return function() { + const self = this; + savedArgs = Array.prototype.slice.call(arguments); + + if (timeout) { + clearTimeout(timeout); + } + + timeout = setTimeout(function() { + fn.apply(self, savedArgs) + timeout = undefined + }, delay) + } +} + +})() diff --git a/documentation/signal.ChannelService.channel.html b/documentation/signal.ChannelService.channel.html new file mode 100644 index 00000000000..7339b4d2a8d --- /dev/null +++ b/documentation/signal.ChannelService.channel.html @@ -0,0 +1,213 @@ + + + + + + Valent.ChannelService::channel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentChannelService::channel

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+channel (
+  ValentChannelService* self,
+  ValentChannel* channel,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when a new channel has been negotiated.

+

In practice, when this is emitted a ValentDeviceManager will +ensure a ValentDevice exists to take ownership of channel.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called after the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
channel
+
+

Type: ValentChannel

+

A ValentChannel

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.Clipboard.changed.html b/documentation/signal.Clipboard.changed.html new file mode 100644 index 00000000000..9b14666d2ec --- /dev/null +++ b/documentation/signal.Clipboard.changed.html @@ -0,0 +1,178 @@ + + + + + + Valent.Clipboard::changed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentClipboard::changed

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+changed (
+  ValentClipboard* self,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when the content of the primary ValentClipboardAdapter changes.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called before the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.ClipboardAdapter.changed.html b/documentation/signal.ClipboardAdapter.changed.html new file mode 100644 index 00000000000..7ce8edc51be --- /dev/null +++ b/documentation/signal.ClipboardAdapter.changed.html @@ -0,0 +1,180 @@ + + + + + + Valent.ClipboardAdapter::changed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentClipboardAdapter::changed

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+changed (
+  ValentClipboardAdapter* self,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when the content of adapter changes.

+

The default handler for this signal updates the value returned by the +default implementation of Valent.ClipboardAdapterClass.get_timestamp.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called before the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.ContactStore.contact-added.html b/documentation/signal.ContactStore.contact-added.html new file mode 100644 index 00000000000..f9cbfa1db10 --- /dev/null +++ b/documentation/signal.ContactStore.contact-added.html @@ -0,0 +1,213 @@ + + + + + + Valent.ContactStore::contact-added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentContactStore::contact-added

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+contact_added (
+  ValentContactStore* self,
+  EContact* contact,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when an EContact is added to store.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called after the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
contact
+
+

Type: EContact

+

A EContact

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.ContactStore.contact-removed.html b/documentation/signal.ContactStore.contact-removed.html new file mode 100644 index 00000000000..c0e13feef42 --- /dev/null +++ b/documentation/signal.ContactStore.contact-removed.html @@ -0,0 +1,213 @@ + + + + + + Valent.ContactStore::contact-removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentContactStore::contact-removed

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+contact_removed (
+  ValentContactStore* self,
+  gchar* uid,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when an EContact is removed from store.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called after the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: gchar*

+

The UID of the removed contact.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.Notifications.notification-added.html b/documentation/signal.Notifications.notification-added.html new file mode 100644 index 00000000000..b110a1a9900 --- /dev/null +++ b/documentation/signal.Notifications.notification-added.html @@ -0,0 +1,214 @@ + + + + + + Valent.Notifications::notification-added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentNotifications::notification-added

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+notification_added (
+  ValentNotifications* self,
+  ValentNotification* notification,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when a notification is added to a +ValentNotificationsAdapter.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called before the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.Notifications.notification-removed.html b/documentation/signal.Notifications.notification-removed.html new file mode 100644 index 00000000000..3e26c830025 --- /dev/null +++ b/documentation/signal.Notifications.notification-removed.html @@ -0,0 +1,214 @@ + + + + + + Valent.Notifications::notification-removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentNotifications::notification-removed

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+notification_removed (
+  ValentNotifications* self,
+  gchar* id,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when a notification is removed from a +ValentNotificationsAdapter.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called before the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: gchar*

+

A notification id.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.NotificationsAdapter.notification-added.html b/documentation/signal.NotificationsAdapter.notification-added.html new file mode 100644 index 00000000000..90cffa63a25 --- /dev/null +++ b/documentation/signal.NotificationsAdapter.notification-added.html @@ -0,0 +1,215 @@ + + + + + + Valent.NotificationsAdapter::notification-added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentNotificationsAdapter::notification-added

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+notification_added (
+  ValentNotificationsAdapter* self,
+  ValentNotification* notification,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when a ValentNotification is added to adapter.

+

Implementations must chain up if they override +Valent.NotificationsAdapterClass.notification_added.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called after the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.NotificationsAdapter.notification-removed.html b/documentation/signal.NotificationsAdapter.notification-removed.html new file mode 100644 index 00000000000..267bd90d7d4 --- /dev/null +++ b/documentation/signal.NotificationsAdapter.notification-removed.html @@ -0,0 +1,215 @@ + + + + + + Valent.NotificationsAdapter::notification-removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentNotificationsAdapter::notification-removed

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+notification_removed (
+  ValentNotificationsAdapter* self,
+  gchar* notification,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when a ValentNotification is removed from adapter.

+

Implementations must chain up if they override +Valent.NotificationsAdapterClass.notification_removed.

+
+ +
+ + + + + + + + + + + +
Default handler:

The default handler is called after the handlers added via g_signal_connect().

Available since: 1.0
+
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: gchar*

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/signal.Object.destroy.html b/documentation/signal.Object.destroy.html new file mode 100644 index 00000000000..0c8825fe18b --- /dev/null +++ b/documentation/signal.Object.destroy.html @@ -0,0 +1,188 @@ + + + + + + Valent.Object::destroy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Signal

+

ValentObject::destroy

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + +

+ +
+
void
+destroy (
+  ValentObject* self,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emitted when the object is being destroyed.

+

This signal is emitted when the object enters disposal and always on the +main thread, with the object lock acquired. Note that you must still drop +any references you hold to avoid leaking memory.

+

Implementations must override Valent.ObjectClass.destroy instead of +GObject.ObjectClass.dispose to ensure the instance is finalized on the +main thread.

+
+ +
+ + + + + + + + + + + + + + + +
Default handler:

The default handler is called after the handlers added via g_signal_connect_after().

Signal emission will restart instead of recursing
Hooks are disabled for this signal
Available since: 1.0
+
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/solarized-dark.css b/documentation/solarized-dark.css new file mode 100644 index 00000000000..2edc59b8846 --- /dev/null +++ b/documentation/solarized-dark.css @@ -0,0 +1,88 @@ +/* + * SPDX-FileCopyrightText: 2014 John Louis Del Rosario, Hank Gay, John Mastro, Brandon Bennett + * SPDX-License-Identifier: MIT + */ + +pre { line-height: 125%; } +td.linenos pre { color: #586e75; background-color: #073642; padding-left: 5px; padding-right: 5px; } +span.linenos { color: #586e75; background-color: #073642; padding-left: 5px; padding-right: 5px; } +td.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.codehilite .hll { background-color: #073642 } +.codehilite { background: #002b36; color: #839496 } +.codehilite .c { color: #586e75; font-style: italic } /* Comment */ +.codehilite .err { color: #839496; background-color: #dc322f } /* Error */ +.codehilite .esc { color: #839496 } /* Escape */ +.codehilite .g { color: #839496 } /* Generic */ +.codehilite .k { color: #859900 } /* Keyword */ +.codehilite .l { color: #839496 } /* Literal */ +.codehilite .n { color: #839496 } /* Name */ +.codehilite .o { color: #586e75 } /* Operator */ +.codehilite .x { color: #839496 } /* Other */ +.codehilite .p { color: #839496 } /* Punctuation */ +.codehilite .ch { color: #586e75; font-style: italic } /* Comment.Hashbang */ +.codehilite .cm { color: #586e75; font-style: italic } /* Comment.Multiline */ +.codehilite .cp { color: #d33682 } /* Comment.Preproc */ +.codehilite .cpf { color: #586e75 } /* Comment.PreprocFile */ +.codehilite .c1 { color: #586e75; font-style: italic } /* Comment.Single */ +.codehilite .cs { color: #586e75; font-style: italic } /* Comment.Special */ +.codehilite .gd { color: #dc322f } /* Generic.Deleted */ +.codehilite .ge { color: #839496; font-style: italic } /* Generic.Emph */ +.codehilite .gr { color: #dc322f } /* Generic.Error */ +.codehilite .gh { color: #839496; font-weight: bold } /* Generic.Heading */ +.codehilite .gi { color: #859900 } /* Generic.Inserted */ +.codehilite .go { color: #839496 } /* Generic.Output */ +.codehilite .gp { color: #839496 } /* Generic.Prompt */ +.codehilite .gs { color: #839496; font-weight: bold } /* Generic.Strong */ +.codehilite .gu { color: #839496; text-decoration: underline } /* Generic.Subheading */ +.codehilite .gt { color: #268bd2 } /* Generic.Traceback */ +.codehilite .kc { color: #2aa198 } /* Keyword.Constant */ +.codehilite .kd { color: #2aa198 } /* Keyword.Declaration */ +.codehilite .kn { color: #cb4b16 } /* Keyword.Namespace */ +.codehilite .kp { color: #859900 } /* Keyword.Pseudo */ +.codehilite .kr { color: #859900 } /* Keyword.Reserved */ +.codehilite .kt { color: #b58900 } /* Keyword.Type */ +.codehilite .ld { color: #839496 } /* Literal.Date */ +.codehilite .m { color: #2aa198 } /* Literal.Number */ +.codehilite .s { color: #2aa198 } /* Literal.String */ +.codehilite .na { color: #839496 } /* Name.Attribute */ +.codehilite .nb { color: #268bd2 } /* Name.Builtin */ +.codehilite .nc { color: #268bd2 } /* Name.Class */ +.codehilite .no { color: #268bd2 } /* Name.Constant */ +.codehilite .nd { color: #268bd2 } /* Name.Decorator */ +.codehilite .ni { color: #268bd2 } /* Name.Entity */ +.codehilite .ne { color: #268bd2 } /* Name.Exception */ +.codehilite .nf { color: #268bd2 } /* Name.Function */ +.codehilite .nl { color: #268bd2 } /* Name.Label */ +.codehilite .nn { color: #268bd2 } /* Name.Namespace */ +.codehilite .nx { color: #839496 } /* Name.Other */ +.codehilite .py { color: #839496 } /* Name.Property */ +.codehilite .nt { color: #268bd2 } /* Name.Tag */ +.codehilite .nv { color: #268bd2 } /* Name.Variable */ +.codehilite .ow { color: #859900 } /* Operator.Word */ +.codehilite .w { color: #839496 } /* Text.Whitespace */ +.codehilite .mb { color: #2aa198 } /* Literal.Number.Bin */ +.codehilite .mf { color: #2aa198 } /* Literal.Number.Float */ +.codehilite .mh { color: #2aa198 } /* Literal.Number.Hex */ +.codehilite .mi { color: #2aa198 } /* Literal.Number.Integer */ +.codehilite .mo { color: #2aa198 } /* Literal.Number.Oct */ +.codehilite .sa { color: #2aa198 } /* Literal.String.Affix */ +.codehilite .sb { color: #2aa198 } /* Literal.String.Backtick */ +.codehilite .sc { color: #2aa198 } /* Literal.String.Char */ +.codehilite .dl { color: #2aa198 } /* Literal.String.Delimiter */ +.codehilite .sd { color: #586e75 } /* Literal.String.Doc */ +.codehilite .s2 { color: #2aa198 } /* Literal.String.Double */ +.codehilite .se { color: #2aa198 } /* Literal.String.Escape */ +.codehilite .sh { color: #2aa198 } /* Literal.String.Heredoc */ +.codehilite .si { color: #2aa198 } /* Literal.String.Interpol */ +.codehilite .sx { color: #2aa198 } /* Literal.String.Other */ +.codehilite .sr { color: #cb4b16 } /* Literal.String.Regex */ +.codehilite .s1 { color: #2aa198 } /* Literal.String.Single */ +.codehilite .ss { color: #2aa198 } /* Literal.String.Symbol */ +.codehilite .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ +.codehilite .fm { color: #268bd2 } /* Name.Function.Magic */ +.codehilite .vc { color: #268bd2 } /* Name.Variable.Class */ +.codehilite .vg { color: #268bd2 } /* Name.Variable.Global */ +.codehilite .vi { color: #268bd2 } /* Name.Variable.Instance */ +.codehilite .vm { color: #268bd2 } /* Name.Variable.Magic */ +.codehilite .il { color: #2aa198 } /* Literal.Number.Integer.Long */ diff --git a/documentation/solarized-light.css b/documentation/solarized-light.css new file mode 100644 index 00000000000..f1fa80f7370 --- /dev/null +++ b/documentation/solarized-light.css @@ -0,0 +1,88 @@ +/* + * SPDX-FileCopyrightText: 2014 John Louis Del Rosario, Hank Gay, John Mastro, Brandon Bennett + * SPDX-License-Identifier: MIT + */ + +pre { line-height: 125%; } +td.linenos pre { color: #93a1a1; background-color: #eee8d5; padding-left: 5px; padding-right: 5px; } +span.linenos { color: #93a1a1; background-color: #eee8d5; padding-left: 5px; padding-right: 5px; } +td.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.codehilite .hll { background-color: #eee8d5 } +.codehilite { background: #fdf6e3; color: #657b83 } +.codehilite .c { color: #93a1a1; font-style: italic } /* Comment */ +.codehilite .err { color: #657b83; background-color: #dc322f } /* Error */ +.codehilite .esc { color: #657b83 } /* Escape */ +.codehilite .g { color: #657b83 } /* Generic */ +.codehilite .k { color: #859900 } /* Keyword */ +.codehilite .l { color: #657b83 } /* Literal */ +.codehilite .n { color: #657b83 } /* Name */ +.codehilite .o { color: #93a1a1 } /* Operator */ +.codehilite .x { color: #657b83 } /* Other */ +.codehilite .p { color: #657b83 } /* Punctuation */ +.codehilite .ch { color: #93a1a1; font-style: italic } /* Comment.Hashbang */ +.codehilite .cm { color: #93a1a1; font-style: italic } /* Comment.Multiline */ +.codehilite .cp { color: #d33682 } /* Comment.Preproc */ +.codehilite .cpf { color: #93a1a1 } /* Comment.PreprocFile */ +.codehilite .c1 { color: #93a1a1; font-style: italic } /* Comment.Single */ +.codehilite .cs { color: #93a1a1; font-style: italic } /* Comment.Special */ +.codehilite .gd { color: #dc322f } /* Generic.Deleted */ +.codehilite .ge { color: #657b83; font-style: italic } /* Generic.Emph */ +.codehilite .gr { color: #dc322f } /* Generic.Error */ +.codehilite .gh { color: #657b83; font-weight: bold } /* Generic.Heading */ +.codehilite .gi { color: #859900 } /* Generic.Inserted */ +.codehilite .go { color: #657b83 } /* Generic.Output */ +.codehilite .gp { color: #657b83 } /* Generic.Prompt */ +.codehilite .gs { color: #657b83; font-weight: bold } /* Generic.Strong */ +.codehilite .gu { color: #657b83; text-decoration: underline } /* Generic.Subheading */ +.codehilite .gt { color: #268bd2 } /* Generic.Traceback */ +.codehilite .kc { color: #2aa198 } /* Keyword.Constant */ +.codehilite .kd { color: #2aa198 } /* Keyword.Declaration */ +.codehilite .kn { color: #cb4b16 } /* Keyword.Namespace */ +.codehilite .kp { color: #859900 } /* Keyword.Pseudo */ +.codehilite .kr { color: #859900 } /* Keyword.Reserved */ +.codehilite .kt { color: #b58900 } /* Keyword.Type */ +.codehilite .ld { color: #657b83 } /* Literal.Date */ +.codehilite .m { color: #2aa198 } /* Literal.Number */ +.codehilite .s { color: #2aa198 } /* Literal.String */ +.codehilite .na { color: #657b83 } /* Name.Attribute */ +.codehilite .nb { color: #268bd2 } /* Name.Builtin */ +.codehilite .nc { color: #268bd2 } /* Name.Class */ +.codehilite .no { color: #268bd2 } /* Name.Constant */ +.codehilite .nd { color: #268bd2 } /* Name.Decorator */ +.codehilite .ni { color: #268bd2 } /* Name.Entity */ +.codehilite .ne { color: #268bd2 } /* Name.Exception */ +.codehilite .nf { color: #268bd2 } /* Name.Function */ +.codehilite .nl { color: #268bd2 } /* Name.Label */ +.codehilite .nn { color: #268bd2 } /* Name.Namespace */ +.codehilite .nx { color: #657b83 } /* Name.Other */ +.codehilite .py { color: #657b83 } /* Name.Property */ +.codehilite .nt { color: #268bd2 } /* Name.Tag */ +.codehilite .nv { color: #268bd2 } /* Name.Variable */ +.codehilite .ow { color: #859900 } /* Operator.Word */ +.codehilite .w { color: #657b83 } /* Text.Whitespace */ +.codehilite .mb { color: #2aa198 } /* Literal.Number.Bin */ +.codehilite .mf { color: #2aa198 } /* Literal.Number.Float */ +.codehilite .mh { color: #2aa198 } /* Literal.Number.Hex */ +.codehilite .mi { color: #2aa198 } /* Literal.Number.Integer */ +.codehilite .mo { color: #2aa198 } /* Literal.Number.Oct */ +.codehilite .sa { color: #2aa198 } /* Literal.String.Affix */ +.codehilite .sb { color: #2aa198 } /* Literal.String.Backtick */ +.codehilite .sc { color: #2aa198 } /* Literal.String.Char */ +.codehilite .dl { color: #2aa198 } /* Literal.String.Delimiter */ +.codehilite .sd { color: #93a1a1 } /* Literal.String.Doc */ +.codehilite .s2 { color: #2aa198 } /* Literal.String.Double */ +.codehilite .se { color: #2aa198 } /* Literal.String.Escape */ +.codehilite .sh { color: #2aa198 } /* Literal.String.Heredoc */ +.codehilite .si { color: #2aa198 } /* Literal.String.Interpol */ +.codehilite .sx { color: #2aa198 } /* Literal.String.Other */ +.codehilite .sr { color: #cb4b16 } /* Literal.String.Regex */ +.codehilite .s1 { color: #2aa198 } /* Literal.String.Single */ +.codehilite .ss { color: #2aa198 } /* Literal.String.Symbol */ +.codehilite .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ +.codehilite .fm { color: #268bd2 } /* Name.Function.Magic */ +.codehilite .vc { color: #268bd2 } /* Name.Variable.Class */ +.codehilite .vg { color: #268bd2 } /* Name.Variable.Global */ +.codehilite .vi { color: #268bd2 } /* Name.Variable.Instance */ +.codehilite .vm { color: #268bd2 } /* Name.Variable.Magic */ +.codehilite .il { color: #2aa198 } /* Literal.Number.Integer.Long */ diff --git a/documentation/style.css b/documentation/style.css new file mode 100644 index 00000000000..5d3ff742bfc --- /dev/null +++ b/documentation/style.css @@ -0,0 +1,1042 @@ +/* + * SPDX-FileCopyrightText: 2021 GNOME Foundation + * + * SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later + */ + +@import url("solarized-light.css") (prefers-color-scheme: light); +@import url("solarized-dark.css") (prefers-color-scheme: dark); + +@import url("fonts.css"); + +/********************************* + * LIGHT THEME + *********************************/ +:root { + + /* colors */ + --text-color: rgb(51, 51, 51); + --text-color-muted: rgba(51, 51, 51, 0.65); + --primary: rgb(28, 118, 228); + --body-bg: #fff; + --sidebar-primary: rgb(144, 194, 255); + --sidebar-bg: #151515; + --sidebar-selected-bg: var(--primary); + --sidebar-hover-bg: rgba(127, 127, 127, 0.2); + --sidebar-text-color: #fafafa; + --sidebar-search-bg: rgba(127, 127, 127, 0.25); + --sidebar-search-focus-bg: rgba(127, 127, 127, 0.3); + --sidebar-padding: 1.5em; + --warning-bg-color: #e5a50a; + --warning-fg-color: rgba(0, 0, 0, 0.8); + --error-bg-color: #e01b24; + --error-fg-color: #ffffff; + --accent-bg-color: #3584e4; + --accent-fg-color: #ffffff; + + /* boxes, e.g. code blocks */ + --box-bg: rgba(135, 135, 135, 0.085); + --box-radius: 0.35rem; + --box-padding: 0.75rem; + --box-margin: 0.75rem 0; + --box-text-color: #111; + + /* typography */ + --body-font-family: "Red Hat Text",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + --body-font-scale: 0.95; + --body-font-size: calc(var(--body-font-scale) * clamp(16px, 1vw, 18px)); + --body-font-weight: normal; + + --monospace-font-family: "Source Code Pro", monospace; + --monospace-font-size: calc(0.86 * var(--body-font-size)); /* Monospace fonts are very different in terms of font-sizes. Adjust this value to scale it */ + + --heading-font-family: "Red Hat Display", var(--body-font-family); + --heading-weight: 900; + --heading-font-scale: 1.05; + + --heading-small-font-family: var(--heading-font-family); + --heading-small-weight: 600; + --heading-small-font-scale: 1; + + --heading-table-font-family: var(--heading-font-family); + --heading-table-weight: 600; + + --heading-docblock-color: #6d6d6d; /* docblocks have headings from source comments. we want them to differ.*/ + --heading-docblock-scale: 0.9; /* docblocks have headings from source comments. we want them to differ.*/ + + --symbol-font-family: var(--heading-font-family); + --symbol-font-weight: 500; + --symbol-font-scale: 1; + + --table-font-size: 0.92em; /* Tables often contain lots information. It's better to scale them down a big to get more sutff fitted inside */ + + --admonition-color-bg: transparent; + --admonition-font-size: 0.9rem; + --admonition-color-title--note: #00b0ff; + --admonition-color-title-bg--note: rgba(0, 176, 255, 0.1); + --admonition-color-title--important: #00bfa5; + --admonition-color-title-bg--important: rgba(0, 191, 165, 0.1); + --admonition-color-title--tip: #00c852; + --admonition-color-title-bg--tip: rgba(0, 200, 82, 0.1); + --admonition-color-title--warning: #ff9100; + --admonition-color-title-bg--warning: rgba(255, 145, 0, 0.1); + + --admonition-icon--note: url('data:image/svg+xml;charset=utf-8,'); + --admonition-icon--important: url('data:image/svg+xml;charset=utf-8,'); + --admonition-icon--tip: url('data:image/svg+xml;charset=utf-8,'); + --admonition-icon--warning: url('data:image/svg+xml;charset=utf-8,'); + + /* misc */ + --preferred-content-width: 90ch; /* The preferred width for the readable content */ + --anchor-sign: "#"; + +} + +/********************************* + * DARK THEME (overrides) + *********************************/ + @media (prefers-color-scheme: dark) { + :root { + --primary: rgb(144, 194, 255); + --text-color: #f6f6f6; + --text-color-muted: #686868; + --body-bg: #121212; + --sidebar-primary: rgb(144, 194, 255); + --sidebar-bg: #1e1e1e; + --sidebar-selected-bg: rgb(17, 112, 228); + --sidebar-text-color: #fafafa; + --box-bg: rgba(135, 135, 135, 0.1); + --box-text-color: #fff; + --heading-docblock-color: #b7b7b7; + --warning-bg-color: #cd9309; + --warning-fg-color: rgba(0, 0, 0, 0.8); + --error-bg-color: #c01c28; + --error-fg-color: #ffffff; + --accent-bg-color: #3584e4; + --accent-fg-color: #ffffff; + color-scheme: dark; + } +} + +/********************************* + * GENERAL STYLING + *********************************/ +*, +*:before, +*:after { + box-sizing: border-box; +} + +::-moz-selection { + color: white; + background: var(--primary); +} + +::selection { + color: white; + background: var(--primary); +} + +body { + font: 16px/1.5 var(--body-font-family); + font-weight: var(--body-font-weight); + font-size: var(--body-font-size); + margin: 0; + padding: 0; + position: relative; + + -webkit-font-feature-settings: "kern", "liga"; + -moz-font-feature-settings: "kern", "liga"; + font-feature-settings: "kern", "liga"; + color: var(--text-color); + background: var(--body-bg); +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--heading-font-family); + font-weight: var(--heading-weight); + margin: 1.75em 0 0.75em 0; +} + +h1 { + font-size: calc(1.75em * var(--heading-font-scale)); +} + + +header h1 { + margin-top: 0; +} + +h2 { + font-size: calc(1.4em * var(--heading-font-scale)); +} + +h3 { + font-size: calc(1.2em * var(--heading-font-scale)); +} + +header h3 { + color: var(--text-color-muted); + margin-bottom: 0; +} + +h4, h5 { + font-size: calc(1em * var(--heading-font-scale)); +} + +h6 { + font-size: calc(1em * var(--heading-small-font-scale)); + font-family: var(--heading-small-font-family); + font-weight: var(--heading-small-weight); +} + +ol, ul { + padding-left: 1rem; +} + +ul ul, ol ul, ul ol, ol ol { + margin-bottom: .6em; +} + +p { + margin: 0 0 .6em 0; +} + +a { + color: var(--primary); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +summary { + outline: none; +} + +blockquote { + border-left: 3px solid var(--primary); + background: var(--box-bg); + padding: var(--box-padding); + border-radius: var(--box-radius); + margin: var(--box--margin); +} + +span.sep::after { + content: "▸"; +} + +span.sep { + font-size: calc(0.5em * var(--monospace-font-size)); + opacity: 0.55; + padding-left: .25em; + padding-right: .25em; +} + +code, +pre { + font-family: var(--monospace-font-family); + font-size: var(--monospace-font-size); + color: var(--box-text-color); +} + +pre { + background: var(--box-bg); + padding: var(--box-padding); + border-radius: var(--box-radius); + overflow: auto; +} + +code { + background: var(--box-bg); + padding: 0 0.35em; + border-radius: 0.35rem; + word-break: break-word; +} + +a > code { + color: var(--primary); +} + + +pre pre, +pre code { + padding: 0; + margin: 0; + font-size: 1em; + background: none; + color: inherit; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-family: inherit; + font-weight: inherit; + font-size: 0.85em; +} + +strong, b { + font-weight: 600; +} + +/* fix alignment of images on small screen */ +img, svg { + display: block; + max-width: 100%; + height: auto; +} + +svg .node polygon, svg .node path { + transition: fill 150ms ease; + fill: var(--box-bg); + stroke: none; +} + +svg .node a { + text-decoration: none !important; +} + +svg .node a text { + fill: var(--text-color); + font-family: var(--body-font-family); +} + +svg .node.link text { + fill: var(--primary); +} + +svg .node.link:hover polygon, svg .node.link:hover path { + fill: var(--sidebar-hover-bg); +} +svg .node.link:hover text { + fill: var(--box-text-color); +} +svg .edge path { + stroke: var(--text-color); +} + +/* fix unwanted margins in tables, code, lists and blockquotes */ +li > *:first-child, +li > *:first-child > *:first-child, +li > *:first-child > *:first-child > *:first-child, +td > *:first-child, +td > *:first-child > *:first-child, +td > *:first-child > *:first-child > *:first-child, +pre > *:first-child, +pre > *:first-child > *:first-child, +pre > *:first-child > *:first-child > *:first-child, +blockquote > *:first-child, +blockquote > *:first-child > *:first-child, +blockquote > *:first-child > *:first-child > *:first-child { + margin-top: 0; +} +li > *:last-child, +li > *:last-child > *:last-child, +li > *:last-child > *:last-child > *:last-child, +td > *:last-child, +td > *:last-child > *:last-child, +td > *:last-child > *:last-child > *:last-child, +pre > *:last-child, +pre > *:last-child > *:last-child, +pre > *:last-child > *:last-child > *:last-child, +blockquote > *:last-child, +blockquote > *:last-child > *:last-child, +blockquote > *:last-child > *:last-child > *:last-child { + margin-bottom: 0; +} + +/* allow easily adding a frame around images, by appending + * #frame to the url + */ +img[src$="#frame"] { + border: 1px solid var(--text-color); +} + +/********************************* + * PAGE STRUCTURE + *********************************/ +#body-wrapper { + display: flex; + flex-wrap: nowrap; + flex-direction: row; +} + +#body-wrapper:focus { + outline: none; +} + +#main { + position: relative; + flex-grow: 1; + min-width: 0; + box-shadow: 0 0 134px rgba(0, 0, 0, 0.1); +} + +footer { + width: 100%; + display: none; +} + +/********************************* + * Button + *********************************/ + +#btn-to-top { + position: fixed; + bottom: 12px; + right: 32px; + z-index: 1000; + border-radius: 50%; + width: 42px; + height: 42px; + border: 1px solid var(--primary); + background: var(--box-bg); + color: var(--text-color); + cursor: pointer; + text-transform: none; +} + +#btn-to-top > .up-arrow { + margin-left: -2px; +} + +#btn-to-top > .up-arrow:after { + content: url(go-up-symbolic.png); +} + +/********************************* + * SIDEBAR + *********************************/ +.sidebar { + background: var(--sidebar-bg); + border-right: 1px solid var(--sidebar-bg); + min-width: 35ch; + padding: var(--sidebar-padding); + color: var(--sidebar-text-color); + position: sticky; + top: 0; + z-index: 2; + height: 100vh; + overflow-y: auto; + color-scheme: dark; +} + +.sidebar a, +.sidebar a:hover { + text-decoration: none; +} + +.sidebar .logo { + display: block; + margin: 1rem auto 1.2rem auto; + width: 50%; +} + +.sidebar .section > ul > li { + margin-right: -10px; +} + +.sidebar .generator > p { + padding-left: 0.5rem; + padding-right: 0.5rem; + font-size: 0.8em; + opacity: 0.8; + position: relative; + bottom: 0; +} + +.sidebar .section h3, .sidebar .section h5 { + text-align: left; + padding-left: 0.5rem; + padding-right: 0.5rem; + font-weight: var(--heading-weight); +} + +.sidebar .section h5 { + font-size: 1em; + margin-bottom: 0.5em; +} + +.sidebar .namespace > h3 { + margin-bottom: 0; + padding: 0; + font-size: 1.5em; + text-transform: uppercase; + font-weight: 900; +} + +.sidebar .namespace > p { + font-size: 0.9em; + opacity: 0.8; + padding-left: 0.5rem; +} + +.sidebar .section { + padding-left: 0.5rem; + padding-right: 0.5rem; + font-size: 80%; +} + +.sidebar .links { + margin-bottom: 1rem; +} + +.sidebar .section a { + display: block; + text-overflow: ellipsis; + overflow: hidden; + transition: background-color 150ms ease; + color: var(--sidebar-primary); + border-radius: var(--box-radius); + padding: 0.2rem 0.5rem; + margin-bottom: 0.15rem; +} + +.sidebar .section a:hover { + background-color: var(--sidebar-hover-bg); + color: var(--sidebar-text-color); +} + +.sidebar .section a.current { + background-color: var(--sidebar-selected-bg); + color: white; +} + +.sidebar .search { + box-sizing: border-box; + text-align: center; +} + +.sidebar .search input[type="text"] { + border: none; + width: 100%; + border-radius: 50px; + padding: 8px 14px; + display: inline-block; + font-size: 14px; + outline: transparent; + background: var(--sidebar-search-bg); + color: var(--sidebar-text-color); + transition: background-color 150ms ease; +} + +.sidebar .search input[type="text"]:hover, +.sidebar .search input[type="text"]:focus { + background: var(--sidebar-search-focus-bg); +} + +.toc { + display: block; + margin-top: 2em; + z-index: 3; + min-width: 15ch; + font-size: 80%; +} + +.toc nav { + margin-left: 2em; + margin-right: 2em; +} + +#toc-title { + text-transform: uppercase; + font-weight: var(--heading-weight); +} + +.toc-list { + list-style-type: none; + margin: 0; + padding-left: 0; +} + +.toc-list-item { + padding-top: .25em; +} + +ul.toc-list > ul.toc-list { + padding-left: 1em; +} + +/********************************* + * ANCHORS & TOGGLERS + *********************************/ +.anchor, +.md-anchor { + position: relative; + z-index: 1; + text-decoration: none; + padding: 0 0.5em; + color: var(--text-color-muted); +} + +.anchor:hover, +.md-anchor:hover { + color: var(--primary); +} + +.anchor:not([href]), +.md-anchor:not([href]) { + display: none; +} + +.anchor:before, +.md-anchor:before { + content: var(--anchor-sign); /*'§'*/ +} + +.toggle-wrapper { + position: relative; +} + +.collapse-toggle { + position: absolute; + right: 0; + left: -2em; + white-space: nowrap; + text-decoration: none; + font-size: 0.8em; + color: transparent; +} + +.collapse-toggle > .inner { + width: 1rem; + height: 1rem; + border-radius: calc(0.75 * var(--box-radius)); + display: inline-flex; + justify-content: center; + align-items: center; + text-align: center; + vertical-align: middle; + color: var(--box-text-color); + position: relative; + left: -0.25rem; + font-family: monospace; + font-size: 0.7rem; + font-weight: bold; + background: var(--box-bg); +} + +/********************************* + * UTILITY + *********************************/ +.deprecated > h6 > a { + opacity: 0.65; +} + +.hidden { + display: none !important; +} + +/********************************* + * CONTENT STYLING + *********************************/ +.content { + padding: 2em 4em; + overflow: visible; + max-width: calc(var(--preferred-content-width) + 8em); +} + +.content table:not(.table-display) { + border-spacing: 0 0.25rem; +} + +.content td { + vertical-align: top; +} + +.content td:first-child { + padding-right: 1rem; +} + +.content td p:first-child { + margin-top: 0; +} + +.content td h1, .content td h2 { + margin-left: 0; + font-size: 1.1em; +} + +.content tr:first-child td { + border-top: 0; +} + +kbd { + display: inline-block; + padding: 8px; + font: 10px monospace; + line-height: 10px; + vertical-align: middle; + border: none; + border-radius: 6px; + box-shadow: 0 0 3px rgba(0,0,0,0.3); + margin: 3px; + background-color: var(--box-bg); + cursor: default; +} + +.content tr:first-child { + border-bottom: 1px solid rgba(0, 0, 0, 0.35); +} + +.content td { + vertical-align: top; +} + +.content td:first-child { + padding-right: 1rem; +} + +.content td p:first-child { + margin-top: 0; +} + +.content td h4, .content td h5 { + margin-left: 0; + font-size: 1.1em; +} + +.content tr:first-child td { + border-top: 0; +} + +.srclink { + color: var(--text-color-muted); + font-size: 1rem; + font-weight: var(--body-font-weight); + flex-grow: 0; + text-decoration: none; + margin-left: auto; + position: relative; + z-index: 1; +} + +.meta tr > td:not(:first-child) { + width: 100%; +} + +.meta tr > td:first-child { + white-space: nowrap; +} + +/********************************* + * DOCBLOCK STYLING + *********************************/ +.docblock { + position: relative; + text-align: left; +} + +.docblock h1 { + font-size: calc(1.3em * var(--heading-docblock-scale) * var(--heading-font-scale)); +} + +.docblock h2 { + font-size: calc(1.2em * var(--heading-docblock-scale) * var(--heading-font-scale)); +} + +.docblock h3 { + font-size: calc(1.1em * var(--heading-docblock-scale) * var(--heading-font-scale)); +} + +.docblock h4 { + font-size: calc(1.05em * var(--heading-docblock-scale) * var(--heading-font-scale)); +} + +.docblock h1, +.docblock h2, +.docblock h3, +.docblock h4, +.docblock h5, +.docblock h6 { + color: var(--heading-docblock-color) +} + +.docblock table { + margin: .25em 0; + max-width: 100%; + font-size: var(--table-font-size); +} + +.docblock table td { + padding: .25em; +} + +.docblock table th { + padding: .25em; + text-align: left; + font-family: var(--heading-table-font-family); + font-weight: var(--heading-table-weight); +} + +.docblock table tr th:first-child, +.docblock table tr td:first-child { + padding-left: 0; +} + +.docblock table tr th:last-child, +.docblock table tr td:last-child { + padding-right: 0; +} + +dl.enum-members { + font-size: 80%; +} + +dl.enum-members dt { + padding-top: 1em; +} + +table.arguments tr td { + color: var(--text-color-muted); +} + +table.arguments tr td:first-child { + min-width: 12em; +} + +table.arguments tr.arg-name td, +table.arguments tr.arg-description td { + color: var(--text-color); +} + +.docblock ul li, +.docblock ol li { + padding-top: 0.15rem; + padding-bottom: 0.15rem; +} + +.docblock ul.type { + list-style: none; +} + +.docblock ul.type li::before { + content: "»"; + color: var(--text-color); + display: inline-block; + width: 1em; + margin-left: -1em; +} + +.docblock .codehilite { + position: relative; +} +.docblock .codehilite > .copy-button { + position: absolute; + top: 0; + right: 0; + + border: none; + background: none; + + margin: var(--box-padding); + cursor: pointer; +} + +.docblock .codehilite > .copy-button { + transition: background-color 150ms ease; + color: var(--primary); + border-radius: var(--box-radius); + padding: 0.2rem 0.5rem; + margin: var(--box-padding); +} + +.docblock .codehilite > .copy-button:hover { + background-color: var(--sidebar-hover-bg); + color: var(--text-color); +} + +.docblock .codehilite > .copy-button:active { + background-color: var(--primary); +} + +.emblem { + padding: 0 0.75em; + border-radius: 9999px; + font-size: 80%; +} + +.emblem.available-next { + background-color: var(--warning-bg-color); + color: var(--warning-fg-color); +} + +.emblem.deprecated { + background-color: var(--error-bg-color); + color: var(--error-fg-color); +} + +.emblem.available { + background-color: var(--accent-bg-color); + color: var(--accent-fg-color); +} + +dt.result { + padding: .5em 0; +} + +.result.emblem.alias, +.result.emblem.bitfield, +.result.emblem.callback, +.result.emblem.class, +.result.emblem.constant, +.result.emblem.extra_content, +.result.emblem.ctor, +.result.emblem.domain, +.result.emblem.enum, +.result.emblem.function_macro, +.result.emblem.function, +.result.emblem.interface, +.result.emblem.method, +.result.emblem.property, +.result.emblem.record, +.result.emblem.signal, +.result.emblem.type_func, +.result.emblem.union, +.result.emblem.vfunc { + background-color: var(--accent-bg-color); + color: var(--accent-fg-color); +} + +.admonition { + background: var(--admonition-color-bg); + border-left: .2rem solid #651fff; + border-radius: .2rem; + box-shadow: 0 .2rem .5rem rgba(0, 0, 0, .05), 0 0 .0625rem rgba(0, 0, 0, .1); + font-size: var(--admonition-font-size); + margin: 1rem auto; + overflow: hidden; + padding: 0 .5rem .5rem; + page-break-inside: avoid; +} + +.admonition > p.admonition-title { + font-weight: 500; + line-height: 1.3; + margin: 0 -.5rem .5rem; + padding: .4rem .5rem .4rem 2rem; + position: relative; +} + +p.admonition-title::before { + content: ""; + position: absolute; + left: .5rem; + height: 1rem; + width: 1rem; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; +} + +.admonition.note > .admonition-title, +.admonition.seealso > .admonition-title { + background-color: var(--admonition-color-title-bg--note); +} + +.admonition.note > .admonition-title::before, +.admonition.seealso > .admonition-title::before { + background-color: var(--admonition-color-title--note); + -webkit-mask-image: var(--admonition-icon--note); + mask-image: var(--admonition-icon--note); + +} + +.admonition.note, +.admonition.seealso { + border-left-color: var(--admonition-color-title--note); +} + +.admonition.tip > .admonition-title, +.admonition.hint > .admonition-title { + background-color: var(--admonition-color-title-bg--tip); +} + +.admonition.tip > .admonition-title::before, +.admonition.hint > .admonition-title::before { + background-color: var(--admonition-color-title--tip); + -webkit-mask-image: var(--admonition-icon--tip); + mask-image: var(--admonition-icon--tip); +} + +.admonition.tip, +.admonition.hint { + border-left-color: var(--admonition-color-title--tip); +} + +.admonition.important > .admonition-title { + background-color: var(--admonition-color-title-bg--important); +} + +.admonition.important > .admonition-title::before { + background-color: var(--admonition-color-title--important); + -webkit-mask-image: var(--admonition-icon--important); + mask-image: var(--admonition-icon--important); +} + +.admonition.important { + border-left-color: var(--admonition-color-title--important); +} + +.admonition.warning > .admonition-title { + background-color: var(--admonition-color-title-bg--warning); +} + +.admonition.warning > .admonition-title::before { + background-color: var(--admonition-color-title--warning); + -webkit-mask-image: var(--admonition-icon--warning); + mask-image: var(--admonition-icon--warning); +} + +.admonition.warning { + border-left-color: var(--admonition-color-title--warning); +} + +/************************************************************* + SYMBOLS +**************************************************************/ +.symbol, +.constructors h6, +.methods h6, +.signals h6, +.properties h6, +.type-funcs h6, +.implements a, +.ancestors a, +.descendants a, +.implementations a, +.sidebar .links a +.toc a +{ + font-family: var(--symbol-font-family); + font-size: calc(1em * var(--symbol-font-scale)); + font-weight: var(--symbol-font-weight); +} + +/************************** + RESPONSIVENESS +**************************/ +@media (max-width: 700px) { + body { + padding-top: 0px; + } + + #body-wrapper { + flex-direction: column; + overflow: hidden; + } + + #main { + width: 100%; + padding: 2rem; + } + + .sidebar { + position: static; + height: initial; + order: 1; + } + + .toc { + display: hidden; + } +} diff --git a/documentation/type_func.Clipboard.get_default.html b/documentation/type_func.Clipboard.get_default.html new file mode 100644 index 00000000000..a618eb615ab --- /dev/null +++ b/documentation/type_func.Clipboard.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Clipboard.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentClipboardget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentClipboard*
+valent_clipboard_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentClipboard.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentClipboard

+

A ValentClipboard

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Contacts.get_default.html b/documentation/type_func.Contacts.get_default.html new file mode 100644 index 00000000000..b0d8d080b04 --- /dev/null +++ b/documentation/type_func.Contacts.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Contacts.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentContactsget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentContacts*
+valent_contacts_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentContacts.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentContacts

+

A ValentContacts

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Device.get_resource.html b/documentation/type_func.Device.get_resource.html new file mode 100644 index 00000000000..7c868a11b3d --- /dev/null +++ b/documentation/type_func.Device.get_resource.html @@ -0,0 +1,197 @@ + + + + + + Valent.Device.get_resource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentDeviceget_resource

+
+ +
+
+

+
+
+

+ Declaration + + + [src] + +

+ +
+
GResource*
+valent_device_get_resource (
+  void
+)
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GResource

+

No description available.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.DeviceManager.get_default.html b/documentation/type_func.DeviceManager.get_default.html new file mode 100644 index 00000000000..d4a3ce920f9 --- /dev/null +++ b/documentation/type_func.DeviceManager.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.DeviceManager.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentDeviceManagerget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentDeviceManager*
+valent_device_manager_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentDeviceManager.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentDeviceManager

+

A ValentDeviceManager

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Input.get_default.html b/documentation/type_func.Input.get_default.html new file mode 100644 index 00000000000..e102538a3df --- /dev/null +++ b/documentation/type_func.Input.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Input.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentInputget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentInput*
+valent_input_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentInput.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentInput

+

A ValentInput

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Media.get_default.html b/documentation/type_func.Media.get_default.html new file mode 100644 index 00000000000..2e02ed8b443 --- /dev/null +++ b/documentation/type_func.Media.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Media.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentMediaget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentMedia*
+valent_media_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentMedia.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMedia

+

A ValentMedia

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Mixer.get_default.html b/documentation/type_func.Mixer.get_default.html new file mode 100644 index 00000000000..58f62cac695 --- /dev/null +++ b/documentation/type_func.Mixer.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Mixer.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentMixerget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentMixer*
+valent_mixer_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentMixer.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixer

+

A ValentMixer

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Notification.add_device_button.html b/documentation/type_func.Notification.add_device_button.html new file mode 100644 index 00000000000..ea124c1f563 --- /dev/null +++ b/documentation/type_func.Notification.add_device_button.html @@ -0,0 +1,283 @@ + + + + + + Valent.Notification.add_device_button + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentNotificationadd_device_button

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_add_device_button (
+  GNotification* notification,
+  ValentDevice* device,
+  const char* label,
+  const char* action,
+  GVariant* target
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Add an action button to notification. action is wrapped in the special +device action for device, which allows it to be activated from the app +action scope.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: GNotification

+

A GNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
device
+
+

Type: ValentDevice

+

A ValentDevice

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
label
+
+

Type: const char*

+

The button label.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
action
+
+

Type: const char*

+

The device action name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
target
+
+

Type: GVariant

+

The action target.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Notification.deserialize.html b/documentation/type_func.Notification.deserialize.html new file mode 100644 index 00000000000..e9933f939e3 --- /dev/null +++ b/documentation/type_func.Notification.deserialize.html @@ -0,0 +1,237 @@ + + + + + + Valent.Notification.deserialize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentNotificationdeserialize

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentNotification*
+valent_notification_deserialize (
+  GVariant* variant
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Deserializes variant into a ValentNotification. Since ValentNotification +is effectively a super-set of GNotification, variant may be a serialized +GNotification or ValentNotification.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
variant
+
+

Type: GVariant

+

A GVariant

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentNotification

+

A ValentNotification

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Notification.set_device_action.html b/documentation/type_func.Notification.set_device_action.html new file mode 100644 index 00000000000..fdfdf1c4916 --- /dev/null +++ b/documentation/type_func.Notification.set_device_action.html @@ -0,0 +1,265 @@ + + + + + + Valent.Notification.set_device_action + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentNotificationset_device_action

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
void
+valent_notification_set_device_action (
+  GNotification* notification,
+  ValentDevice* device,
+  const char* action,
+  GVariant* target
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default action for notification. action is wrapped in the special +device action for device, which allows it to be activated from the app +action scope.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: GNotification

+

A GNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
device
+
+

Type: ValentDevice

+

A ValentDevice

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
action
+
+

Type: const char*

+

The device action name.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
target
+
+

Type: GVariant

+

The action target.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Notifications.get_default.html b/documentation/type_func.Notifications.get_default.html new file mode 100644 index 00000000000..d5ef4df0793 --- /dev/null +++ b/documentation/type_func.Notifications.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Notifications.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentNotificationsget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentNotifications*
+valent_notifications_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentNotifications.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentNotifications

+

A ValentNotifications

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/type_func.Session.get_default.html b/documentation/type_func.Session.get_default.html new file mode 100644 index 00000000000..4719b0e3020 --- /dev/null +++ b/documentation/type_func.Session.get_default.html @@ -0,0 +1,199 @@ + + + + + + Valent.Session.get_default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Function

+

ValentSessionget_default

+
+ +
+
+

unstable since: 1.0

+
+
+

+ Declaration + + + [src] + +

+ +
+
ValentSession*
+valent_session_get_default (
+  void
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default ValentSession.

+
+ +
+ +

Available since: 1.0

+ + + + +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentSession

+

A ValentSession

+
+
+ + + + + + + +
The data is owned by the called function.
The return value can be NULL.
+
+
+
+
+ +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/urlmap.js b/documentation/urlmap.js new file mode 100644 index 00000000000..2a49434384d --- /dev/null +++ b/documentation/urlmap.js @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2021 GNOME Foundation +// SPDX-License-Identifier: LGPL-2.1-or-later + +// A map between namespaces and base URLs for their online documentation +baseURLs = [ + [ 'GLib', 'https://docs.gtk.org/glib/' ], + [ 'GObject', 'https://docs.gtk.org/gobject/' ], + [ 'Gio', 'https://docs.gtk.org/gio/' ], + [ 'Gdk', 'https://docs.gtk.org/gdk4/' ], + [ 'Gsk', 'https://docs.gtk.org/gsk4/' ], + [ 'Gtk', 'https://docs.gtk.org/gtk4/' ], + [ 'GdkPixbuf', 'https://docs.gtk.org/gdk-pixbuf/' ], + [ 'Json', 'https://gnome.pages.gitlab.gnome.org/json-glib/'], + [ 'Peas', 'https://gnome.pages.gitlab.gnome.org/libpeas/libpeas-1.0/'], + [ 'Adw', 'https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/' ], +] + diff --git a/documentation/valent.devhelp2 b/documentation/valent.devhelp2 new file mode 100644 index 00000000000..8b7e29af3e9 --- /dev/null +++ b/documentation/valent.devhelp2 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.activate.html b/documentation/vfunc.ApplicationPlugin.activate.html new file mode 100644 index 00000000000..d1d34ee883b --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.activate.html @@ -0,0 +1,213 @@ + + + + + + Valent.ApplicationPlugin.activate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPluginactivate

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+activate (
+  ValentApplicationPlugin* plugin
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle activation of the application.

+

Implementations should override this method to handle activation, as +a result of GApplication::activate being emitted on the primary +instance of the application.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if handled, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.command_line.html b/documentation/vfunc.ApplicationPlugin.command_line.html new file mode 100644 index 00000000000..e1f97551c84 --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.command_line.html @@ -0,0 +1,246 @@ + + + + + + Valent.ApplicationPlugin.command_line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPlugincommand_line

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
int
+command_line (
+  ValentApplicationPlugin* plugin,
+  GApplicationCommandLine* command_line
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the given command-line options.

+

Implementations should override this method to handle command-line options, +as a result of GApplication::command-line being emitted on the +primary instance of the application.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
command_line
+
+

Type: GApplicationCommandLine

+

A GApplicationCommandLine

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: int

+

An integer that is set as the exit status for the calling process.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.dbus_register.html b/documentation/vfunc.ApplicationPlugin.dbus_register.html new file mode 100644 index 00000000000..b0b7840f454 --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.dbus_register.html @@ -0,0 +1,279 @@ + + + + + + Valent.ApplicationPlugin.dbus_register + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPlugindbus_register

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+dbus_register (
+  ValentApplicationPlugin* plugin,
+  GDBusConnection* connection,
+  const char* object_path,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the D-Bus registration phase of the application.

+

Implementations may override this method to export extra objects on the +bus, that need to exist before the application tries to own the bus name.

+

D-Bus registration will be aborted if FALSE is returned, so implementations +may return TRUE and report the error by other means if it is not intended +to be fatal.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
connection
+
+

Type: GDBusConnection

+

A Gio.DBusCOnnection

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
object_path
+
+

Type: const char*

+

A D-Bus object path.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.dbus_unregister.html b/documentation/vfunc.ApplicationPlugin.dbus_unregister.html new file mode 100644 index 00000000000..7662bf02c06 --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.dbus_unregister.html @@ -0,0 +1,237 @@ + + + + + + Valent.ApplicationPlugin.dbus_unregister + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPlugindbus_unregister

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+dbus_unregister (
+  ValentApplicationPlugin* plugin,
+  GDBusConnection* connection,
+  const char* object_path
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the D-Bus unregistration phase of the application.

+

Implementations should override this method to unexport anything exported in +Valent.ApplicationPluginClass.dbus_register.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
connection
+
+

Type: GDBusConnection

+

A Gio.DBusCOnnection

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
object_path
+
+

Type: const char*

+

A D.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.open.html b/documentation/vfunc.ApplicationPlugin.open.html new file mode 100644 index 00000000000..5031e800b71 --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.open.html @@ -0,0 +1,282 @@ + + + + + + Valent.ApplicationPlugin.open + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPluginopen

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+open (
+  ValentApplicationPlugin* plugin,
+  GFile** files,
+  int n_files,
+  const char* hint
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Open the given files.

+

Implementations should override this method to handle files and URIs, as +a result of GApplication::open being emitted on the primary +instance of the application.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
files
+
+

Type: An array of GFile*

+

An array of GFiles to open.

+ + + + + + + + + + +
The length of the array is specified in the n_files argument.
The data is owned by the caller of the function.
+
+ +
n_files
+
+

Type: int

+

The length of the files array.

+ + + + + + + + + + +
+
+ +
hint
+
+

Type: const char*

+

A hint (or “”)

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if handled, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.shutdown.html b/documentation/vfunc.ApplicationPlugin.shutdown.html new file mode 100644 index 00000000000..dd8e7d42a77 --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.shutdown.html @@ -0,0 +1,186 @@ + + + + + + Valent.ApplicationPlugin.shutdown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPluginshutdown

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+shutdown (
+  ValentApplicationPlugin* plugin
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the shutdown phase of the application.

+

Implementations should override this method to reverse anything done in +Valent.ApplicationPluginClass.startup.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ApplicationPlugin.startup.html b/documentation/vfunc.ApplicationPlugin.startup.html new file mode 100644 index 00000000000..978306a7a1f --- /dev/null +++ b/documentation/vfunc.ApplicationPlugin.startup.html @@ -0,0 +1,186 @@ + + + + + + Valent.ApplicationPlugin.startup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentApplicationPluginstartup

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+startup (
+  ValentApplicationPlugin* plugin
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle the startup phase of the application.

+

Implementations may override this method to perform setup task that should +only happen on the primary instance.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.download.html b/documentation/vfunc.Channel.download.html new file mode 100644 index 00000000000..e977d1fbba9 --- /dev/null +++ b/documentation/vfunc.Channel.download.html @@ -0,0 +1,282 @@ + + + + + + Valent.Channel.download + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChanneldownload

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+download (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Open an auxiliary connection, usually to download data.

+

Implementations should use information from the payloadTransferInfo field +to open a connection and wait for it to be accepted. In most cases the remote +device will write data to the stream and then close it when finished.

+

For example, a TCP-based implementation could connect to a port in the +payloadTransferInfo dictionary on the same host as the channel. When the +connection is accepted the caller can perform operations on it as required.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.download_async.html b/documentation/vfunc.Channel.download_async.html new file mode 100644 index 00000000000..816f6b08e2f --- /dev/null +++ b/documentation/vfunc.Channel.download_async.html @@ -0,0 +1,277 @@ + + + + + + Valent.Channel.download_async + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChanneldownload_async

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+download_async (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Open an auxiliary connection, usually to download data.

+

This is a non-blocking variant of valent_channel_download(). Call +valent_channel_download_finish() to get the result.

+

The default implementation of this method invokes +Valent.ChannelClass.download in a thread.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.download_finish.html b/documentation/vfunc.Channel.download_finish.html new file mode 100644 index 00000000000..11f23080fde --- /dev/null +++ b/documentation/vfunc.Channel.download_finish.html @@ -0,0 +1,258 @@ + + + + + + Valent.Channel.download_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChanneldownload_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+download_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started with valent_channel_download_async().

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.get_verification_key.html b/documentation/vfunc.Channel.get_verification_key.html new file mode 100644 index 00000000000..75b40d847b0 --- /dev/null +++ b/documentation/vfunc.Channel.get_verification_key.html @@ -0,0 +1,214 @@ + + + + + + Valent.Channel.get_verification_key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelget_verification_key

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+get_verification_key (
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a verification key for the connection.

+

Implementations that involve exchanging a key should return a string for the +user to authenticate the connection, similar to a Bluetooth PIN.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A verification key.

+
+
+ + + + + + + +
The data is owned by the called function.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.store_data.html b/documentation/vfunc.Channel.store_data.html new file mode 100644 index 00000000000..d57b1aefeaf --- /dev/null +++ b/documentation/vfunc.Channel.store_data.html @@ -0,0 +1,222 @@ + + + + + + Valent.Channel.store_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelstore_data

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+store_data (
+  ValentChannel* channel,
+  ValentContext* context
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Store channel metadata.

+

This method is called to store channel specific data. Implementations can +override this method to store extra data (eg. TLS Certificate).

+

Implementations that override Valent.ChannelClass.store_data must chain-up.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
context
+
+

Type: ValentContext

+

A ValentContext

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.upload.html b/documentation/vfunc.Channel.upload.html new file mode 100644 index 00000000000..e67a28e8280 --- /dev/null +++ b/documentation/vfunc.Channel.upload.html @@ -0,0 +1,283 @@ + + + + + + Valent.Channel.upload + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelupload

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+upload (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Accept an auxiliary connection, usually to upload data.

+

Implementations should set the payloadTransferInfo field with information +the peer can use to open a connection and wait to accept that connection. In +most cases the remote device with expect the caller to write to the stream +and then close it when finished.

+

For example, a TCP-based implementation could start listening on a port then +send the packet with that port in the payloadTransferInfo dictionary. When +a connection is accepted the caller can perform operations on it as required.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.upload_async.html b/documentation/vfunc.Channel.upload_async.html new file mode 100644 index 00000000000..e6afaba33ce --- /dev/null +++ b/documentation/vfunc.Channel.upload_async.html @@ -0,0 +1,277 @@ + + + + + + Valent.Channel.upload_async + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelupload_async

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+upload_async (
+  ValentChannel* channel,
+  JsonNode* packet,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Accept an auxiliary connection, usually to upload data.

+

This is a non-blocking variant of valent_channel_upload(). Call +valent_channel_upload_finish() to get the result.

+

The default implementation of this method invokes +Valent.ChannelClass.upload in a thread.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Channel.upload_finish.html b/documentation/vfunc.Channel.upload_finish.html new file mode 100644 index 00000000000..59e0db4e4ec --- /dev/null +++ b/documentation/vfunc.Channel.upload_finish.html @@ -0,0 +1,258 @@ + + + + + + Valent.Channel.upload_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelupload_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GIOStream*
+upload_finish (
+  ValentChannel* channel,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started with valent_channel_upload_async().

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GIOStream

+

A GIOStream

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ChannelService.build_identity.html b/documentation/vfunc.ChannelService.build_identity.html new file mode 100644 index 00000000000..6e0062dd7c9 --- /dev/null +++ b/documentation/vfunc.ChannelService.build_identity.html @@ -0,0 +1,181 @@ + + + + + + Valent.ChannelService.build_identity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelServicebuild_identity

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+build_identity (
+  ValentChannelService* service
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Rebuild the local KDE Connect identity packet.

+

This method is called to rebuild the identity packet used to identify the +host device to remote devices.

+

Implementations that override Valent.ChannelServiceClass.build_identity +should chain-up first, then call valent_channel_service_ref_identity() +and modify that.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ChannelService.channel.html b/documentation/vfunc.ChannelService.channel.html new file mode 100644 index 00000000000..dd8f459d14c --- /dev/null +++ b/documentation/vfunc.ChannelService.channel.html @@ -0,0 +1,211 @@ + + + + + + Valent.ChannelService.channel + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelServicechannel

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+channel (
+  ValentChannelService* service,
+  ValentChannel* channel
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit ValentChannelService::channel on service.

+

This method should only be called by implementations of +ValentChannelService.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
channel
+
+

Type: ValentChannel

+

A ValentChannel

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ChannelService.identify.html b/documentation/vfunc.ChannelService.identify.html new file mode 100644 index 00000000000..a6e5df7523c --- /dev/null +++ b/documentation/vfunc.ChannelService.identify.html @@ -0,0 +1,213 @@ + + + + + + Valent.ChannelService.identify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentChannelServiceidentify

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+identify (
+  ValentChannelService* service,
+  const char* target
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Identify the host device to the network.

+

This method is called to announce the availability of the host device to +other devices.

+

Implementations that override Valent.ChannelServiceClass.identify may +ignore target or use it to address a particular device.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
target
+
+

Type: const char*

+

A target string.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.changed.html b/documentation/vfunc.ClipboardAdapter.changed.html new file mode 100644 index 00000000000..4bb45ef7d21 --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.changed.html @@ -0,0 +1,188 @@ + + + + + + Valent.ClipboardAdapter.changed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterchanged

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+changed (
+  ValentClipboardAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits ValentClipboardAdapter::changed signal on adapter.

+

The default handler for this signal updates the value returned by the default +implementation of Valent.ClipboardAdapterClass.get_timestamp.

+

This method should only be called by implementations of +ValentClipboardAdapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.get_mimetypes.html b/documentation/vfunc.ClipboardAdapter.get_mimetypes.html new file mode 100644 index 00000000000..a81bb9ca9e5 --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.get_mimetypes.html @@ -0,0 +1,210 @@ + + + + + + Valent.ClipboardAdapter.get_mimetypes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterget_mimetypes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GStrv
+get_mimetypes (
+  ValentClipboardAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the mime-types of the current clipboard content.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: An array of utf8

+

A list of mime-types.

+
+
+ + + + + + + +
The array is NULL-terminated.
Each element is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.get_timestamp.html b/documentation/vfunc.ClipboardAdapter.get_timestamp.html new file mode 100644 index 00000000000..83ef6e9c67a --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.get_timestamp.html @@ -0,0 +1,212 @@ + + + + + + Valent.ClipboardAdapter.get_timestamp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterget_timestamp

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
int64_t
+get_timestamp (
+  ValentClipboardAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the timestamp of the current clipboard content.

+

The default implementation of this method returns the last time +ValentClipboardAdapter::changed was emitted.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: int64_t

+

A UNIX epoch timestamp (ms)

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.read_bytes.html b/documentation/vfunc.ClipboardAdapter.read_bytes.html new file mode 100644 index 00000000000..60c704b0cc1 --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.read_bytes.html @@ -0,0 +1,272 @@ + + + + + + Valent.ClipboardAdapter.read_bytes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterread_bytes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+read_bytes (
+  ValentClipboardAdapter* adapter,
+  const char* mimetype,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the content of adapter.

+

Call valent_clipboard_adapter_read_bytes_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
mimetype
+
+

Type: const char*

+

A mime-type.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.read_bytes_finish.html b/documentation/vfunc.ClipboardAdapter.read_bytes_finish.html new file mode 100644 index 00000000000..236fa5e7c61 --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.read_bytes_finish.html @@ -0,0 +1,256 @@ + + + + + + Valent.ClipboardAdapter.read_bytes_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterread_bytes_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GBytes*
+read_bytes_finish (
+  ValentClipboardAdapter* adapter,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_adapter_read_bytes().

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: GBytes

+

A GBytes, or NULL with error set.

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
The return value can be NULL.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.write_bytes.html b/documentation/vfunc.ClipboardAdapter.write_bytes.html new file mode 100644 index 00000000000..1d75eeda979 --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.write_bytes.html @@ -0,0 +1,290 @@ + + + + + + Valent.ClipboardAdapter.write_bytes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterwrite_bytes

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+write_bytes (
+  ValentClipboardAdapter* adapter,
+  const char* mimetype,
+  GBytes* bytes,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the content of the clipboard.

+

Call valent_clipboard_adapter_write_bytes_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
mimetype
+
+

Type: const char*

+

A mime-type, or NULL if bytes is NULL.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
bytes
+
+

Type: GBytes

+

A GBytes, or NULL if mimetype is NULL.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ClipboardAdapter.write_bytes_finish.html b/documentation/vfunc.ClipboardAdapter.write_bytes_finish.html new file mode 100644 index 00000000000..0c30b8ba5b0 --- /dev/null +++ b/documentation/vfunc.ClipboardAdapter.write_bytes_finish.html @@ -0,0 +1,256 @@ + + + + + + Valent.ClipboardAdapter.write_bytes_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentClipboardAdapterwrite_bytes_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+write_bytes_finish (
+  ValentClipboardAdapter* adapter,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_clipboard_adapter_write_bytes().

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Component.bind_extension.html b/documentation/vfunc.Component.bind_extension.html new file mode 100644 index 00000000000..97db9df0a6f --- /dev/null +++ b/documentation/vfunc.Component.bind_extension.html @@ -0,0 +1,207 @@ + + + + + + Valent.Component.bind_extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentComponentbind_extension

+
+ +
+
+

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+bind_extension (
+  ValentComponent* component,
+  GObject* extension
+)
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
extension
+
+

Type: GObject

+

No description available.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Component.bind_preferred.html b/documentation/vfunc.Component.bind_preferred.html new file mode 100644 index 00000000000..4626e1ae0c4 --- /dev/null +++ b/documentation/vfunc.Component.bind_preferred.html @@ -0,0 +1,207 @@ + + + + + + Valent.Component.bind_preferred + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentComponentbind_preferred

+
+ +
+
+

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+bind_preferred (
+  ValentComponent* component,
+  GObject* extension
+)
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
extension
+
+

Type: GObject

+

No description available.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Component.unbind_extension.html b/documentation/vfunc.Component.unbind_extension.html new file mode 100644 index 00000000000..362d7e62110 --- /dev/null +++ b/documentation/vfunc.Component.unbind_extension.html @@ -0,0 +1,207 @@ + + + + + + Valent.Component.unbind_extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentComponentunbind_extension

+
+ +
+
+

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+unbind_extension (
+  ValentComponent* component,
+  GObject* extension
+)
+
+
+
+
+ +
+

+ Description + + +

+ +
+ No description available. +
+ +
+ + + +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
extension
+
+

Type: GObject

+

No description available.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ContactStore.add_contacts.html b/documentation/vfunc.ContactStore.add_contacts.html new file mode 100644 index 00000000000..b53582335c9 --- /dev/null +++ b/documentation/vfunc.ContactStore.add_contacts.html @@ -0,0 +1,270 @@ + + + + + + Valent.ContactStore.add_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentContactStoreadd_contacts

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+add_contacts (
+  ValentContactStore* store,
+  GSList* contacts,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Add contacts to store.

+

Call valent_contact_store_add_contacts_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
contacts
+
+

Type: A list of EContact*

+

A GSList

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ContactStore.contact_added.html b/documentation/vfunc.ContactStore.contact_added.html new file mode 100644 index 00000000000..de721a33dae --- /dev/null +++ b/documentation/vfunc.ContactStore.contact_added.html @@ -0,0 +1,218 @@ + + + + + + Valent.ContactStore.contact_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentContactStorecontact_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+contact_added (
+  ValentContactStore* store,
+  EContact* contact
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits ValentContactStore::contact-added signal on store.

+

This method should only be called by implementations of +ValentContactStore. Signal handlers may query the state, so it must +emitted after the internal representation has been updated.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
contact
+
+

Type: EContact

+

The EContact

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ContactStore.contact_removed.html b/documentation/vfunc.ContactStore.contact_removed.html new file mode 100644 index 00000000000..19c412f0bb3 --- /dev/null +++ b/documentation/vfunc.ContactStore.contact_removed.html @@ -0,0 +1,218 @@ + + + + + + Valent.ContactStore.contact_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentContactStorecontact_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+contact_removed (
+  ValentContactStore* store,
+  const char* uid
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emits ValentContactStore::contact-removed on store.

+

This method should only be called by implementations of +ValentContactStore. Signal handlers may query the state, so it must +emitted after the internal representation has been updated.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: const char*

+

The UID of contact.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ContactStore.get_contact.html b/documentation/vfunc.ContactStore.get_contact.html new file mode 100644 index 00000000000..aab3b866caf --- /dev/null +++ b/documentation/vfunc.ContactStore.get_contact.html @@ -0,0 +1,270 @@ + + + + + + Valent.ContactStore.get_contact + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentContactStoreget_contact

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+get_contact (
+  ValentContactStore* store,
+  const char* uid,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get a contact by UID.

+

Call valent_contact_store_get_contact_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uid
+
+

Type: const char*

+

A contact UID.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ContactStore.query.html b/documentation/vfunc.ContactStore.query.html new file mode 100644 index 00000000000..40d5b1abbe1 --- /dev/null +++ b/documentation/vfunc.ContactStore.query.html @@ -0,0 +1,270 @@ + + + + + + Valent.ContactStore.query + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentContactStorequery

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+query (
+  ValentContactStore* store,
+  const char* query,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Query store for contacts matching query.

+

Call valent_contact_store_query_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
query
+
+

Type: const char*

+

A search expression.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.ContactStore.remove_contacts.html b/documentation/vfunc.ContactStore.remove_contacts.html new file mode 100644 index 00000000000..61333c08642 --- /dev/null +++ b/documentation/vfunc.ContactStore.remove_contacts.html @@ -0,0 +1,270 @@ + + + + + + Valent.ContactStore.remove_contacts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentContactStoreremove_contacts

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+remove_contacts (
+  ValentContactStore* store,
+  GSList* uids,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Remove contact uid from store.

+

Call valent_contact_store_remove_contacts_finish() to get the result.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
uids
+
+

Type: A list of utf8

+

A GSList of contact UIDs.

+ + + + + + + + + + +
The data is owned by the caller of the function.
Each element is a NUL terminated UTF-8 string.
+
+ +
cancellable
+
+

Type: GCancellable

+

GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.DevicePlugin.handle_packet.html b/documentation/vfunc.DevicePlugin.handle_packet.html new file mode 100644 index 00000000000..a0976a38ccf --- /dev/null +++ b/documentation/vfunc.DevicePlugin.handle_packet.html @@ -0,0 +1,229 @@ + + + + + + Valent.DevicePlugin.handle_packet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentDevicePluginhandle_packet

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+handle_packet (
+  ValentDevicePlugin* plugin,
+  const char* type,
+  JsonNode* packet
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Handle a packet from the device the plugin is bound to.

+

This is called when the device receives a packet type included in the +X-DevicePluginIncoming field of the .plugin file.

+

This is optional for implementations which do not register any incoming +capabilities, such as plugins that do not provide packet-based functionality.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
type
+
+

Type: const char*

+

A KDE Connect packet type.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ +
packet
+
+

Type: JsonNode

+

A KDE Connect packet.

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.DevicePlugin.update_state.html b/documentation/vfunc.DevicePlugin.update_state.html new file mode 100644 index 00000000000..e24103b955e --- /dev/null +++ b/documentation/vfunc.DevicePlugin.update_state.html @@ -0,0 +1,212 @@ + + + + + + Valent.DevicePlugin.update_state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentDevicePluginupdate_state

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+update_state (
+  ValentDevicePlugin* plugin,
+  ValentDeviceState state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Update the plugin based on the new state of the device.

+

This function is called when the connected or paired state of the device +changes. This may be used to configure actions, event handlers that may +trigger outgoing packets and exchange connect-time data with the device.

+

This is optional for all implementations as plugins aren’t required to be +dependent on the device state.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: ValentDeviceState

+

A ValentDeviceState

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.InputAdapter.keyboard_keysym.html b/documentation/vfunc.InputAdapter.keyboard_keysym.html new file mode 100644 index 00000000000..5161576f73b --- /dev/null +++ b/documentation/vfunc.InputAdapter.keyboard_keysym.html @@ -0,0 +1,229 @@ + + + + + + Valent.InputAdapter.keyboard_keysym + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentInputAdapterkeyboard_keysym

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+keyboard_keysym (
+  ValentInputAdapter* adapter,
+  uint32_t keysym,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Press or release keysym.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
keysym
+
+

Type: uint32_t

+

A keysym.

+ + + + + + + + + + +
+
+ +
state
+
+

Type: gboolean

+

TRUE to press, or FALSE to release.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.InputAdapter.pointer_axis.html b/documentation/vfunc.InputAdapter.pointer_axis.html new file mode 100644 index 00000000000..127c4d99069 --- /dev/null +++ b/documentation/vfunc.InputAdapter.pointer_axis.html @@ -0,0 +1,230 @@ + + + + + + Valent.InputAdapter.pointer_axis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentInputAdapterpointer_axis

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+pointer_axis (
+  ValentInputAdapter* adapter,
+  double dx,
+  double dy
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Scroll the surface under the pointer (dx, dy), relative to its current position.

+

Implementations should handle any necessary scaling.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dx
+
+

Type: double

+

Movement on x-axis.

+ + + + + + + + + + +
+
+ +
dy
+
+

Type: double

+

Movement on y-axis.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.InputAdapter.pointer_button.html b/documentation/vfunc.InputAdapter.pointer_button.html new file mode 100644 index 00000000000..cb85153634e --- /dev/null +++ b/documentation/vfunc.InputAdapter.pointer_button.html @@ -0,0 +1,229 @@ + + + + + + Valent.InputAdapter.pointer_button + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentInputAdapterpointer_button

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+pointer_button (
+  ValentInputAdapter* adapter,
+  unsigned int button,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Press or release button.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
button
+
+

Type: unsigned int

+

A button number.

+ + + + + + + + + + +
+
+ +
state
+
+

Type: gboolean

+

TRUE to press, or FALSE to release.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.InputAdapter.pointer_motion.html b/documentation/vfunc.InputAdapter.pointer_motion.html new file mode 100644 index 00000000000..00cae4fdce0 --- /dev/null +++ b/documentation/vfunc.InputAdapter.pointer_motion.html @@ -0,0 +1,230 @@ + + + + + + Valent.InputAdapter.pointer_motion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentInputAdapterpointer_motion

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+pointer_motion (
+  ValentInputAdapter* adapter,
+  double dx,
+  double dy
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Move the pointer (dx, dy), relative to its current position.

+

Implementation should handle any necessary scaling.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
dx
+
+

Type: double

+

Movement on x-axis.

+ + + + + + + + + + +
+
+ +
dy
+
+

Type: double

+

Movement on y-axis.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaAdapter.export_player.html b/documentation/vfunc.MediaAdapter.export_player.html new file mode 100644 index 00000000000..fbd890f082e --- /dev/null +++ b/documentation/vfunc.MediaAdapter.export_player.html @@ -0,0 +1,211 @@ + + + + + + Valent.MediaAdapter.export_player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaAdapterexport_player

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+export_player (
+  ValentMediaAdapter* adapter,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Export player on adapter.

+

This method is intended to allow device plugins to expose remote media +players to the host system. Usually this means exporting an interface on +D-Bus or an mDNS service.

+

Implementations must automatically unexport any players when destroyed.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaAdapter.unexport_player.html b/documentation/vfunc.MediaAdapter.unexport_player.html new file mode 100644 index 00000000000..6773f0ecb96 --- /dev/null +++ b/documentation/vfunc.MediaAdapter.unexport_player.html @@ -0,0 +1,207 @@ + + + + + + Valent.MediaAdapter.unexport_player + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaAdapterunexport_player

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+unexport_player (
+  ValentMediaAdapter* adapter,
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Unexport player from adapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
player
+
+

Type: ValentMediaPlayer

+

A ValentMediaPlayer

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_flags.html b/documentation/vfunc.MediaPlayer.get_flags.html new file mode 100644 index 00000000000..90dedb9ce2a --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_flags.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_flags + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_flags

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMediaActions
+get_flags (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get flags describing the available actions of player.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMediaActions

+

A bitmask of ValentMediaActions

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_metadata.html b/documentation/vfunc.MediaPlayer.get_metadata.html new file mode 100644 index 00000000000..d4b6510f159 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_metadata.html @@ -0,0 +1,235 @@ + + + + + + Valent.MediaPlayer.get_metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_metadata

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
GVariant*
+get_metadata (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the metadata of the active media items.

+

Implementations should typically have an entry for the mpris:length field. +Other fields generally supported by KDE Connect clients include +mpris:artUrl, xesam:artist, xesam:album and xesam:title.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: GVariant

+

A GVariant of type a{sv}

+
+
+ + + + + + + +
The caller of the function takes ownership of the data, and is responsible for freeing it.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_name.html b/documentation/vfunc.MediaPlayer.get_name.html new file mode 100644 index 00000000000..250422f481c --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_name.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+get_name (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the display name of the player.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

Player name.

+
+
+ + + + + + + +
The data is owned by the called function.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_position.html b/documentation/vfunc.MediaPlayer.get_position.html new file mode 100644 index 00000000000..c1af547192c --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_position.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_position

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
double
+get_position (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the current position in seconds.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: double

+

Position in seconds.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_repeat.html b/documentation/vfunc.MediaPlayer.get_repeat.html new file mode 100644 index 00000000000..6c865ab33ce --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_repeat.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_repeat

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMediaRepeat
+get_repeat (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the repeat mode for player.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMediaRepeat

+

ValentMediaRepeat

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_shuffle.html b/documentation/vfunc.MediaPlayer.get_shuffle.html new file mode 100644 index 00000000000..0e7a00633bf --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_shuffle.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_shuffle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_shuffle

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+get_shuffle (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether playback order is shuffled.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

The shuffle state.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_state.html b/documentation/vfunc.MediaPlayer.get_state.html new file mode 100644 index 00000000000..14c10f10d62 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_state.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_state + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_state

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMediaState
+get_state (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the playback state for player.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMediaState

+

ValentMediaState

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.get_volume.html b/documentation/vfunc.MediaPlayer.get_volume.html new file mode 100644 index 00000000000..ba02ccebb0f --- /dev/null +++ b/documentation/vfunc.MediaPlayer.get_volume.html @@ -0,0 +1,232 @@ + + + + + + Valent.MediaPlayer.get_volume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerget_volume

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
double
+get_volume (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the volume level.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: double

+

The volume of player.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.next.html b/documentation/vfunc.MediaPlayer.next.html new file mode 100644 index 00000000000..57bf63fc8f6 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.next.html @@ -0,0 +1,210 @@ + + + + + + Valent.MediaPlayer.next + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayernext

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+next (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Skip to the next media item.

+

If there is no next track (and endless playback and track repeat are both +off), stop playback. If playback is paused or stopped, it remains that way.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_NEXT, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.pause.html b/documentation/vfunc.MediaPlayer.pause.html new file mode 100644 index 00000000000..f5b0d7763ff --- /dev/null +++ b/documentation/vfunc.MediaPlayer.pause.html @@ -0,0 +1,211 @@ + + + + + + Valent.MediaPlayer.pause + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerpause

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+pause (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Pauses playback.

+

If playback is already paused, this has no effect. Calling +valent_media_player_pause() after this should cause playback to start +again from the same position.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_PAUSE, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.play.html b/documentation/vfunc.MediaPlayer.play.html new file mode 100644 index 00000000000..bcd79782f99 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.play.html @@ -0,0 +1,210 @@ + + + + + + Valent.MediaPlayer.play + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerplay

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+play (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Start playback.

+

If already playing, this has no effect. If paused, playback resumes from the +current position. If there is no track to play, this has no effect.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_PLAY, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.previous.html b/documentation/vfunc.MediaPlayer.previous.html new file mode 100644 index 00000000000..7836598feb3 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.previous.html @@ -0,0 +1,210 @@ + + + + + + Valent.MediaPlayer.previous + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerprevious

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+previous (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Skip to the previous media item.

+

If there is no previous track (and endless playback and track repeat are both +off), stop playback. If playback is paused or stopped, it remains that way.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_PREVIOUS, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.seek.html b/documentation/vfunc.MediaPlayer.seek.html new file mode 100644 index 00000000000..7d301aab9bb --- /dev/null +++ b/documentation/vfunc.MediaPlayer.seek.html @@ -0,0 +1,244 @@ + + + + + + Valent.MediaPlayer.seek + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerseek

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+seek (
+  ValentMediaPlayer* player,
+  double offset
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Seek in the current media item by offset seconds.

+

A negative value seeks back. If this would mean seeking back further than the +start of the track, the position is set to 0. If the value passed in would +mean seeking beyond the end of the track, acts like a call to valent_media_player_seek().

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_SEEK, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
offset
+
+

Type: double

+

Number of seconds to seek forward.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.set_position.html b/documentation/vfunc.MediaPlayer.set_position.html new file mode 100644 index 00000000000..2a12f99a7fb --- /dev/null +++ b/documentation/vfunc.MediaPlayer.set_position.html @@ -0,0 +1,239 @@ + + + + + + Valent.MediaPlayer.set_position + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerset_position

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_position (
+  ValentMediaPlayer* player,
+  double position
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the current position in seconds.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
position
+
+

Type: double

+

Position in seconds.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.set_repeat.html b/documentation/vfunc.MediaPlayer.set_repeat.html new file mode 100644 index 00000000000..d4ee4cd7d65 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.set_repeat.html @@ -0,0 +1,239 @@ + + + + + + Valent.MediaPlayer.set_repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerset_repeat

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_repeat (
+  ValentMediaPlayer* player,
+  ValentMediaRepeat repeat
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the repeat mode of player to repeat.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
repeat
+
+

Type: ValentMediaRepeat

+

A ValentMediaRepeat

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.set_shuffle.html b/documentation/vfunc.MediaPlayer.set_shuffle.html new file mode 100644 index 00000000000..d01cee4be38 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.set_shuffle.html @@ -0,0 +1,239 @@ + + + + + + Valent.MediaPlayer.set_shuffle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerset_shuffle

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_shuffle (
+  ValentMediaPlayer* player,
+  gboolean shuffle
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set whether playback order is shuffled.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
shuffle
+
+

Type: gboolean

+

Shuffle state.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.set_volume.html b/documentation/vfunc.MediaPlayer.set_volume.html new file mode 100644 index 00000000000..153e4f24264 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.set_volume.html @@ -0,0 +1,239 @@ + + + + + + Valent.MediaPlayer.set_volume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerset_volume

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_volume (
+  ValentMediaPlayer* player,
+  double volume
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the volume level of player.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
volume
+
+

Type: double

+

Volume level.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MediaPlayer.stop.html b/documentation/vfunc.MediaPlayer.stop.html new file mode 100644 index 00000000000..f492016ee69 --- /dev/null +++ b/documentation/vfunc.MediaPlayer.stop.html @@ -0,0 +1,211 @@ + + + + + + Valent.MediaPlayer.stop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMediaPlayerstop

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+stop (
+  ValentMediaPlayer* player
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Stop playback.

+

If playback is already stopped, this has no effect. Calling +valent_media_player_play() after this should cause playback to start again +from the beginning of the track.

+

If ValentMediaPlayer:flags does not include +VALENT_MEDIA_ACTION_STOP, calling this method should have no effect.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerAdapter.get_default_input.html b/documentation/vfunc.MixerAdapter.get_default_input.html new file mode 100644 index 00000000000..8db630ad742 --- /dev/null +++ b/documentation/vfunc.MixerAdapter.get_default_input.html @@ -0,0 +1,204 @@ + + + + + + Valent.MixerAdapter.get_default_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerAdapterget_default_input

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerStream*
+get_default_input (
+  ValentMixerAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default input stream for adapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerAdapter.get_default_output.html b/documentation/vfunc.MixerAdapter.get_default_output.html new file mode 100644 index 00000000000..5b725dcb731 --- /dev/null +++ b/documentation/vfunc.MixerAdapter.get_default_output.html @@ -0,0 +1,204 @@ + + + + + + Valent.MixerAdapter.get_default_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerAdapterget_default_output

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerStream*
+get_default_output (
+  ValentMixerAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the default output stream for adapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+
+
+ + + + + + + +
The data is owned by the called function.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerAdapter.set_default_input.html b/documentation/vfunc.MixerAdapter.set_default_input.html new file mode 100644 index 00000000000..e54ee70a794 --- /dev/null +++ b/documentation/vfunc.MixerAdapter.set_default_input.html @@ -0,0 +1,211 @@ + + + + + + Valent.MixerAdapter.set_default_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerAdapterset_default_input

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_default_input (
+  ValentMixerAdapter* adapter,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default input stream for adapter to stream.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerAdapter.set_default_output.html b/documentation/vfunc.MixerAdapter.set_default_output.html new file mode 100644 index 00000000000..c5d6bf0d7ff --- /dev/null +++ b/documentation/vfunc.MixerAdapter.set_default_output.html @@ -0,0 +1,211 @@ + + + + + + Valent.MixerAdapter.set_default_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerAdapterset_default_output

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_default_output (
+  ValentMixerAdapter* adapter,
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the default output stream for adapter to stream.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
stream
+
+

Type: ValentMixerStream

+

A ValentMixerStream

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.get_description.html b/documentation/vfunc.MixerStream.get_description.html new file mode 100644 index 00000000000..0b68bc6d05e --- /dev/null +++ b/documentation/vfunc.MixerStream.get_description.html @@ -0,0 +1,210 @@ + + + + + + Valent.MixerStream.get_description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamget_description

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+get_description (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the human-readable label of stream.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A stream description.

+
+
+ + + + + + + +
The data is owned by the called function.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.get_direction.html b/documentation/vfunc.MixerStream.get_direction.html new file mode 100644 index 00000000000..afff576f267 --- /dev/null +++ b/documentation/vfunc.MixerStream.get_direction.html @@ -0,0 +1,210 @@ + + + + + + Valent.MixerStream.get_direction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamget_direction

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
ValentMixerDirection
+get_direction (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the port direction of stream.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: ValentMixerDirection

+

The ValentMixerDirection of stream.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.get_level.html b/documentation/vfunc.MixerStream.get_level.html new file mode 100644 index 00000000000..46a8f2a3996 --- /dev/null +++ b/documentation/vfunc.MixerStream.get_level.html @@ -0,0 +1,212 @@ + + + + + + Valent.MixerStream.get_level + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamget_level

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
unsigned int
+get_level (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the level of stream (eg. speaker volume, microphone sensitivity).

+

Implementations that override this method should also override +Valent.MixerStreamClass.set_level.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: unsigned int

+

A volume level between 0 and 100

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.get_muted.html b/documentation/vfunc.MixerStream.get_muted.html new file mode 100644 index 00000000000..cb2c7950705 --- /dev/null +++ b/documentation/vfunc.MixerStream.get_muted.html @@ -0,0 +1,212 @@ + + + + + + Valent.MixerStream.get_muted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamget_muted

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+get_muted (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the muted state of stream.

+

Implementations that override this method should also override +Valent.MixerStreamClass.set_muted.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if the stream is muted, or FALSE if not.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.get_name.html b/documentation/vfunc.MixerStream.get_name.html new file mode 100644 index 00000000000..37c240111ba --- /dev/null +++ b/documentation/vfunc.MixerStream.get_name.html @@ -0,0 +1,210 @@ + + + + + + Valent.MixerStream.get_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamget_name

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
const char*
+get_name (
+  ValentMixerStream* stream
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get the unique name of stream.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: const char*

+

A unique name.

+
+
+ + + + + + + +
The data is owned by the called function.
The value is a NUL terminated UTF-8 string.
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.set_level.html b/documentation/vfunc.MixerStream.set_level.html new file mode 100644 index 00000000000..0b0c02d8176 --- /dev/null +++ b/documentation/vfunc.MixerStream.set_level.html @@ -0,0 +1,219 @@ + + + + + + Valent.MixerStream.set_level + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamset_level

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_level (
+  ValentMixerStream* stream,
+  unsigned int level
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the level of stream (eg. speaker volume, microphone sensitivity).

+

Implementations that override this method should also override +Valent.MixerStreamClass.get_level.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
level
+
+

Type: unsigned int

+

A volume level between 0 and 100

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.MixerStream.set_muted.html b/documentation/vfunc.MixerStream.set_muted.html new file mode 100644 index 00000000000..5d36a0bd079 --- /dev/null +++ b/documentation/vfunc.MixerStream.set_muted.html @@ -0,0 +1,219 @@ + + + + + + Valent.MixerStream.set_muted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentMixerStreamset_muted

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_muted (
+  ValentMixerStream* stream,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set the muted state of stream.

+

Implementations that override this method should also override +Valent.MixerStreamClass.get_muted.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: gboolean

+

Whether the stream should be muted.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.NotificationsAdapter.add_notification.html b/documentation/vfunc.NotificationsAdapter.add_notification.html new file mode 100644 index 00000000000..b9336f2ffe1 --- /dev/null +++ b/documentation/vfunc.NotificationsAdapter.add_notification.html @@ -0,0 +1,211 @@ + + + + + + Valent.NotificationsAdapter.add_notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentNotificationsAdapteradd_notification

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+add_notification (
+  ValentNotificationsAdapter* adapter,
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Send notification to the adapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.NotificationsAdapter.notification_added.html b/documentation/vfunc.NotificationsAdapter.notification_added.html new file mode 100644 index 00000000000..f8f00ab5451 --- /dev/null +++ b/documentation/vfunc.NotificationsAdapter.notification_added.html @@ -0,0 +1,213 @@ + + + + + + Valent.NotificationsAdapter.notification_added + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentNotificationsAdapternotification_added

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+notification_added (
+  ValentNotificationsAdapter* adapter,
+  ValentNotification* notification
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit ValentNotificationsAdapter::notification-added on adapter.

+

This method should only be called by implementations of +ValentNotificationsAdapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
notification
+
+

Type: ValentNotification

+

A ValentNotification

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.NotificationsAdapter.notification_removed.html b/documentation/vfunc.NotificationsAdapter.notification_removed.html new file mode 100644 index 00000000000..f00acb136d0 --- /dev/null +++ b/documentation/vfunc.NotificationsAdapter.notification_removed.html @@ -0,0 +1,213 @@ + + + + + + Valent.NotificationsAdapter.notification_removed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentNotificationsAdapternotification_removed

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+notification_removed (
+  ValentNotificationsAdapter* adapter,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Emit ValentNotificationsAdapter::notification-removed on adapter.

+

This method should only be called by implementations of +ValentNotificationsAdapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

A notification id.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.NotificationsAdapter.remove_notification.html b/documentation/vfunc.NotificationsAdapter.remove_notification.html new file mode 100644 index 00000000000..7e7dc036bf4 --- /dev/null +++ b/documentation/vfunc.NotificationsAdapter.remove_notification.html @@ -0,0 +1,211 @@ + + + + + + Valent.NotificationsAdapter.remove_notification + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentNotificationsAdapterremove_notification

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+remove_notification (
+  ValentNotificationsAdapter* adapter,
+  const char* id
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Withdraw id from adapter.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
id
+
+

Type: const char*

+

A notification id.

+ + + + + + + + + + +
The data is owned by the caller of the function.
The value is a NUL terminated UTF-8 string.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Object.destroy.html b/documentation/vfunc.Object.destroy.html new file mode 100644 index 00000000000..c218dcb4a48 --- /dev/null +++ b/documentation/vfunc.Object.destroy.html @@ -0,0 +1,177 @@ + + + + + + Valent.Object.destroy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentObjectdestroy

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+destroy (
+  ValentObject* object
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Destroy the object.

+

If called from the main thread, it calls g_object_run_dispose(), +which activates the object GCancellable and emits +ValentObject::destroy.

+

If called from another thread, an idle source will be added to invoke it on +the main thread.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.SessionAdapter.get_active.html b/documentation/vfunc.SessionAdapter.get_active.html new file mode 100644 index 00000000000..0337cc317db --- /dev/null +++ b/documentation/vfunc.SessionAdapter.get_active.html @@ -0,0 +1,202 @@ + + + + + + Valent.SessionAdapter.get_active + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentSessionAdapterget_active

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+get_active (
+  ValentSessionAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether the session is active.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if active, FALSE if idle.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.SessionAdapter.get_locked.html b/documentation/vfunc.SessionAdapter.get_locked.html new file mode 100644 index 00000000000..6585e780c0d --- /dev/null +++ b/documentation/vfunc.SessionAdapter.get_locked.html @@ -0,0 +1,202 @@ + + + + + + Valent.SessionAdapter.get_locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentSessionAdapterget_locked

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+get_locked (
+  ValentSessionAdapter* adapter
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Get whether the session is locked.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if locked, FALSE if unlocked.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.SessionAdapter.set_locked.html b/documentation/vfunc.SessionAdapter.set_locked.html new file mode 100644 index 00000000000..037e7ee098b --- /dev/null +++ b/documentation/vfunc.SessionAdapter.set_locked.html @@ -0,0 +1,209 @@ + + + + + + Valent.SessionAdapter.set_locked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentSessionAdapterset_locked

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+set_locked (
+  ValentSessionAdapter* adapter,
+  gboolean state
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Set whether the session is locked.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
state
+
+

Type: gboolean

+

TRUE to lock, FALSE to unlock.

+ + + + + + + + + + +
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Transfer.execute.html b/documentation/vfunc.Transfer.execute.html new file mode 100644 index 00000000000..5e2989c1c90 --- /dev/null +++ b/documentation/vfunc.Transfer.execute.html @@ -0,0 +1,246 @@ + + + + + + Valent.Transfer.execute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentTransferexecute

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
void
+execute (
+  ValentTransfer* transfer,
+  GCancellable* cancellable,
+  GAsyncReadyCallback callback,
+  gpointer user_data
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Start the transfer operation.

+

Get the result with valent_transfer_execute_finish().

+

If the transfer operation has already started, this call will fail and +valent_transfer_execute_finish() will return G_IO_ERROR_PENDING.

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
cancellable
+
+

Type: GCancellable

+

A GCancellable

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ +
callback
+
+

Type: GAsyncReadyCallback

+

A GAsyncReadyCallback

+ + + + + + + + + + +
+
+ +
user_data
+
+

Type: gpointer

+

User supplied data.

+ + + + + + + + + + +
The argument can be NULL.
The data is owned by the caller of the function.
+
+ + + +
+
+
+ + + + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/documentation/vfunc.Transfer.execute_finish.html b/documentation/vfunc.Transfer.execute_finish.html new file mode 100644 index 00000000000..7fb8508b4a1 --- /dev/null +++ b/documentation/vfunc.Transfer.execute_finish.html @@ -0,0 +1,246 @@ + + + + + + Valent.Transfer.execute_finish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+

Virtual Method

+

ValentTransferexecute_finish

+
+ +
+
+

unstable since: 1.0

+
+ +
+

+ Declaration + + + [src] + +

+ +
+
gboolean
+execute_finish (
+  ValentTransfer* transfer,
+  GAsyncResult* result,
+  GError** error
+)
+
+
+
+
+ +
+

+ Description + + + [src] + +

+ +
+

Finish an operation started by valent_transfer_execute().

+
+ +
+ +

Available since: 1.0

+ +
+ + +
+ + +
+

+ Parameters + +

+ +
+
+ +
result
+
+

Type: GAsyncResult

+

A GAsyncResult

+ + + + + + + + + + +
The data is owned by the caller of the function.
+
+ + + +
error
+
+

Type: GError **

+

The return location for a recoverable error.

+ + + + + +
The argument can be NULL.
If the return location is not NULL, then you must initialize it to a NULL GError*.
The argument will be left initialized to NULL by the virtual function if there are no errors.
In case of error, the argument will be set to a newly allocated GError; the caller will take ownership of the data, and be responsible for freeing it.
+
+ +
+
+
+ + + +
+

+ Return value + +

+ +
+
+
+

Type: gboolean

+

TRUE if successful, or FALSE with error set.

+
+
+ + + + + + + +
+
+
+
+
+ + +
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 00000000000..9100c811747 Binary files /dev/null and b/favicon.ico differ diff --git a/index.html b/index.html new file mode 100644 index 00000000000..a3ed00c1498 --- /dev/null +++ b/index.html @@ -0,0 +1,170 @@ + + + + + + + Valent + + + + + + + + + + + + + + + +
+

+ + + + + + + Valent +

+
+ +
+

Connect, control and sync devices

+

+ Securely connect your devices to open files and links where you need + them, get notifications when you need them, stay in control of your + media and more. +

+
+ +
+

Nightly Builds

+ +
+ +
+
+
+

Usage

+ +
+ +
+

Development

+ +
+
+
+ + + + diff --git a/logo.svg b/logo.svg new file mode 100644 index 00000000000..fdb63296c6e --- /dev/null +++ b/logo.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/repo/.lock b/repo/.lock new file mode 100644 index 00000000000..e69de29bb2d diff --git a/repo/config b/repo/config new file mode 100644 index 00000000000..d289d741be5 --- /dev/null +++ b/repo/config @@ -0,0 +1,4 @@ +[core] +repo_version=1 +mode=archive-z2 +indexed-deltas=true diff --git a/repo/objects/00/090aeb463c76b5120289fb616104b30598a046b79320d87b00c6e39ee9af32.filez b/repo/objects/00/090aeb463c76b5120289fb616104b30598a046b79320d87b00c6e39ee9af32.filez new file mode 100644 index 00000000000..bedcd0fe984 Binary files /dev/null and b/repo/objects/00/090aeb463c76b5120289fb616104b30598a046b79320d87b00c6e39ee9af32.filez differ diff --git a/repo/objects/00/4488635448d6ebd5e9bcd087f463b059005f30705ba7652fffa5515f6af25a.filez b/repo/objects/00/4488635448d6ebd5e9bcd087f463b059005f30705ba7652fffa5515f6af25a.filez new file mode 100644 index 00000000000..d33cec7f1c4 Binary files /dev/null and b/repo/objects/00/4488635448d6ebd5e9bcd087f463b059005f30705ba7652fffa5515f6af25a.filez differ diff --git a/repo/objects/00/4951087ccdc903fb41748d90a3e3ee40f30baa2d06207ccb743976603b1001.filez b/repo/objects/00/4951087ccdc903fb41748d90a3e3ee40f30baa2d06207ccb743976603b1001.filez new file mode 100644 index 00000000000..28d9f9949bd Binary files /dev/null and b/repo/objects/00/4951087ccdc903fb41748d90a3e3ee40f30baa2d06207ccb743976603b1001.filez differ diff --git a/repo/objects/00/7033c385278254b34fdf05510aed76c155ac03de0650d63269a920c8ff5a2e.dirtree b/repo/objects/00/7033c385278254b34fdf05510aed76c155ac03de0650d63269a920c8ff5a2e.dirtree new file mode 100644 index 00000000000..219318cf9e4 Binary files /dev/null and b/repo/objects/00/7033c385278254b34fdf05510aed76c155ac03de0650d63269a920c8ff5a2e.dirtree differ diff --git a/repo/objects/00/98d7f0eaac2b675b438369494db4f747e75eadc2e6157360f046178c109d3c.dirtree b/repo/objects/00/98d7f0eaac2b675b438369494db4f747e75eadc2e6157360f046178c109d3c.dirtree new file mode 100644 index 00000000000..e29b8427e8c Binary files /dev/null and b/repo/objects/00/98d7f0eaac2b675b438369494db4f747e75eadc2e6157360f046178c109d3c.dirtree differ diff --git a/repo/objects/00/9b0478d8769c8841d43248fa8c913f47d7d0a71c909f8678da4a5270dca14e.filez b/repo/objects/00/9b0478d8769c8841d43248fa8c913f47d7d0a71c909f8678da4a5270dca14e.filez new file mode 100644 index 00000000000..a7da9db4fb5 Binary files /dev/null and b/repo/objects/00/9b0478d8769c8841d43248fa8c913f47d7d0a71c909f8678da4a5270dca14e.filez differ diff --git a/repo/objects/00/9b398fe9ad21efeb6818a770dd0c348291cfcd5b119c7116e63ff6dd80221a.filez b/repo/objects/00/9b398fe9ad21efeb6818a770dd0c348291cfcd5b119c7116e63ff6dd80221a.filez new file mode 100644 index 00000000000..56970d8d83e Binary files /dev/null and b/repo/objects/00/9b398fe9ad21efeb6818a770dd0c348291cfcd5b119c7116e63ff6dd80221a.filez differ diff --git a/repo/objects/00/a5d8007be4342bdac20f1d49c0ae28cff11727a651c89209d428c2dc36b55a.filez b/repo/objects/00/a5d8007be4342bdac20f1d49c0ae28cff11727a651c89209d428c2dc36b55a.filez new file mode 100644 index 00000000000..60077c310ff Binary files /dev/null and b/repo/objects/00/a5d8007be4342bdac20f1d49c0ae28cff11727a651c89209d428c2dc36b55a.filez differ diff --git a/repo/objects/00/ff310e4e22c8572af4656525517931111f721d00a7132f3cae3dc8c7c60e7e.filez b/repo/objects/00/ff310e4e22c8572af4656525517931111f721d00a7132f3cae3dc8c7c60e7e.filez new file mode 100644 index 00000000000..983a33241c0 Binary files /dev/null and b/repo/objects/00/ff310e4e22c8572af4656525517931111f721d00a7132f3cae3dc8c7c60e7e.filez differ diff --git a/repo/objects/01/3359e25042aa44f91dff7fcf121ed812a1ab0cc4fae650208553e33531807a.dirtree b/repo/objects/01/3359e25042aa44f91dff7fcf121ed812a1ab0cc4fae650208553e33531807a.dirtree new file mode 100644 index 00000000000..b691413e84e Binary files /dev/null and b/repo/objects/01/3359e25042aa44f91dff7fcf121ed812a1ab0cc4fae650208553e33531807a.dirtree differ diff --git a/repo/objects/01/33ce1558ee0b331496710bc119061753f30a0e4d120123ec45d1fa86e300ee.filez b/repo/objects/01/33ce1558ee0b331496710bc119061753f30a0e4d120123ec45d1fa86e300ee.filez new file mode 100644 index 00000000000..74e9f29180e Binary files /dev/null and b/repo/objects/01/33ce1558ee0b331496710bc119061753f30a0e4d120123ec45d1fa86e300ee.filez differ diff --git a/repo/objects/01/44fc0bf2cb8ce197663fb9767e4bc54cb4748b7446a75807db063f01ec92b9.filez b/repo/objects/01/44fc0bf2cb8ce197663fb9767e4bc54cb4748b7446a75807db063f01ec92b9.filez new file mode 100644 index 00000000000..5458688f588 Binary files /dev/null and b/repo/objects/01/44fc0bf2cb8ce197663fb9767e4bc54cb4748b7446a75807db063f01ec92b9.filez differ diff --git a/repo/objects/01/580a69eebe821dfca5fd56adb56522ed0d6d4d3735af604eaa312f5283751b.filez b/repo/objects/01/580a69eebe821dfca5fd56adb56522ed0d6d4d3735af604eaa312f5283751b.filez new file mode 100644 index 00000000000..e4a899c2018 Binary files /dev/null and b/repo/objects/01/580a69eebe821dfca5fd56adb56522ed0d6d4d3735af604eaa312f5283751b.filez differ diff --git a/repo/objects/01/6814aa7093125adc07494a6db75a5eae9a4d77d97d2644068f1a1e3c348e42.filez b/repo/objects/01/6814aa7093125adc07494a6db75a5eae9a4d77d97d2644068f1a1e3c348e42.filez new file mode 100644 index 00000000000..7d83f6f2c6c Binary files /dev/null and b/repo/objects/01/6814aa7093125adc07494a6db75a5eae9a4d77d97d2644068f1a1e3c348e42.filez differ diff --git a/repo/objects/01/9c67269f3266c440c16b63840e18365cc952daab4fc31f64d4f93754b354bc.filez b/repo/objects/01/9c67269f3266c440c16b63840e18365cc952daab4fc31f64d4f93754b354bc.filez new file mode 100644 index 00000000000..3fe1432567e Binary files /dev/null and b/repo/objects/01/9c67269f3266c440c16b63840e18365cc952daab4fc31f64d4f93754b354bc.filez differ diff --git a/repo/objects/01/9f4258d7a924b3a2bc87bb90da5ecc0f422e0faea6209b4f9823eab0029829.dirtree b/repo/objects/01/9f4258d7a924b3a2bc87bb90da5ecc0f422e0faea6209b4f9823eab0029829.dirtree new file mode 100644 index 00000000000..9ba68816fca Binary files /dev/null and b/repo/objects/01/9f4258d7a924b3a2bc87bb90da5ecc0f422e0faea6209b4f9823eab0029829.dirtree differ diff --git a/repo/objects/01/b11a522401b0324446973d5a8144c0f00fe1aa6a75c4396521f66149e64217.filez b/repo/objects/01/b11a522401b0324446973d5a8144c0f00fe1aa6a75c4396521f66149e64217.filez new file mode 100644 index 00000000000..f21e32e0438 Binary files /dev/null and b/repo/objects/01/b11a522401b0324446973d5a8144c0f00fe1aa6a75c4396521f66149e64217.filez differ diff --git a/repo/objects/01/ce38e456e24d6d7db5347149ef4669bfb70069529bd95f464410bff5817c34.filez b/repo/objects/01/ce38e456e24d6d7db5347149ef4669bfb70069529bd95f464410bff5817c34.filez new file mode 100644 index 00000000000..06ae1d09462 Binary files /dev/null and b/repo/objects/01/ce38e456e24d6d7db5347149ef4669bfb70069529bd95f464410bff5817c34.filez differ diff --git a/repo/objects/01/e78d5ec934fdad1db8063d57d475ee555c744418575ae4735810afcb6a8699.filez b/repo/objects/01/e78d5ec934fdad1db8063d57d475ee555c744418575ae4735810afcb6a8699.filez new file mode 100644 index 00000000000..bf77cc16e1e Binary files /dev/null and b/repo/objects/01/e78d5ec934fdad1db8063d57d475ee555c744418575ae4735810afcb6a8699.filez differ diff --git a/repo/objects/01/f787ea9084b6bb84b967f44f4d25bed05f42d7819090ab9c1ae5ca03769cf1.filez b/repo/objects/01/f787ea9084b6bb84b967f44f4d25bed05f42d7819090ab9c1ae5ca03769cf1.filez new file mode 100644 index 00000000000..c411d25bc33 Binary files /dev/null and b/repo/objects/01/f787ea9084b6bb84b967f44f4d25bed05f42d7819090ab9c1ae5ca03769cf1.filez differ diff --git a/repo/objects/02/10234f349cbcb5bee4130006d5a188b5622e8ca22c8faea2feb197a684ceee.dirtree b/repo/objects/02/10234f349cbcb5bee4130006d5a188b5622e8ca22c8faea2feb197a684ceee.dirtree new file mode 100644 index 00000000000..007391d73ca Binary files /dev/null and b/repo/objects/02/10234f349cbcb5bee4130006d5a188b5622e8ca22c8faea2feb197a684ceee.dirtree differ diff --git a/repo/objects/02/2979aebbe3e07353df753794830cbefa3eb8fcc5a6607ab7a2118e09213f42.filez b/repo/objects/02/2979aebbe3e07353df753794830cbefa3eb8fcc5a6607ab7a2118e09213f42.filez new file mode 100644 index 00000000000..d701f97406b Binary files /dev/null and b/repo/objects/02/2979aebbe3e07353df753794830cbefa3eb8fcc5a6607ab7a2118e09213f42.filez differ diff --git a/repo/objects/02/abc8d4ace443fc940d74704787e9d955523cc485ea9133483a70e3adf56a63.filez b/repo/objects/02/abc8d4ace443fc940d74704787e9d955523cc485ea9133483a70e3adf56a63.filez new file mode 100644 index 00000000000..54c023464dc Binary files /dev/null and b/repo/objects/02/abc8d4ace443fc940d74704787e9d955523cc485ea9133483a70e3adf56a63.filez differ diff --git a/repo/objects/02/b9e19f29cb8a3b76bed6e57685e251b60fe4fdb2368886ce875bbc8152049c.filez b/repo/objects/02/b9e19f29cb8a3b76bed6e57685e251b60fe4fdb2368886ce875bbc8152049c.filez new file mode 100644 index 00000000000..ffafc0f26c3 Binary files /dev/null and b/repo/objects/02/b9e19f29cb8a3b76bed6e57685e251b60fe4fdb2368886ce875bbc8152049c.filez differ diff --git a/repo/objects/02/e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5.commit b/repo/objects/02/e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5.commit new file mode 100644 index 00000000000..ba1874d3783 Binary files /dev/null and b/repo/objects/02/e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5.commit differ diff --git a/repo/objects/02/e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5.commitmeta b/repo/objects/02/e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5.commitmeta new file mode 100644 index 00000000000..64397bbb619 Binary files /dev/null and b/repo/objects/02/e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5.commitmeta differ diff --git a/repo/objects/02/f546fed841e4f17fc0585e881dd83e18022cdbec9223a181c9ccc4af5600d0.filez b/repo/objects/02/f546fed841e4f17fc0585e881dd83e18022cdbec9223a181c9ccc4af5600d0.filez new file mode 100644 index 00000000000..63c45933883 Binary files /dev/null and b/repo/objects/02/f546fed841e4f17fc0585e881dd83e18022cdbec9223a181c9ccc4af5600d0.filez differ diff --git a/repo/objects/03/196842c7494a9324c4a992f2085b14918fc381d92086e1216ac88db04bf366.filez b/repo/objects/03/196842c7494a9324c4a992f2085b14918fc381d92086e1216ac88db04bf366.filez new file mode 100644 index 00000000000..fb0ab2be9ba Binary files /dev/null and b/repo/objects/03/196842c7494a9324c4a992f2085b14918fc381d92086e1216ac88db04bf366.filez differ diff --git a/repo/objects/03/4a69ef2299eaec2ecc5742f4580ea1fdbac095b448c206e19543d34474685f.dirtree b/repo/objects/03/4a69ef2299eaec2ecc5742f4580ea1fdbac095b448c206e19543d34474685f.dirtree new file mode 100644 index 00000000000..6b00da49144 Binary files /dev/null and b/repo/objects/03/4a69ef2299eaec2ecc5742f4580ea1fdbac095b448c206e19543d34474685f.dirtree differ diff --git a/repo/objects/03/91f71fcef539b2e63ecd91127941a2d3f6065753c70553e76936764f0b1480.filez b/repo/objects/03/91f71fcef539b2e63ecd91127941a2d3f6065753c70553e76936764f0b1480.filez new file mode 100644 index 00000000000..fc47352c85d Binary files /dev/null and b/repo/objects/03/91f71fcef539b2e63ecd91127941a2d3f6065753c70553e76936764f0b1480.filez differ diff --git a/repo/objects/03/a17a00d190f0f99a2bc2ec7bb10f6dd2a641d48d007618c648739735c3a569.filez b/repo/objects/03/a17a00d190f0f99a2bc2ec7bb10f6dd2a641d48d007618c648739735c3a569.filez new file mode 100644 index 00000000000..0de310d442e Binary files /dev/null and b/repo/objects/03/a17a00d190f0f99a2bc2ec7bb10f6dd2a641d48d007618c648739735c3a569.filez differ diff --git a/repo/objects/03/a80d09f7db13a3bf9e26f3508d8913dd31d8c928965017fb69f69850e22249.filez b/repo/objects/03/a80d09f7db13a3bf9e26f3508d8913dd31d8c928965017fb69f69850e22249.filez new file mode 100644 index 00000000000..a6b4bab2491 Binary files /dev/null and b/repo/objects/03/a80d09f7db13a3bf9e26f3508d8913dd31d8c928965017fb69f69850e22249.filez differ diff --git a/repo/objects/03/c5b6ec8842db36de3e1b6498540fa7342c11911149fc6a1092bb18ccef6bf6.filez b/repo/objects/03/c5b6ec8842db36de3e1b6498540fa7342c11911149fc6a1092bb18ccef6bf6.filez new file mode 100644 index 00000000000..8289f3e4887 Binary files /dev/null and b/repo/objects/03/c5b6ec8842db36de3e1b6498540fa7342c11911149fc6a1092bb18ccef6bf6.filez differ diff --git a/repo/objects/03/cbf8032f7aa0b3e2fe8d5ac508bcec62b4b6ae227e0c12f39075ef8053c75b.dirtree b/repo/objects/03/cbf8032f7aa0b3e2fe8d5ac508bcec62b4b6ae227e0c12f39075ef8053c75b.dirtree new file mode 100644 index 00000000000..2cc1cf4ae41 Binary files /dev/null and b/repo/objects/03/cbf8032f7aa0b3e2fe8d5ac508bcec62b4b6ae227e0c12f39075ef8053c75b.dirtree differ diff --git a/repo/objects/03/f771e8fb96219c0a1b939566b9176c74bd25e15d3e11b4fe0e594d8459bb77.filez b/repo/objects/03/f771e8fb96219c0a1b939566b9176c74bd25e15d3e11b4fe0e594d8459bb77.filez new file mode 100644 index 00000000000..1e493251bf7 Binary files /dev/null and b/repo/objects/03/f771e8fb96219c0a1b939566b9176c74bd25e15d3e11b4fe0e594d8459bb77.filez differ diff --git a/repo/objects/04/2f4b277cc9e82eaf8607aa6b01995c4eb50f0ac58c493b8c70640d8a6b8b3f.filez b/repo/objects/04/2f4b277cc9e82eaf8607aa6b01995c4eb50f0ac58c493b8c70640d8a6b8b3f.filez new file mode 100644 index 00000000000..7c78c12a061 Binary files /dev/null and b/repo/objects/04/2f4b277cc9e82eaf8607aa6b01995c4eb50f0ac58c493b8c70640d8a6b8b3f.filez differ diff --git a/repo/objects/04/48bc8f1b4075e21b84c70f5e3179fb6a36be58150408f7ada4e3892311d49d.filez b/repo/objects/04/48bc8f1b4075e21b84c70f5e3179fb6a36be58150408f7ada4e3892311d49d.filez new file mode 100644 index 00000000000..26e3a1c461e Binary files /dev/null and b/repo/objects/04/48bc8f1b4075e21b84c70f5e3179fb6a36be58150408f7ada4e3892311d49d.filez differ diff --git a/repo/objects/04/6ac22c6eecb259fea0be13a08f1521a5a2b6c1f4b36f2a3dddef3833a56600.dirtree b/repo/objects/04/6ac22c6eecb259fea0be13a08f1521a5a2b6c1f4b36f2a3dddef3833a56600.dirtree new file mode 100644 index 00000000000..14d079c9843 Binary files /dev/null and b/repo/objects/04/6ac22c6eecb259fea0be13a08f1521a5a2b6c1f4b36f2a3dddef3833a56600.dirtree differ diff --git a/repo/objects/04/6f3cae3ddf1b31319a13e35f3b35dba4f1cd6a59f99b590f50780bc2b554e4.filez b/repo/objects/04/6f3cae3ddf1b31319a13e35f3b35dba4f1cd6a59f99b590f50780bc2b554e4.filez new file mode 100644 index 00000000000..3290834861e Binary files /dev/null and b/repo/objects/04/6f3cae3ddf1b31319a13e35f3b35dba4f1cd6a59f99b590f50780bc2b554e4.filez differ diff --git a/repo/objects/04/74b4d5ed9b6712340c88f83853a37ed19355d3c179f6f9870ddbb7d55adc16.filez b/repo/objects/04/74b4d5ed9b6712340c88f83853a37ed19355d3c179f6f9870ddbb7d55adc16.filez new file mode 100644 index 00000000000..80098cfc279 Binary files /dev/null and b/repo/objects/04/74b4d5ed9b6712340c88f83853a37ed19355d3c179f6f9870ddbb7d55adc16.filez differ diff --git a/repo/objects/04/75d5f0e35da58b0a3c99edfc8d7b6b902b74b2566fc889f9734afaac864769.dirtree b/repo/objects/04/75d5f0e35da58b0a3c99edfc8d7b6b902b74b2566fc889f9734afaac864769.dirtree new file mode 100644 index 00000000000..bc42acbf57f Binary files /dev/null and b/repo/objects/04/75d5f0e35da58b0a3c99edfc8d7b6b902b74b2566fc889f9734afaac864769.dirtree differ diff --git a/repo/objects/04/9ee6d49386e10845f225a80e43dd820a7bac665aac4a51da984f62f59e3f60.filez b/repo/objects/04/9ee6d49386e10845f225a80e43dd820a7bac665aac4a51da984f62f59e3f60.filez new file mode 100644 index 00000000000..35c8ccddf1a Binary files /dev/null and b/repo/objects/04/9ee6d49386e10845f225a80e43dd820a7bac665aac4a51da984f62f59e3f60.filez differ diff --git a/repo/objects/04/c6d6cc1084e6a6975ef119f2e555131b07af6998701d136902f0801d4c80ea.filez b/repo/objects/04/c6d6cc1084e6a6975ef119f2e555131b07af6998701d136902f0801d4c80ea.filez new file mode 100644 index 00000000000..d20c2adeef4 Binary files /dev/null and b/repo/objects/04/c6d6cc1084e6a6975ef119f2e555131b07af6998701d136902f0801d4c80ea.filez differ diff --git a/repo/objects/04/c90ce764cfdd28deea4559c934439697a5ff0e01a99be47431c5a04c212d4f.filez b/repo/objects/04/c90ce764cfdd28deea4559c934439697a5ff0e01a99be47431c5a04c212d4f.filez new file mode 100644 index 00000000000..e694092767a Binary files /dev/null and b/repo/objects/04/c90ce764cfdd28deea4559c934439697a5ff0e01a99be47431c5a04c212d4f.filez differ diff --git a/repo/objects/04/caee0784fd8f04330115c69f09109c4657885078a10bc83fda9bce8e484dfd.dirtree b/repo/objects/04/caee0784fd8f04330115c69f09109c4657885078a10bc83fda9bce8e484dfd.dirtree new file mode 100644 index 00000000000..60b4709ae2f Binary files /dev/null and b/repo/objects/04/caee0784fd8f04330115c69f09109c4657885078a10bc83fda9bce8e484dfd.dirtree differ diff --git a/repo/objects/04/e367d5a5552c5ed03663e806f1ebb889eab689de578c04bbc37b2046dc8494.filez b/repo/objects/04/e367d5a5552c5ed03663e806f1ebb889eab689de578c04bbc37b2046dc8494.filez new file mode 100644 index 00000000000..411e903daf5 Binary files /dev/null and b/repo/objects/04/e367d5a5552c5ed03663e806f1ebb889eab689de578c04bbc37b2046dc8494.filez differ diff --git a/repo/objects/05/1795e9c5042f6767452589a52de2d2aee4c1b778e0d5b88e7144089c4472ec.filez b/repo/objects/05/1795e9c5042f6767452589a52de2d2aee4c1b778e0d5b88e7144089c4472ec.filez new file mode 100644 index 00000000000..f5bbdccf091 Binary files /dev/null and b/repo/objects/05/1795e9c5042f6767452589a52de2d2aee4c1b778e0d5b88e7144089c4472ec.filez differ diff --git a/repo/objects/05/19b376e79a168858172efeea9ac8501fd1290c9cbaa3b00b88c77a509ea8fb.filez b/repo/objects/05/19b376e79a168858172efeea9ac8501fd1290c9cbaa3b00b88c77a509ea8fb.filez new file mode 100644 index 00000000000..9d3412a1fd0 Binary files /dev/null and b/repo/objects/05/19b376e79a168858172efeea9ac8501fd1290c9cbaa3b00b88c77a509ea8fb.filez differ diff --git a/repo/objects/05/1cf3db8b74d43930478787b1a7aa5c204d47c793ba36c628ef28c964416674.filez b/repo/objects/05/1cf3db8b74d43930478787b1a7aa5c204d47c793ba36c628ef28c964416674.filez new file mode 100644 index 00000000000..66d83c683bc Binary files /dev/null and b/repo/objects/05/1cf3db8b74d43930478787b1a7aa5c204d47c793ba36c628ef28c964416674.filez differ diff --git a/repo/objects/05/42fe6efdb4602104dac19c5bdd4585854ab84438a12e511dd5e09510b99ac4.filez b/repo/objects/05/42fe6efdb4602104dac19c5bdd4585854ab84438a12e511dd5e09510b99ac4.filez new file mode 100644 index 00000000000..99569edaad0 Binary files /dev/null and b/repo/objects/05/42fe6efdb4602104dac19c5bdd4585854ab84438a12e511dd5e09510b99ac4.filez differ diff --git a/repo/objects/05/4493749fc72071b9e5e61cf9be6e69d293be463bbaae872960dc86535df039.filez b/repo/objects/05/4493749fc72071b9e5e61cf9be6e69d293be463bbaae872960dc86535df039.filez new file mode 100644 index 00000000000..bca0e6e205b Binary files /dev/null and b/repo/objects/05/4493749fc72071b9e5e61cf9be6e69d293be463bbaae872960dc86535df039.filez differ diff --git a/repo/objects/05/5315323354eaf0eee5b7c4b4409d1502514dea5fff1971a0fb7bf4d11b2991.filez b/repo/objects/05/5315323354eaf0eee5b7c4b4409d1502514dea5fff1971a0fb7bf4d11b2991.filez new file mode 100644 index 00000000000..24004c4f327 Binary files /dev/null and b/repo/objects/05/5315323354eaf0eee5b7c4b4409d1502514dea5fff1971a0fb7bf4d11b2991.filez differ diff --git a/repo/objects/05/65e4a3444e184d9ff0872d201868d67a8bf368cd20e6d757449a5704ca0cdc.dirtree b/repo/objects/05/65e4a3444e184d9ff0872d201868d67a8bf368cd20e6d757449a5704ca0cdc.dirtree new file mode 100644 index 00000000000..dd214937c58 Binary files /dev/null and b/repo/objects/05/65e4a3444e184d9ff0872d201868d67a8bf368cd20e6d757449a5704ca0cdc.dirtree differ diff --git a/repo/objects/05/6e685d650a406a3e1a5c7da886bd05e4540ae9c5c0497fda04fc24b842583d.dirtree b/repo/objects/05/6e685d650a406a3e1a5c7da886bd05e4540ae9c5c0497fda04fc24b842583d.dirtree new file mode 100644 index 00000000000..f2443a1b2ac Binary files /dev/null and b/repo/objects/05/6e685d650a406a3e1a5c7da886bd05e4540ae9c5c0497fda04fc24b842583d.dirtree differ diff --git a/repo/objects/05/72668f08f3ac7cf819cf02177d93faeea1f33da312621b1e0950d7d5176485.filez b/repo/objects/05/72668f08f3ac7cf819cf02177d93faeea1f33da312621b1e0950d7d5176485.filez new file mode 100644 index 00000000000..e06ccacfad9 Binary files /dev/null and b/repo/objects/05/72668f08f3ac7cf819cf02177d93faeea1f33da312621b1e0950d7d5176485.filez differ diff --git a/repo/objects/05/79f83fd121b366f69e73c426aa95e707fd46812f11f4891fa3a991812a5bf2.filez b/repo/objects/05/79f83fd121b366f69e73c426aa95e707fd46812f11f4891fa3a991812a5bf2.filez new file mode 100644 index 00000000000..b8b14be8ebb Binary files /dev/null and b/repo/objects/05/79f83fd121b366f69e73c426aa95e707fd46812f11f4891fa3a991812a5bf2.filez differ diff --git a/repo/objects/05/7c8f68d08d46486ff56e4f99273a98e43896ac3845caed3135703d53aa6c24.filez b/repo/objects/05/7c8f68d08d46486ff56e4f99273a98e43896ac3845caed3135703d53aa6c24.filez new file mode 100644 index 00000000000..9ce9cfb90c3 Binary files /dev/null and b/repo/objects/05/7c8f68d08d46486ff56e4f99273a98e43896ac3845caed3135703d53aa6c24.filez differ diff --git a/repo/objects/05/8b5d3e2a1b11c22d4799baff52df80ff7be5e31c6db43f161678ebe3aeceb8.filez b/repo/objects/05/8b5d3e2a1b11c22d4799baff52df80ff7be5e31c6db43f161678ebe3aeceb8.filez new file mode 100644 index 00000000000..f215d2f1e1f Binary files /dev/null and b/repo/objects/05/8b5d3e2a1b11c22d4799baff52df80ff7be5e31c6db43f161678ebe3aeceb8.filez differ diff --git a/repo/objects/05/990349f25826a0fff3be7e07665682659f5d6ceedd1baeb675215b1ad6b5ae.dirtree b/repo/objects/05/990349f25826a0fff3be7e07665682659f5d6ceedd1baeb675215b1ad6b5ae.dirtree new file mode 100644 index 00000000000..3e372a28b76 Binary files /dev/null and b/repo/objects/05/990349f25826a0fff3be7e07665682659f5d6ceedd1baeb675215b1ad6b5ae.dirtree differ diff --git a/repo/objects/05/a2ad9d65bcdc560f513621f7f903475e87e95e120740f1d4e888695da3d77d.dirtree b/repo/objects/05/a2ad9d65bcdc560f513621f7f903475e87e95e120740f1d4e888695da3d77d.dirtree new file mode 100644 index 00000000000..dade66d8c8c Binary files /dev/null and b/repo/objects/05/a2ad9d65bcdc560f513621f7f903475e87e95e120740f1d4e888695da3d77d.dirtree differ diff --git a/repo/objects/05/c82bac518ac37abf00de2e548e2caff069ebc74b27621184c6a58cbcef4ff2.filez b/repo/objects/05/c82bac518ac37abf00de2e548e2caff069ebc74b27621184c6a58cbcef4ff2.filez new file mode 100644 index 00000000000..f44d1510055 Binary files /dev/null and b/repo/objects/05/c82bac518ac37abf00de2e548e2caff069ebc74b27621184c6a58cbcef4ff2.filez differ diff --git a/repo/objects/06/01d4f32eefd5afbe809766baa4e30cb20d4dd912e2789567e457a58938672e.filez b/repo/objects/06/01d4f32eefd5afbe809766baa4e30cb20d4dd912e2789567e457a58938672e.filez new file mode 100644 index 00000000000..2c4d7589dde Binary files /dev/null and b/repo/objects/06/01d4f32eefd5afbe809766baa4e30cb20d4dd912e2789567e457a58938672e.filez differ diff --git a/repo/objects/06/1c45f078cb468ce2a0586b4fd89d1b5ad0755028135b324eabae1b0b4fc860.filez b/repo/objects/06/1c45f078cb468ce2a0586b4fd89d1b5ad0755028135b324eabae1b0b4fc860.filez new file mode 100644 index 00000000000..2251fed69cc Binary files /dev/null and b/repo/objects/06/1c45f078cb468ce2a0586b4fd89d1b5ad0755028135b324eabae1b0b4fc860.filez differ diff --git a/repo/objects/06/3093a90da361eed4144d2370dee5eedb595485693a3292295689b2170d6938.filez b/repo/objects/06/3093a90da361eed4144d2370dee5eedb595485693a3292295689b2170d6938.filez new file mode 100644 index 00000000000..bd82607193b Binary files /dev/null and b/repo/objects/06/3093a90da361eed4144d2370dee5eedb595485693a3292295689b2170d6938.filez differ diff --git a/repo/objects/06/3a122c7d4e1fd429d7bab608c2bf2701c8e8b829b295fc5e045e144433e8c6.filez b/repo/objects/06/3a122c7d4e1fd429d7bab608c2bf2701c8e8b829b295fc5e045e144433e8c6.filez new file mode 100644 index 00000000000..51f4a160ca1 Binary files /dev/null and b/repo/objects/06/3a122c7d4e1fd429d7bab608c2bf2701c8e8b829b295fc5e045e144433e8c6.filez differ diff --git a/repo/objects/06/4c2895da34e09ca2b410d717f15269ab3e1d4fb4bbed62caf483b764f230bd.filez b/repo/objects/06/4c2895da34e09ca2b410d717f15269ab3e1d4fb4bbed62caf483b764f230bd.filez new file mode 100644 index 00000000000..4919293169a Binary files /dev/null and b/repo/objects/06/4c2895da34e09ca2b410d717f15269ab3e1d4fb4bbed62caf483b764f230bd.filez differ diff --git a/repo/objects/06/7058f6967220e808a374df529b4af90eb8b47c99c4214d3b31f56fb8b155c2.filez b/repo/objects/06/7058f6967220e808a374df529b4af90eb8b47c99c4214d3b31f56fb8b155c2.filez new file mode 100644 index 00000000000..b4caabf05bb Binary files /dev/null and b/repo/objects/06/7058f6967220e808a374df529b4af90eb8b47c99c4214d3b31f56fb8b155c2.filez differ diff --git a/repo/objects/06/781f57dedb2e4ef39b6f966a190493edf856f07180ae605924ca1f62e0f7c6.dirtree b/repo/objects/06/781f57dedb2e4ef39b6f966a190493edf856f07180ae605924ca1f62e0f7c6.dirtree new file mode 100644 index 00000000000..743fe4d0331 Binary files /dev/null and b/repo/objects/06/781f57dedb2e4ef39b6f966a190493edf856f07180ae605924ca1f62e0f7c6.dirtree differ diff --git a/repo/objects/06/799244ca66141fa26ea1faf0afb9762bf669a1882ada8990f70a1f2c569dd1.dirtree b/repo/objects/06/799244ca66141fa26ea1faf0afb9762bf669a1882ada8990f70a1f2c569dd1.dirtree new file mode 100644 index 00000000000..c236e1a8ec6 Binary files /dev/null and b/repo/objects/06/799244ca66141fa26ea1faf0afb9762bf669a1882ada8990f70a1f2c569dd1.dirtree differ diff --git a/repo/objects/06/8e632297c222e9e9c5bed6c46a47d9fd39ea65765f0275adb9b043f21275fe.filez b/repo/objects/06/8e632297c222e9e9c5bed6c46a47d9fd39ea65765f0275adb9b043f21275fe.filez new file mode 100644 index 00000000000..5ac68d45925 Binary files /dev/null and b/repo/objects/06/8e632297c222e9e9c5bed6c46a47d9fd39ea65765f0275adb9b043f21275fe.filez differ diff --git a/repo/objects/06/c10609a04a474434528ffb8728f86eae1412a1a4540e8c26bba5e7544b580e.filez b/repo/objects/06/c10609a04a474434528ffb8728f86eae1412a1a4540e8c26bba5e7544b580e.filez new file mode 100644 index 00000000000..c7bf71625e1 Binary files /dev/null and b/repo/objects/06/c10609a04a474434528ffb8728f86eae1412a1a4540e8c26bba5e7544b580e.filez differ diff --git a/repo/objects/06/eea8f9cb2f134dd70b44d93b4b3da6c6c36bd67cbd6c7fd9d72ee3660def36.dirtree b/repo/objects/06/eea8f9cb2f134dd70b44d93b4b3da6c6c36bd67cbd6c7fd9d72ee3660def36.dirtree new file mode 100644 index 00000000000..7ba0b8d4a61 Binary files /dev/null and b/repo/objects/06/eea8f9cb2f134dd70b44d93b4b3da6c6c36bd67cbd6c7fd9d72ee3660def36.dirtree differ diff --git a/repo/objects/07/64669f661797aa9bfff909edfdb148d2618dadc734ddd1f014566daa5403d0.filez b/repo/objects/07/64669f661797aa9bfff909edfdb148d2618dadc734ddd1f014566daa5403d0.filez new file mode 100644 index 00000000000..b3800993281 Binary files /dev/null and b/repo/objects/07/64669f661797aa9bfff909edfdb148d2618dadc734ddd1f014566daa5403d0.filez differ diff --git a/repo/objects/07/668234acf436e1f9d3e423a1005b0a42a5cb9a5d107fa5039a2afe414db3d4.filez b/repo/objects/07/668234acf436e1f9d3e423a1005b0a42a5cb9a5d107fa5039a2afe414db3d4.filez new file mode 100644 index 00000000000..c400c60b902 Binary files /dev/null and b/repo/objects/07/668234acf436e1f9d3e423a1005b0a42a5cb9a5d107fa5039a2afe414db3d4.filez differ diff --git a/repo/objects/07/96c40a27fa36c8761d13d4bd2573fb0e76eed039b9baa5caaa396a247a75c5.filez b/repo/objects/07/96c40a27fa36c8761d13d4bd2573fb0e76eed039b9baa5caaa396a247a75c5.filez new file mode 100644 index 00000000000..4a3fb2c3e63 Binary files /dev/null and b/repo/objects/07/96c40a27fa36c8761d13d4bd2573fb0e76eed039b9baa5caaa396a247a75c5.filez differ diff --git a/repo/objects/07/a2bae95d472db8a9b32585659a9aa9dcb7a86f4257a74cfc7bc604b94532e6.filez b/repo/objects/07/a2bae95d472db8a9b32585659a9aa9dcb7a86f4257a74cfc7bc604b94532e6.filez new file mode 100644 index 00000000000..032e6596599 Binary files /dev/null and b/repo/objects/07/a2bae95d472db8a9b32585659a9aa9dcb7a86f4257a74cfc7bc604b94532e6.filez differ diff --git a/repo/objects/07/d142d887e5af841e92cca3200b33687de3ee53c9ae637e9ca1bcc34197339a.filez b/repo/objects/07/d142d887e5af841e92cca3200b33687de3ee53c9ae637e9ca1bcc34197339a.filez new file mode 100644 index 00000000000..562537bbb61 Binary files /dev/null and b/repo/objects/07/d142d887e5af841e92cca3200b33687de3ee53c9ae637e9ca1bcc34197339a.filez differ diff --git a/repo/objects/07/eaf650ea2a89c0619eb4721a94c902849a4ebd10f2eb40145228f9c7cef741.dirtree b/repo/objects/07/eaf650ea2a89c0619eb4721a94c902849a4ebd10f2eb40145228f9c7cef741.dirtree new file mode 100644 index 00000000000..fb8fe12e689 Binary files /dev/null and b/repo/objects/07/eaf650ea2a89c0619eb4721a94c902849a4ebd10f2eb40145228f9c7cef741.dirtree differ diff --git a/repo/objects/07/f300ec50369dea53d9d7d2fc3889b8c08c1ef38a1a0c174ffc45be9c25c411.filez b/repo/objects/07/f300ec50369dea53d9d7d2fc3889b8c08c1ef38a1a0c174ffc45be9c25c411.filez new file mode 100644 index 00000000000..d0694887083 Binary files /dev/null and b/repo/objects/07/f300ec50369dea53d9d7d2fc3889b8c08c1ef38a1a0c174ffc45be9c25c411.filez differ diff --git a/repo/objects/07/fa5bf97a607ec3373b7c79c309aed2b651b3daf58f6891c169a89f65cef9dc.filez b/repo/objects/07/fa5bf97a607ec3373b7c79c309aed2b651b3daf58f6891c169a89f65cef9dc.filez new file mode 100644 index 00000000000..10452bec2ef Binary files /dev/null and b/repo/objects/07/fa5bf97a607ec3373b7c79c309aed2b651b3daf58f6891c169a89f65cef9dc.filez differ diff --git a/repo/objects/08/162929b1dc2f93e3c473a81c7e8576fbfa02c67138508854f7385bd2ad41bb.dirtree b/repo/objects/08/162929b1dc2f93e3c473a81c7e8576fbfa02c67138508854f7385bd2ad41bb.dirtree new file mode 100644 index 00000000000..d0b5754ae9b Binary files /dev/null and b/repo/objects/08/162929b1dc2f93e3c473a81c7e8576fbfa02c67138508854f7385bd2ad41bb.dirtree differ diff --git a/repo/objects/08/2dbb8a025c2e05eda298ca7f22378314694273ab30b073432481fbb1ba6cde.filez b/repo/objects/08/2dbb8a025c2e05eda298ca7f22378314694273ab30b073432481fbb1ba6cde.filez new file mode 100644 index 00000000000..7b11111cb9a Binary files /dev/null and b/repo/objects/08/2dbb8a025c2e05eda298ca7f22378314694273ab30b073432481fbb1ba6cde.filez differ diff --git a/repo/objects/08/36824c35a7b03dd05a24d26e158e8bcd5dc35ae97286dc58bf4a62f6b8dd12.filez b/repo/objects/08/36824c35a7b03dd05a24d26e158e8bcd5dc35ae97286dc58bf4a62f6b8dd12.filez new file mode 100644 index 00000000000..005cf846a74 Binary files /dev/null and b/repo/objects/08/36824c35a7b03dd05a24d26e158e8bcd5dc35ae97286dc58bf4a62f6b8dd12.filez differ diff --git a/repo/objects/08/69f235504e9bb63676914ca12e35cf3e15a8a8ed95a3f802033d9be1c7b047.filez b/repo/objects/08/69f235504e9bb63676914ca12e35cf3e15a8a8ed95a3f802033d9be1c7b047.filez new file mode 100644 index 00000000000..bced2d36334 Binary files /dev/null and b/repo/objects/08/69f235504e9bb63676914ca12e35cf3e15a8a8ed95a3f802033d9be1c7b047.filez differ diff --git a/repo/objects/08/81e92d1fec06e73e797738fae3b8c5d71abdc8b123a54f46ffc0e06ea74275.filez b/repo/objects/08/81e92d1fec06e73e797738fae3b8c5d71abdc8b123a54f46ffc0e06ea74275.filez new file mode 100644 index 00000000000..5bdc8615ec0 Binary files /dev/null and b/repo/objects/08/81e92d1fec06e73e797738fae3b8c5d71abdc8b123a54f46ffc0e06ea74275.filez differ diff --git a/repo/objects/08/93644068e8c7db0b50c190c74f4d407e66710881386d7ae972b3bf82cb3263.filez b/repo/objects/08/93644068e8c7db0b50c190c74f4d407e66710881386d7ae972b3bf82cb3263.filez new file mode 100644 index 00000000000..1078bcf6fda Binary files /dev/null and b/repo/objects/08/93644068e8c7db0b50c190c74f4d407e66710881386d7ae972b3bf82cb3263.filez differ diff --git a/repo/objects/08/a25914bb40f3722ff85a91e89e08ecf2bde00d816d1590d5685e3bb79226e2.filez b/repo/objects/08/a25914bb40f3722ff85a91e89e08ecf2bde00d816d1590d5685e3bb79226e2.filez new file mode 100644 index 00000000000..2176fd74731 Binary files /dev/null and b/repo/objects/08/a25914bb40f3722ff85a91e89e08ecf2bde00d816d1590d5685e3bb79226e2.filez differ diff --git a/repo/objects/08/ad19e3101dbcada77a935dcd3cd3720089dd33091e81b5513c1d77302749e0.filez b/repo/objects/08/ad19e3101dbcada77a935dcd3cd3720089dd33091e81b5513c1d77302749e0.filez new file mode 100644 index 00000000000..2660997551e Binary files /dev/null and b/repo/objects/08/ad19e3101dbcada77a935dcd3cd3720089dd33091e81b5513c1d77302749e0.filez differ diff --git a/repo/objects/08/c422ef8bfe2ce0e65963b263f83c2b5caf5a9ce467a54de5ba60e38ea5f754.filez b/repo/objects/08/c422ef8bfe2ce0e65963b263f83c2b5caf5a9ce467a54de5ba60e38ea5f754.filez new file mode 100644 index 00000000000..8a501871b61 Binary files /dev/null and b/repo/objects/08/c422ef8bfe2ce0e65963b263f83c2b5caf5a9ce467a54de5ba60e38ea5f754.filez differ diff --git a/repo/objects/08/de2f0d09491bfd61673fa07b815a78ee5390569a26da680a59b716a391f49c.dirtree b/repo/objects/08/de2f0d09491bfd61673fa07b815a78ee5390569a26da680a59b716a391f49c.dirtree new file mode 100644 index 00000000000..e2cf2cc46b4 Binary files /dev/null and b/repo/objects/08/de2f0d09491bfd61673fa07b815a78ee5390569a26da680a59b716a391f49c.dirtree differ diff --git a/repo/objects/08/f665c580f02bba28619cd1860bfbd728e59b87240662070c3442ed6ece693d.dirtree b/repo/objects/08/f665c580f02bba28619cd1860bfbd728e59b87240662070c3442ed6ece693d.dirtree new file mode 100644 index 00000000000..b1d95cb0c13 Binary files /dev/null and b/repo/objects/08/f665c580f02bba28619cd1860bfbd728e59b87240662070c3442ed6ece693d.dirtree differ diff --git a/repo/objects/08/f9a46993d439bdb0d9264cb7e1686a213fcda9d6dd8b6452631247c3cb05ce.dirtree b/repo/objects/08/f9a46993d439bdb0d9264cb7e1686a213fcda9d6dd8b6452631247c3cb05ce.dirtree new file mode 100644 index 00000000000..556abddc2e9 Binary files /dev/null and b/repo/objects/08/f9a46993d439bdb0d9264cb7e1686a213fcda9d6dd8b6452631247c3cb05ce.dirtree differ diff --git a/repo/objects/09/0d366377dbcf6ebd7cfb5abd07dc218eb065294bf26af017daf0638d4d1730.filez b/repo/objects/09/0d366377dbcf6ebd7cfb5abd07dc218eb065294bf26af017daf0638d4d1730.filez new file mode 100644 index 00000000000..e8b989a7c53 Binary files /dev/null and b/repo/objects/09/0d366377dbcf6ebd7cfb5abd07dc218eb065294bf26af017daf0638d4d1730.filez differ diff --git a/repo/objects/09/4c190a8399a2a1e61f1efeefe9152f630b9e76c560cf72437ed37398cb9b8d.filez b/repo/objects/09/4c190a8399a2a1e61f1efeefe9152f630b9e76c560cf72437ed37398cb9b8d.filez new file mode 100644 index 00000000000..013f18caeb4 Binary files /dev/null and b/repo/objects/09/4c190a8399a2a1e61f1efeefe9152f630b9e76c560cf72437ed37398cb9b8d.filez differ diff --git a/repo/objects/09/77e66ff1c30f70320e57010769dd49a0d67a3af4ba9d3a1c15e6773531d64d.filez b/repo/objects/09/77e66ff1c30f70320e57010769dd49a0d67a3af4ba9d3a1c15e6773531d64d.filez new file mode 100644 index 00000000000..0574c9184ea Binary files /dev/null and b/repo/objects/09/77e66ff1c30f70320e57010769dd49a0d67a3af4ba9d3a1c15e6773531d64d.filez differ diff --git a/repo/objects/09/7f816a7ce19f52dcfca21cfe8da11cf66ffdea198ddb3fb621563ee00ea2c2.filez b/repo/objects/09/7f816a7ce19f52dcfca21cfe8da11cf66ffdea198ddb3fb621563ee00ea2c2.filez new file mode 100644 index 00000000000..8c5b2617637 Binary files /dev/null and b/repo/objects/09/7f816a7ce19f52dcfca21cfe8da11cf66ffdea198ddb3fb621563ee00ea2c2.filez differ diff --git a/repo/objects/09/84ce7f6ba1c0ae18a267cfb1595e413e994a7f36f505a319c5a0ac62b6312a.filez b/repo/objects/09/84ce7f6ba1c0ae18a267cfb1595e413e994a7f36f505a319c5a0ac62b6312a.filez new file mode 100644 index 00000000000..acbebfab266 Binary files /dev/null and b/repo/objects/09/84ce7f6ba1c0ae18a267cfb1595e413e994a7f36f505a319c5a0ac62b6312a.filez differ diff --git a/repo/objects/09/9f360c091936d67d8d04d9cfae6447c206e583b4da6c78457d50606ab4bead.filez b/repo/objects/09/9f360c091936d67d8d04d9cfae6447c206e583b4da6c78457d50606ab4bead.filez new file mode 100644 index 00000000000..1051a8c9505 Binary files /dev/null and b/repo/objects/09/9f360c091936d67d8d04d9cfae6447c206e583b4da6c78457d50606ab4bead.filez differ diff --git a/repo/objects/09/aaf5b91657c9d353ae6df99faf731effaf924ca7e4fe9551fd2f301ff4bb1a.filez b/repo/objects/09/aaf5b91657c9d353ae6df99faf731effaf924ca7e4fe9551fd2f301ff4bb1a.filez new file mode 100644 index 00000000000..19cb9fcc4a5 Binary files /dev/null and b/repo/objects/09/aaf5b91657c9d353ae6df99faf731effaf924ca7e4fe9551fd2f301ff4bb1a.filez differ diff --git a/repo/objects/09/bb28580ddf6a15cd45ef7b7ef2ddf262eb47469ccb618c0e3d2ea3805b83e6.filez b/repo/objects/09/bb28580ddf6a15cd45ef7b7ef2ddf262eb47469ccb618c0e3d2ea3805b83e6.filez new file mode 100644 index 00000000000..149230599e1 Binary files /dev/null and b/repo/objects/09/bb28580ddf6a15cd45ef7b7ef2ddf262eb47469ccb618c0e3d2ea3805b83e6.filez differ diff --git a/repo/objects/09/d8c9e27f318ae443b19a2b94d5601e15f8dcdd9cdf4822bd94382274c612a3.filez b/repo/objects/09/d8c9e27f318ae443b19a2b94d5601e15f8dcdd9cdf4822bd94382274c612a3.filez new file mode 100644 index 00000000000..87a07ceb08b Binary files /dev/null and b/repo/objects/09/d8c9e27f318ae443b19a2b94d5601e15f8dcdd9cdf4822bd94382274c612a3.filez differ diff --git a/repo/objects/09/da0970a7cc074d10fa905cda6f6f432d8deb45518131595cbcb1c91ec084fb.filez b/repo/objects/09/da0970a7cc074d10fa905cda6f6f432d8deb45518131595cbcb1c91ec084fb.filez new file mode 100644 index 00000000000..561f2acbc51 Binary files /dev/null and b/repo/objects/09/da0970a7cc074d10fa905cda6f6f432d8deb45518131595cbcb1c91ec084fb.filez differ diff --git a/repo/objects/09/fea7a3be52ea0f267d0a2b01cccb1f0f1d4bd942e52db6760725fe37d594b7.filez b/repo/objects/09/fea7a3be52ea0f267d0a2b01cccb1f0f1d4bd942e52db6760725fe37d594b7.filez new file mode 100644 index 00000000000..c5a92e4b479 Binary files /dev/null and b/repo/objects/09/fea7a3be52ea0f267d0a2b01cccb1f0f1d4bd942e52db6760725fe37d594b7.filez differ diff --git a/repo/objects/0a/2c678ed869ae2b18961dcebc10f8ae69382776f49eb01482b850b7f10ad580.filez b/repo/objects/0a/2c678ed869ae2b18961dcebc10f8ae69382776f49eb01482b850b7f10ad580.filez new file mode 100644 index 00000000000..941b22903e9 Binary files /dev/null and b/repo/objects/0a/2c678ed869ae2b18961dcebc10f8ae69382776f49eb01482b850b7f10ad580.filez differ diff --git a/repo/objects/0a/83f7df35f73cb52c9c130b15cee844f40a273a31ef9560ea7e74707ed7dd0e.filez b/repo/objects/0a/83f7df35f73cb52c9c130b15cee844f40a273a31ef9560ea7e74707ed7dd0e.filez new file mode 100644 index 00000000000..d5e3522bcb5 Binary files /dev/null and b/repo/objects/0a/83f7df35f73cb52c9c130b15cee844f40a273a31ef9560ea7e74707ed7dd0e.filez differ diff --git a/repo/objects/0a/a2d528c4d2048e7361859a65d026bd3ef47896fc65cc2f6269fb4929253b5a.filez b/repo/objects/0a/a2d528c4d2048e7361859a65d026bd3ef47896fc65cc2f6269fb4929253b5a.filez new file mode 100644 index 00000000000..6e4a2a482d6 Binary files /dev/null and b/repo/objects/0a/a2d528c4d2048e7361859a65d026bd3ef47896fc65cc2f6269fb4929253b5a.filez differ diff --git a/repo/objects/0a/a7005e599e6dc455956a1b6254772f6e4ce8e494146df12e333e17122992f0.filez b/repo/objects/0a/a7005e599e6dc455956a1b6254772f6e4ce8e494146df12e333e17122992f0.filez new file mode 100644 index 00000000000..9bba10a9494 Binary files /dev/null and b/repo/objects/0a/a7005e599e6dc455956a1b6254772f6e4ce8e494146df12e333e17122992f0.filez differ diff --git a/repo/objects/0a/b0e98c3ef21f377c234892690245793d0e4ebea7e12b30315e317442de0521.filez b/repo/objects/0a/b0e98c3ef21f377c234892690245793d0e4ebea7e12b30315e317442de0521.filez new file mode 100644 index 00000000000..bb10c9d4e5c Binary files /dev/null and b/repo/objects/0a/b0e98c3ef21f377c234892690245793d0e4ebea7e12b30315e317442de0521.filez differ diff --git a/repo/objects/0a/e19b83788801c22218848ae9f31b7c80546d0a342220b442fd8e5584009dd5.filez b/repo/objects/0a/e19b83788801c22218848ae9f31b7c80546d0a342220b442fd8e5584009dd5.filez new file mode 100644 index 00000000000..6c1ac509484 Binary files /dev/null and b/repo/objects/0a/e19b83788801c22218848ae9f31b7c80546d0a342220b442fd8e5584009dd5.filez differ diff --git a/repo/objects/0b/25ad759f252e62a66ef13762330542337733364de027a7bc10e5b6cdb1d839.filez b/repo/objects/0b/25ad759f252e62a66ef13762330542337733364de027a7bc10e5b6cdb1d839.filez new file mode 100644 index 00000000000..f85ebd9a1bf Binary files /dev/null and b/repo/objects/0b/25ad759f252e62a66ef13762330542337733364de027a7bc10e5b6cdb1d839.filez differ diff --git a/repo/objects/0b/30effb99750e3912549f30ddb4f58abacaad9916521adbe9952a81d5637949.filez b/repo/objects/0b/30effb99750e3912549f30ddb4f58abacaad9916521adbe9952a81d5637949.filez new file mode 100644 index 00000000000..4eed74802a0 Binary files /dev/null and b/repo/objects/0b/30effb99750e3912549f30ddb4f58abacaad9916521adbe9952a81d5637949.filez differ diff --git a/repo/objects/0b/3bec65dfe94e0e327133b5d8dc668a3c544a5532bcd8372c147c115942cafc.filez b/repo/objects/0b/3bec65dfe94e0e327133b5d8dc668a3c544a5532bcd8372c147c115942cafc.filez new file mode 100644 index 00000000000..84748e4e049 Binary files /dev/null and b/repo/objects/0b/3bec65dfe94e0e327133b5d8dc668a3c544a5532bcd8372c147c115942cafc.filez differ diff --git a/repo/objects/0b/5a067f694f9c78e1e34e5d33b92f4d3d598fc53246b488108b638d26bf6609.filez b/repo/objects/0b/5a067f694f9c78e1e34e5d33b92f4d3d598fc53246b488108b638d26bf6609.filez new file mode 100644 index 00000000000..bb439b02244 Binary files /dev/null and b/repo/objects/0b/5a067f694f9c78e1e34e5d33b92f4d3d598fc53246b488108b638d26bf6609.filez differ diff --git a/repo/objects/0b/60543c2bf8513db1bf97b4a76ce39195529194d9ac7715585d8a519e60a07a.filez b/repo/objects/0b/60543c2bf8513db1bf97b4a76ce39195529194d9ac7715585d8a519e60a07a.filez new file mode 100644 index 00000000000..361bbd24aee Binary files /dev/null and b/repo/objects/0b/60543c2bf8513db1bf97b4a76ce39195529194d9ac7715585d8a519e60a07a.filez differ diff --git a/repo/objects/0b/644a3316407a5a42d138ea47b42ddbdb140cd59c4166c5520ad55af67134dc.dirtree b/repo/objects/0b/644a3316407a5a42d138ea47b42ddbdb140cd59c4166c5520ad55af67134dc.dirtree new file mode 100644 index 00000000000..1064a43747e Binary files /dev/null and b/repo/objects/0b/644a3316407a5a42d138ea47b42ddbdb140cd59c4166c5520ad55af67134dc.dirtree differ diff --git a/repo/objects/0b/653cbafa8de76a9554dd03089af9a3a2b085f0b34081e38a78bdc0d2c10d55.filez b/repo/objects/0b/653cbafa8de76a9554dd03089af9a3a2b085f0b34081e38a78bdc0d2c10d55.filez new file mode 100644 index 00000000000..b73be2fd6f5 Binary files /dev/null and b/repo/objects/0b/653cbafa8de76a9554dd03089af9a3a2b085f0b34081e38a78bdc0d2c10d55.filez differ diff --git a/repo/objects/0b/eeaf4999aecebbd26fc89fb7e0a0c645866de01cff75963c41c337993db406.filez b/repo/objects/0b/eeaf4999aecebbd26fc89fb7e0a0c645866de01cff75963c41c337993db406.filez new file mode 100644 index 00000000000..ebdf0a1860c Binary files /dev/null and b/repo/objects/0b/eeaf4999aecebbd26fc89fb7e0a0c645866de01cff75963c41c337993db406.filez differ diff --git a/repo/objects/0b/fc209732650b57aeaaa6f83b4e78e90fc821ea6f99028d57f65ba10ec01d16.dirtree b/repo/objects/0b/fc209732650b57aeaaa6f83b4e78e90fc821ea6f99028d57f65ba10ec01d16.dirtree new file mode 100644 index 00000000000..d1db833efa6 Binary files /dev/null and b/repo/objects/0b/fc209732650b57aeaaa6f83b4e78e90fc821ea6f99028d57f65ba10ec01d16.dirtree differ diff --git a/repo/objects/0c/340eef1fc201712fabcaee7495dab45fddec7442847fc649282ff9233f5e15.filez b/repo/objects/0c/340eef1fc201712fabcaee7495dab45fddec7442847fc649282ff9233f5e15.filez new file mode 100644 index 00000000000..3fa1f32547e Binary files /dev/null and b/repo/objects/0c/340eef1fc201712fabcaee7495dab45fddec7442847fc649282ff9233f5e15.filez differ diff --git a/repo/objects/0c/3ca41b169d8161ee4ff637d99b439ad76619be14cc7b24a808ad27c4859a90.dirtree b/repo/objects/0c/3ca41b169d8161ee4ff637d99b439ad76619be14cc7b24a808ad27c4859a90.dirtree new file mode 100644 index 00000000000..020b22f3d90 Binary files /dev/null and b/repo/objects/0c/3ca41b169d8161ee4ff637d99b439ad76619be14cc7b24a808ad27c4859a90.dirtree differ diff --git a/repo/objects/0c/42e730d0c3c095bb0cac671915b5434e3ed49545c65773fca30daa694bfd7d.filez b/repo/objects/0c/42e730d0c3c095bb0cac671915b5434e3ed49545c65773fca30daa694bfd7d.filez new file mode 100644 index 00000000000..820335478fd Binary files /dev/null and b/repo/objects/0c/42e730d0c3c095bb0cac671915b5434e3ed49545c65773fca30daa694bfd7d.filez differ diff --git a/repo/objects/0c/4a04ba858488cac1320ac2a9df500fb8351342d85eb6b955b0228ea0ba49a7.filez b/repo/objects/0c/4a04ba858488cac1320ac2a9df500fb8351342d85eb6b955b0228ea0ba49a7.filez new file mode 100644 index 00000000000..c8ef4e93f56 Binary files /dev/null and b/repo/objects/0c/4a04ba858488cac1320ac2a9df500fb8351342d85eb6b955b0228ea0ba49a7.filez differ diff --git a/repo/objects/0c/5567a6bbe7770c14c8bc27b734e37b7a220cb23d7eb7e74f5bdf1715948631.filez b/repo/objects/0c/5567a6bbe7770c14c8bc27b734e37b7a220cb23d7eb7e74f5bdf1715948631.filez new file mode 100644 index 00000000000..31914f9f2a9 Binary files /dev/null and b/repo/objects/0c/5567a6bbe7770c14c8bc27b734e37b7a220cb23d7eb7e74f5bdf1715948631.filez differ diff --git a/repo/objects/0c/5b0d61f3440d6165c3363ad838dfcfbe92fb1a1e367b952656ddf2fddbb03e.filez b/repo/objects/0c/5b0d61f3440d6165c3363ad838dfcfbe92fb1a1e367b952656ddf2fddbb03e.filez new file mode 100644 index 00000000000..83182e35190 Binary files /dev/null and b/repo/objects/0c/5b0d61f3440d6165c3363ad838dfcfbe92fb1a1e367b952656ddf2fddbb03e.filez differ diff --git a/repo/objects/0c/76aca474e1a03baa2d6c8f72b53d4a44f0eb41d9a7f0592183c06f712ec55a.filez b/repo/objects/0c/76aca474e1a03baa2d6c8f72b53d4a44f0eb41d9a7f0592183c06f712ec55a.filez new file mode 100644 index 00000000000..1955dc5cf6d Binary files /dev/null and b/repo/objects/0c/76aca474e1a03baa2d6c8f72b53d4a44f0eb41d9a7f0592183c06f712ec55a.filez differ diff --git a/repo/objects/0c/88a0855aa4e5e832dfd6f25def4ed794e20751cdda82c644928380eda9ccdd.filez b/repo/objects/0c/88a0855aa4e5e832dfd6f25def4ed794e20751cdda82c644928380eda9ccdd.filez new file mode 100644 index 00000000000..45e531265a9 Binary files /dev/null and b/repo/objects/0c/88a0855aa4e5e832dfd6f25def4ed794e20751cdda82c644928380eda9ccdd.filez differ diff --git a/repo/objects/0c/9c0f0b779b6dce2479f8619e3981e8c899ae5364138c9b9e740484caaf2f0c.filez b/repo/objects/0c/9c0f0b779b6dce2479f8619e3981e8c899ae5364138c9b9e740484caaf2f0c.filez new file mode 100644 index 00000000000..ad4eb0c77a1 Binary files /dev/null and b/repo/objects/0c/9c0f0b779b6dce2479f8619e3981e8c899ae5364138c9b9e740484caaf2f0c.filez differ diff --git a/repo/objects/0c/9e8b6c41dc8e6031a0c6b0bdb64c4357526b472fd0edcf7608ebfe0b0f3c2e.filez b/repo/objects/0c/9e8b6c41dc8e6031a0c6b0bdb64c4357526b472fd0edcf7608ebfe0b0f3c2e.filez new file mode 100644 index 00000000000..0c2405f0806 Binary files /dev/null and b/repo/objects/0c/9e8b6c41dc8e6031a0c6b0bdb64c4357526b472fd0edcf7608ebfe0b0f3c2e.filez differ diff --git a/repo/objects/0c/ad22a3009100de87fa127b9f12288f38f6f4c15b4009f578473e6f3be4f74b.filez b/repo/objects/0c/ad22a3009100de87fa127b9f12288f38f6f4c15b4009f578473e6f3be4f74b.filez new file mode 100644 index 00000000000..7822c12f7eb Binary files /dev/null and b/repo/objects/0c/ad22a3009100de87fa127b9f12288f38f6f4c15b4009f578473e6f3be4f74b.filez differ diff --git a/repo/objects/0c/b6b5e295559316daeaf3fbed7c734e299580e1efc7ba435a02da43fc35d4c2.dirtree b/repo/objects/0c/b6b5e295559316daeaf3fbed7c734e299580e1efc7ba435a02da43fc35d4c2.dirtree new file mode 100644 index 00000000000..22b568f287d Binary files /dev/null and b/repo/objects/0c/b6b5e295559316daeaf3fbed7c734e299580e1efc7ba435a02da43fc35d4c2.dirtree differ diff --git a/repo/objects/0c/c0c22f3de8deeb83cb81af4a1a6e5280e9c9dee28289264e0b9f579fb4192d.filez b/repo/objects/0c/c0c22f3de8deeb83cb81af4a1a6e5280e9c9dee28289264e0b9f579fb4192d.filez new file mode 100644 index 00000000000..bf8e815248e Binary files /dev/null and b/repo/objects/0c/c0c22f3de8deeb83cb81af4a1a6e5280e9c9dee28289264e0b9f579fb4192d.filez differ diff --git a/repo/objects/0c/dab3c61d98e52e9cb5cf454e14f62e3cc20deefb48512f6c379672567d0627.filez b/repo/objects/0c/dab3c61d98e52e9cb5cf454e14f62e3cc20deefb48512f6c379672567d0627.filez new file mode 100644 index 00000000000..848502faa34 Binary files /dev/null and b/repo/objects/0c/dab3c61d98e52e9cb5cf454e14f62e3cc20deefb48512f6c379672567d0627.filez differ diff --git a/repo/objects/0c/e6afa9090f9b158e002b55761d6e372268df6cd5a7c8e6b9b869b73e6ed86f.filez b/repo/objects/0c/e6afa9090f9b158e002b55761d6e372268df6cd5a7c8e6b9b869b73e6ed86f.filez new file mode 100644 index 00000000000..3772fa598e6 Binary files /dev/null and b/repo/objects/0c/e6afa9090f9b158e002b55761d6e372268df6cd5a7c8e6b9b869b73e6ed86f.filez differ diff --git a/repo/objects/0d/329a3d8d4f9809857a333fb3254346f2ad99acd03f58a38afabd71a8c6bdd6.filez b/repo/objects/0d/329a3d8d4f9809857a333fb3254346f2ad99acd03f58a38afabd71a8c6bdd6.filez new file mode 100644 index 00000000000..cce85039a57 Binary files /dev/null and b/repo/objects/0d/329a3d8d4f9809857a333fb3254346f2ad99acd03f58a38afabd71a8c6bdd6.filez differ diff --git a/repo/objects/0d/4231b797450a8bcf268015415338957e1a8eed25377c42f9db628d85806bf8.dirtree b/repo/objects/0d/4231b797450a8bcf268015415338957e1a8eed25377c42f9db628d85806bf8.dirtree new file mode 100644 index 00000000000..fffad118948 Binary files /dev/null and b/repo/objects/0d/4231b797450a8bcf268015415338957e1a8eed25377c42f9db628d85806bf8.dirtree differ diff --git a/repo/objects/0d/5fcb50141a91676e79c105ec9d2d9495e0d460a817340bdce8ee033fd20440.filez b/repo/objects/0d/5fcb50141a91676e79c105ec9d2d9495e0d460a817340bdce8ee033fd20440.filez new file mode 100644 index 00000000000..2e5522298c5 Binary files /dev/null and b/repo/objects/0d/5fcb50141a91676e79c105ec9d2d9495e0d460a817340bdce8ee033fd20440.filez differ diff --git a/repo/objects/0d/6ece28f9e24e98f7b3b864128b7f938267fe3ecfbccd0dc52663fb45251eee.filez b/repo/objects/0d/6ece28f9e24e98f7b3b864128b7f938267fe3ecfbccd0dc52663fb45251eee.filez new file mode 100644 index 00000000000..741708bd5d2 Binary files /dev/null and b/repo/objects/0d/6ece28f9e24e98f7b3b864128b7f938267fe3ecfbccd0dc52663fb45251eee.filez differ diff --git a/repo/objects/0d/803410df7df9657d338fb025197b787a08d4693a1c36ff6d87ab457748f067.filez b/repo/objects/0d/803410df7df9657d338fb025197b787a08d4693a1c36ff6d87ab457748f067.filez new file mode 100644 index 00000000000..47a5f6a73fc Binary files /dev/null and b/repo/objects/0d/803410df7df9657d338fb025197b787a08d4693a1c36ff6d87ab457748f067.filez differ diff --git a/repo/objects/0d/8e901163c14c88d713c2794b05cac3c90526293ea3e603ed5676f0e883d00d.filez b/repo/objects/0d/8e901163c14c88d713c2794b05cac3c90526293ea3e603ed5676f0e883d00d.filez new file mode 100644 index 00000000000..16c08daf885 Binary files /dev/null and b/repo/objects/0d/8e901163c14c88d713c2794b05cac3c90526293ea3e603ed5676f0e883d00d.filez differ diff --git a/repo/objects/0d/904aad34d6bf450731befbb704347ba1c4cc0c1ad945c487e0046989769950.filez b/repo/objects/0d/904aad34d6bf450731befbb704347ba1c4cc0c1ad945c487e0046989769950.filez new file mode 100644 index 00000000000..46ced57b99e Binary files /dev/null and b/repo/objects/0d/904aad34d6bf450731befbb704347ba1c4cc0c1ad945c487e0046989769950.filez differ diff --git a/repo/objects/0d/9a394c94b25b0aa8f7da21c3b7fa7dda0326bf1a6835a08d9c308979a3a441.filez b/repo/objects/0d/9a394c94b25b0aa8f7da21c3b7fa7dda0326bf1a6835a08d9c308979a3a441.filez new file mode 100644 index 00000000000..fab25939e30 Binary files /dev/null and b/repo/objects/0d/9a394c94b25b0aa8f7da21c3b7fa7dda0326bf1a6835a08d9c308979a3a441.filez differ diff --git a/repo/objects/0d/d13d9f0de67b8304e426f12731a3944110b241434b86f5c84ecbd601f2b9fb.dirtree b/repo/objects/0d/d13d9f0de67b8304e426f12731a3944110b241434b86f5c84ecbd601f2b9fb.dirtree new file mode 100644 index 00000000000..5f3e93bac96 Binary files /dev/null and b/repo/objects/0d/d13d9f0de67b8304e426f12731a3944110b241434b86f5c84ecbd601f2b9fb.dirtree differ diff --git a/repo/objects/0d/eeeaad2694b6522c807825a0a6c6d5e798f5e0975db7a0300a9792713bd5d7.filez b/repo/objects/0d/eeeaad2694b6522c807825a0a6c6d5e798f5e0975db7a0300a9792713bd5d7.filez new file mode 100644 index 00000000000..57fd932ead0 Binary files /dev/null and b/repo/objects/0d/eeeaad2694b6522c807825a0a6c6d5e798f5e0975db7a0300a9792713bd5d7.filez differ diff --git a/repo/objects/0d/f1796196c2f7754f830347249bc2496d42554dd566edf2693b5e97d4b802f9.filez b/repo/objects/0d/f1796196c2f7754f830347249bc2496d42554dd566edf2693b5e97d4b802f9.filez new file mode 100644 index 00000000000..e3a6a845451 Binary files /dev/null and b/repo/objects/0d/f1796196c2f7754f830347249bc2496d42554dd566edf2693b5e97d4b802f9.filez differ diff --git a/repo/objects/0e/0cf492bed3c84734fafb09902fcb737bce82fd8ad56d850cd47f68d911fd64.filez b/repo/objects/0e/0cf492bed3c84734fafb09902fcb737bce82fd8ad56d850cd47f68d911fd64.filez new file mode 100644 index 00000000000..9c5fefc131a Binary files /dev/null and b/repo/objects/0e/0cf492bed3c84734fafb09902fcb737bce82fd8ad56d850cd47f68d911fd64.filez differ diff --git a/repo/objects/0e/2e2d49476fef286e7fc55b7ee66be5c0884ee33ff5cfe41f4292e2360910d7.filez b/repo/objects/0e/2e2d49476fef286e7fc55b7ee66be5c0884ee33ff5cfe41f4292e2360910d7.filez new file mode 100644 index 00000000000..168870e8dd8 Binary files /dev/null and b/repo/objects/0e/2e2d49476fef286e7fc55b7ee66be5c0884ee33ff5cfe41f4292e2360910d7.filez differ diff --git a/repo/objects/0e/3259c91343f56d733d7caf3e34267d549a24a38d351a7d5bc8f5b3e1fa5f91.filez b/repo/objects/0e/3259c91343f56d733d7caf3e34267d549a24a38d351a7d5bc8f5b3e1fa5f91.filez new file mode 100644 index 00000000000..62dd2eb1017 Binary files /dev/null and b/repo/objects/0e/3259c91343f56d733d7caf3e34267d549a24a38d351a7d5bc8f5b3e1fa5f91.filez differ diff --git a/repo/objects/0e/4b2e2adb5f6501e051557681e3bae65a87e9ac1cf06a3ceafbee09f9f3bd60.dirtree b/repo/objects/0e/4b2e2adb5f6501e051557681e3bae65a87e9ac1cf06a3ceafbee09f9f3bd60.dirtree new file mode 100644 index 00000000000..3730bc0512f Binary files /dev/null and b/repo/objects/0e/4b2e2adb5f6501e051557681e3bae65a87e9ac1cf06a3ceafbee09f9f3bd60.dirtree differ diff --git a/repo/objects/0e/7c2a7b4d4ddff1f3ca986ebdc133ebdcc8b1fbef1357cdc9d44a4deb38df2a.filez b/repo/objects/0e/7c2a7b4d4ddff1f3ca986ebdc133ebdcc8b1fbef1357cdc9d44a4deb38df2a.filez new file mode 100644 index 00000000000..112c6f8607f Binary files /dev/null and b/repo/objects/0e/7c2a7b4d4ddff1f3ca986ebdc133ebdcc8b1fbef1357cdc9d44a4deb38df2a.filez differ diff --git a/repo/objects/0e/8a22834ecde6a76d9d898b1cc4ab2f480b48221eb419ea7009da5c60484f3b.filez b/repo/objects/0e/8a22834ecde6a76d9d898b1cc4ab2f480b48221eb419ea7009da5c60484f3b.filez new file mode 100644 index 00000000000..4346ecb046c Binary files /dev/null and b/repo/objects/0e/8a22834ecde6a76d9d898b1cc4ab2f480b48221eb419ea7009da5c60484f3b.filez differ diff --git a/repo/objects/0e/bdf4ef97ba28a03faad2774268f520e22072b581269f302c1bc440378b301a.filez b/repo/objects/0e/bdf4ef97ba28a03faad2774268f520e22072b581269f302c1bc440378b301a.filez new file mode 100644 index 00000000000..9b08461d8ae Binary files /dev/null and b/repo/objects/0e/bdf4ef97ba28a03faad2774268f520e22072b581269f302c1bc440378b301a.filez differ diff --git a/repo/objects/0e/dac9a058f7a440e6bff8054a1ab88b41a76ac0dc9a038708a43b2ce174fdcf.filez b/repo/objects/0e/dac9a058f7a440e6bff8054a1ab88b41a76ac0dc9a038708a43b2ce174fdcf.filez new file mode 100644 index 00000000000..54c284a62ae Binary files /dev/null and b/repo/objects/0e/dac9a058f7a440e6bff8054a1ab88b41a76ac0dc9a038708a43b2ce174fdcf.filez differ diff --git a/repo/objects/0e/e13c9cc4abab5a98b4624ffd552aec7ab6e2effd5ae04a23a1b8ad3e9b7de7.filez b/repo/objects/0e/e13c9cc4abab5a98b4624ffd552aec7ab6e2effd5ae04a23a1b8ad3e9b7de7.filez new file mode 100644 index 00000000000..0f9f3bfba7a Binary files /dev/null and b/repo/objects/0e/e13c9cc4abab5a98b4624ffd552aec7ab6e2effd5ae04a23a1b8ad3e9b7de7.filez differ diff --git a/repo/objects/0e/f094321e745ecf9a19a7d2e3422a6c265d193bece835fce05c4af5b28b978d.filez b/repo/objects/0e/f094321e745ecf9a19a7d2e3422a6c265d193bece835fce05c4af5b28b978d.filez new file mode 100644 index 00000000000..e202b312d10 Binary files /dev/null and b/repo/objects/0e/f094321e745ecf9a19a7d2e3422a6c265d193bece835fce05c4af5b28b978d.filez differ diff --git a/repo/objects/0e/f3a136e30a8423a4f5dd86262902aa880f9dc0f765baf8d9858d13e72d3a09.filez b/repo/objects/0e/f3a136e30a8423a4f5dd86262902aa880f9dc0f765baf8d9858d13e72d3a09.filez new file mode 100644 index 00000000000..f7ccc80a3e5 Binary files /dev/null and b/repo/objects/0e/f3a136e30a8423a4f5dd86262902aa880f9dc0f765baf8d9858d13e72d3a09.filez differ diff --git a/repo/objects/0e/fc379611fc3333a2c1f03d8246ce5bffcc787e1b3a895a5049168145afec01.dirtree b/repo/objects/0e/fc379611fc3333a2c1f03d8246ce5bffcc787e1b3a895a5049168145afec01.dirtree new file mode 100644 index 00000000000..0edfcc3f07b Binary files /dev/null and b/repo/objects/0e/fc379611fc3333a2c1f03d8246ce5bffcc787e1b3a895a5049168145afec01.dirtree differ diff --git a/repo/objects/0f/04840eb5d282b7ca706a8558473e9fdf6da6ccd489c2447f94af2ffc6b6974.filez b/repo/objects/0f/04840eb5d282b7ca706a8558473e9fdf6da6ccd489c2447f94af2ffc6b6974.filez new file mode 100644 index 00000000000..367901bf65e Binary files /dev/null and b/repo/objects/0f/04840eb5d282b7ca706a8558473e9fdf6da6ccd489c2447f94af2ffc6b6974.filez differ diff --git a/repo/objects/0f/06bb334a217ece7ffe15666863e1a26baf7dcfba40ac7b55c0f7182da16a7c.filez b/repo/objects/0f/06bb334a217ece7ffe15666863e1a26baf7dcfba40ac7b55c0f7182da16a7c.filez new file mode 100644 index 00000000000..cc7500e6e1f Binary files /dev/null and b/repo/objects/0f/06bb334a217ece7ffe15666863e1a26baf7dcfba40ac7b55c0f7182da16a7c.filez differ diff --git a/repo/objects/0f/07cc1c21bf53d0bc8ca86258db1bb25f115f3f4223ef2c92282f74d69ec1f3.filez b/repo/objects/0f/07cc1c21bf53d0bc8ca86258db1bb25f115f3f4223ef2c92282f74d69ec1f3.filez new file mode 100644 index 00000000000..12cc838fa6d Binary files /dev/null and b/repo/objects/0f/07cc1c21bf53d0bc8ca86258db1bb25f115f3f4223ef2c92282f74d69ec1f3.filez differ diff --git a/repo/objects/0f/25170fabb359a80479ad736a77a9c1cd0410030a6e0bd1a42cfad840be0121.filez b/repo/objects/0f/25170fabb359a80479ad736a77a9c1cd0410030a6e0bd1a42cfad840be0121.filez new file mode 100644 index 00000000000..ead6c3f000c Binary files /dev/null and b/repo/objects/0f/25170fabb359a80479ad736a77a9c1cd0410030a6e0bd1a42cfad840be0121.filez differ diff --git a/repo/objects/0f/3bc647443871b15c3b6f49074726a24286c13a01e35b05d3d281eea64f7e34.filez b/repo/objects/0f/3bc647443871b15c3b6f49074726a24286c13a01e35b05d3d281eea64f7e34.filez new file mode 100644 index 00000000000..94635d07875 Binary files /dev/null and b/repo/objects/0f/3bc647443871b15c3b6f49074726a24286c13a01e35b05d3d281eea64f7e34.filez differ diff --git a/repo/objects/0f/5daa520c65866ab3500a1377c3c0f7149c0bce1a7ab6bd79bc8ea6f1c2908e.filez b/repo/objects/0f/5daa520c65866ab3500a1377c3c0f7149c0bce1a7ab6bd79bc8ea6f1c2908e.filez new file mode 100644 index 00000000000..2b8ba7db133 Binary files /dev/null and b/repo/objects/0f/5daa520c65866ab3500a1377c3c0f7149c0bce1a7ab6bd79bc8ea6f1c2908e.filez differ diff --git a/repo/objects/0f/6a525acf9fddedcf2fa36b4137a18c4ded2b8f5e86360dfde1f7924eb197e2.filez b/repo/objects/0f/6a525acf9fddedcf2fa36b4137a18c4ded2b8f5e86360dfde1f7924eb197e2.filez new file mode 100644 index 00000000000..7fe48116ec5 Binary files /dev/null and b/repo/objects/0f/6a525acf9fddedcf2fa36b4137a18c4ded2b8f5e86360dfde1f7924eb197e2.filez differ diff --git a/repo/objects/0f/8ab302dcf800110516f42a00f2612c4a183c5dfb64d57629d90090950510b8.filez b/repo/objects/0f/8ab302dcf800110516f42a00f2612c4a183c5dfb64d57629d90090950510b8.filez new file mode 100644 index 00000000000..86d068ced76 Binary files /dev/null and b/repo/objects/0f/8ab302dcf800110516f42a00f2612c4a183c5dfb64d57629d90090950510b8.filez differ diff --git a/repo/objects/0f/90f7915b006170528adccc6bcb4bb2c3f28debd53c7268d2059901da61d43f.filez b/repo/objects/0f/90f7915b006170528adccc6bcb4bb2c3f28debd53c7268d2059901da61d43f.filez new file mode 100644 index 00000000000..3e27d86d1df Binary files /dev/null and b/repo/objects/0f/90f7915b006170528adccc6bcb4bb2c3f28debd53c7268d2059901da61d43f.filez differ diff --git a/repo/objects/0f/acbb098ec584ac1e7c2afa791bc32489d5bdc4e4d6f6d4b824a06653592049.filez b/repo/objects/0f/acbb098ec584ac1e7c2afa791bc32489d5bdc4e4d6f6d4b824a06653592049.filez new file mode 100644 index 00000000000..ff2aa9f72af Binary files /dev/null and b/repo/objects/0f/acbb098ec584ac1e7c2afa791bc32489d5bdc4e4d6f6d4b824a06653592049.filez differ diff --git a/repo/objects/0f/ad96e6a15b7140ec690730a0f97ed67c78180e24fcdd691398c4929916f50c.filez b/repo/objects/0f/ad96e6a15b7140ec690730a0f97ed67c78180e24fcdd691398c4929916f50c.filez new file mode 100644 index 00000000000..1e6e4cb4141 Binary files /dev/null and b/repo/objects/0f/ad96e6a15b7140ec690730a0f97ed67c78180e24fcdd691398c4929916f50c.filez differ diff --git a/repo/objects/0f/f50389682f3e1691adb6c363e99a16200bacff73047fddb47cd92a52a01b2e.dirtree b/repo/objects/0f/f50389682f3e1691adb6c363e99a16200bacff73047fddb47cd92a52a01b2e.dirtree new file mode 100644 index 00000000000..b1449752fc4 Binary files /dev/null and b/repo/objects/0f/f50389682f3e1691adb6c363e99a16200bacff73047fddb47cd92a52a01b2e.dirtree differ diff --git a/repo/objects/10/0ce866b410ef0eb9fc3e8e265427cad25687b969237cb19eb5b4790fbd1831.dirtree b/repo/objects/10/0ce866b410ef0eb9fc3e8e265427cad25687b969237cb19eb5b4790fbd1831.dirtree new file mode 100644 index 00000000000..448f0220b60 Binary files /dev/null and b/repo/objects/10/0ce866b410ef0eb9fc3e8e265427cad25687b969237cb19eb5b4790fbd1831.dirtree differ diff --git a/repo/objects/10/3f552a718feee48a904634ce5186b130d12d3d0e64b87b88f5e3f0c3a348a9.filez b/repo/objects/10/3f552a718feee48a904634ce5186b130d12d3d0e64b87b88f5e3f0c3a348a9.filez new file mode 100644 index 00000000000..e6ba77aca5f Binary files /dev/null and b/repo/objects/10/3f552a718feee48a904634ce5186b130d12d3d0e64b87b88f5e3f0c3a348a9.filez differ diff --git a/repo/objects/10/4af245a7d0e7ca1a1c33265dbf2876daab6c3573462c975a9603470004f838.filez b/repo/objects/10/4af245a7d0e7ca1a1c33265dbf2876daab6c3573462c975a9603470004f838.filez new file mode 100644 index 00000000000..23023be30f9 Binary files /dev/null and b/repo/objects/10/4af245a7d0e7ca1a1c33265dbf2876daab6c3573462c975a9603470004f838.filez differ diff --git a/repo/objects/10/532b0670765fe361e0c0998e61bcd3bd06d4c124d70191d0f22aa3103de6df.filez b/repo/objects/10/532b0670765fe361e0c0998e61bcd3bd06d4c124d70191d0f22aa3103de6df.filez new file mode 100644 index 00000000000..f07a2a0901c Binary files /dev/null and b/repo/objects/10/532b0670765fe361e0c0998e61bcd3bd06d4c124d70191d0f22aa3103de6df.filez differ diff --git a/repo/objects/10/554bc949b8f9f912c2f138419522e733b3e8927fcc0b4e06ba96737f0c61f7.dirtree b/repo/objects/10/554bc949b8f9f912c2f138419522e733b3e8927fcc0b4e06ba96737f0c61f7.dirtree new file mode 100644 index 00000000000..640c78c556a Binary files /dev/null and b/repo/objects/10/554bc949b8f9f912c2f138419522e733b3e8927fcc0b4e06ba96737f0c61f7.dirtree differ diff --git a/repo/objects/10/64aa3c563ffff19743b86d0eb99ba0eccce1bb5bd3ed32251393c5ab69d5e9.filez b/repo/objects/10/64aa3c563ffff19743b86d0eb99ba0eccce1bb5bd3ed32251393c5ab69d5e9.filez new file mode 100644 index 00000000000..b909f2c21a4 Binary files /dev/null and b/repo/objects/10/64aa3c563ffff19743b86d0eb99ba0eccce1bb5bd3ed32251393c5ab69d5e9.filez differ diff --git a/repo/objects/10/66f4894caa3c4891229203022d2362f5a98039d820ed66061121e131935d23.dirtree b/repo/objects/10/66f4894caa3c4891229203022d2362f5a98039d820ed66061121e131935d23.dirtree new file mode 100644 index 00000000000..77820510772 Binary files /dev/null and b/repo/objects/10/66f4894caa3c4891229203022d2362f5a98039d820ed66061121e131935d23.dirtree differ diff --git a/repo/objects/10/797f19b1bb6fd12879fc4543fa8844f60a7e9d9856e949f3ce4408d50b19cc.filez b/repo/objects/10/797f19b1bb6fd12879fc4543fa8844f60a7e9d9856e949f3ce4408d50b19cc.filez new file mode 100644 index 00000000000..4fae7da324f Binary files /dev/null and b/repo/objects/10/797f19b1bb6fd12879fc4543fa8844f60a7e9d9856e949f3ce4408d50b19cc.filez differ diff --git a/repo/objects/10/85c24d0a5f813fc202a83027a2734fd67a42be9b258f3f78077d71946dc243.filez b/repo/objects/10/85c24d0a5f813fc202a83027a2734fd67a42be9b258f3f78077d71946dc243.filez new file mode 100644 index 00000000000..1f43d1f0001 Binary files /dev/null and b/repo/objects/10/85c24d0a5f813fc202a83027a2734fd67a42be9b258f3f78077d71946dc243.filez differ diff --git a/repo/objects/10/97d1c2b1e78a59d8a25d705097f891ef971fb914d74df95499fb7130c79650.filez b/repo/objects/10/97d1c2b1e78a59d8a25d705097f891ef971fb914d74df95499fb7130c79650.filez new file mode 100644 index 00000000000..8f77a49f169 Binary files /dev/null and b/repo/objects/10/97d1c2b1e78a59d8a25d705097f891ef971fb914d74df95499fb7130c79650.filez differ diff --git a/repo/objects/10/9f6a86bab9a4e3b848acfb34ecec1ed155d35777575b5c6ff6205206fb4428.filez b/repo/objects/10/9f6a86bab9a4e3b848acfb34ecec1ed155d35777575b5c6ff6205206fb4428.filez new file mode 100644 index 00000000000..3e8bf80e234 Binary files /dev/null and b/repo/objects/10/9f6a86bab9a4e3b848acfb34ecec1ed155d35777575b5c6ff6205206fb4428.filez differ diff --git a/repo/objects/10/a49be0e74983c099e73abac9fbff82471ba7bdef864ba1636cdbbe27132890.filez b/repo/objects/10/a49be0e74983c099e73abac9fbff82471ba7bdef864ba1636cdbbe27132890.filez new file mode 100644 index 00000000000..c0f566d1849 Binary files /dev/null and b/repo/objects/10/a49be0e74983c099e73abac9fbff82471ba7bdef864ba1636cdbbe27132890.filez differ diff --git a/repo/objects/10/d8ac5a09cfdc34c4eefb86e1c51e8706d2e9b1e3212ea81f395be6fe88056d.filez b/repo/objects/10/d8ac5a09cfdc34c4eefb86e1c51e8706d2e9b1e3212ea81f395be6fe88056d.filez new file mode 100644 index 00000000000..f41c9a315cd Binary files /dev/null and b/repo/objects/10/d8ac5a09cfdc34c4eefb86e1c51e8706d2e9b1e3212ea81f395be6fe88056d.filez differ diff --git a/repo/objects/10/f389f86cb44da7239a4bb007f5ec1a7bf48601d03c8197d48a3852b7ca8fa9.filez b/repo/objects/10/f389f86cb44da7239a4bb007f5ec1a7bf48601d03c8197d48a3852b7ca8fa9.filez new file mode 100644 index 00000000000..991c4bab80e Binary files /dev/null and b/repo/objects/10/f389f86cb44da7239a4bb007f5ec1a7bf48601d03c8197d48a3852b7ca8fa9.filez differ diff --git a/repo/objects/10/feaf852e90bc641d17c5e298c4c9d27b610e5236f4b7a780d479f30750d07b.filez b/repo/objects/10/feaf852e90bc641d17c5e298c4c9d27b610e5236f4b7a780d479f30750d07b.filez new file mode 100644 index 00000000000..a0cbf11800c Binary files /dev/null and b/repo/objects/10/feaf852e90bc641d17c5e298c4c9d27b610e5236f4b7a780d479f30750d07b.filez differ diff --git a/repo/objects/11/2dc900f228767bcec0878c5cd7a549a6dcf5518223d50b103a67b2b298f6b6.filez b/repo/objects/11/2dc900f228767bcec0878c5cd7a549a6dcf5518223d50b103a67b2b298f6b6.filez new file mode 100644 index 00000000000..a36362b93f8 Binary files /dev/null and b/repo/objects/11/2dc900f228767bcec0878c5cd7a549a6dcf5518223d50b103a67b2b298f6b6.filez differ diff --git a/repo/objects/11/35821c6b825fc4a2c5440a88ee66b2c2cb0422298092c2c2eb54390f735b20.filez b/repo/objects/11/35821c6b825fc4a2c5440a88ee66b2c2cb0422298092c2c2eb54390f735b20.filez new file mode 100644 index 00000000000..8bed0c6a8d2 Binary files /dev/null and b/repo/objects/11/35821c6b825fc4a2c5440a88ee66b2c2cb0422298092c2c2eb54390f735b20.filez differ diff --git a/repo/objects/11/6290f62da57030782d8cb33792588d9af1b39027c2d70d8062e21eca8c51b6.filez b/repo/objects/11/6290f62da57030782d8cb33792588d9af1b39027c2d70d8062e21eca8c51b6.filez new file mode 100644 index 00000000000..0c3d0447b82 Binary files /dev/null and b/repo/objects/11/6290f62da57030782d8cb33792588d9af1b39027c2d70d8062e21eca8c51b6.filez differ diff --git a/repo/objects/11/872ad8849479d3d9a2e1149f7b72449d5a9071a417b77e8a4a2a6b190e2980.filez b/repo/objects/11/872ad8849479d3d9a2e1149f7b72449d5a9071a417b77e8a4a2a6b190e2980.filez new file mode 100644 index 00000000000..90e9ed9ae2b Binary files /dev/null and b/repo/objects/11/872ad8849479d3d9a2e1149f7b72449d5a9071a417b77e8a4a2a6b190e2980.filez differ diff --git a/repo/objects/11/93fc37bdc05fccf829d8e5765cdfa2e3ed7a928aeed1a2d575d8ba859a75f7.dirtree b/repo/objects/11/93fc37bdc05fccf829d8e5765cdfa2e3ed7a928aeed1a2d575d8ba859a75f7.dirtree new file mode 100644 index 00000000000..55bf70cf385 Binary files /dev/null and b/repo/objects/11/93fc37bdc05fccf829d8e5765cdfa2e3ed7a928aeed1a2d575d8ba859a75f7.dirtree differ diff --git a/repo/objects/11/9523d784626134d301881d4aa426653a0ac0daa0a2cc85184518d11da7a896.filez b/repo/objects/11/9523d784626134d301881d4aa426653a0ac0daa0a2cc85184518d11da7a896.filez new file mode 100644 index 00000000000..af54c28a94f Binary files /dev/null and b/repo/objects/11/9523d784626134d301881d4aa426653a0ac0daa0a2cc85184518d11da7a896.filez differ diff --git a/repo/objects/11/ccace78696129d714609ffe77cb344c871ac6abdf76ccb57be510ecc703bed.filez b/repo/objects/11/ccace78696129d714609ffe77cb344c871ac6abdf76ccb57be510ecc703bed.filez new file mode 100644 index 00000000000..9bbc9d0f9bd Binary files /dev/null and b/repo/objects/11/ccace78696129d714609ffe77cb344c871ac6abdf76ccb57be510ecc703bed.filez differ diff --git a/repo/objects/11/d4ea413f24dc4e026497c61d82f62c93e82793137c20936360eb69e33ee858.dirtree b/repo/objects/11/d4ea413f24dc4e026497c61d82f62c93e82793137c20936360eb69e33ee858.dirtree new file mode 100644 index 00000000000..9aa6eaf6da8 Binary files /dev/null and b/repo/objects/11/d4ea413f24dc4e026497c61d82f62c93e82793137c20936360eb69e33ee858.dirtree differ diff --git a/repo/objects/11/f46f1005d4742eb853711d3ea3f96ad9b3709248a6eee3b5fe6e5150664b43.filez b/repo/objects/11/f46f1005d4742eb853711d3ea3f96ad9b3709248a6eee3b5fe6e5150664b43.filez new file mode 100644 index 00000000000..f91e1f3b791 Binary files /dev/null and b/repo/objects/11/f46f1005d4742eb853711d3ea3f96ad9b3709248a6eee3b5fe6e5150664b43.filez differ diff --git a/repo/objects/12/265cfd5038a1f34203a7d172fab549e71df5a8727fabc39844c8346939b69e.filez b/repo/objects/12/265cfd5038a1f34203a7d172fab549e71df5a8727fabc39844c8346939b69e.filez new file mode 100644 index 00000000000..954d64d1991 Binary files /dev/null and b/repo/objects/12/265cfd5038a1f34203a7d172fab549e71df5a8727fabc39844c8346939b69e.filez differ diff --git a/repo/objects/12/38df3bd3bbbbf2d602f896178718bb9f95aa39b4a52bfbfaded6d2ccd446bd.filez b/repo/objects/12/38df3bd3bbbbf2d602f896178718bb9f95aa39b4a52bfbfaded6d2ccd446bd.filez new file mode 100644 index 00000000000..11cacfb29c7 Binary files /dev/null and b/repo/objects/12/38df3bd3bbbbf2d602f896178718bb9f95aa39b4a52bfbfaded6d2ccd446bd.filez differ diff --git a/repo/objects/12/3b2dd5388d0ff260ad123d03998bd0414d459954da70618c4d75426cf00eb7.filez b/repo/objects/12/3b2dd5388d0ff260ad123d03998bd0414d459954da70618c4d75426cf00eb7.filez new file mode 100644 index 00000000000..cdcc9296461 Binary files /dev/null and b/repo/objects/12/3b2dd5388d0ff260ad123d03998bd0414d459954da70618c4d75426cf00eb7.filez differ diff --git a/repo/objects/12/76066d232bae7f279367f590265a38c3fe6714b9e703498e31d2d405d701ed.filez b/repo/objects/12/76066d232bae7f279367f590265a38c3fe6714b9e703498e31d2d405d701ed.filez new file mode 100644 index 00000000000..32abda417a8 Binary files /dev/null and b/repo/objects/12/76066d232bae7f279367f590265a38c3fe6714b9e703498e31d2d405d701ed.filez differ diff --git a/repo/objects/12/91d24130d0c291b359c41687c7b8181679290b9bec5732bc057655da1eb1e0.filez b/repo/objects/12/91d24130d0c291b359c41687c7b8181679290b9bec5732bc057655da1eb1e0.filez new file mode 100644 index 00000000000..159ccb16b50 Binary files /dev/null and b/repo/objects/12/91d24130d0c291b359c41687c7b8181679290b9bec5732bc057655da1eb1e0.filez differ diff --git a/repo/objects/12/91d995b88a27f85f3ffb54bf4d5cb1ea670d5cd79669be1966532aa9b8cee2.dirtree b/repo/objects/12/91d995b88a27f85f3ffb54bf4d5cb1ea670d5cd79669be1966532aa9b8cee2.dirtree new file mode 100644 index 00000000000..4ddeaf9877f Binary files /dev/null and b/repo/objects/12/91d995b88a27f85f3ffb54bf4d5cb1ea670d5cd79669be1966532aa9b8cee2.dirtree differ diff --git a/repo/objects/12/9a368c55b9207de640c03e129512ffccb3f9d1d1ef22513bc30b41cdb06543.filez b/repo/objects/12/9a368c55b9207de640c03e129512ffccb3f9d1d1ef22513bc30b41cdb06543.filez new file mode 100644 index 00000000000..9cd0e35060e Binary files /dev/null and b/repo/objects/12/9a368c55b9207de640c03e129512ffccb3f9d1d1ef22513bc30b41cdb06543.filez differ diff --git a/repo/objects/12/b6602d66f5e34cf6517955a5d8f23940afd12869d299cd5a99e23f018687be.filez b/repo/objects/12/b6602d66f5e34cf6517955a5d8f23940afd12869d299cd5a99e23f018687be.filez new file mode 100644 index 00000000000..c9d40544dc8 Binary files /dev/null and b/repo/objects/12/b6602d66f5e34cf6517955a5d8f23940afd12869d299cd5a99e23f018687be.filez differ diff --git a/repo/objects/12/d3f182358324c466a26af727af6da090b3a6e21b91be8df8f5bdac139171a4.filez b/repo/objects/12/d3f182358324c466a26af727af6da090b3a6e21b91be8df8f5bdac139171a4.filez new file mode 100644 index 00000000000..360ed04c490 Binary files /dev/null and b/repo/objects/12/d3f182358324c466a26af727af6da090b3a6e21b91be8df8f5bdac139171a4.filez differ diff --git a/repo/objects/12/d9443512e5dcfd5460956ea8caeaa966fb3811e3b489626031fd2d8013f2b0.filez b/repo/objects/12/d9443512e5dcfd5460956ea8caeaa966fb3811e3b489626031fd2d8013f2b0.filez new file mode 100644 index 00000000000..5d41f731845 Binary files /dev/null and b/repo/objects/12/d9443512e5dcfd5460956ea8caeaa966fb3811e3b489626031fd2d8013f2b0.filez differ diff --git a/repo/objects/12/e0ed6047cd5c8497047144eec99ca281fd55b6297302efb5789ae70f2f2929.dirtree b/repo/objects/12/e0ed6047cd5c8497047144eec99ca281fd55b6297302efb5789ae70f2f2929.dirtree new file mode 100644 index 00000000000..03bbff267e5 Binary files /dev/null and b/repo/objects/12/e0ed6047cd5c8497047144eec99ca281fd55b6297302efb5789ae70f2f2929.dirtree differ diff --git a/repo/objects/12/f281beeddac70f4db60a917c5217403cb3652de631d4a8e4ce899c31ff6e96.filez b/repo/objects/12/f281beeddac70f4db60a917c5217403cb3652de631d4a8e4ce899c31ff6e96.filez new file mode 100644 index 00000000000..62bc3387cc6 Binary files /dev/null and b/repo/objects/12/f281beeddac70f4db60a917c5217403cb3652de631d4a8e4ce899c31ff6e96.filez differ diff --git a/repo/objects/13/1fd00a4889f6a844fe482e4d9ca1823381c7dcc30b0f67eb04364a170944de.filez b/repo/objects/13/1fd00a4889f6a844fe482e4d9ca1823381c7dcc30b0f67eb04364a170944de.filez new file mode 100644 index 00000000000..87d3784a741 Binary files /dev/null and b/repo/objects/13/1fd00a4889f6a844fe482e4d9ca1823381c7dcc30b0f67eb04364a170944de.filez differ diff --git a/repo/objects/13/2d059ed1f1d388f513810b19186c9d88ed66f4ff294e9e0dd4c8ff408b83a1.filez b/repo/objects/13/2d059ed1f1d388f513810b19186c9d88ed66f4ff294e9e0dd4c8ff408b83a1.filez new file mode 100644 index 00000000000..e8343da8061 Binary files /dev/null and b/repo/objects/13/2d059ed1f1d388f513810b19186c9d88ed66f4ff294e9e0dd4c8ff408b83a1.filez differ diff --git a/repo/objects/13/411d0d29891b838ba05381918f5dd484decf1a61f2df19affd825cbeb0f240.filez b/repo/objects/13/411d0d29891b838ba05381918f5dd484decf1a61f2df19affd825cbeb0f240.filez new file mode 100644 index 00000000000..a4576ec5aa1 Binary files /dev/null and b/repo/objects/13/411d0d29891b838ba05381918f5dd484decf1a61f2df19affd825cbeb0f240.filez differ diff --git a/repo/objects/13/43c54ad5c5f5221b3a71cef1aa997555f8788a8757a2ae9eefcbd12c02305e.filez b/repo/objects/13/43c54ad5c5f5221b3a71cef1aa997555f8788a8757a2ae9eefcbd12c02305e.filez new file mode 100644 index 00000000000..59f971f73de Binary files /dev/null and b/repo/objects/13/43c54ad5c5f5221b3a71cef1aa997555f8788a8757a2ae9eefcbd12c02305e.filez differ diff --git a/repo/objects/13/61271b788ddb06652cfe9dea56e00b0e434c67e55a905ba058b12102e463ff.filez b/repo/objects/13/61271b788ddb06652cfe9dea56e00b0e434c67e55a905ba058b12102e463ff.filez new file mode 100644 index 00000000000..05949fab90d Binary files /dev/null and b/repo/objects/13/61271b788ddb06652cfe9dea56e00b0e434c67e55a905ba058b12102e463ff.filez differ diff --git a/repo/objects/13/67156133c96a18749e84d488defa8b944ff49486a8a30d8a194f2d546028cc.filez b/repo/objects/13/67156133c96a18749e84d488defa8b944ff49486a8a30d8a194f2d546028cc.filez new file mode 100644 index 00000000000..5b3d09abc35 Binary files /dev/null and b/repo/objects/13/67156133c96a18749e84d488defa8b944ff49486a8a30d8a194f2d546028cc.filez differ diff --git a/repo/objects/13/a77270173078820fff14dab364d541a28830147f20665122a7bc0634e7975d.filez b/repo/objects/13/a77270173078820fff14dab364d541a28830147f20665122a7bc0634e7975d.filez new file mode 100644 index 00000000000..0a8a16816f7 Binary files /dev/null and b/repo/objects/13/a77270173078820fff14dab364d541a28830147f20665122a7bc0634e7975d.filez differ diff --git a/repo/objects/13/b4dc6a73d31929c8a4b04beddacd8429b477ca9c03d67d0f8d51e0ffc2c985.filez b/repo/objects/13/b4dc6a73d31929c8a4b04beddacd8429b477ca9c03d67d0f8d51e0ffc2c985.filez new file mode 100644 index 00000000000..363a7c00be3 Binary files /dev/null and b/repo/objects/13/b4dc6a73d31929c8a4b04beddacd8429b477ca9c03d67d0f8d51e0ffc2c985.filez differ diff --git a/repo/objects/13/cbc3b811a1f9a3fd5c8e38e6a4e7b955a3aacb55bb452d9b86a89b359cacd5.filez b/repo/objects/13/cbc3b811a1f9a3fd5c8e38e6a4e7b955a3aacb55bb452d9b86a89b359cacd5.filez new file mode 100644 index 00000000000..d86fdae2133 Binary files /dev/null and b/repo/objects/13/cbc3b811a1f9a3fd5c8e38e6a4e7b955a3aacb55bb452d9b86a89b359cacd5.filez differ diff --git a/repo/objects/13/e0790042b46ff5264b77fcb3d0e9df3d26de25c33707d1c3a27a2cd7de5916.filez b/repo/objects/13/e0790042b46ff5264b77fcb3d0e9df3d26de25c33707d1c3a27a2cd7de5916.filez new file mode 100644 index 00000000000..db4eb1799cd Binary files /dev/null and b/repo/objects/13/e0790042b46ff5264b77fcb3d0e9df3d26de25c33707d1c3a27a2cd7de5916.filez differ diff --git a/repo/objects/13/f41919292ebd9c3d70c779a9b7590f1169daa72b4127cc85b7461595b9ad33.filez b/repo/objects/13/f41919292ebd9c3d70c779a9b7590f1169daa72b4127cc85b7461595b9ad33.filez new file mode 100644 index 00000000000..150305deccc Binary files /dev/null and b/repo/objects/13/f41919292ebd9c3d70c779a9b7590f1169daa72b4127cc85b7461595b9ad33.filez differ diff --git a/repo/objects/13/fa2a3725b34bbc3af6afa3a1a5d2f4e6696a78b021d9ab4b8aa7d55d040d29.filez b/repo/objects/13/fa2a3725b34bbc3af6afa3a1a5d2f4e6696a78b021d9ab4b8aa7d55d040d29.filez new file mode 100644 index 00000000000..627d41cd8ba Binary files /dev/null and b/repo/objects/13/fa2a3725b34bbc3af6afa3a1a5d2f4e6696a78b021d9ab4b8aa7d55d040d29.filez differ diff --git a/repo/objects/14/050a600345ff76fe40e18c0e72128f339cc5529c38afdf46506fa3d74729bf.dirtree b/repo/objects/14/050a600345ff76fe40e18c0e72128f339cc5529c38afdf46506fa3d74729bf.dirtree new file mode 100644 index 00000000000..7a941b506bf Binary files /dev/null and b/repo/objects/14/050a600345ff76fe40e18c0e72128f339cc5529c38afdf46506fa3d74729bf.dirtree differ diff --git a/repo/objects/14/510019dc3cfdd82835d4907d46b02c78588f4b447ea015414f936cba1bcbc0.dirtree b/repo/objects/14/510019dc3cfdd82835d4907d46b02c78588f4b447ea015414f936cba1bcbc0.dirtree new file mode 100644 index 00000000000..7f2d9666542 Binary files /dev/null and b/repo/objects/14/510019dc3cfdd82835d4907d46b02c78588f4b447ea015414f936cba1bcbc0.dirtree differ diff --git a/repo/objects/14/5786a752581cac79a5e73901aa2aebf8e3bceb1caecfec5df30e4d8932be40.filez b/repo/objects/14/5786a752581cac79a5e73901aa2aebf8e3bceb1caecfec5df30e4d8932be40.filez new file mode 100644 index 00000000000..539f7d0287d Binary files /dev/null and b/repo/objects/14/5786a752581cac79a5e73901aa2aebf8e3bceb1caecfec5df30e4d8932be40.filez differ diff --git a/repo/objects/14/7b566490f1b32283160b6368f072a8340abe6124c3e7ee3cdcf3131446f764.filez b/repo/objects/14/7b566490f1b32283160b6368f072a8340abe6124c3e7ee3cdcf3131446f764.filez new file mode 100644 index 00000000000..e64d0cb3cc2 Binary files /dev/null and b/repo/objects/14/7b566490f1b32283160b6368f072a8340abe6124c3e7ee3cdcf3131446f764.filez differ diff --git a/repo/objects/14/8532b106006f9b326ce088a81a1ef0b48484655fd0c3612dab5281370a096f.dirtree b/repo/objects/14/8532b106006f9b326ce088a81a1ef0b48484655fd0c3612dab5281370a096f.dirtree new file mode 100644 index 00000000000..94d227edf54 Binary files /dev/null and b/repo/objects/14/8532b106006f9b326ce088a81a1ef0b48484655fd0c3612dab5281370a096f.dirtree differ diff --git a/repo/objects/14/a517c45080b83a76d833756ae62f391b656a2f2a01a081e05ec0107b6659a1.filez b/repo/objects/14/a517c45080b83a76d833756ae62f391b656a2f2a01a081e05ec0107b6659a1.filez new file mode 100644 index 00000000000..ce56302e36e Binary files /dev/null and b/repo/objects/14/a517c45080b83a76d833756ae62f391b656a2f2a01a081e05ec0107b6659a1.filez differ diff --git a/repo/objects/14/bfd9096cd68d453add7cf293615b43708bdf25f5373a7e336ff071a0ca97c6.filez b/repo/objects/14/bfd9096cd68d453add7cf293615b43708bdf25f5373a7e336ff071a0ca97c6.filez new file mode 100644 index 00000000000..f4efd2aa634 Binary files /dev/null and b/repo/objects/14/bfd9096cd68d453add7cf293615b43708bdf25f5373a7e336ff071a0ca97c6.filez differ diff --git a/repo/objects/14/c5a073954fbd5694e028e27e95dd27c2f50a4414735fe683cbc7424f5fde90.dirtree b/repo/objects/14/c5a073954fbd5694e028e27e95dd27c2f50a4414735fe683cbc7424f5fde90.dirtree new file mode 100644 index 00000000000..e2eb8d4b24c Binary files /dev/null and b/repo/objects/14/c5a073954fbd5694e028e27e95dd27c2f50a4414735fe683cbc7424f5fde90.dirtree differ diff --git a/repo/objects/14/c5d1556dab39b519acc692e25f9797945b8719e95ae891ed2ab3ea1facbbab.filez b/repo/objects/14/c5d1556dab39b519acc692e25f9797945b8719e95ae891ed2ab3ea1facbbab.filez new file mode 100644 index 00000000000..77dffe50fb7 Binary files /dev/null and b/repo/objects/14/c5d1556dab39b519acc692e25f9797945b8719e95ae891ed2ab3ea1facbbab.filez differ diff --git a/repo/objects/14/c6810567dc1ad6b2c1561522768835aef345f9c4722a773a5f7c7d22699552.filez b/repo/objects/14/c6810567dc1ad6b2c1561522768835aef345f9c4722a773a5f7c7d22699552.filez new file mode 100644 index 00000000000..41926b152c2 Binary files /dev/null and b/repo/objects/14/c6810567dc1ad6b2c1561522768835aef345f9c4722a773a5f7c7d22699552.filez differ diff --git a/repo/objects/14/e8126a9f56bd8fa536b373ce7fc757f63371230bda06bdf154b27abe9ff878.dirtree b/repo/objects/14/e8126a9f56bd8fa536b373ce7fc757f63371230bda06bdf154b27abe9ff878.dirtree new file mode 100644 index 00000000000..87e78b4bb2b Binary files /dev/null and b/repo/objects/14/e8126a9f56bd8fa536b373ce7fc757f63371230bda06bdf154b27abe9ff878.dirtree differ diff --git a/repo/objects/14/f31c1c24c54ed682f748ea1b680d63ba19ed92d7030c0d8a17be9e5622f5a4.filez b/repo/objects/14/f31c1c24c54ed682f748ea1b680d63ba19ed92d7030c0d8a17be9e5622f5a4.filez new file mode 100644 index 00000000000..da6cb125e1a Binary files /dev/null and b/repo/objects/14/f31c1c24c54ed682f748ea1b680d63ba19ed92d7030c0d8a17be9e5622f5a4.filez differ diff --git a/repo/objects/15/34bb9f69728d078d880d430a5cbc8fd77152a406805847927ccd33a1de0a7c.dirtree b/repo/objects/15/34bb9f69728d078d880d430a5cbc8fd77152a406805847927ccd33a1de0a7c.dirtree new file mode 100644 index 00000000000..5eeaeaf2083 Binary files /dev/null and b/repo/objects/15/34bb9f69728d078d880d430a5cbc8fd77152a406805847927ccd33a1de0a7c.dirtree differ diff --git a/repo/objects/15/3b788e7f0852a80d813ed8d9fc10c04748a791d407e4259b99270b3e9b796b.filez b/repo/objects/15/3b788e7f0852a80d813ed8d9fc10c04748a791d407e4259b99270b3e9b796b.filez new file mode 100644 index 00000000000..32b1353f4b7 Binary files /dev/null and b/repo/objects/15/3b788e7f0852a80d813ed8d9fc10c04748a791d407e4259b99270b3e9b796b.filez differ diff --git a/repo/objects/15/3c5490e2f6df921216d495c7af4b01dfe26754c0660acdd157903bac573d32.filez b/repo/objects/15/3c5490e2f6df921216d495c7af4b01dfe26754c0660acdd157903bac573d32.filez new file mode 100644 index 00000000000..bff1315ac60 Binary files /dev/null and b/repo/objects/15/3c5490e2f6df921216d495c7af4b01dfe26754c0660acdd157903bac573d32.filez differ diff --git a/repo/objects/15/617b35da041b38a1a5643ce47f5a47334473b394d1d5923c58e82ec1f41fde.filez b/repo/objects/15/617b35da041b38a1a5643ce47f5a47334473b394d1d5923c58e82ec1f41fde.filez new file mode 100644 index 00000000000..e7993ca59d5 Binary files /dev/null and b/repo/objects/15/617b35da041b38a1a5643ce47f5a47334473b394d1d5923c58e82ec1f41fde.filez differ diff --git a/repo/objects/15/631ed440aba4460635463823ecab2512265a0068892dafb2fd7b18154e3d2e.dirtree b/repo/objects/15/631ed440aba4460635463823ecab2512265a0068892dafb2fd7b18154e3d2e.dirtree new file mode 100644 index 00000000000..b7a8dcd979e Binary files /dev/null and b/repo/objects/15/631ed440aba4460635463823ecab2512265a0068892dafb2fd7b18154e3d2e.dirtree differ diff --git a/repo/objects/15/65393841df58dc31e8d50e995cd8abd8c978599953ee41ae79919a23796640.filez b/repo/objects/15/65393841df58dc31e8d50e995cd8abd8c978599953ee41ae79919a23796640.filez new file mode 100644 index 00000000000..2f5eb708803 Binary files /dev/null and b/repo/objects/15/65393841df58dc31e8d50e995cd8abd8c978599953ee41ae79919a23796640.filez differ diff --git a/repo/objects/15/6d131cbbaef08ac737b00590448a64e7554de00e571d0145bdaa0ba97a7ca9.filez b/repo/objects/15/6d131cbbaef08ac737b00590448a64e7554de00e571d0145bdaa0ba97a7ca9.filez new file mode 100644 index 00000000000..550ded470b1 Binary files /dev/null and b/repo/objects/15/6d131cbbaef08ac737b00590448a64e7554de00e571d0145bdaa0ba97a7ca9.filez differ diff --git a/repo/objects/15/727a8e058dbcf89e1c65d42deb9a2225a4aa28a935b2d374698e6a734e6654.filez b/repo/objects/15/727a8e058dbcf89e1c65d42deb9a2225a4aa28a935b2d374698e6a734e6654.filez new file mode 100644 index 00000000000..cc2e7e64dd8 Binary files /dev/null and b/repo/objects/15/727a8e058dbcf89e1c65d42deb9a2225a4aa28a935b2d374698e6a734e6654.filez differ diff --git a/repo/objects/15/a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e.commit b/repo/objects/15/a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e.commit new file mode 100644 index 00000000000..44eb853b546 Binary files /dev/null and b/repo/objects/15/a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e.commit differ diff --git a/repo/objects/15/a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e.commitmeta b/repo/objects/15/a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e.commitmeta new file mode 100644 index 00000000000..d42a425dc5e Binary files /dev/null and b/repo/objects/15/a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e.commitmeta differ diff --git a/repo/objects/15/a56e58641e67b558f463d98225ce090bd1e55a2053d234cdcf72a7a98cd935.filez b/repo/objects/15/a56e58641e67b558f463d98225ce090bd1e55a2053d234cdcf72a7a98cd935.filez new file mode 100644 index 00000000000..dcb80f303a3 Binary files /dev/null and b/repo/objects/15/a56e58641e67b558f463d98225ce090bd1e55a2053d234cdcf72a7a98cd935.filez differ diff --git a/repo/objects/15/adc3c5a730f8e511955ab11acfc084a0a849ee332c1f61d1d43ad733ffb902.dirtree b/repo/objects/15/adc3c5a730f8e511955ab11acfc084a0a849ee332c1f61d1d43ad733ffb902.dirtree new file mode 100644 index 00000000000..5bb760c80b9 Binary files /dev/null and b/repo/objects/15/adc3c5a730f8e511955ab11acfc084a0a849ee332c1f61d1d43ad733ffb902.dirtree differ diff --git a/repo/objects/15/e40ba7777882a5b10ea633950af8f1cd71ea9edbe6fa5a3f02d690912ed04d.filez b/repo/objects/15/e40ba7777882a5b10ea633950af8f1cd71ea9edbe6fa5a3f02d690912ed04d.filez new file mode 100644 index 00000000000..2315427cf90 Binary files /dev/null and b/repo/objects/15/e40ba7777882a5b10ea633950af8f1cd71ea9edbe6fa5a3f02d690912ed04d.filez differ diff --git a/repo/objects/15/ec591cf254cc0486d6e20fe00062a487094b9aedc8d35eb2ee382786fa0ba1.filez b/repo/objects/15/ec591cf254cc0486d6e20fe00062a487094b9aedc8d35eb2ee382786fa0ba1.filez new file mode 100644 index 00000000000..a6519d1d17d Binary files /dev/null and b/repo/objects/15/ec591cf254cc0486d6e20fe00062a487094b9aedc8d35eb2ee382786fa0ba1.filez differ diff --git a/repo/objects/16/03adf05d78ab03fc9d33c45b23ef719d6457f11e0a15ddbac48ffb98a1df87.filez b/repo/objects/16/03adf05d78ab03fc9d33c45b23ef719d6457f11e0a15ddbac48ffb98a1df87.filez new file mode 100644 index 00000000000..e9d02f9dd54 Binary files /dev/null and b/repo/objects/16/03adf05d78ab03fc9d33c45b23ef719d6457f11e0a15ddbac48ffb98a1df87.filez differ diff --git a/repo/objects/16/0d0d4d85a9bf5a30e74eda575dbe854219f31108777d3b16dd5470ecff06c8.filez b/repo/objects/16/0d0d4d85a9bf5a30e74eda575dbe854219f31108777d3b16dd5470ecff06c8.filez new file mode 100644 index 00000000000..a0258a13176 Binary files /dev/null and b/repo/objects/16/0d0d4d85a9bf5a30e74eda575dbe854219f31108777d3b16dd5470ecff06c8.filez differ diff --git a/repo/objects/16/3ac1a93bdd9220c1ad200517d02192d91f8488c160f09adcedd9ca6095d3d3.filez b/repo/objects/16/3ac1a93bdd9220c1ad200517d02192d91f8488c160f09adcedd9ca6095d3d3.filez new file mode 100644 index 00000000000..8ef6852ca02 Binary files /dev/null and b/repo/objects/16/3ac1a93bdd9220c1ad200517d02192d91f8488c160f09adcedd9ca6095d3d3.filez differ diff --git a/repo/objects/16/452bcfa8374c470b2e87199d7e2f707bbf817f24ce9f49b45c7f0d8a2bc8a1.filez b/repo/objects/16/452bcfa8374c470b2e87199d7e2f707bbf817f24ce9f49b45c7f0d8a2bc8a1.filez new file mode 100644 index 00000000000..a7c760b247f Binary files /dev/null and b/repo/objects/16/452bcfa8374c470b2e87199d7e2f707bbf817f24ce9f49b45c7f0d8a2bc8a1.filez differ diff --git a/repo/objects/16/464b59a05bec296694434402fc838fa56341b71282439ee8808ca6f5f58cb4.filez b/repo/objects/16/464b59a05bec296694434402fc838fa56341b71282439ee8808ca6f5f58cb4.filez new file mode 100644 index 00000000000..70ed50b089b Binary files /dev/null and b/repo/objects/16/464b59a05bec296694434402fc838fa56341b71282439ee8808ca6f5f58cb4.filez differ diff --git a/repo/objects/16/57202f2536f74ebd93cedcd1921539c8a7dd5a462e83b42d6e4913e3b2155c.filez b/repo/objects/16/57202f2536f74ebd93cedcd1921539c8a7dd5a462e83b42d6e4913e3b2155c.filez new file mode 100644 index 00000000000..f41c47d709b Binary files /dev/null and b/repo/objects/16/57202f2536f74ebd93cedcd1921539c8a7dd5a462e83b42d6e4913e3b2155c.filez differ diff --git a/repo/objects/16/78fd3b9b0b9a4e8c2f75b3ac74b729636d3ab5e2ca7cd6baf2fd17e8d4fea0.dirtree b/repo/objects/16/78fd3b9b0b9a4e8c2f75b3ac74b729636d3ab5e2ca7cd6baf2fd17e8d4fea0.dirtree new file mode 100644 index 00000000000..87030e2277d Binary files /dev/null and b/repo/objects/16/78fd3b9b0b9a4e8c2f75b3ac74b729636d3ab5e2ca7cd6baf2fd17e8d4fea0.dirtree differ diff --git a/repo/objects/16/8a2122400d94b37373c32fdfb75049ef0bee7f84681046337427f54ada8a92.dirtree b/repo/objects/16/8a2122400d94b37373c32fdfb75049ef0bee7f84681046337427f54ada8a92.dirtree new file mode 100644 index 00000000000..f9add12b556 Binary files /dev/null and b/repo/objects/16/8a2122400d94b37373c32fdfb75049ef0bee7f84681046337427f54ada8a92.dirtree differ diff --git a/repo/objects/16/9ab7d798da39d591109f1b65412ac9e06fc514301af12670f7c3f0ea92c165.filez b/repo/objects/16/9ab7d798da39d591109f1b65412ac9e06fc514301af12670f7c3f0ea92c165.filez new file mode 100644 index 00000000000..f2d11e0e102 Binary files /dev/null and b/repo/objects/16/9ab7d798da39d591109f1b65412ac9e06fc514301af12670f7c3f0ea92c165.filez differ diff --git a/repo/objects/16/d9a79f8b68bdb8ea0e3ee5174a2598016340f9f237cb87276d5b82947cacea.dirtree b/repo/objects/16/d9a79f8b68bdb8ea0e3ee5174a2598016340f9f237cb87276d5b82947cacea.dirtree new file mode 100644 index 00000000000..555f14a961d Binary files /dev/null and b/repo/objects/16/d9a79f8b68bdb8ea0e3ee5174a2598016340f9f237cb87276d5b82947cacea.dirtree differ diff --git a/repo/objects/16/e7200fe6857ca268f861a0f49ef5b5472801693557237aafa5dbaedc889292.dirtree b/repo/objects/16/e7200fe6857ca268f861a0f49ef5b5472801693557237aafa5dbaedc889292.dirtree new file mode 100644 index 00000000000..ba930ac804d Binary files /dev/null and b/repo/objects/16/e7200fe6857ca268f861a0f49ef5b5472801693557237aafa5dbaedc889292.dirtree differ diff --git a/repo/objects/17/234d81a7ad8e18e495b70fe20aff0e011258c3381f065003ca1d9d8139c684.filez b/repo/objects/17/234d81a7ad8e18e495b70fe20aff0e011258c3381f065003ca1d9d8139c684.filez new file mode 100644 index 00000000000..6723eb5797c Binary files /dev/null and b/repo/objects/17/234d81a7ad8e18e495b70fe20aff0e011258c3381f065003ca1d9d8139c684.filez differ diff --git a/repo/objects/17/2c4ceb7883ce802750ffb2299e6ee12945b0b972a5cb31003582c15ba4267c.dirtree b/repo/objects/17/2c4ceb7883ce802750ffb2299e6ee12945b0b972a5cb31003582c15ba4267c.dirtree new file mode 100644 index 00000000000..ab1d7424395 Binary files /dev/null and b/repo/objects/17/2c4ceb7883ce802750ffb2299e6ee12945b0b972a5cb31003582c15ba4267c.dirtree differ diff --git a/repo/objects/17/34e877f22a6e94c6f72dd8f94537981944f4e4c93f3b1076f0f0788cd1dad7.filez b/repo/objects/17/34e877f22a6e94c6f72dd8f94537981944f4e4c93f3b1076f0f0788cd1dad7.filez new file mode 100644 index 00000000000..88c6ad7b805 Binary files /dev/null and b/repo/objects/17/34e877f22a6e94c6f72dd8f94537981944f4e4c93f3b1076f0f0788cd1dad7.filez differ diff --git a/repo/objects/17/36eaad49cb0b372185de22df520c79bbc902a931b2860fdcafb8774a16c579.filez b/repo/objects/17/36eaad49cb0b372185de22df520c79bbc902a931b2860fdcafb8774a16c579.filez new file mode 100644 index 00000000000..63f6b626ead Binary files /dev/null and b/repo/objects/17/36eaad49cb0b372185de22df520c79bbc902a931b2860fdcafb8774a16c579.filez differ diff --git a/repo/objects/17/476402061d3613666d9dcbd8b204ceaf8bb7bfd50984f0a4b1ef04899a07bd.filez b/repo/objects/17/476402061d3613666d9dcbd8b204ceaf8bb7bfd50984f0a4b1ef04899a07bd.filez new file mode 100644 index 00000000000..326a01dee71 Binary files /dev/null and b/repo/objects/17/476402061d3613666d9dcbd8b204ceaf8bb7bfd50984f0a4b1ef04899a07bd.filez differ diff --git a/repo/objects/17/5c5f58dad9aed6a503de832c5e61b3dfe3e0c87959be079da03f1d958d1fdb.filez b/repo/objects/17/5c5f58dad9aed6a503de832c5e61b3dfe3e0c87959be079da03f1d958d1fdb.filez new file mode 100644 index 00000000000..1b68478e5ea Binary files /dev/null and b/repo/objects/17/5c5f58dad9aed6a503de832c5e61b3dfe3e0c87959be079da03f1d958d1fdb.filez differ diff --git a/repo/objects/17/740ab418b8390fe837fba33c6df954d3fdfc568aced924861f45c12880ade5.filez b/repo/objects/17/740ab418b8390fe837fba33c6df954d3fdfc568aced924861f45c12880ade5.filez new file mode 100644 index 00000000000..cf7368ad668 Binary files /dev/null and b/repo/objects/17/740ab418b8390fe837fba33c6df954d3fdfc568aced924861f45c12880ade5.filez differ diff --git a/repo/objects/17/86a40e50f5acf04d022d701012cb26109947e79f7262f29fc9d13aad6e2523.filez b/repo/objects/17/86a40e50f5acf04d022d701012cb26109947e79f7262f29fc9d13aad6e2523.filez new file mode 100644 index 00000000000..13cb126b2a6 Binary files /dev/null and b/repo/objects/17/86a40e50f5acf04d022d701012cb26109947e79f7262f29fc9d13aad6e2523.filez differ diff --git a/repo/objects/17/a4ba48c5b6f65c48bb4fcf73b9403be91eddf3421ff0103f2bc5e5e10202b0.filez b/repo/objects/17/a4ba48c5b6f65c48bb4fcf73b9403be91eddf3421ff0103f2bc5e5e10202b0.filez new file mode 100644 index 00000000000..bf5f0fbf1b4 Binary files /dev/null and b/repo/objects/17/a4ba48c5b6f65c48bb4fcf73b9403be91eddf3421ff0103f2bc5e5e10202b0.filez differ diff --git a/repo/objects/17/b9f64ed9ce8e6a60b6698ad3235d37ed63e1a95dcf8be3f5bd141cab36a65b.filez b/repo/objects/17/b9f64ed9ce8e6a60b6698ad3235d37ed63e1a95dcf8be3f5bd141cab36a65b.filez new file mode 100644 index 00000000000..ab42bcf37f8 Binary files /dev/null and b/repo/objects/17/b9f64ed9ce8e6a60b6698ad3235d37ed63e1a95dcf8be3f5bd141cab36a65b.filez differ diff --git a/repo/objects/17/bcd07e67847e1a6018fa38269e4117dd24eeb66a16be48608ceb540113052e.filez b/repo/objects/17/bcd07e67847e1a6018fa38269e4117dd24eeb66a16be48608ceb540113052e.filez new file mode 100644 index 00000000000..c4af8d84bc6 Binary files /dev/null and b/repo/objects/17/bcd07e67847e1a6018fa38269e4117dd24eeb66a16be48608ceb540113052e.filez differ diff --git a/repo/objects/17/bd3ce1070fdd5baa15b7d349cb6d01a7a2d5ddb31cd8b5f1837436e4377770.filez b/repo/objects/17/bd3ce1070fdd5baa15b7d349cb6d01a7a2d5ddb31cd8b5f1837436e4377770.filez new file mode 100644 index 00000000000..80644322f65 Binary files /dev/null and b/repo/objects/17/bd3ce1070fdd5baa15b7d349cb6d01a7a2d5ddb31cd8b5f1837436e4377770.filez differ diff --git a/repo/objects/17/c567e11f8aacb2e6f639e1db0766aa84546e1793052f54c9ce0b4722542896.filez b/repo/objects/17/c567e11f8aacb2e6f639e1db0766aa84546e1793052f54c9ce0b4722542896.filez new file mode 100644 index 00000000000..e663a00eaa9 Binary files /dev/null and b/repo/objects/17/c567e11f8aacb2e6f639e1db0766aa84546e1793052f54c9ce0b4722542896.filez differ diff --git a/repo/objects/18/0930724fba1c7bc158adcf951ea7b850d59c5e8ab74bf2c3e05a3b1d5d83f1.filez b/repo/objects/18/0930724fba1c7bc158adcf951ea7b850d59c5e8ab74bf2c3e05a3b1d5d83f1.filez new file mode 100644 index 00000000000..4310cd4b8f7 Binary files /dev/null and b/repo/objects/18/0930724fba1c7bc158adcf951ea7b850d59c5e8ab74bf2c3e05a3b1d5d83f1.filez differ diff --git a/repo/objects/18/12b1d57e586e88deb15dd5ebb61b91ebfcc217d842da8a9851f2fbc8791e65.filez b/repo/objects/18/12b1d57e586e88deb15dd5ebb61b91ebfcc217d842da8a9851f2fbc8791e65.filez new file mode 100644 index 00000000000..de7aa114ef8 Binary files /dev/null and b/repo/objects/18/12b1d57e586e88deb15dd5ebb61b91ebfcc217d842da8a9851f2fbc8791e65.filez differ diff --git a/repo/objects/18/328e5511f4283b82276ea09d706ebd1ccd201e1a6e35bf597d62e5af6c91c9.filez b/repo/objects/18/328e5511f4283b82276ea09d706ebd1ccd201e1a6e35bf597d62e5af6c91c9.filez new file mode 100644 index 00000000000..f62a77454ed Binary files /dev/null and b/repo/objects/18/328e5511f4283b82276ea09d706ebd1ccd201e1a6e35bf597d62e5af6c91c9.filez differ diff --git a/repo/objects/18/49a3acb3fb90d72a45ec4e7c55f4435fd5be29f95eeb117ccbe9c381d10513.dirtree b/repo/objects/18/49a3acb3fb90d72a45ec4e7c55f4435fd5be29f95eeb117ccbe9c381d10513.dirtree new file mode 100644 index 00000000000..fe7694e0b2b Binary files /dev/null and b/repo/objects/18/49a3acb3fb90d72a45ec4e7c55f4435fd5be29f95eeb117ccbe9c381d10513.dirtree differ diff --git a/repo/objects/18/51bec26cb772fcf6c0f2a73eb46f3caac29677fdb9889809f61f6a0bb211e5.dirtree b/repo/objects/18/51bec26cb772fcf6c0f2a73eb46f3caac29677fdb9889809f61f6a0bb211e5.dirtree new file mode 100644 index 00000000000..1c4b56ec3b8 Binary files /dev/null and b/repo/objects/18/51bec26cb772fcf6c0f2a73eb46f3caac29677fdb9889809f61f6a0bb211e5.dirtree differ diff --git a/repo/objects/18/647ab0325ad40f5888e71b73c012aec621fb783bb2ca3ea153090d871bc0cb.filez b/repo/objects/18/647ab0325ad40f5888e71b73c012aec621fb783bb2ca3ea153090d871bc0cb.filez new file mode 100644 index 00000000000..46ef6a6fe17 Binary files /dev/null and b/repo/objects/18/647ab0325ad40f5888e71b73c012aec621fb783bb2ca3ea153090d871bc0cb.filez differ diff --git a/repo/objects/18/6bda9101a80cc30080749e53864cc602a06655a9470f06f685b86abcccb005.filez b/repo/objects/18/6bda9101a80cc30080749e53864cc602a06655a9470f06f685b86abcccb005.filez new file mode 100644 index 00000000000..1b882e1858d Binary files /dev/null and b/repo/objects/18/6bda9101a80cc30080749e53864cc602a06655a9470f06f685b86abcccb005.filez differ diff --git a/repo/objects/18/b2f6a7445c8d57f020464e63082a3a91d3fb539738cc6499f1ef82c99757a2.filez b/repo/objects/18/b2f6a7445c8d57f020464e63082a3a91d3fb539738cc6499f1ef82c99757a2.filez new file mode 100644 index 00000000000..3553720e2ad Binary files /dev/null and b/repo/objects/18/b2f6a7445c8d57f020464e63082a3a91d3fb539738cc6499f1ef82c99757a2.filez differ diff --git a/repo/objects/18/bbdfeed70204ee44202f8eabd666a90b29036ab572867a4ec0fe224d5dbdc3.dirtree b/repo/objects/18/bbdfeed70204ee44202f8eabd666a90b29036ab572867a4ec0fe224d5dbdc3.dirtree new file mode 100644 index 00000000000..f7893b720a9 Binary files /dev/null and b/repo/objects/18/bbdfeed70204ee44202f8eabd666a90b29036ab572867a4ec0fe224d5dbdc3.dirtree differ diff --git a/repo/objects/18/f530dbcd5672a39d9b6b034894b70ed7be8fc42c6858a24a59fb8a5012b22f.filez b/repo/objects/18/f530dbcd5672a39d9b6b034894b70ed7be8fc42c6858a24a59fb8a5012b22f.filez new file mode 100644 index 00000000000..fd033be7a09 Binary files /dev/null and b/repo/objects/18/f530dbcd5672a39d9b6b034894b70ed7be8fc42c6858a24a59fb8a5012b22f.filez differ diff --git a/repo/objects/19/12fe58c9c06391730c90854d4b18121b58741c2a36eceeb2cbb650880d5d8a.filez b/repo/objects/19/12fe58c9c06391730c90854d4b18121b58741c2a36eceeb2cbb650880d5d8a.filez new file mode 100644 index 00000000000..82433de1ad0 Binary files /dev/null and b/repo/objects/19/12fe58c9c06391730c90854d4b18121b58741c2a36eceeb2cbb650880d5d8a.filez differ diff --git a/repo/objects/19/2ce4f15f63cc01be3fe687b69845d55a259360c4d3bd7cb56fe947e673bde2.filez b/repo/objects/19/2ce4f15f63cc01be3fe687b69845d55a259360c4d3bd7cb56fe947e673bde2.filez new file mode 100644 index 00000000000..1d2adeb43df Binary files /dev/null and b/repo/objects/19/2ce4f15f63cc01be3fe687b69845d55a259360c4d3bd7cb56fe947e673bde2.filez differ diff --git a/repo/objects/19/3c21353ee361cd68a59da64770a1e5ab4e34a56d7579c7f4f34a242e2cc23f.filez b/repo/objects/19/3c21353ee361cd68a59da64770a1e5ab4e34a56d7579c7f4f34a242e2cc23f.filez new file mode 100644 index 00000000000..68b28fda438 Binary files /dev/null and b/repo/objects/19/3c21353ee361cd68a59da64770a1e5ab4e34a56d7579c7f4f34a242e2cc23f.filez differ diff --git a/repo/objects/19/438b1a1c23a4560e665c7bd2dd17581fde6c74c9e81f4b6c4b020b2c1429ed.filez b/repo/objects/19/438b1a1c23a4560e665c7bd2dd17581fde6c74c9e81f4b6c4b020b2c1429ed.filez new file mode 100644 index 00000000000..1e52f2cea9f Binary files /dev/null and b/repo/objects/19/438b1a1c23a4560e665c7bd2dd17581fde6c74c9e81f4b6c4b020b2c1429ed.filez differ diff --git a/repo/objects/19/6d18e07b24aae87eea13eb69c5a58b09dd7bf94e2f701f0e66cbe3fb1448a9.dirtree b/repo/objects/19/6d18e07b24aae87eea13eb69c5a58b09dd7bf94e2f701f0e66cbe3fb1448a9.dirtree new file mode 100644 index 00000000000..daaa4087755 Binary files /dev/null and b/repo/objects/19/6d18e07b24aae87eea13eb69c5a58b09dd7bf94e2f701f0e66cbe3fb1448a9.dirtree differ diff --git a/repo/objects/19/6e1133413c65c6393ed6a811f757a0ea5fca3de723b0dfc1a29d930840b98b.dirtree b/repo/objects/19/6e1133413c65c6393ed6a811f757a0ea5fca3de723b0dfc1a29d930840b98b.dirtree new file mode 100644 index 00000000000..cbdfdd7a5c5 Binary files /dev/null and b/repo/objects/19/6e1133413c65c6393ed6a811f757a0ea5fca3de723b0dfc1a29d930840b98b.dirtree differ diff --git a/repo/objects/19/92788d8c6c798846b636ce240fcb6d5aab8eb803bd36ecb31c2193a87ae9b7.filez b/repo/objects/19/92788d8c6c798846b636ce240fcb6d5aab8eb803bd36ecb31c2193a87ae9b7.filez new file mode 100644 index 00000000000..38ff725349b Binary files /dev/null and b/repo/objects/19/92788d8c6c798846b636ce240fcb6d5aab8eb803bd36ecb31c2193a87ae9b7.filez differ diff --git a/repo/objects/19/a8677570bc2659c85fb5bfaa83851c453ecf03b97eb77cf8d5e895b3682126.filez b/repo/objects/19/a8677570bc2659c85fb5bfaa83851c453ecf03b97eb77cf8d5e895b3682126.filez new file mode 100644 index 00000000000..31558eeb14c Binary files /dev/null and b/repo/objects/19/a8677570bc2659c85fb5bfaa83851c453ecf03b97eb77cf8d5e895b3682126.filez differ diff --git a/repo/objects/19/e8d8909668f9e40c91d60308d375fde6d33976561ae5adaca8b3d181e9df05.filez b/repo/objects/19/e8d8909668f9e40c91d60308d375fde6d33976561ae5adaca8b3d181e9df05.filez new file mode 100644 index 00000000000..6ce97f68ff1 Binary files /dev/null and b/repo/objects/19/e8d8909668f9e40c91d60308d375fde6d33976561ae5adaca8b3d181e9df05.filez differ diff --git a/repo/objects/19/ecbb4a5c8071766541a545206f186de475b2b34dd9ca65ecad2d57934d96f9.filez b/repo/objects/19/ecbb4a5c8071766541a545206f186de475b2b34dd9ca65ecad2d57934d96f9.filez new file mode 100644 index 00000000000..715e686ee13 Binary files /dev/null and b/repo/objects/19/ecbb4a5c8071766541a545206f186de475b2b34dd9ca65ecad2d57934d96f9.filez differ diff --git a/repo/objects/19/ffeec95c56cb3c281836956fc1f2b48b67ef664a502faa69bb6a58ccada4df.filez b/repo/objects/19/ffeec95c56cb3c281836956fc1f2b48b67ef664a502faa69bb6a58ccada4df.filez new file mode 100644 index 00000000000..e7e979b73db Binary files /dev/null and b/repo/objects/19/ffeec95c56cb3c281836956fc1f2b48b67ef664a502faa69bb6a58ccada4df.filez differ diff --git a/repo/objects/1a/3fe94643c360ca55b732b8220904128ad8db0c3e4c3bc8390023d936c240c8.dirtree b/repo/objects/1a/3fe94643c360ca55b732b8220904128ad8db0c3e4c3bc8390023d936c240c8.dirtree new file mode 100644 index 00000000000..c68b4aa3755 Binary files /dev/null and b/repo/objects/1a/3fe94643c360ca55b732b8220904128ad8db0c3e4c3bc8390023d936c240c8.dirtree differ diff --git a/repo/objects/1a/44d920f547088f9766088777be38e98756db4baef5630007e36a0f5a8551b0.dirtree b/repo/objects/1a/44d920f547088f9766088777be38e98756db4baef5630007e36a0f5a8551b0.dirtree new file mode 100644 index 00000000000..719780d5ffb Binary files /dev/null and b/repo/objects/1a/44d920f547088f9766088777be38e98756db4baef5630007e36a0f5a8551b0.dirtree differ diff --git a/repo/objects/1a/4513cbae934ed121df006b78b89e8502ff3f31ef97b656885b918e2289200f.filez b/repo/objects/1a/4513cbae934ed121df006b78b89e8502ff3f31ef97b656885b918e2289200f.filez new file mode 100644 index 00000000000..07509d8fd1d Binary files /dev/null and b/repo/objects/1a/4513cbae934ed121df006b78b89e8502ff3f31ef97b656885b918e2289200f.filez differ diff --git a/repo/objects/1a/46b3f21d2e3a8f2dc01907679b5946ff9dacc3a0b53e07df897fd2979c2dad.dirtree b/repo/objects/1a/46b3f21d2e3a8f2dc01907679b5946ff9dacc3a0b53e07df897fd2979c2dad.dirtree new file mode 100644 index 00000000000..0715013405e Binary files /dev/null and b/repo/objects/1a/46b3f21d2e3a8f2dc01907679b5946ff9dacc3a0b53e07df897fd2979c2dad.dirtree differ diff --git a/repo/objects/1a/4e4c445f438297bef970c5a2db9be231b4f321663617550ff07c96fb621924.filez b/repo/objects/1a/4e4c445f438297bef970c5a2db9be231b4f321663617550ff07c96fb621924.filez new file mode 100644 index 00000000000..e8418593250 Binary files /dev/null and b/repo/objects/1a/4e4c445f438297bef970c5a2db9be231b4f321663617550ff07c96fb621924.filez differ diff --git a/repo/objects/1a/6ec12d4d63dd6894269938156ef7d2beaa5b6cfbd0a8b1b4b28e08e195ab37.filez b/repo/objects/1a/6ec12d4d63dd6894269938156ef7d2beaa5b6cfbd0a8b1b4b28e08e195ab37.filez new file mode 100644 index 00000000000..36757ebd884 Binary files /dev/null and b/repo/objects/1a/6ec12d4d63dd6894269938156ef7d2beaa5b6cfbd0a8b1b4b28e08e195ab37.filez differ diff --git a/repo/objects/1a/72374415fd9a0febc6cb2adcc1ac662f8d3a0867085b1883d04434c76a4c10.filez b/repo/objects/1a/72374415fd9a0febc6cb2adcc1ac662f8d3a0867085b1883d04434c76a4c10.filez new file mode 100644 index 00000000000..9aedea23b8b Binary files /dev/null and b/repo/objects/1a/72374415fd9a0febc6cb2adcc1ac662f8d3a0867085b1883d04434c76a4c10.filez differ diff --git a/repo/objects/1a/8166f0fa0e924326b298e939b5b35c5a0365fca887943c29159d21b5ddf7cb.filez b/repo/objects/1a/8166f0fa0e924326b298e939b5b35c5a0365fca887943c29159d21b5ddf7cb.filez new file mode 100644 index 00000000000..b67b2f451ab Binary files /dev/null and b/repo/objects/1a/8166f0fa0e924326b298e939b5b35c5a0365fca887943c29159d21b5ddf7cb.filez differ diff --git a/repo/objects/1a/87b74e3d5121e4b4d309956ca62179f4779be36cac2939b35685ad8edaa28e.filez b/repo/objects/1a/87b74e3d5121e4b4d309956ca62179f4779be36cac2939b35685ad8edaa28e.filez new file mode 100644 index 00000000000..ac9461d6ad9 Binary files /dev/null and b/repo/objects/1a/87b74e3d5121e4b4d309956ca62179f4779be36cac2939b35685ad8edaa28e.filez differ diff --git a/repo/objects/1a/94775f1460aec1f082f6271aaf841544e5d9667bd285bb9d416cf985392183.filez b/repo/objects/1a/94775f1460aec1f082f6271aaf841544e5d9667bd285bb9d416cf985392183.filez new file mode 100644 index 00000000000..b244fb8ac2e Binary files /dev/null and b/repo/objects/1a/94775f1460aec1f082f6271aaf841544e5d9667bd285bb9d416cf985392183.filez differ diff --git a/repo/objects/1a/9f31a8138b6f2d3804a6a6ccaef47d5885fac684efa0d7e82807e083a38bd5.filez b/repo/objects/1a/9f31a8138b6f2d3804a6a6ccaef47d5885fac684efa0d7e82807e083a38bd5.filez new file mode 100644 index 00000000000..b498d0b0fa8 Binary files /dev/null and b/repo/objects/1a/9f31a8138b6f2d3804a6a6ccaef47d5885fac684efa0d7e82807e083a38bd5.filez differ diff --git a/repo/objects/1a/adab3bfc13d0de5693b2516e02f9a78e27fb6ca7b3349b7ae939858becabb4.filez b/repo/objects/1a/adab3bfc13d0de5693b2516e02f9a78e27fb6ca7b3349b7ae939858becabb4.filez new file mode 100644 index 00000000000..4cb57e1eb4d Binary files /dev/null and b/repo/objects/1a/adab3bfc13d0de5693b2516e02f9a78e27fb6ca7b3349b7ae939858becabb4.filez differ diff --git a/repo/objects/1a/b392e49a49dc94062fb41140b20eaf36c527f147c8a20d84616f77b95418c9.dirtree b/repo/objects/1a/b392e49a49dc94062fb41140b20eaf36c527f147c8a20d84616f77b95418c9.dirtree new file mode 100644 index 00000000000..03da81750c5 Binary files /dev/null and b/repo/objects/1a/b392e49a49dc94062fb41140b20eaf36c527f147c8a20d84616f77b95418c9.dirtree differ diff --git a/repo/objects/1a/ca06efa87978880ba8ce46d4e48b51961534f4ed0a964fabbe8f5d01f9c851.filez b/repo/objects/1a/ca06efa87978880ba8ce46d4e48b51961534f4ed0a964fabbe8f5d01f9c851.filez new file mode 100644 index 00000000000..17c54f401e2 Binary files /dev/null and b/repo/objects/1a/ca06efa87978880ba8ce46d4e48b51961534f4ed0a964fabbe8f5d01f9c851.filez differ diff --git a/repo/objects/1a/e5eae6f45fc743230f63c22d3e33cd8bb57fc640195f120b6cfdced082fb05.dirtree b/repo/objects/1a/e5eae6f45fc743230f63c22d3e33cd8bb57fc640195f120b6cfdced082fb05.dirtree new file mode 100644 index 00000000000..807cad57998 Binary files /dev/null and b/repo/objects/1a/e5eae6f45fc743230f63c22d3e33cd8bb57fc640195f120b6cfdced082fb05.dirtree differ diff --git a/repo/objects/1a/ec22d3b7b67ddf7fc3b4bd103daf8315d561c9ea696eddec7642d85765ef4c.dirtree b/repo/objects/1a/ec22d3b7b67ddf7fc3b4bd103daf8315d561c9ea696eddec7642d85765ef4c.dirtree new file mode 100644 index 00000000000..fe3d926b0f7 Binary files /dev/null and b/repo/objects/1a/ec22d3b7b67ddf7fc3b4bd103daf8315d561c9ea696eddec7642d85765ef4c.dirtree differ diff --git a/repo/objects/1b/07cdd07e0318cafe4abf6e12273bdbf26a129a2249a83883fe9446d31b75b7.dirtree b/repo/objects/1b/07cdd07e0318cafe4abf6e12273bdbf26a129a2249a83883fe9446d31b75b7.dirtree new file mode 100644 index 00000000000..0be729ce2a5 Binary files /dev/null and b/repo/objects/1b/07cdd07e0318cafe4abf6e12273bdbf26a129a2249a83883fe9446d31b75b7.dirtree differ diff --git a/repo/objects/1b/298ab020769c9e1c3366a2142b9b6860b653ac9b472fb21af94b317d8ef609.filez b/repo/objects/1b/298ab020769c9e1c3366a2142b9b6860b653ac9b472fb21af94b317d8ef609.filez new file mode 100644 index 00000000000..3cf489f23a1 Binary files /dev/null and b/repo/objects/1b/298ab020769c9e1c3366a2142b9b6860b653ac9b472fb21af94b317d8ef609.filez differ diff --git a/repo/objects/1b/3851ef4c525f49b71a4cf0ddb93e3120c6c80be46e4ad9f4da43278a869ae1.filez b/repo/objects/1b/3851ef4c525f49b71a4cf0ddb93e3120c6c80be46e4ad9f4da43278a869ae1.filez new file mode 100644 index 00000000000..983b2273990 Binary files /dev/null and b/repo/objects/1b/3851ef4c525f49b71a4cf0ddb93e3120c6c80be46e4ad9f4da43278a869ae1.filez differ diff --git a/repo/objects/1b/54353c81e067a7b37d1da8e5ca27d31403ce1023d938e60addc54e25f32b16.dirtree b/repo/objects/1b/54353c81e067a7b37d1da8e5ca27d31403ce1023d938e60addc54e25f32b16.dirtree new file mode 100644 index 00000000000..34a399d879d Binary files /dev/null and b/repo/objects/1b/54353c81e067a7b37d1da8e5ca27d31403ce1023d938e60addc54e25f32b16.dirtree differ diff --git a/repo/objects/1b/61bdcd36e3c73ecef9f038c49a425701f56eb8b45b42c0698a85c25afccc5d.dirtree b/repo/objects/1b/61bdcd36e3c73ecef9f038c49a425701f56eb8b45b42c0698a85c25afccc5d.dirtree new file mode 100644 index 00000000000..d3a7f109600 Binary files /dev/null and b/repo/objects/1b/61bdcd36e3c73ecef9f038c49a425701f56eb8b45b42c0698a85c25afccc5d.dirtree differ diff --git a/repo/objects/1b/661f7a9499b8001b80cb75cfe427800d5f8d982a3cd006bf48cce9094f97ed.filez b/repo/objects/1b/661f7a9499b8001b80cb75cfe427800d5f8d982a3cd006bf48cce9094f97ed.filez new file mode 100644 index 00000000000..56ce63e40c5 Binary files /dev/null and b/repo/objects/1b/661f7a9499b8001b80cb75cfe427800d5f8d982a3cd006bf48cce9094f97ed.filez differ diff --git a/repo/objects/1b/664e1dcdcb2c18a7b5848238b8218c2e9de478f59ddbdd9aba59b10a990373.filez b/repo/objects/1b/664e1dcdcb2c18a7b5848238b8218c2e9de478f59ddbdd9aba59b10a990373.filez new file mode 100644 index 00000000000..5989f82c556 Binary files /dev/null and b/repo/objects/1b/664e1dcdcb2c18a7b5848238b8218c2e9de478f59ddbdd9aba59b10a990373.filez differ diff --git a/repo/objects/1b/81a8127f872dfe5cb5bb383c71a649748d2a4a1423edbe24b74df2270d66b9.filez b/repo/objects/1b/81a8127f872dfe5cb5bb383c71a649748d2a4a1423edbe24b74df2270d66b9.filez new file mode 100644 index 00000000000..0fc7f25dd36 Binary files /dev/null and b/repo/objects/1b/81a8127f872dfe5cb5bb383c71a649748d2a4a1423edbe24b74df2270d66b9.filez differ diff --git a/repo/objects/1b/8e8af423ae95b2de5dbaa9fc17ac63e6137637e117478b434f513702a32b04.filez b/repo/objects/1b/8e8af423ae95b2de5dbaa9fc17ac63e6137637e117478b434f513702a32b04.filez new file mode 100644 index 00000000000..7020f120cc3 Binary files /dev/null and b/repo/objects/1b/8e8af423ae95b2de5dbaa9fc17ac63e6137637e117478b434f513702a32b04.filez differ diff --git a/repo/objects/1b/e285e850d04d5168e0f48f0fee7d813cfbb150ea6afb153540f5502f2f556c.filez b/repo/objects/1b/e285e850d04d5168e0f48f0fee7d813cfbb150ea6afb153540f5502f2f556c.filez new file mode 100644 index 00000000000..c2271164aa5 Binary files /dev/null and b/repo/objects/1b/e285e850d04d5168e0f48f0fee7d813cfbb150ea6afb153540f5502f2f556c.filez differ diff --git a/repo/objects/1b/ef8b3350d1a5d88527392cc0cb91948751c33d5c635f929f91d52a24739712.filez b/repo/objects/1b/ef8b3350d1a5d88527392cc0cb91948751c33d5c635f929f91d52a24739712.filez new file mode 100644 index 00000000000..fa0e642e1f6 Binary files /dev/null and b/repo/objects/1b/ef8b3350d1a5d88527392cc0cb91948751c33d5c635f929f91d52a24739712.filez differ diff --git a/repo/objects/1b/f4d0bd5df401c46793dfa919c3270fa37e696f5f68df7b5335abaecfc5df7c.dirtree b/repo/objects/1b/f4d0bd5df401c46793dfa919c3270fa37e696f5f68df7b5335abaecfc5df7c.dirtree new file mode 100644 index 00000000000..a4a399d6568 Binary files /dev/null and b/repo/objects/1b/f4d0bd5df401c46793dfa919c3270fa37e696f5f68df7b5335abaecfc5df7c.dirtree differ diff --git a/repo/objects/1b/fa71845e6b2630755ed6e5b2c6ef47085c3ae7985726d713ff1bb593922dd1.filez b/repo/objects/1b/fa71845e6b2630755ed6e5b2c6ef47085c3ae7985726d713ff1bb593922dd1.filez new file mode 100644 index 00000000000..a69fadcbd11 Binary files /dev/null and b/repo/objects/1b/fa71845e6b2630755ed6e5b2c6ef47085c3ae7985726d713ff1bb593922dd1.filez differ diff --git a/repo/objects/1c/0712748a42e129cde8e0196dfe5bb14b69e8a2bb99dada1f738296487a88df.filez b/repo/objects/1c/0712748a42e129cde8e0196dfe5bb14b69e8a2bb99dada1f738296487a88df.filez new file mode 100644 index 00000000000..a834042c5ee Binary files /dev/null and b/repo/objects/1c/0712748a42e129cde8e0196dfe5bb14b69e8a2bb99dada1f738296487a88df.filez differ diff --git a/repo/objects/1c/11124a503378863b1d77f8cf1c0d81aa03f59393101b9ebd951f54af8b8ca3.dirtree b/repo/objects/1c/11124a503378863b1d77f8cf1c0d81aa03f59393101b9ebd951f54af8b8ca3.dirtree new file mode 100644 index 00000000000..8172c95d58c Binary files /dev/null and b/repo/objects/1c/11124a503378863b1d77f8cf1c0d81aa03f59393101b9ebd951f54af8b8ca3.dirtree differ diff --git a/repo/objects/1c/a49a33bd88080409d158fac58d2e9bc4380aa8743a09a29e54f26095992e6f.filez b/repo/objects/1c/a49a33bd88080409d158fac58d2e9bc4380aa8743a09a29e54f26095992e6f.filez new file mode 100644 index 00000000000..032d48cea63 Binary files /dev/null and b/repo/objects/1c/a49a33bd88080409d158fac58d2e9bc4380aa8743a09a29e54f26095992e6f.filez differ diff --git a/repo/objects/1c/a7e0e4990a077f1ded79beb98e72d5a6b030afc432493a8737ba6f2a930c0d.filez b/repo/objects/1c/a7e0e4990a077f1ded79beb98e72d5a6b030afc432493a8737ba6f2a930c0d.filez new file mode 100644 index 00000000000..1199f988e4b Binary files /dev/null and b/repo/objects/1c/a7e0e4990a077f1ded79beb98e72d5a6b030afc432493a8737ba6f2a930c0d.filez differ diff --git a/repo/objects/1c/c9e8644b84a8b71beb38f06d5a88e2a30d704b52fb3e4d36ef60182c738af3.filez b/repo/objects/1c/c9e8644b84a8b71beb38f06d5a88e2a30d704b52fb3e4d36ef60182c738af3.filez new file mode 100644 index 00000000000..b5cb1f0d505 Binary files /dev/null and b/repo/objects/1c/c9e8644b84a8b71beb38f06d5a88e2a30d704b52fb3e4d36ef60182c738af3.filez differ diff --git a/repo/objects/1c/d3341ac326ee0b224fd2e2e013972d515bac643e65bf16189d02c573dde1cb.filez b/repo/objects/1c/d3341ac326ee0b224fd2e2e013972d515bac643e65bf16189d02c573dde1cb.filez new file mode 100644 index 00000000000..9348bf3400b Binary files /dev/null and b/repo/objects/1c/d3341ac326ee0b224fd2e2e013972d515bac643e65bf16189d02c573dde1cb.filez differ diff --git a/repo/objects/1c/e3eb01b8a610fb1d8195c830a5d68e57816a7860092c197775ab7e99ad78c2.filez b/repo/objects/1c/e3eb01b8a610fb1d8195c830a5d68e57816a7860092c197775ab7e99ad78c2.filez new file mode 100644 index 00000000000..b301099ef0a Binary files /dev/null and b/repo/objects/1c/e3eb01b8a610fb1d8195c830a5d68e57816a7860092c197775ab7e99ad78c2.filez differ diff --git a/repo/objects/1d/29f2db7fa9d6af2523f3c4f1586dde651ca4ddac4987e03ca99bf53e91d63a.filez b/repo/objects/1d/29f2db7fa9d6af2523f3c4f1586dde651ca4ddac4987e03ca99bf53e91d63a.filez new file mode 100644 index 00000000000..8d8e581df86 Binary files /dev/null and b/repo/objects/1d/29f2db7fa9d6af2523f3c4f1586dde651ca4ddac4987e03ca99bf53e91d63a.filez differ diff --git a/repo/objects/1d/2bf3f32099873fcd7cc5459c972b8643efff974ce3e759cd12ebd5bb45de84.filez b/repo/objects/1d/2bf3f32099873fcd7cc5459c972b8643efff974ce3e759cd12ebd5bb45de84.filez new file mode 100644 index 00000000000..4961d1fc164 Binary files /dev/null and b/repo/objects/1d/2bf3f32099873fcd7cc5459c972b8643efff974ce3e759cd12ebd5bb45de84.filez differ diff --git a/repo/objects/1d/53440f3efa79988e6a8a813e868012389dbe89d65a04fe045265b53ce95ab2.filez b/repo/objects/1d/53440f3efa79988e6a8a813e868012389dbe89d65a04fe045265b53ce95ab2.filez new file mode 100644 index 00000000000..5dec1ed3e5f Binary files /dev/null and b/repo/objects/1d/53440f3efa79988e6a8a813e868012389dbe89d65a04fe045265b53ce95ab2.filez differ diff --git a/repo/objects/1d/5e5f2fd3df2fdc922333c112c4714fc7e5d14ace245ed088e97f3dbf0dada3.filez b/repo/objects/1d/5e5f2fd3df2fdc922333c112c4714fc7e5d14ace245ed088e97f3dbf0dada3.filez new file mode 100644 index 00000000000..4bacfb107a3 Binary files /dev/null and b/repo/objects/1d/5e5f2fd3df2fdc922333c112c4714fc7e5d14ace245ed088e97f3dbf0dada3.filez differ diff --git a/repo/objects/1d/67ae8db44f153450f29da1448e1f1d549e3c24a9d23496ab739075c497c7e6.filez b/repo/objects/1d/67ae8db44f153450f29da1448e1f1d549e3c24a9d23496ab739075c497c7e6.filez new file mode 100644 index 00000000000..189d204dcd3 Binary files /dev/null and b/repo/objects/1d/67ae8db44f153450f29da1448e1f1d549e3c24a9d23496ab739075c497c7e6.filez differ diff --git a/repo/objects/1d/7f01cacb2f0f900ac973c5ca4e5aed354a507b71007c8d65eff578879669ea.filez b/repo/objects/1d/7f01cacb2f0f900ac973c5ca4e5aed354a507b71007c8d65eff578879669ea.filez new file mode 100644 index 00000000000..fdeee02bd45 Binary files /dev/null and b/repo/objects/1d/7f01cacb2f0f900ac973c5ca4e5aed354a507b71007c8d65eff578879669ea.filez differ diff --git a/repo/objects/1d/8bd86cf9f4e9ffc2ee46a8deb5093c00dc7211f0fda5fd358b18efed6c2150.dirtree b/repo/objects/1d/8bd86cf9f4e9ffc2ee46a8deb5093c00dc7211f0fda5fd358b18efed6c2150.dirtree new file mode 100644 index 00000000000..b6213399eb1 Binary files /dev/null and b/repo/objects/1d/8bd86cf9f4e9ffc2ee46a8deb5093c00dc7211f0fda5fd358b18efed6c2150.dirtree differ diff --git a/repo/objects/1d/9b767325fdd8589a5dc0def59d77925f6220b2500f7a5be8aeb13c021c3e89.dirtree b/repo/objects/1d/9b767325fdd8589a5dc0def59d77925f6220b2500f7a5be8aeb13c021c3e89.dirtree new file mode 100644 index 00000000000..836d7b558f5 Binary files /dev/null and b/repo/objects/1d/9b767325fdd8589a5dc0def59d77925f6220b2500f7a5be8aeb13c021c3e89.dirtree differ diff --git a/repo/objects/1d/b43a72106cfce12f7e7bbec2c395b28ee9faf56cba7964d79432019f457b9f.filez b/repo/objects/1d/b43a72106cfce12f7e7bbec2c395b28ee9faf56cba7964d79432019f457b9f.filez new file mode 100644 index 00000000000..5bc3b792d86 Binary files /dev/null and b/repo/objects/1d/b43a72106cfce12f7e7bbec2c395b28ee9faf56cba7964d79432019f457b9f.filez differ diff --git a/repo/objects/1d/bb74edb4850e0625d50221ab768e273a9fc805f30f0cab011a687cd3f3130b.dirtree b/repo/objects/1d/bb74edb4850e0625d50221ab768e273a9fc805f30f0cab011a687cd3f3130b.dirtree new file mode 100644 index 00000000000..cde0390f25b Binary files /dev/null and b/repo/objects/1d/bb74edb4850e0625d50221ab768e273a9fc805f30f0cab011a687cd3f3130b.dirtree differ diff --git a/repo/objects/1d/c6d1a24a775a60627ef5cc025cf10a391db5b3064a8eddf8b4f11bc8bbb7a7.filez b/repo/objects/1d/c6d1a24a775a60627ef5cc025cf10a391db5b3064a8eddf8b4f11bc8bbb7a7.filez new file mode 100644 index 00000000000..4ee98c6e269 Binary files /dev/null and b/repo/objects/1d/c6d1a24a775a60627ef5cc025cf10a391db5b3064a8eddf8b4f11bc8bbb7a7.filez differ diff --git a/repo/objects/1d/d22cfca7c55579a33757649e7e8ef7f976066124f8008b6a8d79ea875326c6.filez b/repo/objects/1d/d22cfca7c55579a33757649e7e8ef7f976066124f8008b6a8d79ea875326c6.filez new file mode 100644 index 00000000000..da86f771e85 Binary files /dev/null and b/repo/objects/1d/d22cfca7c55579a33757649e7e8ef7f976066124f8008b6a8d79ea875326c6.filez differ diff --git a/repo/objects/1d/fc3aa4a5a895f8bbcb723822c130c6e179713bd50cb9e4bd4121db9446a7c3.filez b/repo/objects/1d/fc3aa4a5a895f8bbcb723822c130c6e179713bd50cb9e4bd4121db9446a7c3.filez new file mode 100644 index 00000000000..06cf73b88dd Binary files /dev/null and b/repo/objects/1d/fc3aa4a5a895f8bbcb723822c130c6e179713bd50cb9e4bd4121db9446a7c3.filez differ diff --git a/repo/objects/1d/ff6163195479b6de12acd8a1a552a7b767f9409e0bd5204e461fac0f559bec.filez b/repo/objects/1d/ff6163195479b6de12acd8a1a552a7b767f9409e0bd5204e461fac0f559bec.filez new file mode 100644 index 00000000000..4673d4d0c05 Binary files /dev/null and b/repo/objects/1d/ff6163195479b6de12acd8a1a552a7b767f9409e0bd5204e461fac0f559bec.filez differ diff --git a/repo/objects/1e/398d76e02cb532579adc4ff2f7a1fd5ed84a7cd539aa7cc99cc132147276f2.dirtree b/repo/objects/1e/398d76e02cb532579adc4ff2f7a1fd5ed84a7cd539aa7cc99cc132147276f2.dirtree new file mode 100644 index 00000000000..aa6cef5affa Binary files /dev/null and b/repo/objects/1e/398d76e02cb532579adc4ff2f7a1fd5ed84a7cd539aa7cc99cc132147276f2.dirtree differ diff --git a/repo/objects/1e/489f4de19cd429f9644276916a0ad083740027b1f915d388c7114e1c86663f.filez b/repo/objects/1e/489f4de19cd429f9644276916a0ad083740027b1f915d388c7114e1c86663f.filez new file mode 100644 index 00000000000..4c8d5d93271 Binary files /dev/null and b/repo/objects/1e/489f4de19cd429f9644276916a0ad083740027b1f915d388c7114e1c86663f.filez differ diff --git a/repo/objects/1e/4ece5adf64d643f95fb25816b32cf5cda8897ebc81221428fc43fb6e69c863.filez b/repo/objects/1e/4ece5adf64d643f95fb25816b32cf5cda8897ebc81221428fc43fb6e69c863.filez new file mode 100644 index 00000000000..a85e1b0f49c Binary files /dev/null and b/repo/objects/1e/4ece5adf64d643f95fb25816b32cf5cda8897ebc81221428fc43fb6e69c863.filez differ diff --git a/repo/objects/1e/821a5ed32b28b4042aa883607b8c8cba5194e80fc35e11b75fad379a6a4e9f.filez b/repo/objects/1e/821a5ed32b28b4042aa883607b8c8cba5194e80fc35e11b75fad379a6a4e9f.filez new file mode 100644 index 00000000000..9e9071c770c Binary files /dev/null and b/repo/objects/1e/821a5ed32b28b4042aa883607b8c8cba5194e80fc35e11b75fad379a6a4e9f.filez differ diff --git a/repo/objects/1e/9371876666d726b70e9805acf6fb0482db28c81540eeaed0151bf71c61cb93.filez b/repo/objects/1e/9371876666d726b70e9805acf6fb0482db28c81540eeaed0151bf71c61cb93.filez new file mode 100644 index 00000000000..c044e341ead Binary files /dev/null and b/repo/objects/1e/9371876666d726b70e9805acf6fb0482db28c81540eeaed0151bf71c61cb93.filez differ diff --git a/repo/objects/1e/a5dccf175d62aefbefe1b0889a578641e374346af1e5fc3db458036ffd7634.dirtree b/repo/objects/1e/a5dccf175d62aefbefe1b0889a578641e374346af1e5fc3db458036ffd7634.dirtree new file mode 100644 index 00000000000..7a348f53fb4 Binary files /dev/null and b/repo/objects/1e/a5dccf175d62aefbefe1b0889a578641e374346af1e5fc3db458036ffd7634.dirtree differ diff --git a/repo/objects/1e/d48e1ff88cad1ed7664478a2f614b27fdbf573e7b59d9186cf1240e29aee26.dirtree b/repo/objects/1e/d48e1ff88cad1ed7664478a2f614b27fdbf573e7b59d9186cf1240e29aee26.dirtree new file mode 100644 index 00000000000..4d5345a32d7 Binary files /dev/null and b/repo/objects/1e/d48e1ff88cad1ed7664478a2f614b27fdbf573e7b59d9186cf1240e29aee26.dirtree differ diff --git a/repo/objects/1e/feb8cda93b91d86c3621227c003577f793407845d12d9756c523c4b0832467.filez b/repo/objects/1e/feb8cda93b91d86c3621227c003577f793407845d12d9756c523c4b0832467.filez new file mode 100644 index 00000000000..77e17ce8e7f Binary files /dev/null and b/repo/objects/1e/feb8cda93b91d86c3621227c003577f793407845d12d9756c523c4b0832467.filez differ diff --git a/repo/objects/1f/1ea32b8e2167259d2d98a63154ecffa022dbc99985e8af69788264052ca4df.dirtree b/repo/objects/1f/1ea32b8e2167259d2d98a63154ecffa022dbc99985e8af69788264052ca4df.dirtree new file mode 100644 index 00000000000..578f7d6f41c Binary files /dev/null and b/repo/objects/1f/1ea32b8e2167259d2d98a63154ecffa022dbc99985e8af69788264052ca4df.dirtree differ diff --git a/repo/objects/1f/458aead85c1faef7a2f0cd12c1a8b02bd929a62b1b855a92cf7ff87b5fef9f.filez b/repo/objects/1f/458aead85c1faef7a2f0cd12c1a8b02bd929a62b1b855a92cf7ff87b5fef9f.filez new file mode 100644 index 00000000000..e2fdf68cd07 Binary files /dev/null and b/repo/objects/1f/458aead85c1faef7a2f0cd12c1a8b02bd929a62b1b855a92cf7ff87b5fef9f.filez differ diff --git a/repo/objects/1f/4a45afa4832bf69b4c24ba611e3769c94df5a3504daeed310f78b77fe79221.dirtree b/repo/objects/1f/4a45afa4832bf69b4c24ba611e3769c94df5a3504daeed310f78b77fe79221.dirtree new file mode 100644 index 00000000000..fb5b559c372 Binary files /dev/null and b/repo/objects/1f/4a45afa4832bf69b4c24ba611e3769c94df5a3504daeed310f78b77fe79221.dirtree differ diff --git a/repo/objects/1f/5bc87b10c3772acc265891ad4a37d416bb12dda4630acda904a8ac65742a93.dirtree b/repo/objects/1f/5bc87b10c3772acc265891ad4a37d416bb12dda4630acda904a8ac65742a93.dirtree new file mode 100644 index 00000000000..2deb382aba7 Binary files /dev/null and b/repo/objects/1f/5bc87b10c3772acc265891ad4a37d416bb12dda4630acda904a8ac65742a93.dirtree differ diff --git a/repo/objects/1f/61123097ae282b3252dd960f8bbd2204aafc90f48f010171d36c05624d997f.filez b/repo/objects/1f/61123097ae282b3252dd960f8bbd2204aafc90f48f010171d36c05624d997f.filez new file mode 100644 index 00000000000..c4a102af2a7 Binary files /dev/null and b/repo/objects/1f/61123097ae282b3252dd960f8bbd2204aafc90f48f010171d36c05624d997f.filez differ diff --git a/repo/objects/1f/6bab4cd1661745528fbcad53ed6586b85267cb71388e2360868e5dad720ee0.filez b/repo/objects/1f/6bab4cd1661745528fbcad53ed6586b85267cb71388e2360868e5dad720ee0.filez new file mode 100644 index 00000000000..7689a4d0f19 Binary files /dev/null and b/repo/objects/1f/6bab4cd1661745528fbcad53ed6586b85267cb71388e2360868e5dad720ee0.filez differ diff --git a/repo/objects/1f/7d4c469f571665096d2becccc8ceae97c6879df434c1a3a3f914db62e53739.filez b/repo/objects/1f/7d4c469f571665096d2becccc8ceae97c6879df434c1a3a3f914db62e53739.filez new file mode 100644 index 00000000000..6084f190dcc Binary files /dev/null and b/repo/objects/1f/7d4c469f571665096d2becccc8ceae97c6879df434c1a3a3f914db62e53739.filez differ diff --git a/repo/objects/1f/831880cbca94a7633d479482a04d26d6b8311338c079ca7b5dbbc51781e8d2.dirtree b/repo/objects/1f/831880cbca94a7633d479482a04d26d6b8311338c079ca7b5dbbc51781e8d2.dirtree new file mode 100644 index 00000000000..c765e602ee4 Binary files /dev/null and b/repo/objects/1f/831880cbca94a7633d479482a04d26d6b8311338c079ca7b5dbbc51781e8d2.dirtree differ diff --git a/repo/objects/1f/89e503811d4e28a52c427a630e0de13db19639f831f60a8fee00d55ee02188.dirtree b/repo/objects/1f/89e503811d4e28a52c427a630e0de13db19639f831f60a8fee00d55ee02188.dirtree new file mode 100644 index 00000000000..806ccf341c2 Binary files /dev/null and b/repo/objects/1f/89e503811d4e28a52c427a630e0de13db19639f831f60a8fee00d55ee02188.dirtree differ diff --git a/repo/objects/1f/949f32874551be9332d5aaeca07deb9a789afa099c05957b76bdcd4b817844.filez b/repo/objects/1f/949f32874551be9332d5aaeca07deb9a789afa099c05957b76bdcd4b817844.filez new file mode 100644 index 00000000000..d8c446e12ec Binary files /dev/null and b/repo/objects/1f/949f32874551be9332d5aaeca07deb9a789afa099c05957b76bdcd4b817844.filez differ diff --git a/repo/objects/1f/bdb32db1dd25432e1eef8e444a65f0e13f64e83ff2151e961509ee8e7641db.filez b/repo/objects/1f/bdb32db1dd25432e1eef8e444a65f0e13f64e83ff2151e961509ee8e7641db.filez new file mode 100644 index 00000000000..6f84587bcc5 Binary files /dev/null and b/repo/objects/1f/bdb32db1dd25432e1eef8e444a65f0e13f64e83ff2151e961509ee8e7641db.filez differ diff --git a/repo/objects/1f/c369b7852c891a70b301398103c0f8708713cf7b94f2c38835eadab00d4dcf.filez b/repo/objects/1f/c369b7852c891a70b301398103c0f8708713cf7b94f2c38835eadab00d4dcf.filez new file mode 100644 index 00000000000..e42bb8a595d Binary files /dev/null and b/repo/objects/1f/c369b7852c891a70b301398103c0f8708713cf7b94f2c38835eadab00d4dcf.filez differ diff --git a/repo/objects/1f/d5b305163c8e8051c3d7cea8ab840733d46dca953bbd478f8c19adc9324eae.filez b/repo/objects/1f/d5b305163c8e8051c3d7cea8ab840733d46dca953bbd478f8c19adc9324eae.filez new file mode 100644 index 00000000000..45eea57c219 Binary files /dev/null and b/repo/objects/1f/d5b305163c8e8051c3d7cea8ab840733d46dca953bbd478f8c19adc9324eae.filez differ diff --git a/repo/objects/1f/e3ee1afd98da17a8c695efcbb0508299e033b46202b98a6301afdf93f3bdd7.filez b/repo/objects/1f/e3ee1afd98da17a8c695efcbb0508299e033b46202b98a6301afdf93f3bdd7.filez new file mode 100644 index 00000000000..e21f0e133cd Binary files /dev/null and b/repo/objects/1f/e3ee1afd98da17a8c695efcbb0508299e033b46202b98a6301afdf93f3bdd7.filez differ diff --git a/repo/objects/1f/ee066e0b0d96cdb8a347d9aac2a8b02c725ed9969bb682f6233c8db6bc6cf1.filez b/repo/objects/1f/ee066e0b0d96cdb8a347d9aac2a8b02c725ed9969bb682f6233c8db6bc6cf1.filez new file mode 100644 index 00000000000..7cfa46cd26f Binary files /dev/null and b/repo/objects/1f/ee066e0b0d96cdb8a347d9aac2a8b02c725ed9969bb682f6233c8db6bc6cf1.filez differ diff --git a/repo/objects/1f/fa1d3945078f42bd0366851442e9a261dda3e9e8e5c242d1248657ad3f9bb7.dirtree b/repo/objects/1f/fa1d3945078f42bd0366851442e9a261dda3e9e8e5c242d1248657ad3f9bb7.dirtree new file mode 100644 index 00000000000..1fed0e440db Binary files /dev/null and b/repo/objects/1f/fa1d3945078f42bd0366851442e9a261dda3e9e8e5c242d1248657ad3f9bb7.dirtree differ diff --git a/repo/objects/20/025603a31a780ab59d1ad5f9fab5926a731ec7bbe0acea41c76bdf5becb79e.dirtree b/repo/objects/20/025603a31a780ab59d1ad5f9fab5926a731ec7bbe0acea41c76bdf5becb79e.dirtree new file mode 100644 index 00000000000..2f9e6499fe7 Binary files /dev/null and b/repo/objects/20/025603a31a780ab59d1ad5f9fab5926a731ec7bbe0acea41c76bdf5becb79e.dirtree differ diff --git a/repo/objects/20/0ea11b4ec8b8ca40ac7cef2eb6f01c75bb14ba7653f93213a11785fd63a13a.filez b/repo/objects/20/0ea11b4ec8b8ca40ac7cef2eb6f01c75bb14ba7653f93213a11785fd63a13a.filez new file mode 100644 index 00000000000..ec7121a41da Binary files /dev/null and b/repo/objects/20/0ea11b4ec8b8ca40ac7cef2eb6f01c75bb14ba7653f93213a11785fd63a13a.filez differ diff --git a/repo/objects/20/25633fac77d5a552df0260d51fe33d96cbdbb18f3e8d80604ea988f7bc80d8.filez b/repo/objects/20/25633fac77d5a552df0260d51fe33d96cbdbb18f3e8d80604ea988f7bc80d8.filez new file mode 100644 index 00000000000..a13498ca067 Binary files /dev/null and b/repo/objects/20/25633fac77d5a552df0260d51fe33d96cbdbb18f3e8d80604ea988f7bc80d8.filez differ diff --git a/repo/objects/20/37dc7d7fc65d5cd348700630a6edf9bee3cab6776b245e3eac943acd25b910.dirtree b/repo/objects/20/37dc7d7fc65d5cd348700630a6edf9bee3cab6776b245e3eac943acd25b910.dirtree new file mode 100644 index 00000000000..309d55ae700 Binary files /dev/null and b/repo/objects/20/37dc7d7fc65d5cd348700630a6edf9bee3cab6776b245e3eac943acd25b910.dirtree differ diff --git a/repo/objects/20/3d109083c5f8c18c0c9cea65ab74ed8441f8e29d6e78828d55bf65fc1c2228.filez b/repo/objects/20/3d109083c5f8c18c0c9cea65ab74ed8441f8e29d6e78828d55bf65fc1c2228.filez new file mode 100644 index 00000000000..4f96957bd21 Binary files /dev/null and b/repo/objects/20/3d109083c5f8c18c0c9cea65ab74ed8441f8e29d6e78828d55bf65fc1c2228.filez differ diff --git a/repo/objects/20/3eaae05985ae0b81c26db2c080127593103989d5827bb7207c2f95fb5e1ab5.filez b/repo/objects/20/3eaae05985ae0b81c26db2c080127593103989d5827bb7207c2f95fb5e1ab5.filez new file mode 100644 index 00000000000..82f09454eb6 Binary files /dev/null and b/repo/objects/20/3eaae05985ae0b81c26db2c080127593103989d5827bb7207c2f95fb5e1ab5.filez differ diff --git a/repo/objects/20/49a8e096826df489a711899911896bff648ff90fd86789ce0dd0731606825b.dirtree b/repo/objects/20/49a8e096826df489a711899911896bff648ff90fd86789ce0dd0731606825b.dirtree new file mode 100644 index 00000000000..14c856ac979 Binary files /dev/null and b/repo/objects/20/49a8e096826df489a711899911896bff648ff90fd86789ce0dd0731606825b.dirtree differ diff --git a/repo/objects/20/56f829514d81e080f54d1eb26c9731202094ad0447571b6cf85e8252b88312.filez b/repo/objects/20/56f829514d81e080f54d1eb26c9731202094ad0447571b6cf85e8252b88312.filez new file mode 100644 index 00000000000..60fc66a8efd Binary files /dev/null and b/repo/objects/20/56f829514d81e080f54d1eb26c9731202094ad0447571b6cf85e8252b88312.filez differ diff --git a/repo/objects/20/66b4de07b6a950533e5bca59eb848333bda1db2403c2d194908ff2020cd66f.filez b/repo/objects/20/66b4de07b6a950533e5bca59eb848333bda1db2403c2d194908ff2020cd66f.filez new file mode 100644 index 00000000000..a11757a289e Binary files /dev/null and b/repo/objects/20/66b4de07b6a950533e5bca59eb848333bda1db2403c2d194908ff2020cd66f.filez differ diff --git a/repo/objects/20/76a797b71bd8550bd87802fa3cb54893b4a70220f5e8852ee0d68526fab6ad.filez b/repo/objects/20/76a797b71bd8550bd87802fa3cb54893b4a70220f5e8852ee0d68526fab6ad.filez new file mode 100644 index 00000000000..8ab25ab04ff Binary files /dev/null and b/repo/objects/20/76a797b71bd8550bd87802fa3cb54893b4a70220f5e8852ee0d68526fab6ad.filez differ diff --git a/repo/objects/20/962b75fa5b662daed8a464f82b2d5e9732925fd279e8c1794c006b6df78814.dirtree b/repo/objects/20/962b75fa5b662daed8a464f82b2d5e9732925fd279e8c1794c006b6df78814.dirtree new file mode 100644 index 00000000000..386a4afedf5 Binary files /dev/null and b/repo/objects/20/962b75fa5b662daed8a464f82b2d5e9732925fd279e8c1794c006b6df78814.dirtree differ diff --git a/repo/objects/20/a02299b56fad257640151d943f10c9a95d0e8393cf709f2d1d6d2cc7e6a956.filez b/repo/objects/20/a02299b56fad257640151d943f10c9a95d0e8393cf709f2d1d6d2cc7e6a956.filez new file mode 100644 index 00000000000..3bb6e909ef5 Binary files /dev/null and b/repo/objects/20/a02299b56fad257640151d943f10c9a95d0e8393cf709f2d1d6d2cc7e6a956.filez differ diff --git a/repo/objects/20/a8c49378231915bed0a37371011c0d6a4e8e40c495629d19f2c60c494bc74f.filez b/repo/objects/20/a8c49378231915bed0a37371011c0d6a4e8e40c495629d19f2c60c494bc74f.filez new file mode 100644 index 00000000000..94dc67738aa Binary files /dev/null and b/repo/objects/20/a8c49378231915bed0a37371011c0d6a4e8e40c495629d19f2c60c494bc74f.filez differ diff --git a/repo/objects/20/ab8d22484b2bbace708f221bbc3c490ddddf606ceddf2db09a15e77fe7dd56.filez b/repo/objects/20/ab8d22484b2bbace708f221bbc3c490ddddf606ceddf2db09a15e77fe7dd56.filez new file mode 100644 index 00000000000..53d37cf38ba Binary files /dev/null and b/repo/objects/20/ab8d22484b2bbace708f221bbc3c490ddddf606ceddf2db09a15e77fe7dd56.filez differ diff --git a/repo/objects/20/b8d98c490b8a6900321ed58d0b9f34fb024e1ea08e5fe7cb5c1a45b35d9409.filez b/repo/objects/20/b8d98c490b8a6900321ed58d0b9f34fb024e1ea08e5fe7cb5c1a45b35d9409.filez new file mode 100644 index 00000000000..31199cb37e7 Binary files /dev/null and b/repo/objects/20/b8d98c490b8a6900321ed58d0b9f34fb024e1ea08e5fe7cb5c1a45b35d9409.filez differ diff --git a/repo/objects/20/c4d9b7864c0eff66e41f2758e217c1f02768b8330a123c3d6410f4ae148913.dirtree b/repo/objects/20/c4d9b7864c0eff66e41f2758e217c1f02768b8330a123c3d6410f4ae148913.dirtree new file mode 100644 index 00000000000..372ad0098cd Binary files /dev/null and b/repo/objects/20/c4d9b7864c0eff66e41f2758e217c1f02768b8330a123c3d6410f4ae148913.dirtree differ diff --git a/repo/objects/20/c5d8281f3aa7f550ec2484adeb483a9d525d6e029b29bd8d746ac40989c243.filez b/repo/objects/20/c5d8281f3aa7f550ec2484adeb483a9d525d6e029b29bd8d746ac40989c243.filez new file mode 100644 index 00000000000..ac3112051e0 Binary files /dev/null and b/repo/objects/20/c5d8281f3aa7f550ec2484adeb483a9d525d6e029b29bd8d746ac40989c243.filez differ diff --git a/repo/objects/20/d29c0d03e0734d17249e43c1a2bd50ee91484acd368b15ce72202622781b56.filez b/repo/objects/20/d29c0d03e0734d17249e43c1a2bd50ee91484acd368b15ce72202622781b56.filez new file mode 100644 index 00000000000..4f003a0bdc9 Binary files /dev/null and b/repo/objects/20/d29c0d03e0734d17249e43c1a2bd50ee91484acd368b15ce72202622781b56.filez differ diff --git a/repo/objects/20/dda2f892696f1823da0fd13098d0e49e8ce83cc89072059c2ea75aaaacb23b.dirtree b/repo/objects/20/dda2f892696f1823da0fd13098d0e49e8ce83cc89072059c2ea75aaaacb23b.dirtree new file mode 100644 index 00000000000..96108cbef34 Binary files /dev/null and b/repo/objects/20/dda2f892696f1823da0fd13098d0e49e8ce83cc89072059c2ea75aaaacb23b.dirtree differ diff --git a/repo/objects/21/3994977bcb62d34c9355ebca00cd877dedd027aa06f4b01f1305d28273e150.filez b/repo/objects/21/3994977bcb62d34c9355ebca00cd877dedd027aa06f4b01f1305d28273e150.filez new file mode 100644 index 00000000000..d41130159c5 Binary files /dev/null and b/repo/objects/21/3994977bcb62d34c9355ebca00cd877dedd027aa06f4b01f1305d28273e150.filez differ diff --git a/repo/objects/21/424ed7e7d7d3e90884fb541971abd38c6395a696d060a859bf7afe8650bb38.filez b/repo/objects/21/424ed7e7d7d3e90884fb541971abd38c6395a696d060a859bf7afe8650bb38.filez new file mode 100644 index 00000000000..7c5dd0f8fe1 Binary files /dev/null and b/repo/objects/21/424ed7e7d7d3e90884fb541971abd38c6395a696d060a859bf7afe8650bb38.filez differ diff --git a/repo/objects/21/788a05708d86b9b32f6321f9bed26124c2f2371c738deabdbff644982f445b.dirtree b/repo/objects/21/788a05708d86b9b32f6321f9bed26124c2f2371c738deabdbff644982f445b.dirtree new file mode 100644 index 00000000000..e2a3293c83b Binary files /dev/null and b/repo/objects/21/788a05708d86b9b32f6321f9bed26124c2f2371c738deabdbff644982f445b.dirtree differ diff --git a/repo/objects/21/950b37b8c83c131dcab2373108611e2b79fa776d600ebde15bbadfcfb01c4d.dirtree b/repo/objects/21/950b37b8c83c131dcab2373108611e2b79fa776d600ebde15bbadfcfb01c4d.dirtree new file mode 100644 index 00000000000..1a3eafee247 Binary files /dev/null and b/repo/objects/21/950b37b8c83c131dcab2373108611e2b79fa776d600ebde15bbadfcfb01c4d.dirtree differ diff --git a/repo/objects/21/d625f19d8fe6e9dde7c71b815b50d0524f5d6458285ffa712d2f2c13578784.filez b/repo/objects/21/d625f19d8fe6e9dde7c71b815b50d0524f5d6458285ffa712d2f2c13578784.filez new file mode 100644 index 00000000000..df79b9a1101 Binary files /dev/null and b/repo/objects/21/d625f19d8fe6e9dde7c71b815b50d0524f5d6458285ffa712d2f2c13578784.filez differ diff --git a/repo/objects/21/f527a26dda0fb41e7d574e1cf4748cdb0e065bedfe2df22988b2f54214cac7.filez b/repo/objects/21/f527a26dda0fb41e7d574e1cf4748cdb0e065bedfe2df22988b2f54214cac7.filez new file mode 100644 index 00000000000..17b64cc6487 Binary files /dev/null and b/repo/objects/21/f527a26dda0fb41e7d574e1cf4748cdb0e065bedfe2df22988b2f54214cac7.filez differ diff --git a/repo/objects/21/ffc2af5b82e136b01e2c6dbb33e250468966e664f0e52e3db800ed1d52ee2e.dirtree b/repo/objects/21/ffc2af5b82e136b01e2c6dbb33e250468966e664f0e52e3db800ed1d52ee2e.dirtree new file mode 100644 index 00000000000..cc6cb531af9 Binary files /dev/null and b/repo/objects/21/ffc2af5b82e136b01e2c6dbb33e250468966e664f0e52e3db800ed1d52ee2e.dirtree differ diff --git a/repo/objects/22/708c5e677a2576cb6911a7205a56357ff508747e0b07cb9a623f017c46c9d4.filez b/repo/objects/22/708c5e677a2576cb6911a7205a56357ff508747e0b07cb9a623f017c46c9d4.filez new file mode 100644 index 00000000000..e3621f3c9de Binary files /dev/null and b/repo/objects/22/708c5e677a2576cb6911a7205a56357ff508747e0b07cb9a623f017c46c9d4.filez differ diff --git a/repo/objects/22/c267159bb66d0725a3b781a42a6ab88adc7d2e833c3a5e85c4418fb694b7d0.filez b/repo/objects/22/c267159bb66d0725a3b781a42a6ab88adc7d2e833c3a5e85c4418fb694b7d0.filez new file mode 100644 index 00000000000..86817d90b9e Binary files /dev/null and b/repo/objects/22/c267159bb66d0725a3b781a42a6ab88adc7d2e833c3a5e85c4418fb694b7d0.filez differ diff --git a/repo/objects/22/e88c28b3b2d98cca4f51eaec3399636a62cd758a49305304ccfbcfaa88d36f.filez b/repo/objects/22/e88c28b3b2d98cca4f51eaec3399636a62cd758a49305304ccfbcfaa88d36f.filez new file mode 100644 index 00000000000..27e4f1fe409 Binary files /dev/null and b/repo/objects/22/e88c28b3b2d98cca4f51eaec3399636a62cd758a49305304ccfbcfaa88d36f.filez differ diff --git a/repo/objects/23/0a89c43826c2fa8a8f8339bea5ac726f6631be51b99d22b9a1d1241a351fcd.filez b/repo/objects/23/0a89c43826c2fa8a8f8339bea5ac726f6631be51b99d22b9a1d1241a351fcd.filez new file mode 100644 index 00000000000..ebead2ad125 Binary files /dev/null and b/repo/objects/23/0a89c43826c2fa8a8f8339bea5ac726f6631be51b99d22b9a1d1241a351fcd.filez differ diff --git a/repo/objects/23/3507ff9172a664c39e30f8c2ba938c8ac5af83aa6aa0b7f0eda497785a61fb.dirtree b/repo/objects/23/3507ff9172a664c39e30f8c2ba938c8ac5af83aa6aa0b7f0eda497785a61fb.dirtree new file mode 100644 index 00000000000..3ed3e813eed Binary files /dev/null and b/repo/objects/23/3507ff9172a664c39e30f8c2ba938c8ac5af83aa6aa0b7f0eda497785a61fb.dirtree differ diff --git a/repo/objects/23/4accb4c86dd7c42d6a0fa8658fc21815a4c908cab12e268d67382951246406.filez b/repo/objects/23/4accb4c86dd7c42d6a0fa8658fc21815a4c908cab12e268d67382951246406.filez new file mode 100644 index 00000000000..112cf86dc3c Binary files /dev/null and b/repo/objects/23/4accb4c86dd7c42d6a0fa8658fc21815a4c908cab12e268d67382951246406.filez differ diff --git a/repo/objects/23/50b0986d05da557a30dbbf03387ff1bd72086d88f616b66818ba827b226fe7.filez b/repo/objects/23/50b0986d05da557a30dbbf03387ff1bd72086d88f616b66818ba827b226fe7.filez new file mode 100644 index 00000000000..e2ccb113beb Binary files /dev/null and b/repo/objects/23/50b0986d05da557a30dbbf03387ff1bd72086d88f616b66818ba827b226fe7.filez differ diff --git a/repo/objects/23/7b53a320e51db51259a2bad560ff0c723774f44b416878121ed528f90d10e8.dirtree b/repo/objects/23/7b53a320e51db51259a2bad560ff0c723774f44b416878121ed528f90d10e8.dirtree new file mode 100644 index 00000000000..c81e93fdf21 Binary files /dev/null and b/repo/objects/23/7b53a320e51db51259a2bad560ff0c723774f44b416878121ed528f90d10e8.dirtree differ diff --git a/repo/objects/23/863fc3b1d37105dffd6fc2c2fad84fdedb1ddb09d68ac9ae1ea4adc1be825f.filez b/repo/objects/23/863fc3b1d37105dffd6fc2c2fad84fdedb1ddb09d68ac9ae1ea4adc1be825f.filez new file mode 100644 index 00000000000..b6aadfb7577 Binary files /dev/null and b/repo/objects/23/863fc3b1d37105dffd6fc2c2fad84fdedb1ddb09d68ac9ae1ea4adc1be825f.filez differ diff --git a/repo/objects/23/a2822f249ca56c092b2f5d6ec88292fec46b13334dd8b4be5cffedd48962b8.filez b/repo/objects/23/a2822f249ca56c092b2f5d6ec88292fec46b13334dd8b4be5cffedd48962b8.filez new file mode 100644 index 00000000000..26ce27812f2 Binary files /dev/null and b/repo/objects/23/a2822f249ca56c092b2f5d6ec88292fec46b13334dd8b4be5cffedd48962b8.filez differ diff --git a/repo/objects/23/daaab03f769a9afe8c16886fb5cc62518a2a580c89c6fdf83b479601ab0ec4.filez b/repo/objects/23/daaab03f769a9afe8c16886fb5cc62518a2a580c89c6fdf83b479601ab0ec4.filez new file mode 100644 index 00000000000..c9d41d3a984 Binary files /dev/null and b/repo/objects/23/daaab03f769a9afe8c16886fb5cc62518a2a580c89c6fdf83b479601ab0ec4.filez differ diff --git a/repo/objects/23/dd973f5d653d2d0801e18cec7eaa9b581e94cb48f5d66f2d0b1f3321c43e32.dirtree b/repo/objects/23/dd973f5d653d2d0801e18cec7eaa9b581e94cb48f5d66f2d0b1f3321c43e32.dirtree new file mode 100644 index 00000000000..605bd644681 Binary files /dev/null and b/repo/objects/23/dd973f5d653d2d0801e18cec7eaa9b581e94cb48f5d66f2d0b1f3321c43e32.dirtree differ diff --git a/repo/objects/23/e4bea70adbb8d94250c20086ebe92ce4c404ff3e228f873e6feb70b77b6df3.filez b/repo/objects/23/e4bea70adbb8d94250c20086ebe92ce4c404ff3e228f873e6feb70b77b6df3.filez new file mode 100644 index 00000000000..4a9f3ebcfe2 Binary files /dev/null and b/repo/objects/23/e4bea70adbb8d94250c20086ebe92ce4c404ff3e228f873e6feb70b77b6df3.filez differ diff --git a/repo/objects/24/2b83bc5f1c0068b9fade58dedf7a6f0b4b3c04ac383860dcb2f55e6aab3cea.dirtree b/repo/objects/24/2b83bc5f1c0068b9fade58dedf7a6f0b4b3c04ac383860dcb2f55e6aab3cea.dirtree new file mode 100644 index 00000000000..4610f77c49f Binary files /dev/null and b/repo/objects/24/2b83bc5f1c0068b9fade58dedf7a6f0b4b3c04ac383860dcb2f55e6aab3cea.dirtree differ diff --git a/repo/objects/24/3ec8ccf44a2504a0a00e2568307a2f488894a3d21f01e73ceb8c20ea97c076.filez b/repo/objects/24/3ec8ccf44a2504a0a00e2568307a2f488894a3d21f01e73ceb8c20ea97c076.filez new file mode 100644 index 00000000000..db469364bd7 Binary files /dev/null and b/repo/objects/24/3ec8ccf44a2504a0a00e2568307a2f488894a3d21f01e73ceb8c20ea97c076.filez differ diff --git a/repo/objects/24/4987205cee74ac2b1dc61678f61f4d8c24050a5fd60b20062bd6e867b52925.dirtree b/repo/objects/24/4987205cee74ac2b1dc61678f61f4d8c24050a5fd60b20062bd6e867b52925.dirtree new file mode 100644 index 00000000000..385316b6742 Binary files /dev/null and b/repo/objects/24/4987205cee74ac2b1dc61678f61f4d8c24050a5fd60b20062bd6e867b52925.dirtree differ diff --git a/repo/objects/24/8b039443cb6e76fe093c87f6b4eeecc11a36ffc4377ff50253ce23e00faf71.filez b/repo/objects/24/8b039443cb6e76fe093c87f6b4eeecc11a36ffc4377ff50253ce23e00faf71.filez new file mode 100644 index 00000000000..6323a0719c6 Binary files /dev/null and b/repo/objects/24/8b039443cb6e76fe093c87f6b4eeecc11a36ffc4377ff50253ce23e00faf71.filez differ diff --git a/repo/objects/24/aa758d7bda79889df2b92234237e191232d62079271df27d4becfbfec90ea8.filez b/repo/objects/24/aa758d7bda79889df2b92234237e191232d62079271df27d4becfbfec90ea8.filez new file mode 100644 index 00000000000..2d22772807c Binary files /dev/null and b/repo/objects/24/aa758d7bda79889df2b92234237e191232d62079271df27d4becfbfec90ea8.filez differ diff --git a/repo/objects/24/cfbcd9036caeb710c3218988f95ca5b2f4247a1215ef83044cb9c1df5a9a6f.filez b/repo/objects/24/cfbcd9036caeb710c3218988f95ca5b2f4247a1215ef83044cb9c1df5a9a6f.filez new file mode 100644 index 00000000000..995da29c9e2 Binary files /dev/null and b/repo/objects/24/cfbcd9036caeb710c3218988f95ca5b2f4247a1215ef83044cb9c1df5a9a6f.filez differ diff --git a/repo/objects/24/ea05af7d37da55e56730fd3271bb53a8cf4f247e264ed65017547bb5bc7aea.dirtree b/repo/objects/24/ea05af7d37da55e56730fd3271bb53a8cf4f247e264ed65017547bb5bc7aea.dirtree new file mode 100644 index 00000000000..e2d81c7f5c7 Binary files /dev/null and b/repo/objects/24/ea05af7d37da55e56730fd3271bb53a8cf4f247e264ed65017547bb5bc7aea.dirtree differ diff --git a/repo/objects/24/f9ca3faad2781dd776e2b5434fe70856284beaaab448b7bb5fbd05bd22ed23.dirtree b/repo/objects/24/f9ca3faad2781dd776e2b5434fe70856284beaaab448b7bb5fbd05bd22ed23.dirtree new file mode 100644 index 00000000000..42eb30f6ab7 Binary files /dev/null and b/repo/objects/24/f9ca3faad2781dd776e2b5434fe70856284beaaab448b7bb5fbd05bd22ed23.dirtree differ diff --git a/repo/objects/25/1b05cf440e173d3101aa57f4e8e5865c8bd4b021005f87d07953a409de9ba7.filez b/repo/objects/25/1b05cf440e173d3101aa57f4e8e5865c8bd4b021005f87d07953a409de9ba7.filez new file mode 100644 index 00000000000..5876a339508 Binary files /dev/null and b/repo/objects/25/1b05cf440e173d3101aa57f4e8e5865c8bd4b021005f87d07953a409de9ba7.filez differ diff --git a/repo/objects/25/3aed3ab136d7cfd72594aacc4609ad3507b4152a43fe1fc8cb78767735b059.dirtree b/repo/objects/25/3aed3ab136d7cfd72594aacc4609ad3507b4152a43fe1fc8cb78767735b059.dirtree new file mode 100644 index 00000000000..417fe4eb978 Binary files /dev/null and b/repo/objects/25/3aed3ab136d7cfd72594aacc4609ad3507b4152a43fe1fc8cb78767735b059.dirtree differ diff --git a/repo/objects/25/70b481d34fc840effb82c081f6d3fb53d351e056159dd800178d523e32db86.filez b/repo/objects/25/70b481d34fc840effb82c081f6d3fb53d351e056159dd800178d523e32db86.filez new file mode 100644 index 00000000000..2586324a422 Binary files /dev/null and b/repo/objects/25/70b481d34fc840effb82c081f6d3fb53d351e056159dd800178d523e32db86.filez differ diff --git a/repo/objects/25/7f6c4fd52147b7e872ab9eb88bc47e514e2f83d6ecf0c37284c39dcb1c8e81.filez b/repo/objects/25/7f6c4fd52147b7e872ab9eb88bc47e514e2f83d6ecf0c37284c39dcb1c8e81.filez new file mode 100644 index 00000000000..c928f583cd1 Binary files /dev/null and b/repo/objects/25/7f6c4fd52147b7e872ab9eb88bc47e514e2f83d6ecf0c37284c39dcb1c8e81.filez differ diff --git a/repo/objects/25/f9195bbaa6b9c17c7ed4969c7673b8f94f7e6e429d8d925d65dc29fc3f1b10.filez b/repo/objects/25/f9195bbaa6b9c17c7ed4969c7673b8f94f7e6e429d8d925d65dc29fc3f1b10.filez new file mode 100644 index 00000000000..c66a0003b9a Binary files /dev/null and b/repo/objects/25/f9195bbaa6b9c17c7ed4969c7673b8f94f7e6e429d8d925d65dc29fc3f1b10.filez differ diff --git a/repo/objects/26/379032db3c519935f74bd4ffea80df4354a87745bbcd72d3301085fa53e7d7.filez b/repo/objects/26/379032db3c519935f74bd4ffea80df4354a87745bbcd72d3301085fa53e7d7.filez new file mode 100644 index 00000000000..2cbd07c319e Binary files /dev/null and b/repo/objects/26/379032db3c519935f74bd4ffea80df4354a87745bbcd72d3301085fa53e7d7.filez differ diff --git a/repo/objects/26/6f36aeb1799731d2cd48ed178c00c93744df1da08346cd07b1f524b16614d7.filez b/repo/objects/26/6f36aeb1799731d2cd48ed178c00c93744df1da08346cd07b1f524b16614d7.filez new file mode 100644 index 00000000000..6d7d7cc578f Binary files /dev/null and b/repo/objects/26/6f36aeb1799731d2cd48ed178c00c93744df1da08346cd07b1f524b16614d7.filez differ diff --git a/repo/objects/26/76682cbceba4d9d4f6e2676f4b775dd4df55e255e3158898413a6cc680b4ce.filez b/repo/objects/26/76682cbceba4d9d4f6e2676f4b775dd4df55e255e3158898413a6cc680b4ce.filez new file mode 100644 index 00000000000..9fdee2b262d Binary files /dev/null and b/repo/objects/26/76682cbceba4d9d4f6e2676f4b775dd4df55e255e3158898413a6cc680b4ce.filez differ diff --git a/repo/objects/26/931cf5f80c28fdee3c0dbbc83dd39717f41546fc45fb2e5411b42e886c8857.filez b/repo/objects/26/931cf5f80c28fdee3c0dbbc83dd39717f41546fc45fb2e5411b42e886c8857.filez new file mode 100644 index 00000000000..f364c6e559a Binary files /dev/null and b/repo/objects/26/931cf5f80c28fdee3c0dbbc83dd39717f41546fc45fb2e5411b42e886c8857.filez differ diff --git a/repo/objects/26/b013f90a89a3625da3986691761f26ebcd06cb1bcce0107ce8c4ea5bad20ac.filez b/repo/objects/26/b013f90a89a3625da3986691761f26ebcd06cb1bcce0107ce8c4ea5bad20ac.filez new file mode 100644 index 00000000000..2efa33a7703 Binary files /dev/null and b/repo/objects/26/b013f90a89a3625da3986691761f26ebcd06cb1bcce0107ce8c4ea5bad20ac.filez differ diff --git a/repo/objects/26/fcc6b9806aa2cbc5a2ade552ba496b5c45e59059ce078aa6c818914cac3c82.dirtree b/repo/objects/26/fcc6b9806aa2cbc5a2ade552ba496b5c45e59059ce078aa6c818914cac3c82.dirtree new file mode 100644 index 00000000000..d3f88f59c62 Binary files /dev/null and b/repo/objects/26/fcc6b9806aa2cbc5a2ade552ba496b5c45e59059ce078aa6c818914cac3c82.dirtree differ diff --git a/repo/objects/27/0b299c094af8e370bf99194f12e28735565e70be0444ebb64503ec2a8dd287.dirtree b/repo/objects/27/0b299c094af8e370bf99194f12e28735565e70be0444ebb64503ec2a8dd287.dirtree new file mode 100644 index 00000000000..34e1aa6ebed Binary files /dev/null and b/repo/objects/27/0b299c094af8e370bf99194f12e28735565e70be0444ebb64503ec2a8dd287.dirtree differ diff --git a/repo/objects/27/0bd6cddbe8a717de622649b4c9241b5645a1223b0e67414c31ba991b20022c.filez b/repo/objects/27/0bd6cddbe8a717de622649b4c9241b5645a1223b0e67414c31ba991b20022c.filez new file mode 100644 index 00000000000..88435adf90e Binary files /dev/null and b/repo/objects/27/0bd6cddbe8a717de622649b4c9241b5645a1223b0e67414c31ba991b20022c.filez differ diff --git a/repo/objects/27/3cfc5cf0bd89e747b1bb7b3f79a64738ac017dd8d5663266873b7442d86f42.filez b/repo/objects/27/3cfc5cf0bd89e747b1bb7b3f79a64738ac017dd8d5663266873b7442d86f42.filez new file mode 100644 index 00000000000..a7b88bc7443 Binary files /dev/null and b/repo/objects/27/3cfc5cf0bd89e747b1bb7b3f79a64738ac017dd8d5663266873b7442d86f42.filez differ diff --git a/repo/objects/27/4ad1b1975d8324920376d3766b93ad281003bdd3a9d8ba38c01b08689f3f40.dirtree b/repo/objects/27/4ad1b1975d8324920376d3766b93ad281003bdd3a9d8ba38c01b08689f3f40.dirtree new file mode 100644 index 00000000000..d14dc6c6719 Binary files /dev/null and b/repo/objects/27/4ad1b1975d8324920376d3766b93ad281003bdd3a9d8ba38c01b08689f3f40.dirtree differ diff --git a/repo/objects/27/4e30f0a1c0db8df36240dd29a09ecfb55cc25f174705499801b3d9fd0c065f.filez b/repo/objects/27/4e30f0a1c0db8df36240dd29a09ecfb55cc25f174705499801b3d9fd0c065f.filez new file mode 100644 index 00000000000..0df12b139a0 Binary files /dev/null and b/repo/objects/27/4e30f0a1c0db8df36240dd29a09ecfb55cc25f174705499801b3d9fd0c065f.filez differ diff --git a/repo/objects/27/a5f1bb48dfd9e0dcf9797e5d211c0c3d5f12da9cdc9a9d8401bc5fe3946cdb.dirtree b/repo/objects/27/a5f1bb48dfd9e0dcf9797e5d211c0c3d5f12da9cdc9a9d8401bc5fe3946cdb.dirtree new file mode 100644 index 00000000000..fbff0aca1bb Binary files /dev/null and b/repo/objects/27/a5f1bb48dfd9e0dcf9797e5d211c0c3d5f12da9cdc9a9d8401bc5fe3946cdb.dirtree differ diff --git a/repo/objects/27/e754da1ad3cbdfe4495ce1ef249ab4d94a0c5f41b754553cef89151f6b723e.filez b/repo/objects/27/e754da1ad3cbdfe4495ce1ef249ab4d94a0c5f41b754553cef89151f6b723e.filez new file mode 100644 index 00000000000..d16da740057 Binary files /dev/null and b/repo/objects/27/e754da1ad3cbdfe4495ce1ef249ab4d94a0c5f41b754553cef89151f6b723e.filez differ diff --git a/repo/objects/28/057b16ee2042ec8a39c220de90f7dc6f4a8f64da25816efe8832d841dfc741.filez b/repo/objects/28/057b16ee2042ec8a39c220de90f7dc6f4a8f64da25816efe8832d841dfc741.filez new file mode 100644 index 00000000000..593e8cfdb75 Binary files /dev/null and b/repo/objects/28/057b16ee2042ec8a39c220de90f7dc6f4a8f64da25816efe8832d841dfc741.filez differ diff --git a/repo/objects/28/0e64b4ad3062ca9ef77deef29582f294d0b5b27e045cc58ba6152df304a221.filez b/repo/objects/28/0e64b4ad3062ca9ef77deef29582f294d0b5b27e045cc58ba6152df304a221.filez new file mode 100644 index 00000000000..389e990f4b6 Binary files /dev/null and b/repo/objects/28/0e64b4ad3062ca9ef77deef29582f294d0b5b27e045cc58ba6152df304a221.filez differ diff --git a/repo/objects/28/175f9882540f66a31b69ec1f5dd0e34bae46674d55599f9bdbdf45e46fbb9a.filez b/repo/objects/28/175f9882540f66a31b69ec1f5dd0e34bae46674d55599f9bdbdf45e46fbb9a.filez new file mode 100644 index 00000000000..8423554ce03 Binary files /dev/null and b/repo/objects/28/175f9882540f66a31b69ec1f5dd0e34bae46674d55599f9bdbdf45e46fbb9a.filez differ diff --git a/repo/objects/28/23e0d38eea49053bb6ab48cb85ab1a604254c9ce0fe1e0d49fdbc186e1b1b3.filez b/repo/objects/28/23e0d38eea49053bb6ab48cb85ab1a604254c9ce0fe1e0d49fdbc186e1b1b3.filez new file mode 100644 index 00000000000..8adc08ee5ce Binary files /dev/null and b/repo/objects/28/23e0d38eea49053bb6ab48cb85ab1a604254c9ce0fe1e0d49fdbc186e1b1b3.filez differ diff --git a/repo/objects/28/2a03da614be2633a5dd532d9b9d7ee0890dfe6deb9f32863ea250c34d11e81.filez b/repo/objects/28/2a03da614be2633a5dd532d9b9d7ee0890dfe6deb9f32863ea250c34d11e81.filez new file mode 100644 index 00000000000..92ec99504a8 Binary files /dev/null and b/repo/objects/28/2a03da614be2633a5dd532d9b9d7ee0890dfe6deb9f32863ea250c34d11e81.filez differ diff --git a/repo/objects/28/34475d0154347a3559e0fe19c934ac727cb5531fdd104b755ed8df901af734.dirtree b/repo/objects/28/34475d0154347a3559e0fe19c934ac727cb5531fdd104b755ed8df901af734.dirtree new file mode 100644 index 00000000000..f141cb4d8a0 Binary files /dev/null and b/repo/objects/28/34475d0154347a3559e0fe19c934ac727cb5531fdd104b755ed8df901af734.dirtree differ diff --git a/repo/objects/28/3a99fdcf766fd5fbc27bd018af2e5c718f0cfa2fbda44b72f3a1cf644a1e70.filez b/repo/objects/28/3a99fdcf766fd5fbc27bd018af2e5c718f0cfa2fbda44b72f3a1cf644a1e70.filez new file mode 100644 index 00000000000..349f4413f6d Binary files /dev/null and b/repo/objects/28/3a99fdcf766fd5fbc27bd018af2e5c718f0cfa2fbda44b72f3a1cf644a1e70.filez differ diff --git a/repo/objects/28/53a3cbfebab4137ac0cd2bebb4ef5bc214fe4187774c324d870e330f81fdbb.filez b/repo/objects/28/53a3cbfebab4137ac0cd2bebb4ef5bc214fe4187774c324d870e330f81fdbb.filez new file mode 100644 index 00000000000..50163a77320 Binary files /dev/null and b/repo/objects/28/53a3cbfebab4137ac0cd2bebb4ef5bc214fe4187774c324d870e330f81fdbb.filez differ diff --git a/repo/objects/28/5be210917495c46a5be12d7c27cd7d882f347c0c2d8147f468250de0098bdf.filez b/repo/objects/28/5be210917495c46a5be12d7c27cd7d882f347c0c2d8147f468250de0098bdf.filez new file mode 100644 index 00000000000..1b865da285a Binary files /dev/null and b/repo/objects/28/5be210917495c46a5be12d7c27cd7d882f347c0c2d8147f468250de0098bdf.filez differ diff --git a/repo/objects/28/76bb8a8a9ba08f98bacee26b57e3ed6db9a21ffb79c152be162485e3dc39ff.filez b/repo/objects/28/76bb8a8a9ba08f98bacee26b57e3ed6db9a21ffb79c152be162485e3dc39ff.filez new file mode 100644 index 00000000000..d0fdd76ac60 Binary files /dev/null and b/repo/objects/28/76bb8a8a9ba08f98bacee26b57e3ed6db9a21ffb79c152be162485e3dc39ff.filez differ diff --git a/repo/objects/28/90be4fa5a9a65109d78ace2141e87fb042133b540848d526b55d2d3c45c2ef.dirtree b/repo/objects/28/90be4fa5a9a65109d78ace2141e87fb042133b540848d526b55d2d3c45c2ef.dirtree new file mode 100644 index 00000000000..40c2d62c079 Binary files /dev/null and b/repo/objects/28/90be4fa5a9a65109d78ace2141e87fb042133b540848d526b55d2d3c45c2ef.dirtree differ diff --git a/repo/objects/28/9e154f4ef2abefecff5b861e3fe5cec3899e3b88751e5ecdab3faf5261e0a7.filez b/repo/objects/28/9e154f4ef2abefecff5b861e3fe5cec3899e3b88751e5ecdab3faf5261e0a7.filez new file mode 100644 index 00000000000..ddbae78b891 Binary files /dev/null and b/repo/objects/28/9e154f4ef2abefecff5b861e3fe5cec3899e3b88751e5ecdab3faf5261e0a7.filez differ diff --git a/repo/objects/28/faa58c6d4603bd8196b0403121e012f773fefdbc9504bb81a98ccf30e53bfa.dirtree b/repo/objects/28/faa58c6d4603bd8196b0403121e012f773fefdbc9504bb81a98ccf30e53bfa.dirtree new file mode 100644 index 00000000000..14a77adc112 Binary files /dev/null and b/repo/objects/28/faa58c6d4603bd8196b0403121e012f773fefdbc9504bb81a98ccf30e53bfa.dirtree differ diff --git a/repo/objects/29/5531d62e2f6cd13b4ad907206d87d6905a54d50f3c3188098b278d8ce29c5d.filez b/repo/objects/29/5531d62e2f6cd13b4ad907206d87d6905a54d50f3c3188098b278d8ce29c5d.filez new file mode 100644 index 00000000000..9ebc5378345 Binary files /dev/null and b/repo/objects/29/5531d62e2f6cd13b4ad907206d87d6905a54d50f3c3188098b278d8ce29c5d.filez differ diff --git a/repo/objects/29/957157112bcfd35186a0b8a2337f9db049ed4fe2ce8518cb9fec0eb83078be.filez b/repo/objects/29/957157112bcfd35186a0b8a2337f9db049ed4fe2ce8518cb9fec0eb83078be.filez new file mode 100644 index 00000000000..33780b08b6a Binary files /dev/null and b/repo/objects/29/957157112bcfd35186a0b8a2337f9db049ed4fe2ce8518cb9fec0eb83078be.filez differ diff --git a/repo/objects/29/c25cd1270d0977fff90601af7376f3ca2be241db5bbf54752fb794a6cebce1.filez b/repo/objects/29/c25cd1270d0977fff90601af7376f3ca2be241db5bbf54752fb794a6cebce1.filez new file mode 100644 index 00000000000..07d406443b8 Binary files /dev/null and b/repo/objects/29/c25cd1270d0977fff90601af7376f3ca2be241db5bbf54752fb794a6cebce1.filez differ diff --git a/repo/objects/29/c53e09591d5ecf9ce4b11d474be11cda9435a4d21509d9395e34801881e887.filez b/repo/objects/29/c53e09591d5ecf9ce4b11d474be11cda9435a4d21509d9395e34801881e887.filez new file mode 100644 index 00000000000..dc0807cf7bc Binary files /dev/null and b/repo/objects/29/c53e09591d5ecf9ce4b11d474be11cda9435a4d21509d9395e34801881e887.filez differ diff --git a/repo/objects/29/d0692595275d919da74b5964ddfd81a3784b5804dd4820eab67fdc1f6b0c64.dirtree b/repo/objects/29/d0692595275d919da74b5964ddfd81a3784b5804dd4820eab67fdc1f6b0c64.dirtree new file mode 100644 index 00000000000..9e020a243d9 Binary files /dev/null and b/repo/objects/29/d0692595275d919da74b5964ddfd81a3784b5804dd4820eab67fdc1f6b0c64.dirtree differ diff --git a/repo/objects/29/d1cde47c03d5f3efc2ffb6be7e72814cdf947517426b82d1ff6d6befff8c11.filez b/repo/objects/29/d1cde47c03d5f3efc2ffb6be7e72814cdf947517426b82d1ff6d6befff8c11.filez new file mode 100644 index 00000000000..8e3ccf63c8c Binary files /dev/null and b/repo/objects/29/d1cde47c03d5f3efc2ffb6be7e72814cdf947517426b82d1ff6d6befff8c11.filez differ diff --git a/repo/objects/29/dae353c74b7f4624def72c2f5df92189629b858daf16580425764c28de9a01.filez b/repo/objects/29/dae353c74b7f4624def72c2f5df92189629b858daf16580425764c28de9a01.filez new file mode 100644 index 00000000000..a47bdf3b7ea Binary files /dev/null and b/repo/objects/29/dae353c74b7f4624def72c2f5df92189629b858daf16580425764c28de9a01.filez differ diff --git a/repo/objects/29/f69871bba981004f0324768ae826c51e988c7e4ac85b62dc50a3c5f702f4d4.filez b/repo/objects/29/f69871bba981004f0324768ae826c51e988c7e4ac85b62dc50a3c5f702f4d4.filez new file mode 100644 index 00000000000..12bdf5f8f88 Binary files /dev/null and b/repo/objects/29/f69871bba981004f0324768ae826c51e988c7e4ac85b62dc50a3c5f702f4d4.filez differ diff --git a/repo/objects/2a/1108bebf9597499d26883d46ae852ecc671f670fb82ec1cc7bb086f2bf78c1.dirtree b/repo/objects/2a/1108bebf9597499d26883d46ae852ecc671f670fb82ec1cc7bb086f2bf78c1.dirtree new file mode 100644 index 00000000000..37e91f06f5c Binary files /dev/null and b/repo/objects/2a/1108bebf9597499d26883d46ae852ecc671f670fb82ec1cc7bb086f2bf78c1.dirtree differ diff --git a/repo/objects/2a/29768fee32f883d6b26d99741e39ba3b72af1f5e202779e8998dbac95e8b0a.filez b/repo/objects/2a/29768fee32f883d6b26d99741e39ba3b72af1f5e202779e8998dbac95e8b0a.filez new file mode 100644 index 00000000000..61dbf2575f1 Binary files /dev/null and b/repo/objects/2a/29768fee32f883d6b26d99741e39ba3b72af1f5e202779e8998dbac95e8b0a.filez differ diff --git a/repo/objects/2a/566098a834df3a13a6e838c075c2975a0ffb3cc5edff6794743c18f4aec552.filez b/repo/objects/2a/566098a834df3a13a6e838c075c2975a0ffb3cc5edff6794743c18f4aec552.filez new file mode 100644 index 00000000000..e1305c37201 Binary files /dev/null and b/repo/objects/2a/566098a834df3a13a6e838c075c2975a0ffb3cc5edff6794743c18f4aec552.filez differ diff --git a/repo/objects/2a/6b93917ccf834f34a2fe7d651caf0e8badc1a18b0171d52598ee1a21bbcb5d.filez b/repo/objects/2a/6b93917ccf834f34a2fe7d651caf0e8badc1a18b0171d52598ee1a21bbcb5d.filez new file mode 100644 index 00000000000..4b852c9e401 Binary files /dev/null and b/repo/objects/2a/6b93917ccf834f34a2fe7d651caf0e8badc1a18b0171d52598ee1a21bbcb5d.filez differ diff --git a/repo/objects/2a/74059ddddd31e628c8127995eb031111c89c571f7703e7a069c420102dcf46.filez b/repo/objects/2a/74059ddddd31e628c8127995eb031111c89c571f7703e7a069c420102dcf46.filez new file mode 100644 index 00000000000..ff22f62c6f2 Binary files /dev/null and b/repo/objects/2a/74059ddddd31e628c8127995eb031111c89c571f7703e7a069c420102dcf46.filez differ diff --git a/repo/objects/2a/7f7de5246991eab7b67b04543ff8218225e7fb2213de351ee3b863c37475bd.filez b/repo/objects/2a/7f7de5246991eab7b67b04543ff8218225e7fb2213de351ee3b863c37475bd.filez new file mode 100644 index 00000000000..fa83cf0174c Binary files /dev/null and b/repo/objects/2a/7f7de5246991eab7b67b04543ff8218225e7fb2213de351ee3b863c37475bd.filez differ diff --git a/repo/objects/2a/a333f165298e81b03b160fea3f340bc69b414ad5a76116263ae1a585c80514.filez b/repo/objects/2a/a333f165298e81b03b160fea3f340bc69b414ad5a76116263ae1a585c80514.filez new file mode 100644 index 00000000000..bbfd2d8a49a Binary files /dev/null and b/repo/objects/2a/a333f165298e81b03b160fea3f340bc69b414ad5a76116263ae1a585c80514.filez differ diff --git a/repo/objects/2a/b09076e593b1446ce8e70de4f34d3f5d300bb4679d1eb5ed57bc20234cc2bc.filez b/repo/objects/2a/b09076e593b1446ce8e70de4f34d3f5d300bb4679d1eb5ed57bc20234cc2bc.filez new file mode 100644 index 00000000000..983afb7af30 Binary files /dev/null and b/repo/objects/2a/b09076e593b1446ce8e70de4f34d3f5d300bb4679d1eb5ed57bc20234cc2bc.filez differ diff --git a/repo/objects/2a/bab8e18303032fd00863b3dd110b7609df13542d211a65acbef387fbf4906f.dirtree b/repo/objects/2a/bab8e18303032fd00863b3dd110b7609df13542d211a65acbef387fbf4906f.dirtree new file mode 100644 index 00000000000..585ee849b17 Binary files /dev/null and b/repo/objects/2a/bab8e18303032fd00863b3dd110b7609df13542d211a65acbef387fbf4906f.dirtree differ diff --git a/repo/objects/2a/c564b3e301dd363a0b0fc5900cc6d54c72b42efbd5484d527fa68f5a498aaf.filez b/repo/objects/2a/c564b3e301dd363a0b0fc5900cc6d54c72b42efbd5484d527fa68f5a498aaf.filez new file mode 100644 index 00000000000..0432d98afaa Binary files /dev/null and b/repo/objects/2a/c564b3e301dd363a0b0fc5900cc6d54c72b42efbd5484d527fa68f5a498aaf.filez differ diff --git a/repo/objects/2a/cefcb1327dde316a60b0f0256ccc22b1ba450b819f4dc0991ae0b176605272.filez b/repo/objects/2a/cefcb1327dde316a60b0f0256ccc22b1ba450b819f4dc0991ae0b176605272.filez new file mode 100644 index 00000000000..8f1ff65ac9c Binary files /dev/null and b/repo/objects/2a/cefcb1327dde316a60b0f0256ccc22b1ba450b819f4dc0991ae0b176605272.filez differ diff --git a/repo/objects/2a/fcdbd84d6b18275ad97c046e1ae78d63408d9424d53593723a602fb826f858.dirtree b/repo/objects/2a/fcdbd84d6b18275ad97c046e1ae78d63408d9424d53593723a602fb826f858.dirtree new file mode 100644 index 00000000000..54c9c545f12 Binary files /dev/null and b/repo/objects/2a/fcdbd84d6b18275ad97c046e1ae78d63408d9424d53593723a602fb826f858.dirtree differ diff --git a/repo/objects/2b/239fe446b7bc29f6912b31cd38be617005f13194315c8c51dca82bfc2f451d.filez b/repo/objects/2b/239fe446b7bc29f6912b31cd38be617005f13194315c8c51dca82bfc2f451d.filez new file mode 100644 index 00000000000..fab02ecba18 Binary files /dev/null and b/repo/objects/2b/239fe446b7bc29f6912b31cd38be617005f13194315c8c51dca82bfc2f451d.filez differ diff --git a/repo/objects/2b/2b895ab19979b76018cc5b7215382803c26f6d3a3756a1b185160996c77557.filez b/repo/objects/2b/2b895ab19979b76018cc5b7215382803c26f6d3a3756a1b185160996c77557.filez new file mode 100644 index 00000000000..45307c9be9d Binary files /dev/null and b/repo/objects/2b/2b895ab19979b76018cc5b7215382803c26f6d3a3756a1b185160996c77557.filez differ diff --git a/repo/objects/2b/2e880d19fd8f8f710f7b2631968ba45f14f3f933ea1873fd032bb75557c7d0.filez b/repo/objects/2b/2e880d19fd8f8f710f7b2631968ba45f14f3f933ea1873fd032bb75557c7d0.filez new file mode 100644 index 00000000000..71e8d85caef Binary files /dev/null and b/repo/objects/2b/2e880d19fd8f8f710f7b2631968ba45f14f3f933ea1873fd032bb75557c7d0.filez differ diff --git a/repo/objects/2b/5282e49de5191cf0c9298cee501fd78da72aa6bbab0d202c388c9541d5f45e.filez b/repo/objects/2b/5282e49de5191cf0c9298cee501fd78da72aa6bbab0d202c388c9541d5f45e.filez new file mode 100644 index 00000000000..2a0ed6fe75b Binary files /dev/null and b/repo/objects/2b/5282e49de5191cf0c9298cee501fd78da72aa6bbab0d202c388c9541d5f45e.filez differ diff --git a/repo/objects/2b/5a054aa701492ee78358471b72bc08d7470046978c02c00776a5d15c577993.dirtree b/repo/objects/2b/5a054aa701492ee78358471b72bc08d7470046978c02c00776a5d15c577993.dirtree new file mode 100644 index 00000000000..2021f5734f8 Binary files /dev/null and b/repo/objects/2b/5a054aa701492ee78358471b72bc08d7470046978c02c00776a5d15c577993.dirtree differ diff --git a/repo/objects/2b/628e35a461556d3e3244d6f36d2498e901e17e041d89b6f62a42d44becf560.filez b/repo/objects/2b/628e35a461556d3e3244d6f36d2498e901e17e041d89b6f62a42d44becf560.filez new file mode 100644 index 00000000000..95ff22d64be Binary files /dev/null and b/repo/objects/2b/628e35a461556d3e3244d6f36d2498e901e17e041d89b6f62a42d44becf560.filez differ diff --git a/repo/objects/2b/7eefc56222ee26ecba6404286e7cee5e1cd19b56264b3119269da4c5f711c9.filez b/repo/objects/2b/7eefc56222ee26ecba6404286e7cee5e1cd19b56264b3119269da4c5f711c9.filez new file mode 100644 index 00000000000..6a8b74e6c8b Binary files /dev/null and b/repo/objects/2b/7eefc56222ee26ecba6404286e7cee5e1cd19b56264b3119269da4c5f711c9.filez differ diff --git a/repo/objects/2b/9730b106d7e55bcdadb35e9496417fa0179d1ab65ed95cf489547fcdc8f8b2.filez b/repo/objects/2b/9730b106d7e55bcdadb35e9496417fa0179d1ab65ed95cf489547fcdc8f8b2.filez new file mode 100644 index 00000000000..c3dec25d55f Binary files /dev/null and b/repo/objects/2b/9730b106d7e55bcdadb35e9496417fa0179d1ab65ed95cf489547fcdc8f8b2.filez differ diff --git a/repo/objects/2c/1eb87f0768abd6767a491d6855750269e9df4312f8cff8b4a0bc3385a5674e.filez b/repo/objects/2c/1eb87f0768abd6767a491d6855750269e9df4312f8cff8b4a0bc3385a5674e.filez new file mode 100644 index 00000000000..fff7c8d0730 Binary files /dev/null and b/repo/objects/2c/1eb87f0768abd6767a491d6855750269e9df4312f8cff8b4a0bc3385a5674e.filez differ diff --git a/repo/objects/2c/31b33d51ece21f066a2b77bfb4c04474399b5208c26e9871c94335098e1b51.dirtree b/repo/objects/2c/31b33d51ece21f066a2b77bfb4c04474399b5208c26e9871c94335098e1b51.dirtree new file mode 100644 index 00000000000..cdd29d9d0c5 Binary files /dev/null and b/repo/objects/2c/31b33d51ece21f066a2b77bfb4c04474399b5208c26e9871c94335098e1b51.dirtree differ diff --git a/repo/objects/2c/3a3e2ac40d8eb48c4e034c3fa3a45c5be3288087c4e55ef75503189b2e1510.dirtree b/repo/objects/2c/3a3e2ac40d8eb48c4e034c3fa3a45c5be3288087c4e55ef75503189b2e1510.dirtree new file mode 100644 index 00000000000..eeb3e8dfa9e Binary files /dev/null and b/repo/objects/2c/3a3e2ac40d8eb48c4e034c3fa3a45c5be3288087c4e55ef75503189b2e1510.dirtree differ diff --git a/repo/objects/2c/3af30b7541557044c62f2f9ecc114f1dda3ea677cbd6c0cb3bad4181e255b2.filez b/repo/objects/2c/3af30b7541557044c62f2f9ecc114f1dda3ea677cbd6c0cb3bad4181e255b2.filez new file mode 100644 index 00000000000..e3beb5f16c2 Binary files /dev/null and b/repo/objects/2c/3af30b7541557044c62f2f9ecc114f1dda3ea677cbd6c0cb3bad4181e255b2.filez differ diff --git a/repo/objects/2c/3fd0db3c95688e489716828dd6c63d99aadde3ada7a61475df13c6cbe151a8.dirtree b/repo/objects/2c/3fd0db3c95688e489716828dd6c63d99aadde3ada7a61475df13c6cbe151a8.dirtree new file mode 100644 index 00000000000..5a74b22c699 Binary files /dev/null and b/repo/objects/2c/3fd0db3c95688e489716828dd6c63d99aadde3ada7a61475df13c6cbe151a8.dirtree differ diff --git a/repo/objects/2c/5203839cf963c07f756bc99d77ac5355c9dd96443e89bd5e41c5269e009038.filez b/repo/objects/2c/5203839cf963c07f756bc99d77ac5355c9dd96443e89bd5e41c5269e009038.filez new file mode 100644 index 00000000000..e994d0a1de8 Binary files /dev/null and b/repo/objects/2c/5203839cf963c07f756bc99d77ac5355c9dd96443e89bd5e41c5269e009038.filez differ diff --git a/repo/objects/2c/6d3456684491c3c0002ae166895a5aaf1f24067d7a728f2bb8815fce93cdd8.filez b/repo/objects/2c/6d3456684491c3c0002ae166895a5aaf1f24067d7a728f2bb8815fce93cdd8.filez new file mode 100644 index 00000000000..e34f5bde618 Binary files /dev/null and b/repo/objects/2c/6d3456684491c3c0002ae166895a5aaf1f24067d7a728f2bb8815fce93cdd8.filez differ diff --git a/repo/objects/2c/7327e35adaf6dec70b6ae0699846537e0dfbd24ca4b05879f8284606e6dab6.dirtree b/repo/objects/2c/7327e35adaf6dec70b6ae0699846537e0dfbd24ca4b05879f8284606e6dab6.dirtree new file mode 100644 index 00000000000..fb72111e8bf Binary files /dev/null and b/repo/objects/2c/7327e35adaf6dec70b6ae0699846537e0dfbd24ca4b05879f8284606e6dab6.dirtree differ diff --git a/repo/objects/2c/7bfaf574441d3deb5ff68e8495fe08cb9ae3e76a69c55b8d18219ba1a84fda.filez b/repo/objects/2c/7bfaf574441d3deb5ff68e8495fe08cb9ae3e76a69c55b8d18219ba1a84fda.filez new file mode 100644 index 00000000000..99e9cbde66b Binary files /dev/null and b/repo/objects/2c/7bfaf574441d3deb5ff68e8495fe08cb9ae3e76a69c55b8d18219ba1a84fda.filez differ diff --git a/repo/objects/2c/d9de589de8ba1525b86cc9a00c5cc7e3f71e6b321d3195ebbb671215eefa1d.filez b/repo/objects/2c/d9de589de8ba1525b86cc9a00c5cc7e3f71e6b321d3195ebbb671215eefa1d.filez new file mode 100644 index 00000000000..8a8f9f2feef Binary files /dev/null and b/repo/objects/2c/d9de589de8ba1525b86cc9a00c5cc7e3f71e6b321d3195ebbb671215eefa1d.filez differ diff --git a/repo/objects/2c/de6589e1c01c42766ae29f13cb3d9ae2a235ba4878c4840e23ccb67f36efbe.filez b/repo/objects/2c/de6589e1c01c42766ae29f13cb3d9ae2a235ba4878c4840e23ccb67f36efbe.filez new file mode 100644 index 00000000000..f45a00538bc Binary files /dev/null and b/repo/objects/2c/de6589e1c01c42766ae29f13cb3d9ae2a235ba4878c4840e23ccb67f36efbe.filez differ diff --git a/repo/objects/2c/e501d55e74d970e3b4d1b9e2f0aeba3069facef64225f218787c24b45d7334.filez b/repo/objects/2c/e501d55e74d970e3b4d1b9e2f0aeba3069facef64225f218787c24b45d7334.filez new file mode 100644 index 00000000000..e5d12d9eb2d Binary files /dev/null and b/repo/objects/2c/e501d55e74d970e3b4d1b9e2f0aeba3069facef64225f218787c24b45d7334.filez differ diff --git a/repo/objects/2d/0ba7d907667e262c75497c754b01878af62c93d01770f9bad54c33d29b2406.filez b/repo/objects/2d/0ba7d907667e262c75497c754b01878af62c93d01770f9bad54c33d29b2406.filez new file mode 100644 index 00000000000..18f48698045 Binary files /dev/null and b/repo/objects/2d/0ba7d907667e262c75497c754b01878af62c93d01770f9bad54c33d29b2406.filez differ diff --git a/repo/objects/2d/10d02611b4d3b4acd96571addbd94ef1f27c29cceaf940faa2348921330c46.dirtree b/repo/objects/2d/10d02611b4d3b4acd96571addbd94ef1f27c29cceaf940faa2348921330c46.dirtree new file mode 100644 index 00000000000..b4d313d4d07 Binary files /dev/null and b/repo/objects/2d/10d02611b4d3b4acd96571addbd94ef1f27c29cceaf940faa2348921330c46.dirtree differ diff --git a/repo/objects/2d/194ef376e6e67c5b4f21ce5470873b115805ff94020b4f4a652f220a2ba624.dirtree b/repo/objects/2d/194ef376e6e67c5b4f21ce5470873b115805ff94020b4f4a652f220a2ba624.dirtree new file mode 100644 index 00000000000..9f58617c900 Binary files /dev/null and b/repo/objects/2d/194ef376e6e67c5b4f21ce5470873b115805ff94020b4f4a652f220a2ba624.dirtree differ diff --git a/repo/objects/2d/2b9a7871b71e4a5131c33996fabb2034ac3821c8cdeb2d58e292b8f9c0eed0.filez b/repo/objects/2d/2b9a7871b71e4a5131c33996fabb2034ac3821c8cdeb2d58e292b8f9c0eed0.filez new file mode 100644 index 00000000000..a1ab13a6009 Binary files /dev/null and b/repo/objects/2d/2b9a7871b71e4a5131c33996fabb2034ac3821c8cdeb2d58e292b8f9c0eed0.filez differ diff --git a/repo/objects/2d/2ecee329af1759392d58ea7ded23652d505b0662db0791c80ac60b8435064a.filez b/repo/objects/2d/2ecee329af1759392d58ea7ded23652d505b0662db0791c80ac60b8435064a.filez new file mode 100644 index 00000000000..2a264bb8b5e Binary files /dev/null and b/repo/objects/2d/2ecee329af1759392d58ea7ded23652d505b0662db0791c80ac60b8435064a.filez differ diff --git a/repo/objects/2d/32259c179a0c8204bba9b6a19ba7d1bc92440bfe363415dfc482eed9d58511.filez b/repo/objects/2d/32259c179a0c8204bba9b6a19ba7d1bc92440bfe363415dfc482eed9d58511.filez new file mode 100644 index 00000000000..d74ee2aa372 Binary files /dev/null and b/repo/objects/2d/32259c179a0c8204bba9b6a19ba7d1bc92440bfe363415dfc482eed9d58511.filez differ diff --git a/repo/objects/2d/af6e34e8dd094c240c678989bd7bab510ef118aa2ce2f7ff718c6bb933c535.filez b/repo/objects/2d/af6e34e8dd094c240c678989bd7bab510ef118aa2ce2f7ff718c6bb933c535.filez new file mode 100644 index 00000000000..c40d8014716 Binary files /dev/null and b/repo/objects/2d/af6e34e8dd094c240c678989bd7bab510ef118aa2ce2f7ff718c6bb933c535.filez differ diff --git a/repo/objects/2d/d80c819a57e890d3f944a08602331392002cbaa72f2b48f0ee58753d1fb50f.filez b/repo/objects/2d/d80c819a57e890d3f944a08602331392002cbaa72f2b48f0ee58753d1fb50f.filez new file mode 100644 index 00000000000..37c1bd20254 Binary files /dev/null and b/repo/objects/2d/d80c819a57e890d3f944a08602331392002cbaa72f2b48f0ee58753d1fb50f.filez differ diff --git a/repo/objects/2d/dba185d2c983e0ed6356c401620147cd1e9e53cccb19e9e599de71a4709418.filez b/repo/objects/2d/dba185d2c983e0ed6356c401620147cd1e9e53cccb19e9e599de71a4709418.filez new file mode 100644 index 00000000000..6804c8f0650 Binary files /dev/null and b/repo/objects/2d/dba185d2c983e0ed6356c401620147cd1e9e53cccb19e9e599de71a4709418.filez differ diff --git a/repo/objects/2d/e33e4449d4fb565ff9078987671208bf4bca83baace16016daf5e03a39025f.filez b/repo/objects/2d/e33e4449d4fb565ff9078987671208bf4bca83baace16016daf5e03a39025f.filez new file mode 100644 index 00000000000..b14fe8f3611 Binary files /dev/null and b/repo/objects/2d/e33e4449d4fb565ff9078987671208bf4bca83baace16016daf5e03a39025f.filez differ diff --git a/repo/objects/2d/e48f0df3f4ea2e999c5025c808c38a49cf7ccce75c15ff51122720ac682155.filez b/repo/objects/2d/e48f0df3f4ea2e999c5025c808c38a49cf7ccce75c15ff51122720ac682155.filez new file mode 100644 index 00000000000..db8aed97e11 Binary files /dev/null and b/repo/objects/2d/e48f0df3f4ea2e999c5025c808c38a49cf7ccce75c15ff51122720ac682155.filez differ diff --git a/repo/objects/2d/eac381d11388dfdaa09209a722174a89dfb14e0860a6abce62b48ab6355b36.dirtree b/repo/objects/2d/eac381d11388dfdaa09209a722174a89dfb14e0860a6abce62b48ab6355b36.dirtree new file mode 100644 index 00000000000..a8348f919c7 Binary files /dev/null and b/repo/objects/2d/eac381d11388dfdaa09209a722174a89dfb14e0860a6abce62b48ab6355b36.dirtree differ diff --git a/repo/objects/2d/ec6f24fa93f43df773d519d55eadcc305ca1ce61400da1517ccaf0d599940e.filez b/repo/objects/2d/ec6f24fa93f43df773d519d55eadcc305ca1ce61400da1517ccaf0d599940e.filez new file mode 100644 index 00000000000..63fa2e3f6b7 Binary files /dev/null and b/repo/objects/2d/ec6f24fa93f43df773d519d55eadcc305ca1ce61400da1517ccaf0d599940e.filez differ diff --git a/repo/objects/2d/fcc4a9668683c7d712e7de831a6a86d483e3f45ae2dfbeb0a96cd4d81d386f.filez b/repo/objects/2d/fcc4a9668683c7d712e7de831a6a86d483e3f45ae2dfbeb0a96cd4d81d386f.filez new file mode 100644 index 00000000000..7b55292615e Binary files /dev/null and b/repo/objects/2d/fcc4a9668683c7d712e7de831a6a86d483e3f45ae2dfbeb0a96cd4d81d386f.filez differ diff --git a/repo/objects/2e/0f78646be897511207cae37e42e6c3a251c2cd5661c956357fd602c21be44a.filez b/repo/objects/2e/0f78646be897511207cae37e42e6c3a251c2cd5661c956357fd602c21be44a.filez new file mode 100644 index 00000000000..00e67e30d4c Binary files /dev/null and b/repo/objects/2e/0f78646be897511207cae37e42e6c3a251c2cd5661c956357fd602c21be44a.filez differ diff --git a/repo/objects/2e/3ba3ad38a0e9e3f02e7fb68c09aa4d7ad56f651db17975aa0d4332fd1a8644.filez b/repo/objects/2e/3ba3ad38a0e9e3f02e7fb68c09aa4d7ad56f651db17975aa0d4332fd1a8644.filez new file mode 100644 index 00000000000..393ad4abe3a Binary files /dev/null and b/repo/objects/2e/3ba3ad38a0e9e3f02e7fb68c09aa4d7ad56f651db17975aa0d4332fd1a8644.filez differ diff --git a/repo/objects/2e/b0126560ddd2083d610b0524b82922d48ca94513a1d0692438f959c2fc1db2.filez b/repo/objects/2e/b0126560ddd2083d610b0524b82922d48ca94513a1d0692438f959c2fc1db2.filez new file mode 100644 index 00000000000..6e89355427d Binary files /dev/null and b/repo/objects/2e/b0126560ddd2083d610b0524b82922d48ca94513a1d0692438f959c2fc1db2.filez differ diff --git a/repo/objects/2e/c8b8c247e19996386f1bb12270bf0d2eb5e4a977e03af86eef235e49e798b1.filez b/repo/objects/2e/c8b8c247e19996386f1bb12270bf0d2eb5e4a977e03af86eef235e49e798b1.filez new file mode 100644 index 00000000000..0a6783c0e96 Binary files /dev/null and b/repo/objects/2e/c8b8c247e19996386f1bb12270bf0d2eb5e4a977e03af86eef235e49e798b1.filez differ diff --git a/repo/objects/2e/ed38b22fcafd9ce558dba3aa839d262d6fd64f2aa9d7cfa7602693b88f3af1.dirtree b/repo/objects/2e/ed38b22fcafd9ce558dba3aa839d262d6fd64f2aa9d7cfa7602693b88f3af1.dirtree new file mode 100644 index 00000000000..943c65bf2d4 Binary files /dev/null and b/repo/objects/2e/ed38b22fcafd9ce558dba3aa839d262d6fd64f2aa9d7cfa7602693b88f3af1.dirtree differ diff --git a/repo/objects/2f/000067d29ca8b1d3f12ff229a798b63573bbc14b6c32aea5b6142c64e25dd0.filez b/repo/objects/2f/000067d29ca8b1d3f12ff229a798b63573bbc14b6c32aea5b6142c64e25dd0.filez new file mode 100644 index 00000000000..f17906bee83 Binary files /dev/null and b/repo/objects/2f/000067d29ca8b1d3f12ff229a798b63573bbc14b6c32aea5b6142c64e25dd0.filez differ diff --git a/repo/objects/2f/158d595dda1bba6e93a70a909a639765a95365ae6421eebf748574022d05b9.filez b/repo/objects/2f/158d595dda1bba6e93a70a909a639765a95365ae6421eebf748574022d05b9.filez new file mode 100644 index 00000000000..dbba797b0f9 Binary files /dev/null and b/repo/objects/2f/158d595dda1bba6e93a70a909a639765a95365ae6421eebf748574022d05b9.filez differ diff --git a/repo/objects/2f/1654857d4283633afaf1f688ded8fc2b571b41e6ba48eb9e78641120a25a55.dirtree b/repo/objects/2f/1654857d4283633afaf1f688ded8fc2b571b41e6ba48eb9e78641120a25a55.dirtree new file mode 100644 index 00000000000..33ed775016f Binary files /dev/null and b/repo/objects/2f/1654857d4283633afaf1f688ded8fc2b571b41e6ba48eb9e78641120a25a55.dirtree differ diff --git a/repo/objects/2f/41247c42ceed567f8c7e6d35f39ad4654fd6971b2d2d21fdf10fe62aa12590.dirtree b/repo/objects/2f/41247c42ceed567f8c7e6d35f39ad4654fd6971b2d2d21fdf10fe62aa12590.dirtree new file mode 100644 index 00000000000..e9fdfaee273 Binary files /dev/null and b/repo/objects/2f/41247c42ceed567f8c7e6d35f39ad4654fd6971b2d2d21fdf10fe62aa12590.dirtree differ diff --git a/repo/objects/2f/570b98688fc249d64538284bdd8aaf0cb063da3b5d28e6e08a6fea9a6377b7.dirtree b/repo/objects/2f/570b98688fc249d64538284bdd8aaf0cb063da3b5d28e6e08a6fea9a6377b7.dirtree new file mode 100644 index 00000000000..28038d863fe Binary files /dev/null and b/repo/objects/2f/570b98688fc249d64538284bdd8aaf0cb063da3b5d28e6e08a6fea9a6377b7.dirtree differ diff --git a/repo/objects/2f/745fca20354350b922a28e57aea7435b93eafe1a9ab1de51aeea4bff0db65a.filez b/repo/objects/2f/745fca20354350b922a28e57aea7435b93eafe1a9ab1de51aeea4bff0db65a.filez new file mode 100644 index 00000000000..5cbfcb53101 Binary files /dev/null and b/repo/objects/2f/745fca20354350b922a28e57aea7435b93eafe1a9ab1de51aeea4bff0db65a.filez differ diff --git a/repo/objects/2f/80b1829d29e219bb0cd68ce29617c43d92a34773f7d66cc2eb28914d5929b1.dirtree b/repo/objects/2f/80b1829d29e219bb0cd68ce29617c43d92a34773f7d66cc2eb28914d5929b1.dirtree new file mode 100644 index 00000000000..6c294b0b114 Binary files /dev/null and b/repo/objects/2f/80b1829d29e219bb0cd68ce29617c43d92a34773f7d66cc2eb28914d5929b1.dirtree differ diff --git a/repo/objects/2f/86af638ba3a58a9a22b9ad64c83546fa2f8b19c60f3aec9af35afe65af84a6.filez b/repo/objects/2f/86af638ba3a58a9a22b9ad64c83546fa2f8b19c60f3aec9af35afe65af84a6.filez new file mode 100644 index 00000000000..7a2b83c74f4 Binary files /dev/null and b/repo/objects/2f/86af638ba3a58a9a22b9ad64c83546fa2f8b19c60f3aec9af35afe65af84a6.filez differ diff --git a/repo/objects/2f/891e80d820f19f4e8dc748d67818f6ae4c98283584a9a25c1ca9ec4503381b.filez b/repo/objects/2f/891e80d820f19f4e8dc748d67818f6ae4c98283584a9a25c1ca9ec4503381b.filez new file mode 100644 index 00000000000..f5002f16683 Binary files /dev/null and b/repo/objects/2f/891e80d820f19f4e8dc748d67818f6ae4c98283584a9a25c1ca9ec4503381b.filez differ diff --git a/repo/objects/2f/c8b6f720570f59f4bd11b51759d938e41eaa1ae5f83c15456fdaef4141d592.filez b/repo/objects/2f/c8b6f720570f59f4bd11b51759d938e41eaa1ae5f83c15456fdaef4141d592.filez new file mode 100644 index 00000000000..a75fc6d615a Binary files /dev/null and b/repo/objects/2f/c8b6f720570f59f4bd11b51759d938e41eaa1ae5f83c15456fdaef4141d592.filez differ diff --git a/repo/objects/2f/cb97662d590a88bc79e64b830f71dc72e7c3f91d5795d23a15fe8d5f0621d5.filez b/repo/objects/2f/cb97662d590a88bc79e64b830f71dc72e7c3f91d5795d23a15fe8d5f0621d5.filez new file mode 100644 index 00000000000..6b9d1d73278 Binary files /dev/null and b/repo/objects/2f/cb97662d590a88bc79e64b830f71dc72e7c3f91d5795d23a15fe8d5f0621d5.filez differ diff --git a/repo/objects/2f/fdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1.commit b/repo/objects/2f/fdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1.commit new file mode 100644 index 00000000000..26d7555aabc Binary files /dev/null and b/repo/objects/2f/fdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1.commit differ diff --git a/repo/objects/2f/fdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1.commitmeta b/repo/objects/2f/fdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1.commitmeta new file mode 100644 index 00000000000..3381e42468e Binary files /dev/null and b/repo/objects/2f/fdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1.commitmeta differ diff --git a/repo/objects/30/24d46b4a035d81fd075f244c9500041f1c689dd845b1b49f753e05180d3772.filez b/repo/objects/30/24d46b4a035d81fd075f244c9500041f1c689dd845b1b49f753e05180d3772.filez new file mode 100644 index 00000000000..90424474aed Binary files /dev/null and b/repo/objects/30/24d46b4a035d81fd075f244c9500041f1c689dd845b1b49f753e05180d3772.filez differ diff --git a/repo/objects/30/42d8b2db7ef1f5792fb77ff99a5122f7eddf3f24a8154829d52ddeda5b5d24.filez b/repo/objects/30/42d8b2db7ef1f5792fb77ff99a5122f7eddf3f24a8154829d52ddeda5b5d24.filez new file mode 100644 index 00000000000..7d75ec15898 Binary files /dev/null and b/repo/objects/30/42d8b2db7ef1f5792fb77ff99a5122f7eddf3f24a8154829d52ddeda5b5d24.filez differ diff --git a/repo/objects/30/4cda93c39403e7bf5b0b5559e1b7293cb990f2632b40b9b10c5ba12fd93860.dirtree b/repo/objects/30/4cda93c39403e7bf5b0b5559e1b7293cb990f2632b40b9b10c5ba12fd93860.dirtree new file mode 100644 index 00000000000..e7afa38bbcf Binary files /dev/null and b/repo/objects/30/4cda93c39403e7bf5b0b5559e1b7293cb990f2632b40b9b10c5ba12fd93860.dirtree differ diff --git a/repo/objects/30/5ea0907a90c77f196ac3c1af296bbb60cdd3cfcf80410b27460af9a909392c.dirtree b/repo/objects/30/5ea0907a90c77f196ac3c1af296bbb60cdd3cfcf80410b27460af9a909392c.dirtree new file mode 100644 index 00000000000..62abfe2a04c Binary files /dev/null and b/repo/objects/30/5ea0907a90c77f196ac3c1af296bbb60cdd3cfcf80410b27460af9a909392c.dirtree differ diff --git a/repo/objects/30/6ba43e9e5d8cb74da0a0524e8b1b0ec19a32435f2d94e9b90fa7724600b762.filez b/repo/objects/30/6ba43e9e5d8cb74da0a0524e8b1b0ec19a32435f2d94e9b90fa7724600b762.filez new file mode 100644 index 00000000000..66ebcaffb02 Binary files /dev/null and b/repo/objects/30/6ba43e9e5d8cb74da0a0524e8b1b0ec19a32435f2d94e9b90fa7724600b762.filez differ diff --git a/repo/objects/30/cb1ced2d007e86e83bfe5972146c8406170407eac3413615152c92be2c28da.filez b/repo/objects/30/cb1ced2d007e86e83bfe5972146c8406170407eac3413615152c92be2c28da.filez new file mode 100644 index 00000000000..014ba534bf5 Binary files /dev/null and b/repo/objects/30/cb1ced2d007e86e83bfe5972146c8406170407eac3413615152c92be2c28da.filez differ diff --git a/repo/objects/31/02ae3240cff18c14bfa9128494279e57ef408bdafbb9d1582f13b4b3c70253.dirtree b/repo/objects/31/02ae3240cff18c14bfa9128494279e57ef408bdafbb9d1582f13b4b3c70253.dirtree new file mode 100644 index 00000000000..bdd3cf2aaa9 Binary files /dev/null and b/repo/objects/31/02ae3240cff18c14bfa9128494279e57ef408bdafbb9d1582f13b4b3c70253.dirtree differ diff --git a/repo/objects/31/082d8f82a6a568993043eac3c0b00bf1c2c405a5dbf5d45e1b9a00ed7d508c.filez b/repo/objects/31/082d8f82a6a568993043eac3c0b00bf1c2c405a5dbf5d45e1b9a00ed7d508c.filez new file mode 100644 index 00000000000..9ebaa451eae Binary files /dev/null and b/repo/objects/31/082d8f82a6a568993043eac3c0b00bf1c2c405a5dbf5d45e1b9a00ed7d508c.filez differ diff --git a/repo/objects/31/0b81242d525e525f334075cabc37ecd2b5d579ebf22478ecbbc47c79f9c3ed.filez b/repo/objects/31/0b81242d525e525f334075cabc37ecd2b5d579ebf22478ecbbc47c79f9c3ed.filez new file mode 100644 index 00000000000..4f3ef154d70 Binary files /dev/null and b/repo/objects/31/0b81242d525e525f334075cabc37ecd2b5d579ebf22478ecbbc47c79f9c3ed.filez differ diff --git a/repo/objects/31/18c93b613640d22188b82e5d279bdfcbb72ed7070b2d0002a6844a91bfc440.filez b/repo/objects/31/18c93b613640d22188b82e5d279bdfcbb72ed7070b2d0002a6844a91bfc440.filez new file mode 100644 index 00000000000..bda97beedf1 Binary files /dev/null and b/repo/objects/31/18c93b613640d22188b82e5d279bdfcbb72ed7070b2d0002a6844a91bfc440.filez differ diff --git a/repo/objects/31/6b365fd66965ffc1ed482b48b77ddaa7494ccc0ca13e97e9c650753c68694f.filez b/repo/objects/31/6b365fd66965ffc1ed482b48b77ddaa7494ccc0ca13e97e9c650753c68694f.filez new file mode 100644 index 00000000000..7192dd5e8f7 Binary files /dev/null and b/repo/objects/31/6b365fd66965ffc1ed482b48b77ddaa7494ccc0ca13e97e9c650753c68694f.filez differ diff --git a/repo/objects/31/8929eb0aef099092d20f6c64d771f9ce1bf9c9777ea4844e430b61fb0484cc.filez b/repo/objects/31/8929eb0aef099092d20f6c64d771f9ce1bf9c9777ea4844e430b61fb0484cc.filez new file mode 100644 index 00000000000..561d989972f Binary files /dev/null and b/repo/objects/31/8929eb0aef099092d20f6c64d771f9ce1bf9c9777ea4844e430b61fb0484cc.filez differ diff --git a/repo/objects/31/a5c25291d47b3534837f85a033e1f710ec0edbdca32d590809d6d938fa95ae.dirtree b/repo/objects/31/a5c25291d47b3534837f85a033e1f710ec0edbdca32d590809d6d938fa95ae.dirtree new file mode 100644 index 00000000000..588636df0fd Binary files /dev/null and b/repo/objects/31/a5c25291d47b3534837f85a033e1f710ec0edbdca32d590809d6d938fa95ae.dirtree differ diff --git a/repo/objects/31/b8d41943e30caa6947b69b641c431d3845f3b60e4cd0c8ba601d5354036db2.dirtree b/repo/objects/31/b8d41943e30caa6947b69b641c431d3845f3b60e4cd0c8ba601d5354036db2.dirtree new file mode 100644 index 00000000000..785a4d001f5 Binary files /dev/null and b/repo/objects/31/b8d41943e30caa6947b69b641c431d3845f3b60e4cd0c8ba601d5354036db2.dirtree differ diff --git a/repo/objects/31/dc5afce6f7ca9ce8f5111c1ea467f025b8ee47f3f14f7c83ec6a133c9a90f4.dirtree b/repo/objects/31/dc5afce6f7ca9ce8f5111c1ea467f025b8ee47f3f14f7c83ec6a133c9a90f4.dirtree new file mode 100644 index 00000000000..8fd4a0d52fc Binary files /dev/null and b/repo/objects/31/dc5afce6f7ca9ce8f5111c1ea467f025b8ee47f3f14f7c83ec6a133c9a90f4.dirtree differ diff --git a/repo/objects/31/eb4418adc975dc6d074c5fde2fe7e9e8e08f7e4328dd610b77d84c25d82f71.filez b/repo/objects/31/eb4418adc975dc6d074c5fde2fe7e9e8e08f7e4328dd610b77d84c25d82f71.filez new file mode 100644 index 00000000000..1136e68fa72 Binary files /dev/null and b/repo/objects/31/eb4418adc975dc6d074c5fde2fe7e9e8e08f7e4328dd610b77d84c25d82f71.filez differ diff --git a/repo/objects/31/ef770e7351a8bec99c57fdb19adcb53b6fe8acbc2c29abcd5c213d84ac837b.filez b/repo/objects/31/ef770e7351a8bec99c57fdb19adcb53b6fe8acbc2c29abcd5c213d84ac837b.filez new file mode 100644 index 00000000000..759c357ec87 Binary files /dev/null and b/repo/objects/31/ef770e7351a8bec99c57fdb19adcb53b6fe8acbc2c29abcd5c213d84ac837b.filez differ diff --git a/repo/objects/31/f09d35126e31ef21ac0c0256fdec9140bbdfd438539c6c89a43ea39dc123f5.dirtree b/repo/objects/31/f09d35126e31ef21ac0c0256fdec9140bbdfd438539c6c89a43ea39dc123f5.dirtree new file mode 100644 index 00000000000..38cf0b8c791 Binary files /dev/null and b/repo/objects/31/f09d35126e31ef21ac0c0256fdec9140bbdfd438539c6c89a43ea39dc123f5.dirtree differ diff --git a/repo/objects/31/f6a2eebbc49d61106030f0818beef808662d88b88eaff46a6e91498ad26765.filez b/repo/objects/31/f6a2eebbc49d61106030f0818beef808662d88b88eaff46a6e91498ad26765.filez new file mode 100644 index 00000000000..cc6b4c2df5a Binary files /dev/null and b/repo/objects/31/f6a2eebbc49d61106030f0818beef808662d88b88eaff46a6e91498ad26765.filez differ diff --git a/repo/objects/32/0b4ddb17f62a3c8dfc2ca4696e8b4fe0ee5f6945a102e64a41433ac1a60172.filez b/repo/objects/32/0b4ddb17f62a3c8dfc2ca4696e8b4fe0ee5f6945a102e64a41433ac1a60172.filez new file mode 100644 index 00000000000..60fb1b88832 Binary files /dev/null and b/repo/objects/32/0b4ddb17f62a3c8dfc2ca4696e8b4fe0ee5f6945a102e64a41433ac1a60172.filez differ diff --git a/repo/objects/32/2104ad77d4b6a80065f309a51bdc2817283331f6b301e02d613be7a0b2367e.filez b/repo/objects/32/2104ad77d4b6a80065f309a51bdc2817283331f6b301e02d613be7a0b2367e.filez new file mode 100644 index 00000000000..51b41ff121d Binary files /dev/null and b/repo/objects/32/2104ad77d4b6a80065f309a51bdc2817283331f6b301e02d613be7a0b2367e.filez differ diff --git a/repo/objects/32/2883098f64ba9c9fd8a36956390364afc2c2d46ff87e4be5c67dfc8e2a6f6c.filez b/repo/objects/32/2883098f64ba9c9fd8a36956390364afc2c2d46ff87e4be5c67dfc8e2a6f6c.filez new file mode 100644 index 00000000000..e8710187bff Binary files /dev/null and b/repo/objects/32/2883098f64ba9c9fd8a36956390364afc2c2d46ff87e4be5c67dfc8e2a6f6c.filez differ diff --git a/repo/objects/32/28944b2fd61315959a8ba5814958e7d4b52c4be73e9a387b1c6f7fed512e5a.dirtree b/repo/objects/32/28944b2fd61315959a8ba5814958e7d4b52c4be73e9a387b1c6f7fed512e5a.dirtree new file mode 100644 index 00000000000..70c03c0e7ee Binary files /dev/null and b/repo/objects/32/28944b2fd61315959a8ba5814958e7d4b52c4be73e9a387b1c6f7fed512e5a.dirtree differ diff --git a/repo/objects/32/2a67218fd36e6ca71c77a511c7fe641b8c3bd52235be57dd0f87d1d24c0056.dirtree b/repo/objects/32/2a67218fd36e6ca71c77a511c7fe641b8c3bd52235be57dd0f87d1d24c0056.dirtree new file mode 100644 index 00000000000..c0cb3a452b5 Binary files /dev/null and b/repo/objects/32/2a67218fd36e6ca71c77a511c7fe641b8c3bd52235be57dd0f87d1d24c0056.dirtree differ diff --git a/repo/objects/32/36f894a3f66acc1b0cb07ce71cee58ab4142f16bfd4e8d443732920f87670b.filez b/repo/objects/32/36f894a3f66acc1b0cb07ce71cee58ab4142f16bfd4e8d443732920f87670b.filez new file mode 100644 index 00000000000..49004171265 Binary files /dev/null and b/repo/objects/32/36f894a3f66acc1b0cb07ce71cee58ab4142f16bfd4e8d443732920f87670b.filez differ diff --git a/repo/objects/32/8a9de7f88c549b22c1feb7f9b1b2c80a5b4c279f665b8c463538420d14e45b.filez b/repo/objects/32/8a9de7f88c549b22c1feb7f9b1b2c80a5b4c279f665b8c463538420d14e45b.filez new file mode 100644 index 00000000000..7e7551fdd53 Binary files /dev/null and b/repo/objects/32/8a9de7f88c549b22c1feb7f9b1b2c80a5b4c279f665b8c463538420d14e45b.filez differ diff --git a/repo/objects/32/8db7d98b118f4974c34101d563b4f878c51181e7936f0bd02c5341ef6b1a4b.dirtree b/repo/objects/32/8db7d98b118f4974c34101d563b4f878c51181e7936f0bd02c5341ef6b1a4b.dirtree new file mode 100644 index 00000000000..5c17bc2c58a Binary files /dev/null and b/repo/objects/32/8db7d98b118f4974c34101d563b4f878c51181e7936f0bd02c5341ef6b1a4b.dirtree differ diff --git a/repo/objects/32/9f25ae3e4f9f95bae2cee13e8a5c6a78cfb874a94e3a5d25e2b5ac5643c1db.filez b/repo/objects/32/9f25ae3e4f9f95bae2cee13e8a5c6a78cfb874a94e3a5d25e2b5ac5643c1db.filez new file mode 100644 index 00000000000..5c78527c92f Binary files /dev/null and b/repo/objects/32/9f25ae3e4f9f95bae2cee13e8a5c6a78cfb874a94e3a5d25e2b5ac5643c1db.filez differ diff --git a/repo/objects/32/b4463b86160e236532965c509d2d12b2d580b577fb3b2a3f04ae54c9c0a3f4.filez b/repo/objects/32/b4463b86160e236532965c509d2d12b2d580b577fb3b2a3f04ae54c9c0a3f4.filez new file mode 100644 index 00000000000..51032e88900 Binary files /dev/null and b/repo/objects/32/b4463b86160e236532965c509d2d12b2d580b577fb3b2a3f04ae54c9c0a3f4.filez differ diff --git a/repo/objects/32/df35749dede01ba9bde8a9d773ba1857324a1bef1a9ba67c25b14f5e43d265.filez b/repo/objects/32/df35749dede01ba9bde8a9d773ba1857324a1bef1a9ba67c25b14f5e43d265.filez new file mode 100644 index 00000000000..6ccf734ff8b Binary files /dev/null and b/repo/objects/32/df35749dede01ba9bde8a9d773ba1857324a1bef1a9ba67c25b14f5e43d265.filez differ diff --git a/repo/objects/32/e29a6b3d75ecb6f70e17c5566d067d7f91f7c88607a5e1c4b12479ee6f27ef.filez b/repo/objects/32/e29a6b3d75ecb6f70e17c5566d067d7f91f7c88607a5e1c4b12479ee6f27ef.filez new file mode 100644 index 00000000000..e2ab037dd4e Binary files /dev/null and b/repo/objects/32/e29a6b3d75ecb6f70e17c5566d067d7f91f7c88607a5e1c4b12479ee6f27ef.filez differ diff --git a/repo/objects/33/0b5f66b65e525e37d7edd18bbf6604430b25521619268eb96b72c582b84a2e.filez b/repo/objects/33/0b5f66b65e525e37d7edd18bbf6604430b25521619268eb96b72c582b84a2e.filez new file mode 100644 index 00000000000..933687b8a90 Binary files /dev/null and b/repo/objects/33/0b5f66b65e525e37d7edd18bbf6604430b25521619268eb96b72c582b84a2e.filez differ diff --git a/repo/objects/33/252996e21e43cfeeac6d64ec1e45b6544eb1560eb2381d0b0b42dd0426c2eb.filez b/repo/objects/33/252996e21e43cfeeac6d64ec1e45b6544eb1560eb2381d0b0b42dd0426c2eb.filez new file mode 100644 index 00000000000..259e6fd2add Binary files /dev/null and b/repo/objects/33/252996e21e43cfeeac6d64ec1e45b6544eb1560eb2381d0b0b42dd0426c2eb.filez differ diff --git a/repo/objects/33/2641251a779a198b02c04be50bf7df807f142e461b93a63e89c8640b24e6ce.filez b/repo/objects/33/2641251a779a198b02c04be50bf7df807f142e461b93a63e89c8640b24e6ce.filez new file mode 100644 index 00000000000..023a4e38300 Binary files /dev/null and b/repo/objects/33/2641251a779a198b02c04be50bf7df807f142e461b93a63e89c8640b24e6ce.filez differ diff --git a/repo/objects/33/3a12a0969c1165b23a47d6144a25dab0188f4ade20ef0896527934ee76da75.filez b/repo/objects/33/3a12a0969c1165b23a47d6144a25dab0188f4ade20ef0896527934ee76da75.filez new file mode 100644 index 00000000000..555f281dcea Binary files /dev/null and b/repo/objects/33/3a12a0969c1165b23a47d6144a25dab0188f4ade20ef0896527934ee76da75.filez differ diff --git a/repo/objects/33/3c32d53741837afcb17939e887fa0df853542c772e8ef4e571185b34eae3d1.filez b/repo/objects/33/3c32d53741837afcb17939e887fa0df853542c772e8ef4e571185b34eae3d1.filez new file mode 100644 index 00000000000..42e5c8f8f7d Binary files /dev/null and b/repo/objects/33/3c32d53741837afcb17939e887fa0df853542c772e8ef4e571185b34eae3d1.filez differ diff --git a/repo/objects/33/40b8b1728297009f7e8619f01ddd10c54f1f2261d34355195c59b6d54ff15c.filez b/repo/objects/33/40b8b1728297009f7e8619f01ddd10c54f1f2261d34355195c59b6d54ff15c.filez new file mode 100644 index 00000000000..02fd1abb98d Binary files /dev/null and b/repo/objects/33/40b8b1728297009f7e8619f01ddd10c54f1f2261d34355195c59b6d54ff15c.filez differ diff --git a/repo/objects/33/493a3ea4ce3d33d820ec530b06192c18016ba2584e38f017e77135485aada6.filez b/repo/objects/33/493a3ea4ce3d33d820ec530b06192c18016ba2584e38f017e77135485aada6.filez new file mode 100644 index 00000000000..0e4d7571b42 Binary files /dev/null and b/repo/objects/33/493a3ea4ce3d33d820ec530b06192c18016ba2584e38f017e77135485aada6.filez differ diff --git a/repo/objects/33/8079d5e011f2dfca1b5aa2a2507f2abbe050f6d68b688e68dae6fdf26a0765.filez b/repo/objects/33/8079d5e011f2dfca1b5aa2a2507f2abbe050f6d68b688e68dae6fdf26a0765.filez new file mode 100644 index 00000000000..9e052e81b8c Binary files /dev/null and b/repo/objects/33/8079d5e011f2dfca1b5aa2a2507f2abbe050f6d68b688e68dae6fdf26a0765.filez differ diff --git a/repo/objects/33/d2a550ebdcb19b84f076ed2b638e657d65cbdcf11c833ef4aea5de1b83be17.dirtree b/repo/objects/33/d2a550ebdcb19b84f076ed2b638e657d65cbdcf11c833ef4aea5de1b83be17.dirtree new file mode 100644 index 00000000000..4718dd2692b Binary files /dev/null and b/repo/objects/33/d2a550ebdcb19b84f076ed2b638e657d65cbdcf11c833ef4aea5de1b83be17.dirtree differ diff --git a/repo/objects/34/0ffa8d9d9e66545f50c455ac1f51f92783f2b7e76ee229ade9c29b7c754819.filez b/repo/objects/34/0ffa8d9d9e66545f50c455ac1f51f92783f2b7e76ee229ade9c29b7c754819.filez new file mode 100644 index 00000000000..231b4a9aa6c Binary files /dev/null and b/repo/objects/34/0ffa8d9d9e66545f50c455ac1f51f92783f2b7e76ee229ade9c29b7c754819.filez differ diff --git a/repo/objects/34/536d010874ee4cba770ef668c69004b291b14cc9570cd620cfd3525978e217.filez b/repo/objects/34/536d010874ee4cba770ef668c69004b291b14cc9570cd620cfd3525978e217.filez new file mode 100644 index 00000000000..6ec55d77d99 Binary files /dev/null and b/repo/objects/34/536d010874ee4cba770ef668c69004b291b14cc9570cd620cfd3525978e217.filez differ diff --git a/repo/objects/34/551857b4b3f5136a542ec7217dd2e3a318f9a0b0698c80367a3777614a282a.filez b/repo/objects/34/551857b4b3f5136a542ec7217dd2e3a318f9a0b0698c80367a3777614a282a.filez new file mode 100644 index 00000000000..fb529e9dc6b Binary files /dev/null and b/repo/objects/34/551857b4b3f5136a542ec7217dd2e3a318f9a0b0698c80367a3777614a282a.filez differ diff --git a/repo/objects/34/559dba49de868ed7f46f8c8180e8b5f41a15c3a8c1673f134eecdcdf95603d.filez b/repo/objects/34/559dba49de868ed7f46f8c8180e8b5f41a15c3a8c1673f134eecdcdf95603d.filez new file mode 100644 index 00000000000..455bdd4e267 Binary files /dev/null and b/repo/objects/34/559dba49de868ed7f46f8c8180e8b5f41a15c3a8c1673f134eecdcdf95603d.filez differ diff --git a/repo/objects/34/5a5b91c11fea8a57a89e33c7dd35a3c7f36d7df7ae274d27a06fe2a7a58426.filez b/repo/objects/34/5a5b91c11fea8a57a89e33c7dd35a3c7f36d7df7ae274d27a06fe2a7a58426.filez new file mode 100644 index 00000000000..95b96c8369e Binary files /dev/null and b/repo/objects/34/5a5b91c11fea8a57a89e33c7dd35a3c7f36d7df7ae274d27a06fe2a7a58426.filez differ diff --git a/repo/objects/34/b82cafbc82c58312aef982849770aa3843ce0b077be8ba9d747e01e020ee78.filez b/repo/objects/34/b82cafbc82c58312aef982849770aa3843ce0b077be8ba9d747e01e020ee78.filez new file mode 100644 index 00000000000..40e9afa988b Binary files /dev/null and b/repo/objects/34/b82cafbc82c58312aef982849770aa3843ce0b077be8ba9d747e01e020ee78.filez differ diff --git a/repo/objects/34/bef83c474fb84eed8365dc29f79aa994640a836229f76a9b62f9e787c1c91c.dirtree b/repo/objects/34/bef83c474fb84eed8365dc29f79aa994640a836229f76a9b62f9e787c1c91c.dirtree new file mode 100644 index 00000000000..ff5eb6f2331 Binary files /dev/null and b/repo/objects/34/bef83c474fb84eed8365dc29f79aa994640a836229f76a9b62f9e787c1c91c.dirtree differ diff --git a/repo/objects/34/cd1a28248173b98ccd3a7cb0c0b735b28862967c38888009c4a4e5d1220ece.filez b/repo/objects/34/cd1a28248173b98ccd3a7cb0c0b735b28862967c38888009c4a4e5d1220ece.filez new file mode 100644 index 00000000000..9cb2309ace2 Binary files /dev/null and b/repo/objects/34/cd1a28248173b98ccd3a7cb0c0b735b28862967c38888009c4a4e5d1220ece.filez differ diff --git a/repo/objects/34/d3943f5a70857816ef721292c6ae4ec9f58f3b70013d178c1b4a185a89a28d.filez b/repo/objects/34/d3943f5a70857816ef721292c6ae4ec9f58f3b70013d178c1b4a185a89a28d.filez new file mode 100644 index 00000000000..8ca50a0f158 Binary files /dev/null and b/repo/objects/34/d3943f5a70857816ef721292c6ae4ec9f58f3b70013d178c1b4a185a89a28d.filez differ diff --git a/repo/objects/34/e48b7c6ead51446bd2272aa9ae86dc77e070557b43c6b6274d5e5a81b32132.filez b/repo/objects/34/e48b7c6ead51446bd2272aa9ae86dc77e070557b43c6b6274d5e5a81b32132.filez new file mode 100644 index 00000000000..bf80c05a03c Binary files /dev/null and b/repo/objects/34/e48b7c6ead51446bd2272aa9ae86dc77e070557b43c6b6274d5e5a81b32132.filez differ diff --git a/repo/objects/35/3acc41848f7517e731bc05e3bfb77ac63f1c21c6f62361a116654d0290a350.dirtree b/repo/objects/35/3acc41848f7517e731bc05e3bfb77ac63f1c21c6f62361a116654d0290a350.dirtree new file mode 100644 index 00000000000..38820a40df1 Binary files /dev/null and b/repo/objects/35/3acc41848f7517e731bc05e3bfb77ac63f1c21c6f62361a116654d0290a350.dirtree differ diff --git a/repo/objects/35/3c330dbf24bee49735d1e72092c58cad59fd4c3466dbd135b39e77f333adfa.filez b/repo/objects/35/3c330dbf24bee49735d1e72092c58cad59fd4c3466dbd135b39e77f333adfa.filez new file mode 100644 index 00000000000..f5eff788c40 Binary files /dev/null and b/repo/objects/35/3c330dbf24bee49735d1e72092c58cad59fd4c3466dbd135b39e77f333adfa.filez differ diff --git a/repo/objects/35/48a8284aa13731740c93faa6b1212301a8fa605799a0023626c4e406e8d0de.filez b/repo/objects/35/48a8284aa13731740c93faa6b1212301a8fa605799a0023626c4e406e8d0de.filez new file mode 100644 index 00000000000..436c4d010c1 Binary files /dev/null and b/repo/objects/35/48a8284aa13731740c93faa6b1212301a8fa605799a0023626c4e406e8d0de.filez differ diff --git a/repo/objects/35/4f99bff8c11adab8601d2de591029287b7e501fe2937d464b897f92b508bd9.filez b/repo/objects/35/4f99bff8c11adab8601d2de591029287b7e501fe2937d464b897f92b508bd9.filez new file mode 100644 index 00000000000..4798f2b374b Binary files /dev/null and b/repo/objects/35/4f99bff8c11adab8601d2de591029287b7e501fe2937d464b897f92b508bd9.filez differ diff --git a/repo/objects/35/5d0df2be89b7c1b13a43d731089350f9c3b315ed9471c76f08becac114a34a.dirtree b/repo/objects/35/5d0df2be89b7c1b13a43d731089350f9c3b315ed9471c76f08becac114a34a.dirtree new file mode 100644 index 00000000000..dd69b50da74 Binary files /dev/null and b/repo/objects/35/5d0df2be89b7c1b13a43d731089350f9c3b315ed9471c76f08becac114a34a.dirtree differ diff --git a/repo/objects/35/923beee45f5ae1356c2636c54c3fe22aa1f208fcdbc970d24727812fc5d585.filez b/repo/objects/35/923beee45f5ae1356c2636c54c3fe22aa1f208fcdbc970d24727812fc5d585.filez new file mode 100644 index 00000000000..75286221b24 Binary files /dev/null and b/repo/objects/35/923beee45f5ae1356c2636c54c3fe22aa1f208fcdbc970d24727812fc5d585.filez differ diff --git a/repo/objects/35/92b16e4c9b3caded1eb1d4a42ae7dc260362cd180501d42e9f781aa738891b.filez b/repo/objects/35/92b16e4c9b3caded1eb1d4a42ae7dc260362cd180501d42e9f781aa738891b.filez new file mode 100644 index 00000000000..9340ebcf1d5 Binary files /dev/null and b/repo/objects/35/92b16e4c9b3caded1eb1d4a42ae7dc260362cd180501d42e9f781aa738891b.filez differ diff --git a/repo/objects/35/b26a032ef241135c13d65fc9705747cef6a2e4dc587c7c30e7369404db1f40.filez b/repo/objects/35/b26a032ef241135c13d65fc9705747cef6a2e4dc587c7c30e7369404db1f40.filez new file mode 100644 index 00000000000..857df505918 Binary files /dev/null and b/repo/objects/35/b26a032ef241135c13d65fc9705747cef6a2e4dc587c7c30e7369404db1f40.filez differ diff --git a/repo/objects/35/dd63077cec45114278e2605c59a7b7586f972f3b633702053d8698b0658a80.filez b/repo/objects/35/dd63077cec45114278e2605c59a7b7586f972f3b633702053d8698b0658a80.filez new file mode 100644 index 00000000000..5746fd295ab Binary files /dev/null and b/repo/objects/35/dd63077cec45114278e2605c59a7b7586f972f3b633702053d8698b0658a80.filez differ diff --git a/repo/objects/35/df5ec47f6d332431dd3ec0aed7c2498bd328714d6529f37672ce4ed59de6da.dirtree b/repo/objects/35/df5ec47f6d332431dd3ec0aed7c2498bd328714d6529f37672ce4ed59de6da.dirtree new file mode 100644 index 00000000000..0425f4aa43b Binary files /dev/null and b/repo/objects/35/df5ec47f6d332431dd3ec0aed7c2498bd328714d6529f37672ce4ed59de6da.dirtree differ diff --git a/repo/objects/35/f3e6d7cc50359fe180d3b0c6fd6cd4f420e9a5a181c37186c5baf2a6e3c79f.filez b/repo/objects/35/f3e6d7cc50359fe180d3b0c6fd6cd4f420e9a5a181c37186c5baf2a6e3c79f.filez new file mode 100644 index 00000000000..b24e83f57ec Binary files /dev/null and b/repo/objects/35/f3e6d7cc50359fe180d3b0c6fd6cd4f420e9a5a181c37186c5baf2a6e3c79f.filez differ diff --git a/repo/objects/36/28982c1038c2480da44bf5938be188cdc2a8c14a6c9680f8b2d212c098f3bd.filez b/repo/objects/36/28982c1038c2480da44bf5938be188cdc2a8c14a6c9680f8b2d212c098f3bd.filez new file mode 100644 index 00000000000..f535254b800 Binary files /dev/null and b/repo/objects/36/28982c1038c2480da44bf5938be188cdc2a8c14a6c9680f8b2d212c098f3bd.filez differ diff --git a/repo/objects/36/35ffc54afb33a1540f0dfebc4c84dd037ed121ac8365aef0f14d6b0d145a97.filez b/repo/objects/36/35ffc54afb33a1540f0dfebc4c84dd037ed121ac8365aef0f14d6b0d145a97.filez new file mode 100644 index 00000000000..5b3e7d752c3 Binary files /dev/null and b/repo/objects/36/35ffc54afb33a1540f0dfebc4c84dd037ed121ac8365aef0f14d6b0d145a97.filez differ diff --git a/repo/objects/36/483b16c96d5af2942aaa9f4e1e103a8a12cc3926484c58f8b5e627a8204d0e.filez b/repo/objects/36/483b16c96d5af2942aaa9f4e1e103a8a12cc3926484c58f8b5e627a8204d0e.filez new file mode 100644 index 00000000000..8fe1e5a9c47 Binary files /dev/null and b/repo/objects/36/483b16c96d5af2942aaa9f4e1e103a8a12cc3926484c58f8b5e627a8204d0e.filez differ diff --git a/repo/objects/36/4bc987611a64169a21f7eb7e91566fca1d2a4b7e3d075e4864af5223f9fa6f.filez b/repo/objects/36/4bc987611a64169a21f7eb7e91566fca1d2a4b7e3d075e4864af5223f9fa6f.filez new file mode 100644 index 00000000000..9ececfbd4e7 Binary files /dev/null and b/repo/objects/36/4bc987611a64169a21f7eb7e91566fca1d2a4b7e3d075e4864af5223f9fa6f.filez differ diff --git a/repo/objects/36/661094b2455207be7f824bcfc57c3461a535c7341c9b3ba2c7c056d3501334.filez b/repo/objects/36/661094b2455207be7f824bcfc57c3461a535c7341c9b3ba2c7c056d3501334.filez new file mode 100644 index 00000000000..02a94c8ee13 Binary files /dev/null and b/repo/objects/36/661094b2455207be7f824bcfc57c3461a535c7341c9b3ba2c7c056d3501334.filez differ diff --git a/repo/objects/36/68241d93e1710c04a3d5835fe35fd25f59251237fe89e8b1adc38444a1063e.filez b/repo/objects/36/68241d93e1710c04a3d5835fe35fd25f59251237fe89e8b1adc38444a1063e.filez new file mode 100644 index 00000000000..a05999b7997 Binary files /dev/null and b/repo/objects/36/68241d93e1710c04a3d5835fe35fd25f59251237fe89e8b1adc38444a1063e.filez differ diff --git a/repo/objects/36/83681d045c2eaeed633da3bf7b000e39f38a1ec5ff2b3173999940f360f3cd.filez b/repo/objects/36/83681d045c2eaeed633da3bf7b000e39f38a1ec5ff2b3173999940f360f3cd.filez new file mode 100644 index 00000000000..4d14b77f429 Binary files /dev/null and b/repo/objects/36/83681d045c2eaeed633da3bf7b000e39f38a1ec5ff2b3173999940f360f3cd.filez differ diff --git a/repo/objects/36/86467bb19a77bda2db5ea4e119153e054906b9e5632db5c235f6df7efbff88.dirtree b/repo/objects/36/86467bb19a77bda2db5ea4e119153e054906b9e5632db5c235f6df7efbff88.dirtree new file mode 100644 index 00000000000..0d5f3133b31 Binary files /dev/null and b/repo/objects/36/86467bb19a77bda2db5ea4e119153e054906b9e5632db5c235f6df7efbff88.dirtree differ diff --git a/repo/objects/36/95d58e24c2005af12db9796413a8b7fea19d7651f8c10e3fe1e8fc11b1d7fe.filez b/repo/objects/36/95d58e24c2005af12db9796413a8b7fea19d7651f8c10e3fe1e8fc11b1d7fe.filez new file mode 100644 index 00000000000..8bc5aeae467 Binary files /dev/null and b/repo/objects/36/95d58e24c2005af12db9796413a8b7fea19d7651f8c10e3fe1e8fc11b1d7fe.filez differ diff --git a/repo/objects/36/9ba4d2a6e1506c4899f0b59ea4b37416f9def4109d6ac18c716d32a1baadb4.filez b/repo/objects/36/9ba4d2a6e1506c4899f0b59ea4b37416f9def4109d6ac18c716d32a1baadb4.filez new file mode 100644 index 00000000000..e726d6e8c56 Binary files /dev/null and b/repo/objects/36/9ba4d2a6e1506c4899f0b59ea4b37416f9def4109d6ac18c716d32a1baadb4.filez differ diff --git a/repo/objects/36/a8de5e3ca8d358fd2c291a1c8865b7181ad9ab75435b37ace78ca8c05e23f4.dirtree b/repo/objects/36/a8de5e3ca8d358fd2c291a1c8865b7181ad9ab75435b37ace78ca8c05e23f4.dirtree new file mode 100644 index 00000000000..0229f44e47b Binary files /dev/null and b/repo/objects/36/a8de5e3ca8d358fd2c291a1c8865b7181ad9ab75435b37ace78ca8c05e23f4.dirtree differ diff --git a/repo/objects/36/a9319e207989bfdb5361980008c67faa1662b12446daf95083152b6ae26000.filez b/repo/objects/36/a9319e207989bfdb5361980008c67faa1662b12446daf95083152b6ae26000.filez new file mode 100644 index 00000000000..ad5ee2213dd Binary files /dev/null and b/repo/objects/36/a9319e207989bfdb5361980008c67faa1662b12446daf95083152b6ae26000.filez differ diff --git a/repo/objects/36/b95ca235dc60793b3e76c78a1164045b6a1b5194dfb2a1330c2c4d3ae92f44.dirtree b/repo/objects/36/b95ca235dc60793b3e76c78a1164045b6a1b5194dfb2a1330c2c4d3ae92f44.dirtree new file mode 100644 index 00000000000..8028456ab84 Binary files /dev/null and b/repo/objects/36/b95ca235dc60793b3e76c78a1164045b6a1b5194dfb2a1330c2c4d3ae92f44.dirtree differ diff --git a/repo/objects/36/df5974297510b117dd3c6abcc747bf2a110c336df7ef30f6b89fda2b890f56.filez b/repo/objects/36/df5974297510b117dd3c6abcc747bf2a110c336df7ef30f6b89fda2b890f56.filez new file mode 100644 index 00000000000..0c4f4761293 Binary files /dev/null and b/repo/objects/36/df5974297510b117dd3c6abcc747bf2a110c336df7ef30f6b89fda2b890f56.filez differ diff --git a/repo/objects/36/ec464e4d3efb6bd2eab725edcf28365569db65559342df49de4347d463709f.dirtree b/repo/objects/36/ec464e4d3efb6bd2eab725edcf28365569db65559342df49de4347d463709f.dirtree new file mode 100644 index 00000000000..e3605516621 Binary files /dev/null and b/repo/objects/36/ec464e4d3efb6bd2eab725edcf28365569db65559342df49de4347d463709f.dirtree differ diff --git a/repo/objects/37/028cc78c7be2196f7d12c673cfabf68b556fd7bb837e8aee5eada15668a79e.filez b/repo/objects/37/028cc78c7be2196f7d12c673cfabf68b556fd7bb837e8aee5eada15668a79e.filez new file mode 100644 index 00000000000..703d101bb1e Binary files /dev/null and b/repo/objects/37/028cc78c7be2196f7d12c673cfabf68b556fd7bb837e8aee5eada15668a79e.filez differ diff --git a/repo/objects/37/1121c9cd96e2f3514798e6d13f5363d0ed675072eb7bec9e2e295668bb0845.filez b/repo/objects/37/1121c9cd96e2f3514798e6d13f5363d0ed675072eb7bec9e2e295668bb0845.filez new file mode 100644 index 00000000000..a946004886a Binary files /dev/null and b/repo/objects/37/1121c9cd96e2f3514798e6d13f5363d0ed675072eb7bec9e2e295668bb0845.filez differ diff --git a/repo/objects/37/19a67f9b3affdda58a0d2263e670356eeb15779535cf74c0dda83986d9ee4a.filez b/repo/objects/37/19a67f9b3affdda58a0d2263e670356eeb15779535cf74c0dda83986d9ee4a.filez new file mode 100644 index 00000000000..f1adcf6c4d9 Binary files /dev/null and b/repo/objects/37/19a67f9b3affdda58a0d2263e670356eeb15779535cf74c0dda83986d9ee4a.filez differ diff --git a/repo/objects/37/1c2c66dfdc65c6af4d63babcf94cbbad18279548f4c15944cc78298f4942dc.filez b/repo/objects/37/1c2c66dfdc65c6af4d63babcf94cbbad18279548f4c15944cc78298f4942dc.filez new file mode 100644 index 00000000000..14bf363c841 Binary files /dev/null and b/repo/objects/37/1c2c66dfdc65c6af4d63babcf94cbbad18279548f4c15944cc78298f4942dc.filez differ diff --git a/repo/objects/37/5398e2a4f21a7f83089edc71f6da7fa5767170044cbc2711b51b5622bc6694.filez b/repo/objects/37/5398e2a4f21a7f83089edc71f6da7fa5767170044cbc2711b51b5622bc6694.filez new file mode 100644 index 00000000000..69545514037 Binary files /dev/null and b/repo/objects/37/5398e2a4f21a7f83089edc71f6da7fa5767170044cbc2711b51b5622bc6694.filez differ diff --git a/repo/objects/37/5739605f3bd7b00a0db27a5b3fb975b0eb24fee2653be8872e6813dae3000e.filez b/repo/objects/37/5739605f3bd7b00a0db27a5b3fb975b0eb24fee2653be8872e6813dae3000e.filez new file mode 100644 index 00000000000..5987f1a13f6 Binary files /dev/null and b/repo/objects/37/5739605f3bd7b00a0db27a5b3fb975b0eb24fee2653be8872e6813dae3000e.filez differ diff --git a/repo/objects/37/649907f3235fa24c57b8c35ae4263b1d372bf1a3c441667ec631ebd2041d7f.dirtree b/repo/objects/37/649907f3235fa24c57b8c35ae4263b1d372bf1a3c441667ec631ebd2041d7f.dirtree new file mode 100644 index 00000000000..377f0874ad9 Binary files /dev/null and b/repo/objects/37/649907f3235fa24c57b8c35ae4263b1d372bf1a3c441667ec631ebd2041d7f.dirtree differ diff --git a/repo/objects/37/66e1e6d5bde57c5f3661ef7e09c7126f1bcd3ec55e7b15b0eceec6b0e1642b.filez b/repo/objects/37/66e1e6d5bde57c5f3661ef7e09c7126f1bcd3ec55e7b15b0eceec6b0e1642b.filez new file mode 100644 index 00000000000..a8c1ce644c3 Binary files /dev/null and b/repo/objects/37/66e1e6d5bde57c5f3661ef7e09c7126f1bcd3ec55e7b15b0eceec6b0e1642b.filez differ diff --git a/repo/objects/37/832f33710002ff8d9750edf922cf93e4ab4eac8a0a1940df7f67929f88d676.filez b/repo/objects/37/832f33710002ff8d9750edf922cf93e4ab4eac8a0a1940df7f67929f88d676.filez new file mode 100644 index 00000000000..c94cca585fb Binary files /dev/null and b/repo/objects/37/832f33710002ff8d9750edf922cf93e4ab4eac8a0a1940df7f67929f88d676.filez differ diff --git a/repo/objects/37/f169ba53bb0c0ebabf79082732e6f67f0331f12788e0e880dc6330bdb7faf6.filez b/repo/objects/37/f169ba53bb0c0ebabf79082732e6f67f0331f12788e0e880dc6330bdb7faf6.filez new file mode 100644 index 00000000000..86ce347fed2 Binary files /dev/null and b/repo/objects/37/f169ba53bb0c0ebabf79082732e6f67f0331f12788e0e880dc6330bdb7faf6.filez differ diff --git a/repo/objects/37/f4c51a968e9ad197defd7b08f181a21f4ac5a6e987985438c106cdc8a5b10e.filez b/repo/objects/37/f4c51a968e9ad197defd7b08f181a21f4ac5a6e987985438c106cdc8a5b10e.filez new file mode 100644 index 00000000000..b45023fce58 Binary files /dev/null and b/repo/objects/37/f4c51a968e9ad197defd7b08f181a21f4ac5a6e987985438c106cdc8a5b10e.filez differ diff --git a/repo/objects/38/22997a574e6505ac03856f1fd7b5d2a2636307e0809ba443f75f66a6651fbc.filez b/repo/objects/38/22997a574e6505ac03856f1fd7b5d2a2636307e0809ba443f75f66a6651fbc.filez new file mode 100644 index 00000000000..20ffa5d2354 Binary files /dev/null and b/repo/objects/38/22997a574e6505ac03856f1fd7b5d2a2636307e0809ba443f75f66a6651fbc.filez differ diff --git a/repo/objects/38/2dcdebb9a1fd0db6966e43fe23bafb78a4a5431800430e304630eeacccccc5.filez b/repo/objects/38/2dcdebb9a1fd0db6966e43fe23bafb78a4a5431800430e304630eeacccccc5.filez new file mode 100644 index 00000000000..96fd369c5e2 Binary files /dev/null and b/repo/objects/38/2dcdebb9a1fd0db6966e43fe23bafb78a4a5431800430e304630eeacccccc5.filez differ diff --git a/repo/objects/38/36433f6202551cdea30522eae274d7d6e0c14527ae17fb0309b7c76a59a119.filez b/repo/objects/38/36433f6202551cdea30522eae274d7d6e0c14527ae17fb0309b7c76a59a119.filez new file mode 100644 index 00000000000..9bd3d31bfb7 Binary files /dev/null and b/repo/objects/38/36433f6202551cdea30522eae274d7d6e0c14527ae17fb0309b7c76a59a119.filez differ diff --git a/repo/objects/38/47ca1146d397e556468747cf9354ad44173de003207d2c4b5fea7ba92612aa.filez b/repo/objects/38/47ca1146d397e556468747cf9354ad44173de003207d2c4b5fea7ba92612aa.filez new file mode 100644 index 00000000000..3e605e6fb6e Binary files /dev/null and b/repo/objects/38/47ca1146d397e556468747cf9354ad44173de003207d2c4b5fea7ba92612aa.filez differ diff --git a/repo/objects/38/57f4d56bcf2af96098f6cf8758eea77db2bd8eeb351f274d994425edfb1010.dirtree b/repo/objects/38/57f4d56bcf2af96098f6cf8758eea77db2bd8eeb351f274d994425edfb1010.dirtree new file mode 100644 index 00000000000..700dedb83fe Binary files /dev/null and b/repo/objects/38/57f4d56bcf2af96098f6cf8758eea77db2bd8eeb351f274d994425edfb1010.dirtree differ diff --git a/repo/objects/38/5a64312ce7699cd437a251acd19d2cdab6a7fa00be163bf8017c319a2dd35f.filez b/repo/objects/38/5a64312ce7699cd437a251acd19d2cdab6a7fa00be163bf8017c319a2dd35f.filez new file mode 100644 index 00000000000..f872e141814 Binary files /dev/null and b/repo/objects/38/5a64312ce7699cd437a251acd19d2cdab6a7fa00be163bf8017c319a2dd35f.filez differ diff --git a/repo/objects/38/71be194e9b4434f865f63fcd8f0d4a1e0ecc4496cbb7bf06b6acdf705a1c5a.filez b/repo/objects/38/71be194e9b4434f865f63fcd8f0d4a1e0ecc4496cbb7bf06b6acdf705a1c5a.filez new file mode 100644 index 00000000000..41053e5af63 Binary files /dev/null and b/repo/objects/38/71be194e9b4434f865f63fcd8f0d4a1e0ecc4496cbb7bf06b6acdf705a1c5a.filez differ diff --git a/repo/objects/38/8164c00e03bade314017b8a1cbf074fddc96560e4c985cedc0b13fcf1a0f2c.filez b/repo/objects/38/8164c00e03bade314017b8a1cbf074fddc96560e4c985cedc0b13fcf1a0f2c.filez new file mode 100644 index 00000000000..b5b0e6fff83 Binary files /dev/null and b/repo/objects/38/8164c00e03bade314017b8a1cbf074fddc96560e4c985cedc0b13fcf1a0f2c.filez differ diff --git a/repo/objects/38/8a82f36e4ce824d8378748e448206ad6ad7db6cc2bd553e33ae5dfdac79e92.filez b/repo/objects/38/8a82f36e4ce824d8378748e448206ad6ad7db6cc2bd553e33ae5dfdac79e92.filez new file mode 100644 index 00000000000..a98e3b99e76 Binary files /dev/null and b/repo/objects/38/8a82f36e4ce824d8378748e448206ad6ad7db6cc2bd553e33ae5dfdac79e92.filez differ diff --git a/repo/objects/38/97a3929e8bc11fad9f77e18d1b4b59be460065faf24d4525811fbf8d1a27c6.filez b/repo/objects/38/97a3929e8bc11fad9f77e18d1b4b59be460065faf24d4525811fbf8d1a27c6.filez new file mode 100644 index 00000000000..8599820e187 Binary files /dev/null and b/repo/objects/38/97a3929e8bc11fad9f77e18d1b4b59be460065faf24d4525811fbf8d1a27c6.filez differ diff --git a/repo/objects/38/a036d848e61bddfbb7f24feeae8fc3a3eb44adac66ca461a13378d39429d1f.filez b/repo/objects/38/a036d848e61bddfbb7f24feeae8fc3a3eb44adac66ca461a13378d39429d1f.filez new file mode 100644 index 00000000000..4818a6d6b6f Binary files /dev/null and b/repo/objects/38/a036d848e61bddfbb7f24feeae8fc3a3eb44adac66ca461a13378d39429d1f.filez differ diff --git a/repo/objects/38/afa73f96765021a541cb569dc774923e0fe286a263695f99ae7030e2bbfd03.filez b/repo/objects/38/afa73f96765021a541cb569dc774923e0fe286a263695f99ae7030e2bbfd03.filez new file mode 100644 index 00000000000..7d9c514ff4f Binary files /dev/null and b/repo/objects/38/afa73f96765021a541cb569dc774923e0fe286a263695f99ae7030e2bbfd03.filez differ diff --git a/repo/objects/38/ba59593ee00fa5f4d6b858ff87da98812318ae489afd35cef84aeef5361e96.filez b/repo/objects/38/ba59593ee00fa5f4d6b858ff87da98812318ae489afd35cef84aeef5361e96.filez new file mode 100644 index 00000000000..39035ff3f80 Binary files /dev/null and b/repo/objects/38/ba59593ee00fa5f4d6b858ff87da98812318ae489afd35cef84aeef5361e96.filez differ diff --git a/repo/objects/38/c24ef7f4f891a1d2b9bf70bb2cd864df9f3e11df9821e3745cb24529fd3cb4.filez b/repo/objects/38/c24ef7f4f891a1d2b9bf70bb2cd864df9f3e11df9821e3745cb24529fd3cb4.filez new file mode 100644 index 00000000000..c9bcec9717a Binary files /dev/null and b/repo/objects/38/c24ef7f4f891a1d2b9bf70bb2cd864df9f3e11df9821e3745cb24529fd3cb4.filez differ diff --git a/repo/objects/38/c2a902d4ca06d7688c05e0f169969fcfa46b67f9ecc78480c9582f419c39db.dirtree b/repo/objects/38/c2a902d4ca06d7688c05e0f169969fcfa46b67f9ecc78480c9582f419c39db.dirtree new file mode 100644 index 00000000000..2533cef8df2 Binary files /dev/null and b/repo/objects/38/c2a902d4ca06d7688c05e0f169969fcfa46b67f9ecc78480c9582f419c39db.dirtree differ diff --git a/repo/objects/38/ca56cd5f4c44e1a7d71516502770e28dbd2414f4cf674e1beda093ee6b442f.filez b/repo/objects/38/ca56cd5f4c44e1a7d71516502770e28dbd2414f4cf674e1beda093ee6b442f.filez new file mode 100644 index 00000000000..9950cc3d366 Binary files /dev/null and b/repo/objects/38/ca56cd5f4c44e1a7d71516502770e28dbd2414f4cf674e1beda093ee6b442f.filez differ diff --git a/repo/objects/38/d1eac769a35650a9f79d928ff7892a5d1e7ed610ac7b4834e6b8416a3c7595.filez b/repo/objects/38/d1eac769a35650a9f79d928ff7892a5d1e7ed610ac7b4834e6b8416a3c7595.filez new file mode 100644 index 00000000000..e38aae11dde Binary files /dev/null and b/repo/objects/38/d1eac769a35650a9f79d928ff7892a5d1e7ed610ac7b4834e6b8416a3c7595.filez differ diff --git a/repo/objects/38/ef05dd42735ce5ef2dc00794403ab659c77eb8213f3e4f07b498c8d913ffbe.filez b/repo/objects/38/ef05dd42735ce5ef2dc00794403ab659c77eb8213f3e4f07b498c8d913ffbe.filez new file mode 100644 index 00000000000..094cb5b950c Binary files /dev/null and b/repo/objects/38/ef05dd42735ce5ef2dc00794403ab659c77eb8213f3e4f07b498c8d913ffbe.filez differ diff --git a/repo/objects/38/ffc51eb178833ed6a2bddee28199bad421650203684e4fa6e36072dda25d59.filez b/repo/objects/38/ffc51eb178833ed6a2bddee28199bad421650203684e4fa6e36072dda25d59.filez new file mode 100644 index 00000000000..cb2bc5e3cd1 Binary files /dev/null and b/repo/objects/38/ffc51eb178833ed6a2bddee28199bad421650203684e4fa6e36072dda25d59.filez differ diff --git a/repo/objects/39/3571dfde0a5d730c7272d4e2c73916bfb6ff6a0c3dba1faa309adb273c98a6.filez b/repo/objects/39/3571dfde0a5d730c7272d4e2c73916bfb6ff6a0c3dba1faa309adb273c98a6.filez new file mode 100644 index 00000000000..abb1bf16a64 Binary files /dev/null and b/repo/objects/39/3571dfde0a5d730c7272d4e2c73916bfb6ff6a0c3dba1faa309adb273c98a6.filez differ diff --git a/repo/objects/39/44933e18bdb21dd9b7b4d13abf3947b51aee5f08d89461b206db0520ee2bd8.filez b/repo/objects/39/44933e18bdb21dd9b7b4d13abf3947b51aee5f08d89461b206db0520ee2bd8.filez new file mode 100644 index 00000000000..1708ea96510 Binary files /dev/null and b/repo/objects/39/44933e18bdb21dd9b7b4d13abf3947b51aee5f08d89461b206db0520ee2bd8.filez differ diff --git a/repo/objects/39/45c9f4dc766077051fca8701acc22722f8a468f8c50156cce7ae176602543c.dirtree b/repo/objects/39/45c9f4dc766077051fca8701acc22722f8a468f8c50156cce7ae176602543c.dirtree new file mode 100644 index 00000000000..d914ed1c75c Binary files /dev/null and b/repo/objects/39/45c9f4dc766077051fca8701acc22722f8a468f8c50156cce7ae176602543c.dirtree differ diff --git a/repo/objects/39/8200448354c3be3680e3af5690393ebcdb3da2bda2c11d2e6023de4c078875.filez b/repo/objects/39/8200448354c3be3680e3af5690393ebcdb3da2bda2c11d2e6023de4c078875.filez new file mode 100644 index 00000000000..dda0391d89f Binary files /dev/null and b/repo/objects/39/8200448354c3be3680e3af5690393ebcdb3da2bda2c11d2e6023de4c078875.filez differ diff --git a/repo/objects/39/8953ee4e70981398bb4958aaeba509925a13b5210ea427548dedec3f82aa99.dirtree b/repo/objects/39/8953ee4e70981398bb4958aaeba509925a13b5210ea427548dedec3f82aa99.dirtree new file mode 100644 index 00000000000..7630d73017e Binary files /dev/null and b/repo/objects/39/8953ee4e70981398bb4958aaeba509925a13b5210ea427548dedec3f82aa99.dirtree differ diff --git a/repo/objects/39/9d844de39a4556543efb7f0474e8a454e17afc4a0789b98eb866ecef364be6.filez b/repo/objects/39/9d844de39a4556543efb7f0474e8a454e17afc4a0789b98eb866ecef364be6.filez new file mode 100644 index 00000000000..d80d502401b Binary files /dev/null and b/repo/objects/39/9d844de39a4556543efb7f0474e8a454e17afc4a0789b98eb866ecef364be6.filez differ diff --git a/repo/objects/39/b78f51e3201329107ee3791e1c9345c1f33fc2706daf7c56e69bb29746cce1.dirtree b/repo/objects/39/b78f51e3201329107ee3791e1c9345c1f33fc2706daf7c56e69bb29746cce1.dirtree new file mode 100644 index 00000000000..b87566703fe Binary files /dev/null and b/repo/objects/39/b78f51e3201329107ee3791e1c9345c1f33fc2706daf7c56e69bb29746cce1.dirtree differ diff --git a/repo/objects/39/c1c699e9761b9b8c757768a20dd6f14461933a2843f9d6d17680351191a520.filez b/repo/objects/39/c1c699e9761b9b8c757768a20dd6f14461933a2843f9d6d17680351191a520.filez new file mode 100644 index 00000000000..8eaacf0eb06 Binary files /dev/null and b/repo/objects/39/c1c699e9761b9b8c757768a20dd6f14461933a2843f9d6d17680351191a520.filez differ diff --git a/repo/objects/39/d6129d32ededb044435c5cdecc0c9c72b7e177c4c61d77aa26b72bb9e52bf4.dirtree b/repo/objects/39/d6129d32ededb044435c5cdecc0c9c72b7e177c4c61d77aa26b72bb9e52bf4.dirtree new file mode 100644 index 00000000000..84184190e72 Binary files /dev/null and b/repo/objects/39/d6129d32ededb044435c5cdecc0c9c72b7e177c4c61d77aa26b72bb9e52bf4.dirtree differ diff --git a/repo/objects/3a/0d1e4f92e8ebd73821a2309b2d699478cd239359319f3787459510b937c138.filez b/repo/objects/3a/0d1e4f92e8ebd73821a2309b2d699478cd239359319f3787459510b937c138.filez new file mode 100644 index 00000000000..5050a5f755b Binary files /dev/null and b/repo/objects/3a/0d1e4f92e8ebd73821a2309b2d699478cd239359319f3787459510b937c138.filez differ diff --git a/repo/objects/3a/2d8869996b3f9a1c2bfbec4a2a572971b31b82f4e2750ffb26c9e863d3e18b.filez b/repo/objects/3a/2d8869996b3f9a1c2bfbec4a2a572971b31b82f4e2750ffb26c9e863d3e18b.filez new file mode 100644 index 00000000000..3ee60b9f8ee Binary files /dev/null and b/repo/objects/3a/2d8869996b3f9a1c2bfbec4a2a572971b31b82f4e2750ffb26c9e863d3e18b.filez differ diff --git a/repo/objects/3a/5f531091e4291358b1370bdcb83c2b3f39937c0904d154e46fb6dca3fad95e.filez b/repo/objects/3a/5f531091e4291358b1370bdcb83c2b3f39937c0904d154e46fb6dca3fad95e.filez new file mode 100644 index 00000000000..8e30283b174 Binary files /dev/null and b/repo/objects/3a/5f531091e4291358b1370bdcb83c2b3f39937c0904d154e46fb6dca3fad95e.filez differ diff --git a/repo/objects/3a/6546d347d5b81142382a3e7a037ee74b03dd9435c6de0cfceb458aa0be7d4b.filez b/repo/objects/3a/6546d347d5b81142382a3e7a037ee74b03dd9435c6de0cfceb458aa0be7d4b.filez new file mode 100644 index 00000000000..e5491fc33f1 Binary files /dev/null and b/repo/objects/3a/6546d347d5b81142382a3e7a037ee74b03dd9435c6de0cfceb458aa0be7d4b.filez differ diff --git a/repo/objects/3a/6f3dc0e4f85221d2b6c521636fe9e2ddcfb163bc5ba546cf696c77f010df72.filez b/repo/objects/3a/6f3dc0e4f85221d2b6c521636fe9e2ddcfb163bc5ba546cf696c77f010df72.filez new file mode 100644 index 00000000000..7bdb636a2ae Binary files /dev/null and b/repo/objects/3a/6f3dc0e4f85221d2b6c521636fe9e2ddcfb163bc5ba546cf696c77f010df72.filez differ diff --git a/repo/objects/3a/aa8eb9bb6fe134973a1e551fe596676a173d571a72b795150798e70342fa7c.filez b/repo/objects/3a/aa8eb9bb6fe134973a1e551fe596676a173d571a72b795150798e70342fa7c.filez new file mode 100644 index 00000000000..3a04c716169 Binary files /dev/null and b/repo/objects/3a/aa8eb9bb6fe134973a1e551fe596676a173d571a72b795150798e70342fa7c.filez differ diff --git a/repo/objects/3a/ed61d87d13187199e6b858d5570a0a2cd9143758626ebd0d44b8b0eac98497.filez b/repo/objects/3a/ed61d87d13187199e6b858d5570a0a2cd9143758626ebd0d44b8b0eac98497.filez new file mode 100644 index 00000000000..efd432a0b9c Binary files /dev/null and b/repo/objects/3a/ed61d87d13187199e6b858d5570a0a2cd9143758626ebd0d44b8b0eac98497.filez differ diff --git a/repo/objects/3a/f7ad8547869b56d289edcdc78ac910d4d1aaa3948343ae1d340a0d06c55746.filez b/repo/objects/3a/f7ad8547869b56d289edcdc78ac910d4d1aaa3948343ae1d340a0d06c55746.filez new file mode 100644 index 00000000000..94980ffc412 Binary files /dev/null and b/repo/objects/3a/f7ad8547869b56d289edcdc78ac910d4d1aaa3948343ae1d340a0d06c55746.filez differ diff --git a/repo/objects/3b/054e516917fb6fe9e31c423978ab7b4e978305d38a9bc4f90e027763b24f9c.dirtree b/repo/objects/3b/054e516917fb6fe9e31c423978ab7b4e978305d38a9bc4f90e027763b24f9c.dirtree new file mode 100644 index 00000000000..1da773e6668 Binary files /dev/null and b/repo/objects/3b/054e516917fb6fe9e31c423978ab7b4e978305d38a9bc4f90e027763b24f9c.dirtree differ diff --git a/repo/objects/3b/0e8865d5871f871c85e8a151eae28f198df28a3480b6efcac8d39df6630a2d.filez b/repo/objects/3b/0e8865d5871f871c85e8a151eae28f198df28a3480b6efcac8d39df6630a2d.filez new file mode 100644 index 00000000000..a775de40efc Binary files /dev/null and b/repo/objects/3b/0e8865d5871f871c85e8a151eae28f198df28a3480b6efcac8d39df6630a2d.filez differ diff --git a/repo/objects/3b/20048bb7d4097126412c7115d24305dc5d818da8293890839438842e43f735.dirtree b/repo/objects/3b/20048bb7d4097126412c7115d24305dc5d818da8293890839438842e43f735.dirtree new file mode 100644 index 00000000000..005557d9f3c Binary files /dev/null and b/repo/objects/3b/20048bb7d4097126412c7115d24305dc5d818da8293890839438842e43f735.dirtree differ diff --git a/repo/objects/3b/3b7fc6cc4acb2ff92673beffb3553d8d693b7fdef232f236e3a35fda894a71.filez b/repo/objects/3b/3b7fc6cc4acb2ff92673beffb3553d8d693b7fdef232f236e3a35fda894a71.filez new file mode 100644 index 00000000000..439b3d59b5d Binary files /dev/null and b/repo/objects/3b/3b7fc6cc4acb2ff92673beffb3553d8d693b7fdef232f236e3a35fda894a71.filez differ diff --git a/repo/objects/3b/4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9.commit b/repo/objects/3b/4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9.commit new file mode 100644 index 00000000000..7c7287ed4f9 Binary files /dev/null and b/repo/objects/3b/4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9.commit differ diff --git a/repo/objects/3b/4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9.commitmeta b/repo/objects/3b/4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9.commitmeta new file mode 100644 index 00000000000..477483d25bf Binary files /dev/null and b/repo/objects/3b/4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9.commitmeta differ diff --git a/repo/objects/3b/9b46be42e7389a06fd21b16fb74666d0f4ab07b992cf0ece5ccd9bffc1470e.dirtree b/repo/objects/3b/9b46be42e7389a06fd21b16fb74666d0f4ab07b992cf0ece5ccd9bffc1470e.dirtree new file mode 100644 index 00000000000..9af3c2b3ab9 Binary files /dev/null and b/repo/objects/3b/9b46be42e7389a06fd21b16fb74666d0f4ab07b992cf0ece5ccd9bffc1470e.dirtree differ diff --git a/repo/objects/3b/bcea42d1d1844ec292c120d483eff5839f5d08a1a46f4133bf402c87c0df80.dirtree b/repo/objects/3b/bcea42d1d1844ec292c120d483eff5839f5d08a1a46f4133bf402c87c0df80.dirtree new file mode 100644 index 00000000000..d13c041f8d4 Binary files /dev/null and b/repo/objects/3b/bcea42d1d1844ec292c120d483eff5839f5d08a1a46f4133bf402c87c0df80.dirtree differ diff --git a/repo/objects/3b/bcfb303f45544ad5493c83f56e95e11e5f4d16c48238ed5051f520cbd1a571.dirtree b/repo/objects/3b/bcfb303f45544ad5493c83f56e95e11e5f4d16c48238ed5051f520cbd1a571.dirtree new file mode 100644 index 00000000000..1104f757785 Binary files /dev/null and b/repo/objects/3b/bcfb303f45544ad5493c83f56e95e11e5f4d16c48238ed5051f520cbd1a571.dirtree differ diff --git a/repo/objects/3b/e0a9db1800a4f480e6163d93c6fc795907232ba47bf3218e2642e3f838a7fb.filez b/repo/objects/3b/e0a9db1800a4f480e6163d93c6fc795907232ba47bf3218e2642e3f838a7fb.filez new file mode 100644 index 00000000000..c54839ac047 Binary files /dev/null and b/repo/objects/3b/e0a9db1800a4f480e6163d93c6fc795907232ba47bf3218e2642e3f838a7fb.filez differ diff --git a/repo/objects/3b/e5b6546b84db0da933692300b7b71541eaa4409394c5dd71bd98f3929df8af.filez b/repo/objects/3b/e5b6546b84db0da933692300b7b71541eaa4409394c5dd71bd98f3929df8af.filez new file mode 100644 index 00000000000..a63a9847cc7 Binary files /dev/null and b/repo/objects/3b/e5b6546b84db0da933692300b7b71541eaa4409394c5dd71bd98f3929df8af.filez differ diff --git a/repo/objects/3c/1b54a4d3f2e99bbfebfc8539aa98f4207139bba39827781bd2b9af2c4fcddf.filez b/repo/objects/3c/1b54a4d3f2e99bbfebfc8539aa98f4207139bba39827781bd2b9af2c4fcddf.filez new file mode 100644 index 00000000000..a7e941c1b3e Binary files /dev/null and b/repo/objects/3c/1b54a4d3f2e99bbfebfc8539aa98f4207139bba39827781bd2b9af2c4fcddf.filez differ diff --git a/repo/objects/3c/1e798e6c6631dbc19439315d770abf82662b79671e2a25c53b46cbf4ea9a1e.filez b/repo/objects/3c/1e798e6c6631dbc19439315d770abf82662b79671e2a25c53b46cbf4ea9a1e.filez new file mode 100644 index 00000000000..b049cde4648 Binary files /dev/null and b/repo/objects/3c/1e798e6c6631dbc19439315d770abf82662b79671e2a25c53b46cbf4ea9a1e.filez differ diff --git a/repo/objects/3c/2d3e64cc969c2d233e7abf3cd46f0c64611002c96a6cd8703bc712f8274ec0.dirtree b/repo/objects/3c/2d3e64cc969c2d233e7abf3cd46f0c64611002c96a6cd8703bc712f8274ec0.dirtree new file mode 100644 index 00000000000..53ba9ba6df2 Binary files /dev/null and b/repo/objects/3c/2d3e64cc969c2d233e7abf3cd46f0c64611002c96a6cd8703bc712f8274ec0.dirtree differ diff --git a/repo/objects/3c/38b23a1c785b120d9d25842e17bf5bdf88a0f2d7dd01b2e76f59dc3f1612f6.filez b/repo/objects/3c/38b23a1c785b120d9d25842e17bf5bdf88a0f2d7dd01b2e76f59dc3f1612f6.filez new file mode 100644 index 00000000000..54dc32f36b7 Binary files /dev/null and b/repo/objects/3c/38b23a1c785b120d9d25842e17bf5bdf88a0f2d7dd01b2e76f59dc3f1612f6.filez differ diff --git a/repo/objects/3c/3f988300a95418da8a5fdff709623c5a7aa2677315020e297a08c6d0544433.dirtree b/repo/objects/3c/3f988300a95418da8a5fdff709623c5a7aa2677315020e297a08c6d0544433.dirtree new file mode 100644 index 00000000000..0402392c50f Binary files /dev/null and b/repo/objects/3c/3f988300a95418da8a5fdff709623c5a7aa2677315020e297a08c6d0544433.dirtree differ diff --git a/repo/objects/3c/883036f0a69b74d25fb69ccfbe91bdbefe1510a29447df0fef24b37f9d4a7d.dirtree b/repo/objects/3c/883036f0a69b74d25fb69ccfbe91bdbefe1510a29447df0fef24b37f9d4a7d.dirtree new file mode 100644 index 00000000000..ea644e92aad Binary files /dev/null and b/repo/objects/3c/883036f0a69b74d25fb69ccfbe91bdbefe1510a29447df0fef24b37f9d4a7d.dirtree differ diff --git a/repo/objects/3c/9d6e4303b9caf48025e36812c2b7b9fb6cf14120fba6a5e62586f1ff8ffde7.filez b/repo/objects/3c/9d6e4303b9caf48025e36812c2b7b9fb6cf14120fba6a5e62586f1ff8ffde7.filez new file mode 100644 index 00000000000..5925e036006 Binary files /dev/null and b/repo/objects/3c/9d6e4303b9caf48025e36812c2b7b9fb6cf14120fba6a5e62586f1ff8ffde7.filez differ diff --git a/repo/objects/3c/a3add07ed441a73abf2d0f76f1086bd443041e16e951512742bfc96b04d187.filez b/repo/objects/3c/a3add07ed441a73abf2d0f76f1086bd443041e16e951512742bfc96b04d187.filez new file mode 100644 index 00000000000..e34e246bdb1 Binary files /dev/null and b/repo/objects/3c/a3add07ed441a73abf2d0f76f1086bd443041e16e951512742bfc96b04d187.filez differ diff --git a/repo/objects/3c/a99c547c8c949aebbd559ab92370aec2aaf488174b6d2d08e4e032a6736979.filez b/repo/objects/3c/a99c547c8c949aebbd559ab92370aec2aaf488174b6d2d08e4e032a6736979.filez new file mode 100644 index 00000000000..2e13a591a66 Binary files /dev/null and b/repo/objects/3c/a99c547c8c949aebbd559ab92370aec2aaf488174b6d2d08e4e032a6736979.filez differ diff --git a/repo/objects/3c/d837bde4bd18c3e9c88a7fb3521668cce8cd0dad307c2774e63c12b427fa18.filez b/repo/objects/3c/d837bde4bd18c3e9c88a7fb3521668cce8cd0dad307c2774e63c12b427fa18.filez new file mode 100644 index 00000000000..735012e9e79 Binary files /dev/null and b/repo/objects/3c/d837bde4bd18c3e9c88a7fb3521668cce8cd0dad307c2774e63c12b427fa18.filez differ diff --git a/repo/objects/3c/e2b1e70c5cb0106efe329c8d33b3bb44beadd9729b323135bbf57e23efb471.filez b/repo/objects/3c/e2b1e70c5cb0106efe329c8d33b3bb44beadd9729b323135bbf57e23efb471.filez new file mode 100644 index 00000000000..2802eedf6dc Binary files /dev/null and b/repo/objects/3c/e2b1e70c5cb0106efe329c8d33b3bb44beadd9729b323135bbf57e23efb471.filez differ diff --git a/repo/objects/3d/03f63f7010aa9915b735b6b75bdb4860ab3c586dfc0a9cfc55f331ce456f84.filez b/repo/objects/3d/03f63f7010aa9915b735b6b75bdb4860ab3c586dfc0a9cfc55f331ce456f84.filez new file mode 100644 index 00000000000..5bea1123d51 Binary files /dev/null and b/repo/objects/3d/03f63f7010aa9915b735b6b75bdb4860ab3c586dfc0a9cfc55f331ce456f84.filez differ diff --git a/repo/objects/3d/06e8fea7365078cc8713195cd2c6ce018f7fef21c8edc06c72be4fb06b144d.filez b/repo/objects/3d/06e8fea7365078cc8713195cd2c6ce018f7fef21c8edc06c72be4fb06b144d.filez new file mode 100644 index 00000000000..218b3b2ce11 Binary files /dev/null and b/repo/objects/3d/06e8fea7365078cc8713195cd2c6ce018f7fef21c8edc06c72be4fb06b144d.filez differ diff --git a/repo/objects/3d/299865a93a2f42ba0760d45a86697764b8c4293f0ce0a28f986106687949d3.filez b/repo/objects/3d/299865a93a2f42ba0760d45a86697764b8c4293f0ce0a28f986106687949d3.filez new file mode 100644 index 00000000000..5002add1947 Binary files /dev/null and b/repo/objects/3d/299865a93a2f42ba0760d45a86697764b8c4293f0ce0a28f986106687949d3.filez differ diff --git a/repo/objects/3d/3e8222562bd1909efc1183f1f4c56b0067c036e8d5c1c33ff037c077a209d6.filez b/repo/objects/3d/3e8222562bd1909efc1183f1f4c56b0067c036e8d5c1c33ff037c077a209d6.filez new file mode 100644 index 00000000000..af6bc64915b Binary files /dev/null and b/repo/objects/3d/3e8222562bd1909efc1183f1f4c56b0067c036e8d5c1c33ff037c077a209d6.filez differ diff --git a/repo/objects/3d/563593bc92532e3a97ad5f04be7952682c093f8d8e788037b8573d8622599d.filez b/repo/objects/3d/563593bc92532e3a97ad5f04be7952682c093f8d8e788037b8573d8622599d.filez new file mode 100644 index 00000000000..b09403ec2ee Binary files /dev/null and b/repo/objects/3d/563593bc92532e3a97ad5f04be7952682c093f8d8e788037b8573d8622599d.filez differ diff --git a/repo/objects/3d/6a392d4d8c4c83af9b17788c1ab2ac07f6c556fbd62f74b965f8a967352f70.filez b/repo/objects/3d/6a392d4d8c4c83af9b17788c1ab2ac07f6c556fbd62f74b965f8a967352f70.filez new file mode 100644 index 00000000000..7df94288915 Binary files /dev/null and b/repo/objects/3d/6a392d4d8c4c83af9b17788c1ab2ac07f6c556fbd62f74b965f8a967352f70.filez differ diff --git a/repo/objects/3d/7c5e6b9ffd6b01be9f2ce0e5d9effe6dd004c9e74857359934169176f9d084.filez b/repo/objects/3d/7c5e6b9ffd6b01be9f2ce0e5d9effe6dd004c9e74857359934169176f9d084.filez new file mode 100644 index 00000000000..548a8c0fe57 Binary files /dev/null and b/repo/objects/3d/7c5e6b9ffd6b01be9f2ce0e5d9effe6dd004c9e74857359934169176f9d084.filez differ diff --git a/repo/objects/3d/92db92431acc005f0afb96712c0b80fe74debb7af3cff2055a424e612060b0.filez b/repo/objects/3d/92db92431acc005f0afb96712c0b80fe74debb7af3cff2055a424e612060b0.filez new file mode 100644 index 00000000000..b1db3fd2390 Binary files /dev/null and b/repo/objects/3d/92db92431acc005f0afb96712c0b80fe74debb7af3cff2055a424e612060b0.filez differ diff --git a/repo/objects/3d/b814e33116ab5643615371d17c9dba433504e5aeb03374f373c3757109517c.filez b/repo/objects/3d/b814e33116ab5643615371d17c9dba433504e5aeb03374f373c3757109517c.filez new file mode 100644 index 00000000000..fdb427e54a8 Binary files /dev/null and b/repo/objects/3d/b814e33116ab5643615371d17c9dba433504e5aeb03374f373c3757109517c.filez differ diff --git a/repo/objects/3d/bd9b45045d4e1a2b89736ca0177ba0f263565abc8846b46cb29b5f494825a5.dirtree b/repo/objects/3d/bd9b45045d4e1a2b89736ca0177ba0f263565abc8846b46cb29b5f494825a5.dirtree new file mode 100644 index 00000000000..8d0bc655de5 Binary files /dev/null and b/repo/objects/3d/bd9b45045d4e1a2b89736ca0177ba0f263565abc8846b46cb29b5f494825a5.dirtree differ diff --git a/repo/objects/3d/d594b2cddd0dec870c5967bfc7523b6090f786415f41f81af27dab43e08a90.filez b/repo/objects/3d/d594b2cddd0dec870c5967bfc7523b6090f786415f41f81af27dab43e08a90.filez new file mode 100644 index 00000000000..0564c8a8bc3 Binary files /dev/null and b/repo/objects/3d/d594b2cddd0dec870c5967bfc7523b6090f786415f41f81af27dab43e08a90.filez differ diff --git a/repo/objects/3d/daeb53542ea4b08b9bbb93416565a81f5d31ef9006b5f6b357769b58afc1ca.dirtree b/repo/objects/3d/daeb53542ea4b08b9bbb93416565a81f5d31ef9006b5f6b357769b58afc1ca.dirtree new file mode 100644 index 00000000000..3fca6613a4f Binary files /dev/null and b/repo/objects/3d/daeb53542ea4b08b9bbb93416565a81f5d31ef9006b5f6b357769b58afc1ca.dirtree differ diff --git a/repo/objects/3e/3cda9497132cdd194d896d4b8cc090ed910ce8bcc668049785f5eb3d9abe41.dirtree b/repo/objects/3e/3cda9497132cdd194d896d4b8cc090ed910ce8bcc668049785f5eb3d9abe41.dirtree new file mode 100644 index 00000000000..0fdda2abdba Binary files /dev/null and b/repo/objects/3e/3cda9497132cdd194d896d4b8cc090ed910ce8bcc668049785f5eb3d9abe41.dirtree differ diff --git a/repo/objects/3e/3d3fd58e59fb93983d8f32b74c8d95d0a51a7fabf41688280b6c02ef8f0f52.filez b/repo/objects/3e/3d3fd58e59fb93983d8f32b74c8d95d0a51a7fabf41688280b6c02ef8f0f52.filez new file mode 100644 index 00000000000..a9bc55e0b9f Binary files /dev/null and b/repo/objects/3e/3d3fd58e59fb93983d8f32b74c8d95d0a51a7fabf41688280b6c02ef8f0f52.filez differ diff --git a/repo/objects/3e/487fc2ffdf11ae1342f7cfb8bf3571acb99d4d66526cbc020061b02e777ab0.filez b/repo/objects/3e/487fc2ffdf11ae1342f7cfb8bf3571acb99d4d66526cbc020061b02e777ab0.filez new file mode 100644 index 00000000000..249ff1c59b6 Binary files /dev/null and b/repo/objects/3e/487fc2ffdf11ae1342f7cfb8bf3571acb99d4d66526cbc020061b02e777ab0.filez differ diff --git a/repo/objects/3e/58bb1a01fbcac02221f5bffe50378abe86242dce638831d8e72dfc621257db.filez b/repo/objects/3e/58bb1a01fbcac02221f5bffe50378abe86242dce638831d8e72dfc621257db.filez new file mode 100644 index 00000000000..fcd54c832b4 Binary files /dev/null and b/repo/objects/3e/58bb1a01fbcac02221f5bffe50378abe86242dce638831d8e72dfc621257db.filez differ diff --git a/repo/objects/3e/64bcf0e688bec30b03fd9f1d2b9fc7b9cc41600fa2ee2e225291a93fded511.dirtree b/repo/objects/3e/64bcf0e688bec30b03fd9f1d2b9fc7b9cc41600fa2ee2e225291a93fded511.dirtree new file mode 100644 index 00000000000..38fbea5c65a Binary files /dev/null and b/repo/objects/3e/64bcf0e688bec30b03fd9f1d2b9fc7b9cc41600fa2ee2e225291a93fded511.dirtree differ diff --git a/repo/objects/3e/6d1c0fd0a4de5229e795491f6207f2458101b4da4459420315472a30725caf.filez b/repo/objects/3e/6d1c0fd0a4de5229e795491f6207f2458101b4da4459420315472a30725caf.filez new file mode 100644 index 00000000000..626eaf6eb31 Binary files /dev/null and b/repo/objects/3e/6d1c0fd0a4de5229e795491f6207f2458101b4da4459420315472a30725caf.filez differ diff --git a/repo/objects/3e/761b2548526cc583febcc7a90bb58bd5a2e49df85e42885d51e960726ce2e0.filez b/repo/objects/3e/761b2548526cc583febcc7a90bb58bd5a2e49df85e42885d51e960726ce2e0.filez new file mode 100644 index 00000000000..c66719e37fe Binary files /dev/null and b/repo/objects/3e/761b2548526cc583febcc7a90bb58bd5a2e49df85e42885d51e960726ce2e0.filez differ diff --git a/repo/objects/3e/90285950ba0afe8658b84700f9701583f0b4446ce0ea3eb0c285019c3b2ed4.dirtree b/repo/objects/3e/90285950ba0afe8658b84700f9701583f0b4446ce0ea3eb0c285019c3b2ed4.dirtree new file mode 100644 index 00000000000..1846a900a40 Binary files /dev/null and b/repo/objects/3e/90285950ba0afe8658b84700f9701583f0b4446ce0ea3eb0c285019c3b2ed4.dirtree differ diff --git a/repo/objects/3e/9265d768b999ff6c03a6955baee110e86a650ebd29d6a63bf96010c8147871.filez b/repo/objects/3e/9265d768b999ff6c03a6955baee110e86a650ebd29d6a63bf96010c8147871.filez new file mode 100644 index 00000000000..6e7c3656313 Binary files /dev/null and b/repo/objects/3e/9265d768b999ff6c03a6955baee110e86a650ebd29d6a63bf96010c8147871.filez differ diff --git a/repo/objects/3e/aca88139bfb93f9ddf7859984ceae85f6ca4a9905188c2857441dce271ce67.filez b/repo/objects/3e/aca88139bfb93f9ddf7859984ceae85f6ca4a9905188c2857441dce271ce67.filez new file mode 100644 index 00000000000..cfda4aab68a Binary files /dev/null and b/repo/objects/3e/aca88139bfb93f9ddf7859984ceae85f6ca4a9905188c2857441dce271ce67.filez differ diff --git a/repo/objects/3f/2f457b79322c879f1f21873a43b7e4b8f23b4a4f3bf0176800fe04e8c4bb3d.filez b/repo/objects/3f/2f457b79322c879f1f21873a43b7e4b8f23b4a4f3bf0176800fe04e8c4bb3d.filez new file mode 100644 index 00000000000..dd76625eb3d Binary files /dev/null and b/repo/objects/3f/2f457b79322c879f1f21873a43b7e4b8f23b4a4f3bf0176800fe04e8c4bb3d.filez differ diff --git a/repo/objects/3f/4c1c4bbe166a51d128d8c1091a2164da3fc82f0dafb4a82b8ec80509e8ac33.filez b/repo/objects/3f/4c1c4bbe166a51d128d8c1091a2164da3fc82f0dafb4a82b8ec80509e8ac33.filez new file mode 100644 index 00000000000..3b530210a44 Binary files /dev/null and b/repo/objects/3f/4c1c4bbe166a51d128d8c1091a2164da3fc82f0dafb4a82b8ec80509e8ac33.filez differ diff --git a/repo/objects/3f/4ee18764cf1566e623e4450d6248711bd6c2541b98f14071cdc62c6da065dc.filez b/repo/objects/3f/4ee18764cf1566e623e4450d6248711bd6c2541b98f14071cdc62c6da065dc.filez new file mode 100644 index 00000000000..2e79f750042 Binary files /dev/null and b/repo/objects/3f/4ee18764cf1566e623e4450d6248711bd6c2541b98f14071cdc62c6da065dc.filez differ diff --git a/repo/objects/3f/5251996f40ef700350378720c27dbe6806536086b5c0b9c2c951f7f79978d0.dirtree b/repo/objects/3f/5251996f40ef700350378720c27dbe6806536086b5c0b9c2c951f7f79978d0.dirtree new file mode 100644 index 00000000000..738a9e5716b Binary files /dev/null and b/repo/objects/3f/5251996f40ef700350378720c27dbe6806536086b5c0b9c2c951f7f79978d0.dirtree differ diff --git a/repo/objects/3f/5c2068683937fd7ed2aaed581c236a48514cc192aafa8d1237c3690b8df4e9.filez b/repo/objects/3f/5c2068683937fd7ed2aaed581c236a48514cc192aafa8d1237c3690b8df4e9.filez new file mode 100644 index 00000000000..f7718b3dcf9 Binary files /dev/null and b/repo/objects/3f/5c2068683937fd7ed2aaed581c236a48514cc192aafa8d1237c3690b8df4e9.filez differ diff --git a/repo/objects/3f/b5248cfddf784245fbbb20d046a772cb77b5bc2c33c81c83a77e071290d0ff.filez b/repo/objects/3f/b5248cfddf784245fbbb20d046a772cb77b5bc2c33c81c83a77e071290d0ff.filez new file mode 100644 index 00000000000..afd5a607d67 Binary files /dev/null and b/repo/objects/3f/b5248cfddf784245fbbb20d046a772cb77b5bc2c33c81c83a77e071290d0ff.filez differ diff --git a/repo/objects/3f/cd12dfe975511c5351b8831b727f87a8ddafec4f7871d7afb36ac94aa74934.filez b/repo/objects/3f/cd12dfe975511c5351b8831b727f87a8ddafec4f7871d7afb36ac94aa74934.filez new file mode 100644 index 00000000000..470703414f7 Binary files /dev/null and b/repo/objects/3f/cd12dfe975511c5351b8831b727f87a8ddafec4f7871d7afb36ac94aa74934.filez differ diff --git a/repo/objects/3f/d0e34f6fee380db09378556fd18a12715f5e568c3be6bf1cab6cfa2209def3.filez b/repo/objects/3f/d0e34f6fee380db09378556fd18a12715f5e568c3be6bf1cab6cfa2209def3.filez new file mode 100644 index 00000000000..6f9dd7abe07 Binary files /dev/null and b/repo/objects/3f/d0e34f6fee380db09378556fd18a12715f5e568c3be6bf1cab6cfa2209def3.filez differ diff --git a/repo/objects/3f/e4c81e602a13575314e726e0fb65c6a928cc061d159ec64615134c79192ce0.filez b/repo/objects/3f/e4c81e602a13575314e726e0fb65c6a928cc061d159ec64615134c79192ce0.filez new file mode 100644 index 00000000000..26ce71c2db9 Binary files /dev/null and b/repo/objects/3f/e4c81e602a13575314e726e0fb65c6a928cc061d159ec64615134c79192ce0.filez differ diff --git a/repo/objects/3f/e7b8eb3bafebf76d8fab9a9e55221a4d7378185cb6dcb33d64b3000fcd6d22.dirtree b/repo/objects/3f/e7b8eb3bafebf76d8fab9a9e55221a4d7378185cb6dcb33d64b3000fcd6d22.dirtree new file mode 100644 index 00000000000..7aba4eccc09 Binary files /dev/null and b/repo/objects/3f/e7b8eb3bafebf76d8fab9a9e55221a4d7378185cb6dcb33d64b3000fcd6d22.dirtree differ diff --git a/repo/objects/3f/edf10a2b33bc36c2c0d73e7af9e0b234d41e66cfd9164fe5aa2286d5c1479d.dirtree b/repo/objects/3f/edf10a2b33bc36c2c0d73e7af9e0b234d41e66cfd9164fe5aa2286d5c1479d.dirtree new file mode 100644 index 00000000000..8509e765577 Binary files /dev/null and b/repo/objects/3f/edf10a2b33bc36c2c0d73e7af9e0b234d41e66cfd9164fe5aa2286d5c1479d.dirtree differ diff --git a/repo/objects/3f/f404a191072b59b72ab105d971ae8e23f92decbb0d79f4387af2f059e4864c.filez b/repo/objects/3f/f404a191072b59b72ab105d971ae8e23f92decbb0d79f4387af2f059e4864c.filez new file mode 100644 index 00000000000..da55ae9063a Binary files /dev/null and b/repo/objects/3f/f404a191072b59b72ab105d971ae8e23f92decbb0d79f4387af2f059e4864c.filez differ diff --git a/repo/objects/40/022f8dbd898b1d82f266b069be176798551a730c47c63512ef2e95539e6f0d.filez b/repo/objects/40/022f8dbd898b1d82f266b069be176798551a730c47c63512ef2e95539e6f0d.filez new file mode 100644 index 00000000000..7b92a6d1926 Binary files /dev/null and b/repo/objects/40/022f8dbd898b1d82f266b069be176798551a730c47c63512ef2e95539e6f0d.filez differ diff --git a/repo/objects/40/80ac45596c0d94c9c0a1c7ae4ea2b914a4c8a0575e6df1bfc1484b7ca55ff5.filez b/repo/objects/40/80ac45596c0d94c9c0a1c7ae4ea2b914a4c8a0575e6df1bfc1484b7ca55ff5.filez new file mode 100644 index 00000000000..7c66effe3c1 Binary files /dev/null and b/repo/objects/40/80ac45596c0d94c9c0a1c7ae4ea2b914a4c8a0575e6df1bfc1484b7ca55ff5.filez differ diff --git a/repo/objects/40/9c08262bb9f95028acbe29418a9a6f36a252157cb9d707df15733e8a830bba.filez b/repo/objects/40/9c08262bb9f95028acbe29418a9a6f36a252157cb9d707df15733e8a830bba.filez new file mode 100644 index 00000000000..3a7532970fd Binary files /dev/null and b/repo/objects/40/9c08262bb9f95028acbe29418a9a6f36a252157cb9d707df15733e8a830bba.filez differ diff --git a/repo/objects/40/a0ac480b709df78ca20eb77019c52e6d2abde452ec4be72543deba9f4da140.filez b/repo/objects/40/a0ac480b709df78ca20eb77019c52e6d2abde452ec4be72543deba9f4da140.filez new file mode 100644 index 00000000000..eb20eab084f Binary files /dev/null and b/repo/objects/40/a0ac480b709df78ca20eb77019c52e6d2abde452ec4be72543deba9f4da140.filez differ diff --git a/repo/objects/40/c1b989eba764edc4a5fdd5119ff236feb697cc4a272cd867a6348d1995540c.filez b/repo/objects/40/c1b989eba764edc4a5fdd5119ff236feb697cc4a272cd867a6348d1995540c.filez new file mode 100644 index 00000000000..299d7ce959c Binary files /dev/null and b/repo/objects/40/c1b989eba764edc4a5fdd5119ff236feb697cc4a272cd867a6348d1995540c.filez differ diff --git a/repo/objects/40/c21f6aa685277c57f0611c0d06c3096813f4faf3cfefb6abaf2aa096d3282b.filez b/repo/objects/40/c21f6aa685277c57f0611c0d06c3096813f4faf3cfefb6abaf2aa096d3282b.filez new file mode 100644 index 00000000000..a28feabc2d7 Binary files /dev/null and b/repo/objects/40/c21f6aa685277c57f0611c0d06c3096813f4faf3cfefb6abaf2aa096d3282b.filez differ diff --git a/repo/objects/40/ec3269fb47d347547ee5886e2a9be561bcb8acae4d181fa9fc00db40ceba99.filez b/repo/objects/40/ec3269fb47d347547ee5886e2a9be561bcb8acae4d181fa9fc00db40ceba99.filez new file mode 100644 index 00000000000..3253d35a145 Binary files /dev/null and b/repo/objects/40/ec3269fb47d347547ee5886e2a9be561bcb8acae4d181fa9fc00db40ceba99.filez differ diff --git a/repo/objects/40/f85b003eb98d8db99eb884b738ac424d4b36bebc8a70461f48336ab81f02d2.filez b/repo/objects/40/f85b003eb98d8db99eb884b738ac424d4b36bebc8a70461f48336ab81f02d2.filez new file mode 100644 index 00000000000..775029ffa96 Binary files /dev/null and b/repo/objects/40/f85b003eb98d8db99eb884b738ac424d4b36bebc8a70461f48336ab81f02d2.filez differ diff --git a/repo/objects/40/fd4b8929763d989ee5d18942a8340ce5e71dc97930e3fc0051388186c63e50.dirtree b/repo/objects/40/fd4b8929763d989ee5d18942a8340ce5e71dc97930e3fc0051388186c63e50.dirtree new file mode 100644 index 00000000000..5ac6d34649a Binary files /dev/null and b/repo/objects/40/fd4b8929763d989ee5d18942a8340ce5e71dc97930e3fc0051388186c63e50.dirtree differ diff --git a/repo/objects/41/205b0963a62950a5324ddfea3e787a82655199ec9bb97151970c52026a394d.filez b/repo/objects/41/205b0963a62950a5324ddfea3e787a82655199ec9bb97151970c52026a394d.filez new file mode 100644 index 00000000000..5b472844ff6 Binary files /dev/null and b/repo/objects/41/205b0963a62950a5324ddfea3e787a82655199ec9bb97151970c52026a394d.filez differ diff --git a/repo/objects/41/2aec2c3e5404315982a9bd9df02c096447b0687ae7167e641722dc8911616c.filez b/repo/objects/41/2aec2c3e5404315982a9bd9df02c096447b0687ae7167e641722dc8911616c.filez new file mode 100644 index 00000000000..8f1299d13f2 Binary files /dev/null and b/repo/objects/41/2aec2c3e5404315982a9bd9df02c096447b0687ae7167e641722dc8911616c.filez differ diff --git a/repo/objects/41/33b67388da0ee294e91fcb8acddb0e1307fefb7ce373bec97ab9904f8029f8.filez b/repo/objects/41/33b67388da0ee294e91fcb8acddb0e1307fefb7ce373bec97ab9904f8029f8.filez new file mode 100644 index 00000000000..41d70408c90 Binary files /dev/null and b/repo/objects/41/33b67388da0ee294e91fcb8acddb0e1307fefb7ce373bec97ab9904f8029f8.filez differ diff --git a/repo/objects/41/44087a890a509f3bb6316849024d8bc29fc589fd6bb90feb75ca81b7f3d50a.filez b/repo/objects/41/44087a890a509f3bb6316849024d8bc29fc589fd6bb90feb75ca81b7f3d50a.filez new file mode 100644 index 00000000000..2d8148aff5c Binary files /dev/null and b/repo/objects/41/44087a890a509f3bb6316849024d8bc29fc589fd6bb90feb75ca81b7f3d50a.filez differ diff --git a/repo/objects/41/6620b19fe8dfe5ac9dd4a08a133250adec09774cd2fffee1e8d24d4b177d4e.filez b/repo/objects/41/6620b19fe8dfe5ac9dd4a08a133250adec09774cd2fffee1e8d24d4b177d4e.filez new file mode 100644 index 00000000000..dceb0dbef6d Binary files /dev/null and b/repo/objects/41/6620b19fe8dfe5ac9dd4a08a133250adec09774cd2fffee1e8d24d4b177d4e.filez differ diff --git a/repo/objects/41/724b6b588b211e9689a4f2d32c5bdba064e84540cd4fe6a18e2f039c3ba85f.filez b/repo/objects/41/724b6b588b211e9689a4f2d32c5bdba064e84540cd4fe6a18e2f039c3ba85f.filez new file mode 100644 index 00000000000..2653443e457 Binary files /dev/null and b/repo/objects/41/724b6b588b211e9689a4f2d32c5bdba064e84540cd4fe6a18e2f039c3ba85f.filez differ diff --git a/repo/objects/41/7fa31f6296436dae951a58e23d177b07ae369d4d0cc005952a5fab7737217a.filez b/repo/objects/41/7fa31f6296436dae951a58e23d177b07ae369d4d0cc005952a5fab7737217a.filez new file mode 100644 index 00000000000..d2fae855660 Binary files /dev/null and b/repo/objects/41/7fa31f6296436dae951a58e23d177b07ae369d4d0cc005952a5fab7737217a.filez differ diff --git a/repo/objects/41/9158de5036bd70bc6f1dffcdbc3ad49316b3d28c730558169a676968a42192.filez b/repo/objects/41/9158de5036bd70bc6f1dffcdbc3ad49316b3d28c730558169a676968a42192.filez new file mode 100644 index 00000000000..f4c119889b1 Binary files /dev/null and b/repo/objects/41/9158de5036bd70bc6f1dffcdbc3ad49316b3d28c730558169a676968a42192.filez differ diff --git a/repo/objects/41/9488dc1eb29abedd77964c8c2297b899a052a71c41667a6960dd162621e9b2.filez b/repo/objects/41/9488dc1eb29abedd77964c8c2297b899a052a71c41667a6960dd162621e9b2.filez new file mode 100644 index 00000000000..1020d47bc71 Binary files /dev/null and b/repo/objects/41/9488dc1eb29abedd77964c8c2297b899a052a71c41667a6960dd162621e9b2.filez differ diff --git a/repo/objects/41/9f79c1b2003a60587cd9ab24a72ee883543e811382b75882fb135edeb101e5.filez b/repo/objects/41/9f79c1b2003a60587cd9ab24a72ee883543e811382b75882fb135edeb101e5.filez new file mode 100644 index 00000000000..f3c14718e54 Binary files /dev/null and b/repo/objects/41/9f79c1b2003a60587cd9ab24a72ee883543e811382b75882fb135edeb101e5.filez differ diff --git a/repo/objects/41/a7bbbfaaf09e760ba8b1dabbfd2e6ac38a7536e980ae22ea88400cfd624304.dirtree b/repo/objects/41/a7bbbfaaf09e760ba8b1dabbfd2e6ac38a7536e980ae22ea88400cfd624304.dirtree new file mode 100644 index 00000000000..79e1d3c1a24 Binary files /dev/null and b/repo/objects/41/a7bbbfaaf09e760ba8b1dabbfd2e6ac38a7536e980ae22ea88400cfd624304.dirtree differ diff --git a/repo/objects/41/ce3063864663d6d37dfbbab5101e13ed49b7fd5d0f9a272b53fdef64285bd0.dirtree b/repo/objects/41/ce3063864663d6d37dfbbab5101e13ed49b7fd5d0f9a272b53fdef64285bd0.dirtree new file mode 100644 index 00000000000..f2282416668 Binary files /dev/null and b/repo/objects/41/ce3063864663d6d37dfbbab5101e13ed49b7fd5d0f9a272b53fdef64285bd0.dirtree differ diff --git a/repo/objects/41/dfa5b72f882d393a18a7b2214592c074a4bdd9fd746bf682ec67806496d552.filez b/repo/objects/41/dfa5b72f882d393a18a7b2214592c074a4bdd9fd746bf682ec67806496d552.filez new file mode 100644 index 00000000000..cd4bda34402 Binary files /dev/null and b/repo/objects/41/dfa5b72f882d393a18a7b2214592c074a4bdd9fd746bf682ec67806496d552.filez differ diff --git a/repo/objects/42/025b86bb9187e60741f0988a15fcffddf23547cba59fd306e0902d4a8beef9.dirtree b/repo/objects/42/025b86bb9187e60741f0988a15fcffddf23547cba59fd306e0902d4a8beef9.dirtree new file mode 100644 index 00000000000..bfb5fc59139 Binary files /dev/null and b/repo/objects/42/025b86bb9187e60741f0988a15fcffddf23547cba59fd306e0902d4a8beef9.dirtree differ diff --git a/repo/objects/42/0e9d093d4ca5232aa42305859714ca61d5337fd9236c41671f8be79612de05.filez b/repo/objects/42/0e9d093d4ca5232aa42305859714ca61d5337fd9236c41671f8be79612de05.filez new file mode 100644 index 00000000000..365cfc1af12 Binary files /dev/null and b/repo/objects/42/0e9d093d4ca5232aa42305859714ca61d5337fd9236c41671f8be79612de05.filez differ diff --git a/repo/objects/42/2c0cf3f6058920be5da865dbb40a21d98a4e28cf6aa546856cf00502938b7b.dirtree b/repo/objects/42/2c0cf3f6058920be5da865dbb40a21d98a4e28cf6aa546856cf00502938b7b.dirtree new file mode 100644 index 00000000000..d33d8790959 Binary files /dev/null and b/repo/objects/42/2c0cf3f6058920be5da865dbb40a21d98a4e28cf6aa546856cf00502938b7b.dirtree differ diff --git a/repo/objects/42/5957f1dd84b3d2ba65759ed01d42fe53052f85cb2f8e2116eb10fbae73884b.filez b/repo/objects/42/5957f1dd84b3d2ba65759ed01d42fe53052f85cb2f8e2116eb10fbae73884b.filez new file mode 100644 index 00000000000..9c80d360ae1 Binary files /dev/null and b/repo/objects/42/5957f1dd84b3d2ba65759ed01d42fe53052f85cb2f8e2116eb10fbae73884b.filez differ diff --git a/repo/objects/42/a967d8d588f5ccdcb97a26ab4ceaf9f8064b3f0a3bfcafede312aa724db6c9.filez b/repo/objects/42/a967d8d588f5ccdcb97a26ab4ceaf9f8064b3f0a3bfcafede312aa724db6c9.filez new file mode 100644 index 00000000000..20177b5c313 Binary files /dev/null and b/repo/objects/42/a967d8d588f5ccdcb97a26ab4ceaf9f8064b3f0a3bfcafede312aa724db6c9.filez differ diff --git a/repo/objects/42/c9fc8c1016adafb981c62de13cfe6c82022fa5dfce752e9f67f60f26c7bb1a.filez b/repo/objects/42/c9fc8c1016adafb981c62de13cfe6c82022fa5dfce752e9f67f60f26c7bb1a.filez new file mode 100644 index 00000000000..9117275b43b Binary files /dev/null and b/repo/objects/42/c9fc8c1016adafb981c62de13cfe6c82022fa5dfce752e9f67f60f26c7bb1a.filez differ diff --git a/repo/objects/42/ee9a4cd3cd74cc598f3e26edf7650ac55fe611467b5ec40500aef9094a3f5a.filez b/repo/objects/42/ee9a4cd3cd74cc598f3e26edf7650ac55fe611467b5ec40500aef9094a3f5a.filez new file mode 100644 index 00000000000..ca509d973e2 Binary files /dev/null and b/repo/objects/42/ee9a4cd3cd74cc598f3e26edf7650ac55fe611467b5ec40500aef9094a3f5a.filez differ diff --git a/repo/objects/42/efcd8144fb9d1090c159d4a87c1c5c05f5ddab688e295549aa41ceb1e15754.filez b/repo/objects/42/efcd8144fb9d1090c159d4a87c1c5c05f5ddab688e295549aa41ceb1e15754.filez new file mode 100644 index 00000000000..d23a4e955a6 Binary files /dev/null and b/repo/objects/42/efcd8144fb9d1090c159d4a87c1c5c05f5ddab688e295549aa41ceb1e15754.filez differ diff --git a/repo/objects/43/07a7610aad8d99cc680b1df192d960ac99a3c14c537ab74044dd653adbb65e.dirtree b/repo/objects/43/07a7610aad8d99cc680b1df192d960ac99a3c14c537ab74044dd653adbb65e.dirtree new file mode 100644 index 00000000000..064748c0a1c Binary files /dev/null and b/repo/objects/43/07a7610aad8d99cc680b1df192d960ac99a3c14c537ab74044dd653adbb65e.dirtree differ diff --git a/repo/objects/43/28cd339c45aa495c3a1f52e3e702f41535b089020d70aabec92a8d9fff9fad.filez b/repo/objects/43/28cd339c45aa495c3a1f52e3e702f41535b089020d70aabec92a8d9fff9fad.filez new file mode 100644 index 00000000000..c482a748f20 Binary files /dev/null and b/repo/objects/43/28cd339c45aa495c3a1f52e3e702f41535b089020d70aabec92a8d9fff9fad.filez differ diff --git a/repo/objects/43/2e67ce98626f5be6c0ccb436f4b646d07acb6da3c07b4022fd778b7d1366f9.filez b/repo/objects/43/2e67ce98626f5be6c0ccb436f4b646d07acb6da3c07b4022fd778b7d1366f9.filez new file mode 100644 index 00000000000..4aef902e20d Binary files /dev/null and b/repo/objects/43/2e67ce98626f5be6c0ccb436f4b646d07acb6da3c07b4022fd778b7d1366f9.filez differ diff --git a/repo/objects/43/2f5bec7f7f90db0dc3b6b215ebf88a7e2b4041f42be397f6ce9307bcbd3eca.dirtree b/repo/objects/43/2f5bec7f7f90db0dc3b6b215ebf88a7e2b4041f42be397f6ce9307bcbd3eca.dirtree new file mode 100644 index 00000000000..5ffa00a4640 Binary files /dev/null and b/repo/objects/43/2f5bec7f7f90db0dc3b6b215ebf88a7e2b4041f42be397f6ce9307bcbd3eca.dirtree differ diff --git a/repo/objects/43/4aaf7eaa17179b43b48f376c92a718348e67dc05761a78d9329a60613beb0f.filez b/repo/objects/43/4aaf7eaa17179b43b48f376c92a718348e67dc05761a78d9329a60613beb0f.filez new file mode 100644 index 00000000000..fb5967fb43e Binary files /dev/null and b/repo/objects/43/4aaf7eaa17179b43b48f376c92a718348e67dc05761a78d9329a60613beb0f.filez differ diff --git a/repo/objects/43/5c557ced920cb6b8b7142971a459f68b40a6e19b5812e497ba7912dbed2b6f.filez b/repo/objects/43/5c557ced920cb6b8b7142971a459f68b40a6e19b5812e497ba7912dbed2b6f.filez new file mode 100644 index 00000000000..aa0e28c66d7 Binary files /dev/null and b/repo/objects/43/5c557ced920cb6b8b7142971a459f68b40a6e19b5812e497ba7912dbed2b6f.filez differ diff --git a/repo/objects/43/95915d9071a4bf7f6e8f1b154e375ab95393598673f856cc582e48b741f787.filez b/repo/objects/43/95915d9071a4bf7f6e8f1b154e375ab95393598673f856cc582e48b741f787.filez new file mode 100644 index 00000000000..c0624666e72 Binary files /dev/null and b/repo/objects/43/95915d9071a4bf7f6e8f1b154e375ab95393598673f856cc582e48b741f787.filez differ diff --git a/repo/objects/43/960e8c51f28eaa32e1b2a287fc6bcfc99351a84f2a3de6e55f85801d9c831c.filez b/repo/objects/43/960e8c51f28eaa32e1b2a287fc6bcfc99351a84f2a3de6e55f85801d9c831c.filez new file mode 100644 index 00000000000..a89aafcc732 Binary files /dev/null and b/repo/objects/43/960e8c51f28eaa32e1b2a287fc6bcfc99351a84f2a3de6e55f85801d9c831c.filez differ diff --git a/repo/objects/43/97ca72045c2ee5d6499a3a988a2c832773ef05f3fc8d824e4f40954567f1e5.filez b/repo/objects/43/97ca72045c2ee5d6499a3a988a2c832773ef05f3fc8d824e4f40954567f1e5.filez new file mode 100644 index 00000000000..32ce73c1e22 Binary files /dev/null and b/repo/objects/43/97ca72045c2ee5d6499a3a988a2c832773ef05f3fc8d824e4f40954567f1e5.filez differ diff --git a/repo/objects/43/a25a7358f0bd1907abefeaff2676afcd5623355130a5a309ca35c1d637091b.filez b/repo/objects/43/a25a7358f0bd1907abefeaff2676afcd5623355130a5a309ca35c1d637091b.filez new file mode 100644 index 00000000000..30509dff403 Binary files /dev/null and b/repo/objects/43/a25a7358f0bd1907abefeaff2676afcd5623355130a5a309ca35c1d637091b.filez differ diff --git a/repo/objects/43/ae5db2504af7c1355c5f50bb7a146ae17e0ccbf275f75153bb93d10a490d5e.filez b/repo/objects/43/ae5db2504af7c1355c5f50bb7a146ae17e0ccbf275f75153bb93d10a490d5e.filez new file mode 100644 index 00000000000..d5788ab0910 Binary files /dev/null and b/repo/objects/43/ae5db2504af7c1355c5f50bb7a146ae17e0ccbf275f75153bb93d10a490d5e.filez differ diff --git a/repo/objects/43/c39785762985783f334dece6c146f44a09400ebc8da36f8e8ee25d737d35e7.dirtree b/repo/objects/43/c39785762985783f334dece6c146f44a09400ebc8da36f8e8ee25d737d35e7.dirtree new file mode 100644 index 00000000000..dbade88d5eb Binary files /dev/null and b/repo/objects/43/c39785762985783f334dece6c146f44a09400ebc8da36f8e8ee25d737d35e7.dirtree differ diff --git a/repo/objects/43/c8795de815f2889f2dae45f16899e3852a53912776e2195ffe3beff77db30f.filez b/repo/objects/43/c8795de815f2889f2dae45f16899e3852a53912776e2195ffe3beff77db30f.filez new file mode 100644 index 00000000000..a65f05d98be Binary files /dev/null and b/repo/objects/43/c8795de815f2889f2dae45f16899e3852a53912776e2195ffe3beff77db30f.filez differ diff --git a/repo/objects/43/c8c09b7debc967f453c6aa7b74a134b0e3b153a33060f774a544addca5d598.filez b/repo/objects/43/c8c09b7debc967f453c6aa7b74a134b0e3b153a33060f774a544addca5d598.filez new file mode 100644 index 00000000000..84e328c60c9 Binary files /dev/null and b/repo/objects/43/c8c09b7debc967f453c6aa7b74a134b0e3b153a33060f774a544addca5d598.filez differ diff --git a/repo/objects/43/d6aca2ec33f1337eed96d62f9409dd4e284502126f658badf29b8a5ee43323.dirtree b/repo/objects/43/d6aca2ec33f1337eed96d62f9409dd4e284502126f658badf29b8a5ee43323.dirtree new file mode 100644 index 00000000000..2d9f5a625ac Binary files /dev/null and b/repo/objects/43/d6aca2ec33f1337eed96d62f9409dd4e284502126f658badf29b8a5ee43323.dirtree differ diff --git a/repo/objects/43/fa62216b72d57cb8acef27c98d98c3ff4949b30f18d5919dedf93544210873.dirtree b/repo/objects/43/fa62216b72d57cb8acef27c98d98c3ff4949b30f18d5919dedf93544210873.dirtree new file mode 100644 index 00000000000..a9823f97caa Binary files /dev/null and b/repo/objects/43/fa62216b72d57cb8acef27c98d98c3ff4949b30f18d5919dedf93544210873.dirtree differ diff --git a/repo/objects/44/0dc1b8ac8bad1e29bb9d126d4026c1f2f94fa7add8fac4cef43c8a979078c9.filez b/repo/objects/44/0dc1b8ac8bad1e29bb9d126d4026c1f2f94fa7add8fac4cef43c8a979078c9.filez new file mode 100644 index 00000000000..9b069831e77 Binary files /dev/null and b/repo/objects/44/0dc1b8ac8bad1e29bb9d126d4026c1f2f94fa7add8fac4cef43c8a979078c9.filez differ diff --git a/repo/objects/44/0f5945aa695f2ed5b2b8ef4025412c21464dec5790c974d7523e964434fd39.filez b/repo/objects/44/0f5945aa695f2ed5b2b8ef4025412c21464dec5790c974d7523e964434fd39.filez new file mode 100644 index 00000000000..27208dca3e9 Binary files /dev/null and b/repo/objects/44/0f5945aa695f2ed5b2b8ef4025412c21464dec5790c974d7523e964434fd39.filez differ diff --git a/repo/objects/44/2806bfc1927c66ae5710c5f140f06ecc330cd37d60c1f715857e0c2df13c22.filez b/repo/objects/44/2806bfc1927c66ae5710c5f140f06ecc330cd37d60c1f715857e0c2df13c22.filez new file mode 100644 index 00000000000..cbacdcf0d34 Binary files /dev/null and b/repo/objects/44/2806bfc1927c66ae5710c5f140f06ecc330cd37d60c1f715857e0c2df13c22.filez differ diff --git a/repo/objects/44/67f70f57116d61881ef96e941f0151752d90728b6e73ce50c9d1a0a8c4bc22.filez b/repo/objects/44/67f70f57116d61881ef96e941f0151752d90728b6e73ce50c9d1a0a8c4bc22.filez new file mode 100644 index 00000000000..8b3f26ba01f Binary files /dev/null and b/repo/objects/44/67f70f57116d61881ef96e941f0151752d90728b6e73ce50c9d1a0a8c4bc22.filez differ diff --git a/repo/objects/44/6a0ef11b7cc167f3b603e585c7eeeeb675faa412d5ec73f62988eb0b6c5488.dirmeta b/repo/objects/44/6a0ef11b7cc167f3b603e585c7eeeeb675faa412d5ec73f62988eb0b6c5488.dirmeta new file mode 100644 index 00000000000..6757a41ee10 Binary files /dev/null and b/repo/objects/44/6a0ef11b7cc167f3b603e585c7eeeeb675faa412d5ec73f62988eb0b6c5488.dirmeta differ diff --git a/repo/objects/44/887c53bc23f388fcb77536aea9447c19962c8825a3238249633bed089945bb.dirtree b/repo/objects/44/887c53bc23f388fcb77536aea9447c19962c8825a3238249633bed089945bb.dirtree new file mode 100644 index 00000000000..e205f3235a0 Binary files /dev/null and b/repo/objects/44/887c53bc23f388fcb77536aea9447c19962c8825a3238249633bed089945bb.dirtree differ diff --git a/repo/objects/44/9cad979fe1671ab7210891e0c2c0486ddff0188eeae5256ee09ff6ef7c928e.filez b/repo/objects/44/9cad979fe1671ab7210891e0c2c0486ddff0188eeae5256ee09ff6ef7c928e.filez new file mode 100644 index 00000000000..d99fb036e06 Binary files /dev/null and b/repo/objects/44/9cad979fe1671ab7210891e0c2c0486ddff0188eeae5256ee09ff6ef7c928e.filez differ diff --git a/repo/objects/44/9d8acc69e2ece5721d1a284beebcaebb196945689263b617604a71cefdffaa.filez b/repo/objects/44/9d8acc69e2ece5721d1a284beebcaebb196945689263b617604a71cefdffaa.filez new file mode 100644 index 00000000000..f69bc8a1b27 Binary files /dev/null and b/repo/objects/44/9d8acc69e2ece5721d1a284beebcaebb196945689263b617604a71cefdffaa.filez differ diff --git a/repo/objects/44/be83a3933ac32ae7ca479152636c24a0c8345351b6a0ac6754937a82f573b1.filez b/repo/objects/44/be83a3933ac32ae7ca479152636c24a0c8345351b6a0ac6754937a82f573b1.filez new file mode 100644 index 00000000000..c65bec0e998 Binary files /dev/null and b/repo/objects/44/be83a3933ac32ae7ca479152636c24a0c8345351b6a0ac6754937a82f573b1.filez differ diff --git a/repo/objects/44/c1153c155c168f286e81c55dfeff37ac39055d27be66da462b01bbfabbdbb8.dirtree b/repo/objects/44/c1153c155c168f286e81c55dfeff37ac39055d27be66da462b01bbfabbdbb8.dirtree new file mode 100644 index 00000000000..34c60957af6 Binary files /dev/null and b/repo/objects/44/c1153c155c168f286e81c55dfeff37ac39055d27be66da462b01bbfabbdbb8.dirtree differ diff --git a/repo/objects/44/cc955c110d61628f605c0359a8ad6d65a028da4776320df17b0a6b45560eb4.filez b/repo/objects/44/cc955c110d61628f605c0359a8ad6d65a028da4776320df17b0a6b45560eb4.filez new file mode 100644 index 00000000000..14dab8d74f4 Binary files /dev/null and b/repo/objects/44/cc955c110d61628f605c0359a8ad6d65a028da4776320df17b0a6b45560eb4.filez differ diff --git a/repo/objects/44/cd07d270d1dbec85dc5473c2aba6a5aa98667b6a6ec3a740da000cd9a1c68a.filez b/repo/objects/44/cd07d270d1dbec85dc5473c2aba6a5aa98667b6a6ec3a740da000cd9a1c68a.filez new file mode 100644 index 00000000000..181bb5e5d20 Binary files /dev/null and b/repo/objects/44/cd07d270d1dbec85dc5473c2aba6a5aa98667b6a6ec3a740da000cd9a1c68a.filez differ diff --git a/repo/objects/45/173cecd8cbf44312f1c02abb70e5d900c95016024d381d8c837aaa5056ec5a.filez b/repo/objects/45/173cecd8cbf44312f1c02abb70e5d900c95016024d381d8c837aaa5056ec5a.filez new file mode 100644 index 00000000000..48b06527e18 Binary files /dev/null and b/repo/objects/45/173cecd8cbf44312f1c02abb70e5d900c95016024d381d8c837aaa5056ec5a.filez differ diff --git a/repo/objects/45/1eaf0d7d5b3986261237bab182cf82a7ce6ecece333523764395b04b7bf0e7.filez b/repo/objects/45/1eaf0d7d5b3986261237bab182cf82a7ce6ecece333523764395b04b7bf0e7.filez new file mode 100644 index 00000000000..f64d258b58e Binary files /dev/null and b/repo/objects/45/1eaf0d7d5b3986261237bab182cf82a7ce6ecece333523764395b04b7bf0e7.filez differ diff --git a/repo/objects/45/49dca2413905766897e81cdb26f429117c49e4b6a8dd33e72ed6638e874c75.filez b/repo/objects/45/49dca2413905766897e81cdb26f429117c49e4b6a8dd33e72ed6638e874c75.filez new file mode 100644 index 00000000000..e235df8a6d9 Binary files /dev/null and b/repo/objects/45/49dca2413905766897e81cdb26f429117c49e4b6a8dd33e72ed6638e874c75.filez differ diff --git a/repo/objects/45/5ff69f56837ef11300bb9dae170c2587690da693b6478846399dce34a0a6ea.dirtree b/repo/objects/45/5ff69f56837ef11300bb9dae170c2587690da693b6478846399dce34a0a6ea.dirtree new file mode 100644 index 00000000000..b8c33d188d8 Binary files /dev/null and b/repo/objects/45/5ff69f56837ef11300bb9dae170c2587690da693b6478846399dce34a0a6ea.dirtree differ diff --git a/repo/objects/45/6130d571155969f3c586df62307388cb52e5d1931d28bfbd4b17cc1fd1f9af.filez b/repo/objects/45/6130d571155969f3c586df62307388cb52e5d1931d28bfbd4b17cc1fd1f9af.filez new file mode 100644 index 00000000000..e36f7eeaa10 Binary files /dev/null and b/repo/objects/45/6130d571155969f3c586df62307388cb52e5d1931d28bfbd4b17cc1fd1f9af.filez differ diff --git a/repo/objects/45/636b377b078dbdc55c2c8827ed55b4d203fd622693f2b07e0c9809f23da590.filez b/repo/objects/45/636b377b078dbdc55c2c8827ed55b4d203fd622693f2b07e0c9809f23da590.filez new file mode 100644 index 00000000000..fca72ae769e Binary files /dev/null and b/repo/objects/45/636b377b078dbdc55c2c8827ed55b4d203fd622693f2b07e0c9809f23da590.filez differ diff --git a/repo/objects/45/8a9f37661f1907e6f5fcdf51289d18e2500ce173bd6a6010a296e320ddc2ac.dirtree b/repo/objects/45/8a9f37661f1907e6f5fcdf51289d18e2500ce173bd6a6010a296e320ddc2ac.dirtree new file mode 100644 index 00000000000..e7afcf323ca Binary files /dev/null and b/repo/objects/45/8a9f37661f1907e6f5fcdf51289d18e2500ce173bd6a6010a296e320ddc2ac.dirtree differ diff --git a/repo/objects/45/adbb26696c0da106224c660048db2582a43cebfc7646abe329582946b16824.filez b/repo/objects/45/adbb26696c0da106224c660048db2582a43cebfc7646abe329582946b16824.filez new file mode 100644 index 00000000000..ab63fdf9b1a Binary files /dev/null and b/repo/objects/45/adbb26696c0da106224c660048db2582a43cebfc7646abe329582946b16824.filez differ diff --git a/repo/objects/45/c2d7f19738578d25f46b9ff429b46694403eed30b6e010d14a0009447f2662.dirtree b/repo/objects/45/c2d7f19738578d25f46b9ff429b46694403eed30b6e010d14a0009447f2662.dirtree new file mode 100644 index 00000000000..d9e2e4661c1 Binary files /dev/null and b/repo/objects/45/c2d7f19738578d25f46b9ff429b46694403eed30b6e010d14a0009447f2662.dirtree differ diff --git a/repo/objects/45/cab6aeca9246024ee2876eb857ffefa48d86752510068aa9a63e1155805530.filez b/repo/objects/45/cab6aeca9246024ee2876eb857ffefa48d86752510068aa9a63e1155805530.filez new file mode 100644 index 00000000000..e958a51f324 Binary files /dev/null and b/repo/objects/45/cab6aeca9246024ee2876eb857ffefa48d86752510068aa9a63e1155805530.filez differ diff --git a/repo/objects/45/dd825f29aecbb47839da78c5190718638899ffb777785b7c64693e18ffafba.filez b/repo/objects/45/dd825f29aecbb47839da78c5190718638899ffb777785b7c64693e18ffafba.filez new file mode 100644 index 00000000000..b5a81776e0a Binary files /dev/null and b/repo/objects/45/dd825f29aecbb47839da78c5190718638899ffb777785b7c64693e18ffafba.filez differ diff --git a/repo/objects/45/fcb214872e1156fafd516a28ee65ce67be5abca205fe14bebfaa362cce4c5d.filez b/repo/objects/45/fcb214872e1156fafd516a28ee65ce67be5abca205fe14bebfaa362cce4c5d.filez new file mode 100644 index 00000000000..39776889da4 Binary files /dev/null and b/repo/objects/45/fcb214872e1156fafd516a28ee65ce67be5abca205fe14bebfaa362cce4c5d.filez differ diff --git a/repo/objects/46/01f0f1f613c600a13b308e17290bdfe2f03177e28b957e56b464427f1fc1f1.filez b/repo/objects/46/01f0f1f613c600a13b308e17290bdfe2f03177e28b957e56b464427f1fc1f1.filez new file mode 100644 index 00000000000..c6c28745b95 Binary files /dev/null and b/repo/objects/46/01f0f1f613c600a13b308e17290bdfe2f03177e28b957e56b464427f1fc1f1.filez differ diff --git a/repo/objects/46/03b0cdca51aa40f05cb8591154a8d143547131741534efd266c049dc6af24a.filez b/repo/objects/46/03b0cdca51aa40f05cb8591154a8d143547131741534efd266c049dc6af24a.filez new file mode 100644 index 00000000000..73291945a8f Binary files /dev/null and b/repo/objects/46/03b0cdca51aa40f05cb8591154a8d143547131741534efd266c049dc6af24a.filez differ diff --git a/repo/objects/46/2b0ad7e083569dd7a67a7bbb5540d56a1af19b88e0170f6970384d3ef5700f.filez b/repo/objects/46/2b0ad7e083569dd7a67a7bbb5540d56a1af19b88e0170f6970384d3ef5700f.filez new file mode 100644 index 00000000000..e3f608893f5 Binary files /dev/null and b/repo/objects/46/2b0ad7e083569dd7a67a7bbb5540d56a1af19b88e0170f6970384d3ef5700f.filez differ diff --git a/repo/objects/46/2e17e1f497c7902ca2a5540557bd95b299715daf13b8fddf19bec31a91becb.filez b/repo/objects/46/2e17e1f497c7902ca2a5540557bd95b299715daf13b8fddf19bec31a91becb.filez new file mode 100644 index 00000000000..a4de9a0d07b Binary files /dev/null and b/repo/objects/46/2e17e1f497c7902ca2a5540557bd95b299715daf13b8fddf19bec31a91becb.filez differ diff --git a/repo/objects/46/579238e6f9ef6cac6b50c1687d0249d72d5d4235b1d38b72dda1c400b9df8b.filez b/repo/objects/46/579238e6f9ef6cac6b50c1687d0249d72d5d4235b1d38b72dda1c400b9df8b.filez new file mode 100644 index 00000000000..c5f1cd530ca Binary files /dev/null and b/repo/objects/46/579238e6f9ef6cac6b50c1687d0249d72d5d4235b1d38b72dda1c400b9df8b.filez differ diff --git a/repo/objects/46/8243562b3f7de88a1b4bd6e00df6801db10217dc68515e32fe23b9e28e431d.dirtree b/repo/objects/46/8243562b3f7de88a1b4bd6e00df6801db10217dc68515e32fe23b9e28e431d.dirtree new file mode 100644 index 00000000000..b8685231c05 Binary files /dev/null and b/repo/objects/46/8243562b3f7de88a1b4bd6e00df6801db10217dc68515e32fe23b9e28e431d.dirtree differ diff --git a/repo/objects/46/94cc41cd58a3c2926ebca8aa5e0a08b68ba916b050396b7db99053397c3b56.filez b/repo/objects/46/94cc41cd58a3c2926ebca8aa5e0a08b68ba916b050396b7db99053397c3b56.filez new file mode 100644 index 00000000000..da63784e33b Binary files /dev/null and b/repo/objects/46/94cc41cd58a3c2926ebca8aa5e0a08b68ba916b050396b7db99053397c3b56.filez differ diff --git a/repo/objects/46/9d99aa79631e9742ef5b69c52700f0c42a0595dcf1137d8226a8c8cbd79fb0.dirtree b/repo/objects/46/9d99aa79631e9742ef5b69c52700f0c42a0595dcf1137d8226a8c8cbd79fb0.dirtree new file mode 100644 index 00000000000..35080dd10eb Binary files /dev/null and b/repo/objects/46/9d99aa79631e9742ef5b69c52700f0c42a0595dcf1137d8226a8c8cbd79fb0.dirtree differ diff --git a/repo/objects/46/a717d5cc4ba87db915892e492b117630e6481221ab8c653b3685d35bcd5f97.filez b/repo/objects/46/a717d5cc4ba87db915892e492b117630e6481221ab8c653b3685d35bcd5f97.filez new file mode 100644 index 00000000000..a1465d67155 Binary files /dev/null and b/repo/objects/46/a717d5cc4ba87db915892e492b117630e6481221ab8c653b3685d35bcd5f97.filez differ diff --git a/repo/objects/46/a9287958767195d81c71911a6bb698f5b179129ac2200cf4ad650a77d55f6c.filez b/repo/objects/46/a9287958767195d81c71911a6bb698f5b179129ac2200cf4ad650a77d55f6c.filez new file mode 100644 index 00000000000..55b737a292c Binary files /dev/null and b/repo/objects/46/a9287958767195d81c71911a6bb698f5b179129ac2200cf4ad650a77d55f6c.filez differ diff --git a/repo/objects/46/ed756729285bb6e364ca4b3d0e90058c9645e6324774f0d05487f4943aaeca.filez b/repo/objects/46/ed756729285bb6e364ca4b3d0e90058c9645e6324774f0d05487f4943aaeca.filez new file mode 100644 index 00000000000..69cdf3a5cfd Binary files /dev/null and b/repo/objects/46/ed756729285bb6e364ca4b3d0e90058c9645e6324774f0d05487f4943aaeca.filez differ diff --git a/repo/objects/47/08fcd1b40f1f8ec1c4267af86b50f8e9711c63b5170e297f00d12a00da3171.dirtree b/repo/objects/47/08fcd1b40f1f8ec1c4267af86b50f8e9711c63b5170e297f00d12a00da3171.dirtree new file mode 100644 index 00000000000..60d8c924662 Binary files /dev/null and b/repo/objects/47/08fcd1b40f1f8ec1c4267af86b50f8e9711c63b5170e297f00d12a00da3171.dirtree differ diff --git a/repo/objects/47/42d241ab8e555b07e0e1274f39f09241eac216e2291cf61cae43f53c1bf2eb.filez b/repo/objects/47/42d241ab8e555b07e0e1274f39f09241eac216e2291cf61cae43f53c1bf2eb.filez new file mode 100644 index 00000000000..b7139add167 Binary files /dev/null and b/repo/objects/47/42d241ab8e555b07e0e1274f39f09241eac216e2291cf61cae43f53c1bf2eb.filez differ diff --git a/repo/objects/47/8d4f9b67021979e5a10f392c3a2fc8c291e8b1a6a631ad28fe7853fad6a75f.filez b/repo/objects/47/8d4f9b67021979e5a10f392c3a2fc8c291e8b1a6a631ad28fe7853fad6a75f.filez new file mode 100644 index 00000000000..ba364d3d841 Binary files /dev/null and b/repo/objects/47/8d4f9b67021979e5a10f392c3a2fc8c291e8b1a6a631ad28fe7853fad6a75f.filez differ diff --git a/repo/objects/47/982aa5dc66f16cf710bf042b6a550ee30d8037b59ae7710ba340597e193214.dirtree b/repo/objects/47/982aa5dc66f16cf710bf042b6a550ee30d8037b59ae7710ba340597e193214.dirtree new file mode 100644 index 00000000000..f14aa88e46b Binary files /dev/null and b/repo/objects/47/982aa5dc66f16cf710bf042b6a550ee30d8037b59ae7710ba340597e193214.dirtree differ diff --git a/repo/objects/47/9b7ffde9f821b566b4f9d9ca58fe439cae4ca2f24250fca152b40bed03fb1d.dirtree b/repo/objects/47/9b7ffde9f821b566b4f9d9ca58fe439cae4ca2f24250fca152b40bed03fb1d.dirtree new file mode 100644 index 00000000000..52fba7be6ef Binary files /dev/null and b/repo/objects/47/9b7ffde9f821b566b4f9d9ca58fe439cae4ca2f24250fca152b40bed03fb1d.dirtree differ diff --git a/repo/objects/48/1d0f3a65799c6aff73692e786e35002e64203bc340c6ef096594946fef32ed.filez b/repo/objects/48/1d0f3a65799c6aff73692e786e35002e64203bc340c6ef096594946fef32ed.filez new file mode 100644 index 00000000000..71cb735fe37 Binary files /dev/null and b/repo/objects/48/1d0f3a65799c6aff73692e786e35002e64203bc340c6ef096594946fef32ed.filez differ diff --git a/repo/objects/48/4a698692eb1ea17487981ff91b6857932eb23225b807fc2ac1aee0ac84bec4.dirtree b/repo/objects/48/4a698692eb1ea17487981ff91b6857932eb23225b807fc2ac1aee0ac84bec4.dirtree new file mode 100644 index 00000000000..79a7f71f698 Binary files /dev/null and b/repo/objects/48/4a698692eb1ea17487981ff91b6857932eb23225b807fc2ac1aee0ac84bec4.dirtree differ diff --git a/repo/objects/48/7ee59acd44e433c616546fa77620cdb6af803ccbdd04c5a46723d6c1bde7ce.filez b/repo/objects/48/7ee59acd44e433c616546fa77620cdb6af803ccbdd04c5a46723d6c1bde7ce.filez new file mode 100644 index 00000000000..59469ab6cc2 Binary files /dev/null and b/repo/objects/48/7ee59acd44e433c616546fa77620cdb6af803ccbdd04c5a46723d6c1bde7ce.filez differ diff --git a/repo/objects/48/7ee9c6e1475b4bf193a0dadd789335c242286d4bac6ae1b7a362c711c95ea6.filez b/repo/objects/48/7ee9c6e1475b4bf193a0dadd789335c242286d4bac6ae1b7a362c711c95ea6.filez new file mode 100644 index 00000000000..f9b88ecba27 Binary files /dev/null and b/repo/objects/48/7ee9c6e1475b4bf193a0dadd789335c242286d4bac6ae1b7a362c711c95ea6.filez differ diff --git a/repo/objects/48/aa07c9be0e736a9740dac103e162c193202c48a0e382dbd29b823f43a94f60.filez b/repo/objects/48/aa07c9be0e736a9740dac103e162c193202c48a0e382dbd29b823f43a94f60.filez new file mode 100644 index 00000000000..75c961436e1 Binary files /dev/null and b/repo/objects/48/aa07c9be0e736a9740dac103e162c193202c48a0e382dbd29b823f43a94f60.filez differ diff --git a/repo/objects/48/ade6ed379c770ff2bf7ad3e9223cfc4ba0e9ce9fd6467de3518695d9ac29f4.filez b/repo/objects/48/ade6ed379c770ff2bf7ad3e9223cfc4ba0e9ce9fd6467de3518695d9ac29f4.filez new file mode 100644 index 00000000000..6295c01d743 Binary files /dev/null and b/repo/objects/48/ade6ed379c770ff2bf7ad3e9223cfc4ba0e9ce9fd6467de3518695d9ac29f4.filez differ diff --git a/repo/objects/48/cbcbf8963a7f02afd4c646f933ae75a81e19a2a2c1fa39c5f58fbf3c1bbad9.filez b/repo/objects/48/cbcbf8963a7f02afd4c646f933ae75a81e19a2a2c1fa39c5f58fbf3c1bbad9.filez new file mode 100644 index 00000000000..b7e5b866852 Binary files /dev/null and b/repo/objects/48/cbcbf8963a7f02afd4c646f933ae75a81e19a2a2c1fa39c5f58fbf3c1bbad9.filez differ diff --git a/repo/objects/48/e22c08da93dd778c929f34564d2a1b07338feb0b75ff869fa18a9a5533f233.filez b/repo/objects/48/e22c08da93dd778c929f34564d2a1b07338feb0b75ff869fa18a9a5533f233.filez new file mode 100644 index 00000000000..002ca4b02da Binary files /dev/null and b/repo/objects/48/e22c08da93dd778c929f34564d2a1b07338feb0b75ff869fa18a9a5533f233.filez differ diff --git a/repo/objects/48/fb1aac10f7b923cbb17ce7853643b60671b7695967c376455dfd3792820723.filez b/repo/objects/48/fb1aac10f7b923cbb17ce7853643b60671b7695967c376455dfd3792820723.filez new file mode 100644 index 00000000000..d4807ce5ae8 Binary files /dev/null and b/repo/objects/48/fb1aac10f7b923cbb17ce7853643b60671b7695967c376455dfd3792820723.filez differ diff --git a/repo/objects/49/032e50616364f00bf42c46fd279916778b4d3ad32b15c9256bfe79025cd65b.filez b/repo/objects/49/032e50616364f00bf42c46fd279916778b4d3ad32b15c9256bfe79025cd65b.filez new file mode 100644 index 00000000000..8aeab9bf51c Binary files /dev/null and b/repo/objects/49/032e50616364f00bf42c46fd279916778b4d3ad32b15c9256bfe79025cd65b.filez differ diff --git a/repo/objects/49/18efc694ad6e2cb8147cc1d37d1d4550ca0c39df878adfa87771b58deb535d.dirtree b/repo/objects/49/18efc694ad6e2cb8147cc1d37d1d4550ca0c39df878adfa87771b58deb535d.dirtree new file mode 100644 index 00000000000..02599ee5a32 Binary files /dev/null and b/repo/objects/49/18efc694ad6e2cb8147cc1d37d1d4550ca0c39df878adfa87771b58deb535d.dirtree differ diff --git a/repo/objects/49/26050d4bfbde68452a5a6b2fb32e55cc415159379ab1052557d00bced93489.filez b/repo/objects/49/26050d4bfbde68452a5a6b2fb32e55cc415159379ab1052557d00bced93489.filez new file mode 100644 index 00000000000..fbb22593d00 Binary files /dev/null and b/repo/objects/49/26050d4bfbde68452a5a6b2fb32e55cc415159379ab1052557d00bced93489.filez differ diff --git a/repo/objects/49/4039950aefa966a5feb36f540664a1ec270c66837c9390109edad6fa6f0fc5.filez b/repo/objects/49/4039950aefa966a5feb36f540664a1ec270c66837c9390109edad6fa6f0fc5.filez new file mode 100644 index 00000000000..b05e5aec1f2 Binary files /dev/null and b/repo/objects/49/4039950aefa966a5feb36f540664a1ec270c66837c9390109edad6fa6f0fc5.filez differ diff --git a/repo/objects/49/445344db18e40e08f8c60db012b1601521f77fe81d02a8682fe63d4e9fcf94.filez b/repo/objects/49/445344db18e40e08f8c60db012b1601521f77fe81d02a8682fe63d4e9fcf94.filez new file mode 100644 index 00000000000..52588305ef7 Binary files /dev/null and b/repo/objects/49/445344db18e40e08f8c60db012b1601521f77fe81d02a8682fe63d4e9fcf94.filez differ diff --git a/repo/objects/49/65cfe23c88dd72c4a97c2e960aaefc63e36ee25a46874900746890fba875e6.filez b/repo/objects/49/65cfe23c88dd72c4a97c2e960aaefc63e36ee25a46874900746890fba875e6.filez new file mode 100644 index 00000000000..404a5566afc Binary files /dev/null and b/repo/objects/49/65cfe23c88dd72c4a97c2e960aaefc63e36ee25a46874900746890fba875e6.filez differ diff --git a/repo/objects/49/89e1e53289d0104a9b67c1bd460e5ba713c40b324756dcecfcd810d6008a75.filez b/repo/objects/49/89e1e53289d0104a9b67c1bd460e5ba713c40b324756dcecfcd810d6008a75.filez new file mode 100644 index 00000000000..d704a53bf27 Binary files /dev/null and b/repo/objects/49/89e1e53289d0104a9b67c1bd460e5ba713c40b324756dcecfcd810d6008a75.filez differ diff --git a/repo/objects/49/8ef609c65a23bd325f61ef3aaee81c1f3e6c02e2dcdd1b7923069315bad940.filez b/repo/objects/49/8ef609c65a23bd325f61ef3aaee81c1f3e6c02e2dcdd1b7923069315bad940.filez new file mode 100644 index 00000000000..5e844a787a3 Binary files /dev/null and b/repo/objects/49/8ef609c65a23bd325f61ef3aaee81c1f3e6c02e2dcdd1b7923069315bad940.filez differ diff --git a/repo/objects/49/ac10c0165e84dde484dbf167e54d93897ce89642f2c8f185acba4a1c352ee7.dirtree b/repo/objects/49/ac10c0165e84dde484dbf167e54d93897ce89642f2c8f185acba4a1c352ee7.dirtree new file mode 100644 index 00000000000..6a844e58d5b Binary files /dev/null and b/repo/objects/49/ac10c0165e84dde484dbf167e54d93897ce89642f2c8f185acba4a1c352ee7.dirtree differ diff --git a/repo/objects/49/d6e02e9db1bb5b3e6bcd5768973930195757923f6366cb6aec63e330509caa.filez b/repo/objects/49/d6e02e9db1bb5b3e6bcd5768973930195757923f6366cb6aec63e330509caa.filez new file mode 100644 index 00000000000..2d84f980ded Binary files /dev/null and b/repo/objects/49/d6e02e9db1bb5b3e6bcd5768973930195757923f6366cb6aec63e330509caa.filez differ diff --git a/repo/objects/49/f41b86689d3870b5adfe4a144fdf4e569ea7b2e284a2d37b0373b4390e6c0a.dirtree b/repo/objects/49/f41b86689d3870b5adfe4a144fdf4e569ea7b2e284a2d37b0373b4390e6c0a.dirtree new file mode 100644 index 00000000000..d3dcde8ca83 Binary files /dev/null and b/repo/objects/49/f41b86689d3870b5adfe4a144fdf4e569ea7b2e284a2d37b0373b4390e6c0a.dirtree differ diff --git a/repo/objects/49/fa1be47a8acf6dede42d71ad751f6580849b064737e3036c68c3bcf902a252.dirtree b/repo/objects/49/fa1be47a8acf6dede42d71ad751f6580849b064737e3036c68c3bcf902a252.dirtree new file mode 100644 index 00000000000..8b42211238e Binary files /dev/null and b/repo/objects/49/fa1be47a8acf6dede42d71ad751f6580849b064737e3036c68c3bcf902a252.dirtree differ diff --git a/repo/objects/4a/282d9292051fb0e3e22e827c31a0c53fddbc2bafb87e48772866390144b0af.dirtree b/repo/objects/4a/282d9292051fb0e3e22e827c31a0c53fddbc2bafb87e48772866390144b0af.dirtree new file mode 100644 index 00000000000..8df4b4d8a7e Binary files /dev/null and b/repo/objects/4a/282d9292051fb0e3e22e827c31a0c53fddbc2bafb87e48772866390144b0af.dirtree differ diff --git a/repo/objects/4a/512fbea2565af4ceb6893559bdfe49d358536eec5ec72911156074428e3a58.filez b/repo/objects/4a/512fbea2565af4ceb6893559bdfe49d358536eec5ec72911156074428e3a58.filez new file mode 100644 index 00000000000..e01746765f1 Binary files /dev/null and b/repo/objects/4a/512fbea2565af4ceb6893559bdfe49d358536eec5ec72911156074428e3a58.filez differ diff --git a/repo/objects/4a/5e11f56aa665aff3c4d093c3ac6acfbdf33b4d938f9ae64faf5363eed4bc82.dirtree b/repo/objects/4a/5e11f56aa665aff3c4d093c3ac6acfbdf33b4d938f9ae64faf5363eed4bc82.dirtree new file mode 100644 index 00000000000..f2a3de362e5 Binary files /dev/null and b/repo/objects/4a/5e11f56aa665aff3c4d093c3ac6acfbdf33b4d938f9ae64faf5363eed4bc82.dirtree differ diff --git a/repo/objects/4a/6b469c83896575ffdda2f84d8fe640fc7c7a489460d90649db4991436c13ea.dirtree b/repo/objects/4a/6b469c83896575ffdda2f84d8fe640fc7c7a489460d90649db4991436c13ea.dirtree new file mode 100644 index 00000000000..13d8d9c1d57 Binary files /dev/null and b/repo/objects/4a/6b469c83896575ffdda2f84d8fe640fc7c7a489460d90649db4991436c13ea.dirtree differ diff --git a/repo/objects/4a/8506f611a628b2ff140c6dd3296a75a3b9f0216657ac43be75b233f2819388.filez b/repo/objects/4a/8506f611a628b2ff140c6dd3296a75a3b9f0216657ac43be75b233f2819388.filez new file mode 100644 index 00000000000..3cac2bba2ba Binary files /dev/null and b/repo/objects/4a/8506f611a628b2ff140c6dd3296a75a3b9f0216657ac43be75b233f2819388.filez differ diff --git a/repo/objects/4a/9b08c29d1f86c6ca5cf8bd5c3a362954f3ca13d7ce223da3459286766691e5.filez b/repo/objects/4a/9b08c29d1f86c6ca5cf8bd5c3a362954f3ca13d7ce223da3459286766691e5.filez new file mode 100644 index 00000000000..47cb3740e49 Binary files /dev/null and b/repo/objects/4a/9b08c29d1f86c6ca5cf8bd5c3a362954f3ca13d7ce223da3459286766691e5.filez differ diff --git a/repo/objects/4a/9e5174e0b0efcbd3814359231ea5344ff8ebd323cdbe532d67744f64d98253.filez b/repo/objects/4a/9e5174e0b0efcbd3814359231ea5344ff8ebd323cdbe532d67744f64d98253.filez new file mode 100644 index 00000000000..da8a3cb017d Binary files /dev/null and b/repo/objects/4a/9e5174e0b0efcbd3814359231ea5344ff8ebd323cdbe532d67744f64d98253.filez differ diff --git a/repo/objects/4a/b74860cf7353d2c737fb8927959cc9e5ea81d27ee7bcb39339ce125cd7371a.filez b/repo/objects/4a/b74860cf7353d2c737fb8927959cc9e5ea81d27ee7bcb39339ce125cd7371a.filez new file mode 100644 index 00000000000..e1aaba906b9 Binary files /dev/null and b/repo/objects/4a/b74860cf7353d2c737fb8927959cc9e5ea81d27ee7bcb39339ce125cd7371a.filez differ diff --git a/repo/objects/4a/ba15175300f8d4c9cfc135518e79d3e813a108742d08fb88f2ec5a38d7be19.filez b/repo/objects/4a/ba15175300f8d4c9cfc135518e79d3e813a108742d08fb88f2ec5a38d7be19.filez new file mode 100644 index 00000000000..06b17beb3e8 Binary files /dev/null and b/repo/objects/4a/ba15175300f8d4c9cfc135518e79d3e813a108742d08fb88f2ec5a38d7be19.filez differ diff --git a/repo/objects/4a/bd7e37c7b30b76ddda0edbed87ebc6df50857afd01a85fca90506eafa048a5.filez b/repo/objects/4a/bd7e37c7b30b76ddda0edbed87ebc6df50857afd01a85fca90506eafa048a5.filez new file mode 100644 index 00000000000..c6990d69602 Binary files /dev/null and b/repo/objects/4a/bd7e37c7b30b76ddda0edbed87ebc6df50857afd01a85fca90506eafa048a5.filez differ diff --git a/repo/objects/4a/cb5834e96cc4c4568daf32f89d357cc19f37e0cfb15ccdd42912b976dff5ec.filez b/repo/objects/4a/cb5834e96cc4c4568daf32f89d357cc19f37e0cfb15ccdd42912b976dff5ec.filez new file mode 100644 index 00000000000..287f7ed5706 Binary files /dev/null and b/repo/objects/4a/cb5834e96cc4c4568daf32f89d357cc19f37e0cfb15ccdd42912b976dff5ec.filez differ diff --git a/repo/objects/4a/f8572d91be806507982b3aa1f47abb53c98da3769fa298e5a9e6e51cde4fa2.filez b/repo/objects/4a/f8572d91be806507982b3aa1f47abb53c98da3769fa298e5a9e6e51cde4fa2.filez new file mode 100644 index 00000000000..4484d2a4f9d Binary files /dev/null and b/repo/objects/4a/f8572d91be806507982b3aa1f47abb53c98da3769fa298e5a9e6e51cde4fa2.filez differ diff --git a/repo/objects/4b/13f1b3040e42882d216b63dcdb2d9d0b988f8cdfbd035a4b9574ee3ab84f53.dirtree b/repo/objects/4b/13f1b3040e42882d216b63dcdb2d9d0b988f8cdfbd035a4b9574ee3ab84f53.dirtree new file mode 100644 index 00000000000..f99a801375b Binary files /dev/null and b/repo/objects/4b/13f1b3040e42882d216b63dcdb2d9d0b988f8cdfbd035a4b9574ee3ab84f53.dirtree differ diff --git a/repo/objects/4b/6c0138fda2f3f8076a8a0d1489c8a54c125c1f67dec435894dd3ad56d55c3a.filez b/repo/objects/4b/6c0138fda2f3f8076a8a0d1489c8a54c125c1f67dec435894dd3ad56d55c3a.filez new file mode 100644 index 00000000000..07789974da2 Binary files /dev/null and b/repo/objects/4b/6c0138fda2f3f8076a8a0d1489c8a54c125c1f67dec435894dd3ad56d55c3a.filez differ diff --git a/repo/objects/4b/966c3c94604aa629cc5394566df8af6111f5eec279f6904ca688ef678d7d1b.dirtree b/repo/objects/4b/966c3c94604aa629cc5394566df8af6111f5eec279f6904ca688ef678d7d1b.dirtree new file mode 100644 index 00000000000..08d5a37d35a Binary files /dev/null and b/repo/objects/4b/966c3c94604aa629cc5394566df8af6111f5eec279f6904ca688ef678d7d1b.dirtree differ diff --git a/repo/objects/4b/9a61830b8dfc6c29f91095a6f60d64a9d522ec3c26d85e7240da933478d6b5.filez b/repo/objects/4b/9a61830b8dfc6c29f91095a6f60d64a9d522ec3c26d85e7240da933478d6b5.filez new file mode 100644 index 00000000000..f56b5c35924 Binary files /dev/null and b/repo/objects/4b/9a61830b8dfc6c29f91095a6f60d64a9d522ec3c26d85e7240da933478d6b5.filez differ diff --git a/repo/objects/4b/a8adf58e8fcbe401dea7d529e3bff819652ea913a3b79dd744e9858560d31d.filez b/repo/objects/4b/a8adf58e8fcbe401dea7d529e3bff819652ea913a3b79dd744e9858560d31d.filez new file mode 100644 index 00000000000..b46e63c8f0e Binary files /dev/null and b/repo/objects/4b/a8adf58e8fcbe401dea7d529e3bff819652ea913a3b79dd744e9858560d31d.filez differ diff --git a/repo/objects/4b/bc28c2f43ac1ff7bf294b323a99cced56812fa92c171ef8ece360fbfe730e7.filez b/repo/objects/4b/bc28c2f43ac1ff7bf294b323a99cced56812fa92c171ef8ece360fbfe730e7.filez new file mode 100644 index 00000000000..a89a3122727 Binary files /dev/null and b/repo/objects/4b/bc28c2f43ac1ff7bf294b323a99cced56812fa92c171ef8ece360fbfe730e7.filez differ diff --git a/repo/objects/4b/ce75e38e4bf0275e88ead327e34e0bd0b7738cf1601d91d5e550dea6ed4c01.filez b/repo/objects/4b/ce75e38e4bf0275e88ead327e34e0bd0b7738cf1601d91d5e550dea6ed4c01.filez new file mode 100644 index 00000000000..d82eb5ee22d Binary files /dev/null and b/repo/objects/4b/ce75e38e4bf0275e88ead327e34e0bd0b7738cf1601d91d5e550dea6ed4c01.filez differ diff --git a/repo/objects/4b/d236ab4d5d4334ae3a9c387d11e71a732820887b20e46879ae014e5827ab34.filez b/repo/objects/4b/d236ab4d5d4334ae3a9c387d11e71a732820887b20e46879ae014e5827ab34.filez new file mode 100644 index 00000000000..c7662d79df9 Binary files /dev/null and b/repo/objects/4b/d236ab4d5d4334ae3a9c387d11e71a732820887b20e46879ae014e5827ab34.filez differ diff --git a/repo/objects/4b/d7fd6160f3fb0e1ddc835221774d0352db3115b4ef3c5fd8be1add66645691.dirtree b/repo/objects/4b/d7fd6160f3fb0e1ddc835221774d0352db3115b4ef3c5fd8be1add66645691.dirtree new file mode 100644 index 00000000000..b05e0a69678 Binary files /dev/null and b/repo/objects/4b/d7fd6160f3fb0e1ddc835221774d0352db3115b4ef3c5fd8be1add66645691.dirtree differ diff --git a/repo/objects/4b/e29b659e86ee46f7ca778571d10dde13e093a44ceae7243072f975494d32d4.dirtree b/repo/objects/4b/e29b659e86ee46f7ca778571d10dde13e093a44ceae7243072f975494d32d4.dirtree new file mode 100644 index 00000000000..3161001dbc5 Binary files /dev/null and b/repo/objects/4b/e29b659e86ee46f7ca778571d10dde13e093a44ceae7243072f975494d32d4.dirtree differ diff --git a/repo/objects/4b/f0beb3eba760678d1bc5f879e1a413187d364f14ed547e8c348fb9e4924097.filez b/repo/objects/4b/f0beb3eba760678d1bc5f879e1a413187d364f14ed547e8c348fb9e4924097.filez new file mode 100644 index 00000000000..3324262ee1f Binary files /dev/null and b/repo/objects/4b/f0beb3eba760678d1bc5f879e1a413187d364f14ed547e8c348fb9e4924097.filez differ diff --git a/repo/objects/4b/fecda8f5b7e424e36d164b2d713b708f11c55b01b94270fc1c9dcbb870d420.filez b/repo/objects/4b/fecda8f5b7e424e36d164b2d713b708f11c55b01b94270fc1c9dcbb870d420.filez new file mode 100644 index 00000000000..830d005b5e3 Binary files /dev/null and b/repo/objects/4b/fecda8f5b7e424e36d164b2d713b708f11c55b01b94270fc1c9dcbb870d420.filez differ diff --git a/repo/objects/4c/00bb1b2a4c2c84ab9156704406d23e9f4dcc563227f68387e9cfef339d96c2.filez b/repo/objects/4c/00bb1b2a4c2c84ab9156704406d23e9f4dcc563227f68387e9cfef339d96c2.filez new file mode 100644 index 00000000000..7f196a593c1 Binary files /dev/null and b/repo/objects/4c/00bb1b2a4c2c84ab9156704406d23e9f4dcc563227f68387e9cfef339d96c2.filez differ diff --git a/repo/objects/4c/1e06df0fedf21680f5fa146ec3a3508f1696ec87af27f318e59d98055400ca.filez b/repo/objects/4c/1e06df0fedf21680f5fa146ec3a3508f1696ec87af27f318e59d98055400ca.filez new file mode 100644 index 00000000000..9ee4a51f6cc Binary files /dev/null and b/repo/objects/4c/1e06df0fedf21680f5fa146ec3a3508f1696ec87af27f318e59d98055400ca.filez differ diff --git a/repo/objects/4c/3c9c0d0bbb98943ffbdac902d520f5712cdaa814ba2217feb78497a3b2f720.filez b/repo/objects/4c/3c9c0d0bbb98943ffbdac902d520f5712cdaa814ba2217feb78497a3b2f720.filez new file mode 100644 index 00000000000..d2143e03e03 Binary files /dev/null and b/repo/objects/4c/3c9c0d0bbb98943ffbdac902d520f5712cdaa814ba2217feb78497a3b2f720.filez differ diff --git a/repo/objects/4c/4da55aa978bcb8702ee74663b2f39543dae015d0b3156a45b874c4034f6ef7.filez b/repo/objects/4c/4da55aa978bcb8702ee74663b2f39543dae015d0b3156a45b874c4034f6ef7.filez new file mode 100644 index 00000000000..9ac41299cf6 Binary files /dev/null and b/repo/objects/4c/4da55aa978bcb8702ee74663b2f39543dae015d0b3156a45b874c4034f6ef7.filez differ diff --git a/repo/objects/4c/ce63ec8e518c69a81ec23026cbefc81da0de4ca7b2e82ae7ea1d93ffd17bd3.filez b/repo/objects/4c/ce63ec8e518c69a81ec23026cbefc81da0de4ca7b2e82ae7ea1d93ffd17bd3.filez new file mode 100644 index 00000000000..d464e94122b Binary files /dev/null and b/repo/objects/4c/ce63ec8e518c69a81ec23026cbefc81da0de4ca7b2e82ae7ea1d93ffd17bd3.filez differ diff --git a/repo/objects/4c/cfcf2c9dd5c5a53fc0348c2f72004d8d58ddc5311b52c4e31dce05ed076f27.filez b/repo/objects/4c/cfcf2c9dd5c5a53fc0348c2f72004d8d58ddc5311b52c4e31dce05ed076f27.filez new file mode 100644 index 00000000000..a441a089ef1 Binary files /dev/null and b/repo/objects/4c/cfcf2c9dd5c5a53fc0348c2f72004d8d58ddc5311b52c4e31dce05ed076f27.filez differ diff --git a/repo/objects/4c/f452267e8cd5687e494653dd1fdc991aa960ca0f2d002bf180779a6e1a548f.filez b/repo/objects/4c/f452267e8cd5687e494653dd1fdc991aa960ca0f2d002bf180779a6e1a548f.filez new file mode 100644 index 00000000000..0f6f5c1e62d Binary files /dev/null and b/repo/objects/4c/f452267e8cd5687e494653dd1fdc991aa960ca0f2d002bf180779a6e1a548f.filez differ diff --git a/repo/objects/4d/1a28b0683af86533a066282ede6877ccc618f0359bce42c5208826f06f08c7.dirtree b/repo/objects/4d/1a28b0683af86533a066282ede6877ccc618f0359bce42c5208826f06f08c7.dirtree new file mode 100644 index 00000000000..1362b446b59 Binary files /dev/null and b/repo/objects/4d/1a28b0683af86533a066282ede6877ccc618f0359bce42c5208826f06f08c7.dirtree differ diff --git a/repo/objects/4d/2909d6dd5bc0e842c88605bbc3d7fd079553c66e39d5d4681b3a48996b93c8.filez b/repo/objects/4d/2909d6dd5bc0e842c88605bbc3d7fd079553c66e39d5d4681b3a48996b93c8.filez new file mode 100644 index 00000000000..4c20a1b5262 Binary files /dev/null and b/repo/objects/4d/2909d6dd5bc0e842c88605bbc3d7fd079553c66e39d5d4681b3a48996b93c8.filez differ diff --git a/repo/objects/4d/8985cf6d2dd6f11537e22888131ba13a21ab6c677420237af3ee94814c32b7.dirtree b/repo/objects/4d/8985cf6d2dd6f11537e22888131ba13a21ab6c677420237af3ee94814c32b7.dirtree new file mode 100644 index 00000000000..6f4b71af237 Binary files /dev/null and b/repo/objects/4d/8985cf6d2dd6f11537e22888131ba13a21ab6c677420237af3ee94814c32b7.dirtree differ diff --git a/repo/objects/4d/965d998eef7d9b72fb97bf4dc00742e6a70fe3208e684b119c6884539cb43b.filez b/repo/objects/4d/965d998eef7d9b72fb97bf4dc00742e6a70fe3208e684b119c6884539cb43b.filez new file mode 100644 index 00000000000..2ed49be28c2 Binary files /dev/null and b/repo/objects/4d/965d998eef7d9b72fb97bf4dc00742e6a70fe3208e684b119c6884539cb43b.filez differ diff --git a/repo/objects/4d/d82c19bed8c4685feb66d62efd7f14f95d7000687b37425fef10f7c4ba1d3c.filez b/repo/objects/4d/d82c19bed8c4685feb66d62efd7f14f95d7000687b37425fef10f7c4ba1d3c.filez new file mode 100644 index 00000000000..ec74703800d Binary files /dev/null and b/repo/objects/4d/d82c19bed8c4685feb66d62efd7f14f95d7000687b37425fef10f7c4ba1d3c.filez differ diff --git a/repo/objects/4d/e9effe0aa196a9014f008648f44b0a9812206bedac35309d14b11cb6158817.filez b/repo/objects/4d/e9effe0aa196a9014f008648f44b0a9812206bedac35309d14b11cb6158817.filez new file mode 100644 index 00000000000..89491bc774a Binary files /dev/null and b/repo/objects/4d/e9effe0aa196a9014f008648f44b0a9812206bedac35309d14b11cb6158817.filez differ diff --git a/repo/objects/4d/f1c1b3c34a08266d531ac61ce09b1626fcbcdfb7487617e88cded30f1e328b.filez b/repo/objects/4d/f1c1b3c34a08266d531ac61ce09b1626fcbcdfb7487617e88cded30f1e328b.filez new file mode 100644 index 00000000000..4eab534a5db Binary files /dev/null and b/repo/objects/4d/f1c1b3c34a08266d531ac61ce09b1626fcbcdfb7487617e88cded30f1e328b.filez differ diff --git a/repo/objects/4e/2fd8a430b306e7276c6f041abfc30e19762164c15687b53e7466f11d24a1fa.filez b/repo/objects/4e/2fd8a430b306e7276c6f041abfc30e19762164c15687b53e7466f11d24a1fa.filez new file mode 100644 index 00000000000..60c04677323 Binary files /dev/null and b/repo/objects/4e/2fd8a430b306e7276c6f041abfc30e19762164c15687b53e7466f11d24a1fa.filez differ diff --git a/repo/objects/4e/760df55b6399d135dde593509b913e950fc87192157d084bcd186151bb077c.filez b/repo/objects/4e/760df55b6399d135dde593509b913e950fc87192157d084bcd186151bb077c.filez new file mode 100644 index 00000000000..d2271783388 Binary files /dev/null and b/repo/objects/4e/760df55b6399d135dde593509b913e950fc87192157d084bcd186151bb077c.filez differ diff --git a/repo/objects/4e/98cc01a6e4f7cba56d0b260b26dc9aeb8e5b40d2cd040bbe8ecd42e8340b4a.filez b/repo/objects/4e/98cc01a6e4f7cba56d0b260b26dc9aeb8e5b40d2cd040bbe8ecd42e8340b4a.filez new file mode 100644 index 00000000000..48ae31c47e9 Binary files /dev/null and b/repo/objects/4e/98cc01a6e4f7cba56d0b260b26dc9aeb8e5b40d2cd040bbe8ecd42e8340b4a.filez differ diff --git a/repo/objects/4e/aaebc8a338efeff46201953ace5924a018cf438266055b71373c896433aca2.filez b/repo/objects/4e/aaebc8a338efeff46201953ace5924a018cf438266055b71373c896433aca2.filez new file mode 100644 index 00000000000..04990623742 Binary files /dev/null and b/repo/objects/4e/aaebc8a338efeff46201953ace5924a018cf438266055b71373c896433aca2.filez differ diff --git a/repo/objects/4e/e5f64300f796721997574843aaa3011070b74af89a3795b652377be103153f.filez b/repo/objects/4e/e5f64300f796721997574843aaa3011070b74af89a3795b652377be103153f.filez new file mode 100644 index 00000000000..38c45fb5d38 Binary files /dev/null and b/repo/objects/4e/e5f64300f796721997574843aaa3011070b74af89a3795b652377be103153f.filez differ diff --git a/repo/objects/4f/07bc541ab826c66f054b628676c1f0594b43ba1caf842875a867759c2731fb.dirtree b/repo/objects/4f/07bc541ab826c66f054b628676c1f0594b43ba1caf842875a867759c2731fb.dirtree new file mode 100644 index 00000000000..15e93530780 Binary files /dev/null and b/repo/objects/4f/07bc541ab826c66f054b628676c1f0594b43ba1caf842875a867759c2731fb.dirtree differ diff --git a/repo/objects/4f/0dcc8c736b12945a0545cb56b016d9e7a8350e9b145c71ac9f0749a0793f15.dirtree b/repo/objects/4f/0dcc8c736b12945a0545cb56b016d9e7a8350e9b145c71ac9f0749a0793f15.dirtree new file mode 100644 index 00000000000..61da016fcc2 Binary files /dev/null and b/repo/objects/4f/0dcc8c736b12945a0545cb56b016d9e7a8350e9b145c71ac9f0749a0793f15.dirtree differ diff --git a/repo/objects/4f/16bd673a19cee31f26bcee5d76108245eaad2cdc61fc527a7e3c4e9df9fe9c.dirtree b/repo/objects/4f/16bd673a19cee31f26bcee5d76108245eaad2cdc61fc527a7e3c4e9df9fe9c.dirtree new file mode 100644 index 00000000000..26c5d14ec98 Binary files /dev/null and b/repo/objects/4f/16bd673a19cee31f26bcee5d76108245eaad2cdc61fc527a7e3c4e9df9fe9c.dirtree differ diff --git a/repo/objects/4f/1dd8a8c2de137e0de4719ae0c3b40c126ee868cc28cca760337912239bab52.dirtree b/repo/objects/4f/1dd8a8c2de137e0de4719ae0c3b40c126ee868cc28cca760337912239bab52.dirtree new file mode 100644 index 00000000000..4070975a7f9 Binary files /dev/null and b/repo/objects/4f/1dd8a8c2de137e0de4719ae0c3b40c126ee868cc28cca760337912239bab52.dirtree differ diff --git a/repo/objects/4f/5cd0dcc4f60392d11b01ee5ce23ee911dfc3b9cc432f64727c106887b57f72.filez b/repo/objects/4f/5cd0dcc4f60392d11b01ee5ce23ee911dfc3b9cc432f64727c106887b57f72.filez new file mode 100644 index 00000000000..e84e1848f60 Binary files /dev/null and b/repo/objects/4f/5cd0dcc4f60392d11b01ee5ce23ee911dfc3b9cc432f64727c106887b57f72.filez differ diff --git a/repo/objects/4f/7a1f3b1c8cbeca052552c8245851053d21371c9cab27cd02e89dc0a1e7dfec.filez b/repo/objects/4f/7a1f3b1c8cbeca052552c8245851053d21371c9cab27cd02e89dc0a1e7dfec.filez new file mode 100644 index 00000000000..d09d9e4f6a3 Binary files /dev/null and b/repo/objects/4f/7a1f3b1c8cbeca052552c8245851053d21371c9cab27cd02e89dc0a1e7dfec.filez differ diff --git a/repo/objects/4f/7cad70608b2dd9d6a1f12652d59ccf9a15cc00919c43aa58b2ccf1f19e3bb0.filez b/repo/objects/4f/7cad70608b2dd9d6a1f12652d59ccf9a15cc00919c43aa58b2ccf1f19e3bb0.filez new file mode 100644 index 00000000000..932d45ccf18 Binary files /dev/null and b/repo/objects/4f/7cad70608b2dd9d6a1f12652d59ccf9a15cc00919c43aa58b2ccf1f19e3bb0.filez differ diff --git a/repo/objects/4f/a9edd16da8ed7caea25981c260db572d0cad1f96d26ece73df955e6602ae96.filez b/repo/objects/4f/a9edd16da8ed7caea25981c260db572d0cad1f96d26ece73df955e6602ae96.filez new file mode 100644 index 00000000000..61a968f9bd4 Binary files /dev/null and b/repo/objects/4f/a9edd16da8ed7caea25981c260db572d0cad1f96d26ece73df955e6602ae96.filez differ diff --git a/repo/objects/4f/dda0fdfc416ab480aebdc7b6b4a7c820307f3ee2e834d22c5dae0c4cb92e07.filez b/repo/objects/4f/dda0fdfc416ab480aebdc7b6b4a7c820307f3ee2e834d22c5dae0c4cb92e07.filez new file mode 100644 index 00000000000..1918893bf6f Binary files /dev/null and b/repo/objects/4f/dda0fdfc416ab480aebdc7b6b4a7c820307f3ee2e834d22c5dae0c4cb92e07.filez differ diff --git a/repo/objects/50/18bd45f2075535f28c4e083004814d5b6a9d94e713767f830a041fa5793efd.filez b/repo/objects/50/18bd45f2075535f28c4e083004814d5b6a9d94e713767f830a041fa5793efd.filez new file mode 100644 index 00000000000..66f50fb7adc Binary files /dev/null and b/repo/objects/50/18bd45f2075535f28c4e083004814d5b6a9d94e713767f830a041fa5793efd.filez differ diff --git a/repo/objects/50/242bd87061d9680ee736b9011898c29ff35e30a4c9945851cd5a1558438fab.filez b/repo/objects/50/242bd87061d9680ee736b9011898c29ff35e30a4c9945851cd5a1558438fab.filez new file mode 100644 index 00000000000..ffc0d468f49 Binary files /dev/null and b/repo/objects/50/242bd87061d9680ee736b9011898c29ff35e30a4c9945851cd5a1558438fab.filez differ diff --git a/repo/objects/50/374081813141afd0c2fd7bbb3ac689f865208e19d1c7f4c4b628dcef9e15c6.filez b/repo/objects/50/374081813141afd0c2fd7bbb3ac689f865208e19d1c7f4c4b628dcef9e15c6.filez new file mode 100644 index 00000000000..2e1c522351f Binary files /dev/null and b/repo/objects/50/374081813141afd0c2fd7bbb3ac689f865208e19d1c7f4c4b628dcef9e15c6.filez differ diff --git a/repo/objects/50/38516854bdfd036b9a22d13b9dddb3ebe3e8d647b1e2edcbe39fcfdb0fbbdb.filez b/repo/objects/50/38516854bdfd036b9a22d13b9dddb3ebe3e8d647b1e2edcbe39fcfdb0fbbdb.filez new file mode 100644 index 00000000000..9e5c338e272 Binary files /dev/null and b/repo/objects/50/38516854bdfd036b9a22d13b9dddb3ebe3e8d647b1e2edcbe39fcfdb0fbbdb.filez differ diff --git a/repo/objects/50/7433bb1e011fed0109cdc13fcb414abe5faa429759be106e81ce7aa962c557.filez b/repo/objects/50/7433bb1e011fed0109cdc13fcb414abe5faa429759be106e81ce7aa962c557.filez new file mode 100644 index 00000000000..f52893d6de7 Binary files /dev/null and b/repo/objects/50/7433bb1e011fed0109cdc13fcb414abe5faa429759be106e81ce7aa962c557.filez differ diff --git a/repo/objects/50/81717898233eaca57ceeabd7307b0e6708d7c8645c8b92cbdde0356aadbada.filez b/repo/objects/50/81717898233eaca57ceeabd7307b0e6708d7c8645c8b92cbdde0356aadbada.filez new file mode 100644 index 00000000000..196e909112f Binary files /dev/null and b/repo/objects/50/81717898233eaca57ceeabd7307b0e6708d7c8645c8b92cbdde0356aadbada.filez differ diff --git a/repo/objects/50/b7c8a88c1c6a3ed5feab5752679466ac5f61935677f49c2bf27f54dcd891ca.dirtree b/repo/objects/50/b7c8a88c1c6a3ed5feab5752679466ac5f61935677f49c2bf27f54dcd891ca.dirtree new file mode 100644 index 00000000000..6cf8edd65ff Binary files /dev/null and b/repo/objects/50/b7c8a88c1c6a3ed5feab5752679466ac5f61935677f49c2bf27f54dcd891ca.dirtree differ diff --git a/repo/objects/50/c1a7cc5b9f7f2d54fd14da8307d9ff32129a4461e34c771611e0556044b52f.filez b/repo/objects/50/c1a7cc5b9f7f2d54fd14da8307d9ff32129a4461e34c771611e0556044b52f.filez new file mode 100644 index 00000000000..83ec8927885 Binary files /dev/null and b/repo/objects/50/c1a7cc5b9f7f2d54fd14da8307d9ff32129a4461e34c771611e0556044b52f.filez differ diff --git a/repo/objects/50/d18361c5c607cb9e03ae42dd8993932a6ea1e1579d485a01decc910118a84f.dirtree b/repo/objects/50/d18361c5c607cb9e03ae42dd8993932a6ea1e1579d485a01decc910118a84f.dirtree new file mode 100644 index 00000000000..6e73d264555 Binary files /dev/null and b/repo/objects/50/d18361c5c607cb9e03ae42dd8993932a6ea1e1579d485a01decc910118a84f.dirtree differ diff --git a/repo/objects/50/e8b63235b8ad3aca595b69282bca99de64f88c49f3d39c919751e90bdd3931.dirtree b/repo/objects/50/e8b63235b8ad3aca595b69282bca99de64f88c49f3d39c919751e90bdd3931.dirtree new file mode 100644 index 00000000000..821abf8650c Binary files /dev/null and b/repo/objects/50/e8b63235b8ad3aca595b69282bca99de64f88c49f3d39c919751e90bdd3931.dirtree differ diff --git a/repo/objects/51/05ed2e37a5bce8672eae218a4ca6deb8532c041497ddade40f8e80314ad854.filez b/repo/objects/51/05ed2e37a5bce8672eae218a4ca6deb8532c041497ddade40f8e80314ad854.filez new file mode 100644 index 00000000000..41bae4232bc Binary files /dev/null and b/repo/objects/51/05ed2e37a5bce8672eae218a4ca6deb8532c041497ddade40f8e80314ad854.filez differ diff --git a/repo/objects/51/241847a5de20a7701c5039e12cd67ae6787c19bf42706816b3258f2c107749.filez b/repo/objects/51/241847a5de20a7701c5039e12cd67ae6787c19bf42706816b3258f2c107749.filez new file mode 100644 index 00000000000..3cff65eb9b8 Binary files /dev/null and b/repo/objects/51/241847a5de20a7701c5039e12cd67ae6787c19bf42706816b3258f2c107749.filez differ diff --git a/repo/objects/51/2f78c5ae15b6c12597869957158a452a317bf82ea30e0bf6043fb0f5508729.filez b/repo/objects/51/2f78c5ae15b6c12597869957158a452a317bf82ea30e0bf6043fb0f5508729.filez new file mode 100644 index 00000000000..6682b30f153 Binary files /dev/null and b/repo/objects/51/2f78c5ae15b6c12597869957158a452a317bf82ea30e0bf6043fb0f5508729.filez differ diff --git a/repo/objects/51/33e2109a498cc71662348f274118afc0dde7426d4662505a53af9167674a4a.filez b/repo/objects/51/33e2109a498cc71662348f274118afc0dde7426d4662505a53af9167674a4a.filez new file mode 100644 index 00000000000..8fbb069524f Binary files /dev/null and b/repo/objects/51/33e2109a498cc71662348f274118afc0dde7426d4662505a53af9167674a4a.filez differ diff --git a/repo/objects/51/369f7d97b79960d8212208ccf62c4967228661f66c85fa0b42d59318f9b465.filez b/repo/objects/51/369f7d97b79960d8212208ccf62c4967228661f66c85fa0b42d59318f9b465.filez new file mode 100644 index 00000000000..85cbe0f4dc5 Binary files /dev/null and b/repo/objects/51/369f7d97b79960d8212208ccf62c4967228661f66c85fa0b42d59318f9b465.filez differ diff --git a/repo/objects/51/7848965886db654083fcba4cf088a41483b400f34eaa0ba182d43fa7f29735.filez b/repo/objects/51/7848965886db654083fcba4cf088a41483b400f34eaa0ba182d43fa7f29735.filez new file mode 100644 index 00000000000..fd4c9e047ae Binary files /dev/null and b/repo/objects/51/7848965886db654083fcba4cf088a41483b400f34eaa0ba182d43fa7f29735.filez differ diff --git a/repo/objects/51/b4eef908f0019bb4f0078fcc417ce75378a4c826bb31b33868f575447a426b.filez b/repo/objects/51/b4eef908f0019bb4f0078fcc417ce75378a4c826bb31b33868f575447a426b.filez new file mode 100644 index 00000000000..063d8f73fac Binary files /dev/null and b/repo/objects/51/b4eef908f0019bb4f0078fcc417ce75378a4c826bb31b33868f575447a426b.filez differ diff --git a/repo/objects/51/cfd84dda524d19088fa15620a6a7fb997c28ef9613e677402df51c3cc19f11.filez b/repo/objects/51/cfd84dda524d19088fa15620a6a7fb997c28ef9613e677402df51c3cc19f11.filez new file mode 100644 index 00000000000..9aa380e3819 Binary files /dev/null and b/repo/objects/51/cfd84dda524d19088fa15620a6a7fb997c28ef9613e677402df51c3cc19f11.filez differ diff --git a/repo/objects/51/eb69f096523c194fb29f7bea9a266c98e8c495e26e29d6c60eb4bf37fceac3.dirtree b/repo/objects/51/eb69f096523c194fb29f7bea9a266c98e8c495e26e29d6c60eb4bf37fceac3.dirtree new file mode 100644 index 00000000000..d73ed14c2d8 Binary files /dev/null and b/repo/objects/51/eb69f096523c194fb29f7bea9a266c98e8c495e26e29d6c60eb4bf37fceac3.dirtree differ diff --git a/repo/objects/51/f2586d82861021c412c0b5f4fb1294c10afaa727719fd68aed677b3ed47b77.filez b/repo/objects/51/f2586d82861021c412c0b5f4fb1294c10afaa727719fd68aed677b3ed47b77.filez new file mode 100644 index 00000000000..8c657376d60 Binary files /dev/null and b/repo/objects/51/f2586d82861021c412c0b5f4fb1294c10afaa727719fd68aed677b3ed47b77.filez differ diff --git a/repo/objects/51/f8c04aa431d8e17eeda4f7185fe0787ea411b2b29840d4a79b4d9c80145fca.dirtree b/repo/objects/51/f8c04aa431d8e17eeda4f7185fe0787ea411b2b29840d4a79b4d9c80145fca.dirtree new file mode 100644 index 00000000000..12e83b98899 Binary files /dev/null and b/repo/objects/51/f8c04aa431d8e17eeda4f7185fe0787ea411b2b29840d4a79b4d9c80145fca.dirtree differ diff --git a/repo/objects/51/ff96e9b31410ee206ef59cbc77f992730b85bc1459d40ff5119b1ccbae41f1.filez b/repo/objects/51/ff96e9b31410ee206ef59cbc77f992730b85bc1459d40ff5119b1ccbae41f1.filez new file mode 100644 index 00000000000..b3f78194f67 Binary files /dev/null and b/repo/objects/51/ff96e9b31410ee206ef59cbc77f992730b85bc1459d40ff5119b1ccbae41f1.filez differ diff --git a/repo/objects/52/0561963899ce2f8a803fcbfd6b2a21975f35fd86c99ed0de7de9d3242604a7.dirtree b/repo/objects/52/0561963899ce2f8a803fcbfd6b2a21975f35fd86c99ed0de7de9d3242604a7.dirtree new file mode 100644 index 00000000000..b43f2b62546 Binary files /dev/null and b/repo/objects/52/0561963899ce2f8a803fcbfd6b2a21975f35fd86c99ed0de7de9d3242604a7.dirtree differ diff --git a/repo/objects/52/0eb63a3abe0698c8c356da5411a39a3e518b1a4f40d0796582c0ee48000428.dirtree b/repo/objects/52/0eb63a3abe0698c8c356da5411a39a3e518b1a4f40d0796582c0ee48000428.dirtree new file mode 100644 index 00000000000..5770dade153 Binary files /dev/null and b/repo/objects/52/0eb63a3abe0698c8c356da5411a39a3e518b1a4f40d0796582c0ee48000428.dirtree differ diff --git a/repo/objects/52/15249222cc3d0d982ab32b5880c97e2776e7b5b1a12dd46702057a753a98c7.filez b/repo/objects/52/15249222cc3d0d982ab32b5880c97e2776e7b5b1a12dd46702057a753a98c7.filez new file mode 100644 index 00000000000..0e62bcd8952 Binary files /dev/null and b/repo/objects/52/15249222cc3d0d982ab32b5880c97e2776e7b5b1a12dd46702057a753a98c7.filez differ diff --git a/repo/objects/52/24192f8eb63963763284a4818f7672fd02c2f5a2f18ed4b2f17c81de95974f.filez b/repo/objects/52/24192f8eb63963763284a4818f7672fd02c2f5a2f18ed4b2f17c81de95974f.filez new file mode 100644 index 00000000000..35c0f5dac73 Binary files /dev/null and b/repo/objects/52/24192f8eb63963763284a4818f7672fd02c2f5a2f18ed4b2f17c81de95974f.filez differ diff --git a/repo/objects/52/24d1084e7842847d3b9cebcc976f76a018b533aa3521ff81929fdd6c96afc9.filez b/repo/objects/52/24d1084e7842847d3b9cebcc976f76a018b533aa3521ff81929fdd6c96afc9.filez new file mode 100644 index 00000000000..a5ff4ab9ac4 Binary files /dev/null and b/repo/objects/52/24d1084e7842847d3b9cebcc976f76a018b533aa3521ff81929fdd6c96afc9.filez differ diff --git a/repo/objects/52/2d25079a4d71a8c47be3e5dad7562f75bf999e9feb121ae3bb2c90c37c103a.filez b/repo/objects/52/2d25079a4d71a8c47be3e5dad7562f75bf999e9feb121ae3bb2c90c37c103a.filez new file mode 100644 index 00000000000..ce18910e7a2 Binary files /dev/null and b/repo/objects/52/2d25079a4d71a8c47be3e5dad7562f75bf999e9feb121ae3bb2c90c37c103a.filez differ diff --git a/repo/objects/52/4ad53858c8b7dd789a7f71833b19568738e2976b9de56edeeb64f7cfccdfc3.filez b/repo/objects/52/4ad53858c8b7dd789a7f71833b19568738e2976b9de56edeeb64f7cfccdfc3.filez new file mode 100644 index 00000000000..c30295b507c Binary files /dev/null and b/repo/objects/52/4ad53858c8b7dd789a7f71833b19568738e2976b9de56edeeb64f7cfccdfc3.filez differ diff --git a/repo/objects/52/50aee29c536aef080cf571becd8709c5375514915c1b57924f7c1ffdb48f5d.filez b/repo/objects/52/50aee29c536aef080cf571becd8709c5375514915c1b57924f7c1ffdb48f5d.filez new file mode 100644 index 00000000000..3993fe6d961 Binary files /dev/null and b/repo/objects/52/50aee29c536aef080cf571becd8709c5375514915c1b57924f7c1ffdb48f5d.filez differ diff --git a/repo/objects/52/604eeefd034c22ece5ad8fd52a5491a3569825d5cbf91f315c44fa88a135be.filez b/repo/objects/52/604eeefd034c22ece5ad8fd52a5491a3569825d5cbf91f315c44fa88a135be.filez new file mode 100644 index 00000000000..8feb9801aaf Binary files /dev/null and b/repo/objects/52/604eeefd034c22ece5ad8fd52a5491a3569825d5cbf91f315c44fa88a135be.filez differ diff --git a/repo/objects/52/6bdc276bf71971369103fadb15e84fa3485a4a1f0743a6a631f40f5d55f5e2.dirtree b/repo/objects/52/6bdc276bf71971369103fadb15e84fa3485a4a1f0743a6a631f40f5d55f5e2.dirtree new file mode 100644 index 00000000000..81357e50208 Binary files /dev/null and b/repo/objects/52/6bdc276bf71971369103fadb15e84fa3485a4a1f0743a6a631f40f5d55f5e2.dirtree differ diff --git a/repo/objects/52/8367b63d0c6a4cbef111ab3abe44d5ddf320a4654be9c9b175552f78604a39.filez b/repo/objects/52/8367b63d0c6a4cbef111ab3abe44d5ddf320a4654be9c9b175552f78604a39.filez new file mode 100644 index 00000000000..7e7f61c13be Binary files /dev/null and b/repo/objects/52/8367b63d0c6a4cbef111ab3abe44d5ddf320a4654be9c9b175552f78604a39.filez differ diff --git a/repo/objects/52/8e39c1c5af19ccd4cbca6054cbb5e5060a65b27a81e60cdb36b24fa5489f02.filez b/repo/objects/52/8e39c1c5af19ccd4cbca6054cbb5e5060a65b27a81e60cdb36b24fa5489f02.filez new file mode 100644 index 00000000000..e127a7ee028 Binary files /dev/null and b/repo/objects/52/8e39c1c5af19ccd4cbca6054cbb5e5060a65b27a81e60cdb36b24fa5489f02.filez differ diff --git a/repo/objects/52/92cb3c7d54abc3ede00c58ec0dc1e389f3f43ac78a361ca529f6e95d94df16.filez b/repo/objects/52/92cb3c7d54abc3ede00c58ec0dc1e389f3f43ac78a361ca529f6e95d94df16.filez new file mode 100644 index 00000000000..c8f043fa371 Binary files /dev/null and b/repo/objects/52/92cb3c7d54abc3ede00c58ec0dc1e389f3f43ac78a361ca529f6e95d94df16.filez differ diff --git a/repo/objects/52/b7d62770295e289692b8bfba33811846e05696393b13ca9ba753d2bc8a2183.dirtree b/repo/objects/52/b7d62770295e289692b8bfba33811846e05696393b13ca9ba753d2bc8a2183.dirtree new file mode 100644 index 00000000000..ac454e4678a Binary files /dev/null and b/repo/objects/52/b7d62770295e289692b8bfba33811846e05696393b13ca9ba753d2bc8a2183.dirtree differ diff --git a/repo/objects/52/c9a63548f2dd164ca89f7f07d1e7b9879d895904070c038378eae5fcabc91e.filez b/repo/objects/52/c9a63548f2dd164ca89f7f07d1e7b9879d895904070c038378eae5fcabc91e.filez new file mode 100644 index 00000000000..2eea4761b8a Binary files /dev/null and b/repo/objects/52/c9a63548f2dd164ca89f7f07d1e7b9879d895904070c038378eae5fcabc91e.filez differ diff --git a/repo/objects/52/d8608f9037dfe6380640ebad352b3a117f9dc379dc688d6be5ae5f4a0cfaa1.filez b/repo/objects/52/d8608f9037dfe6380640ebad352b3a117f9dc379dc688d6be5ae5f4a0cfaa1.filez new file mode 100644 index 00000000000..5d7e756868b Binary files /dev/null and b/repo/objects/52/d8608f9037dfe6380640ebad352b3a117f9dc379dc688d6be5ae5f4a0cfaa1.filez differ diff --git a/repo/objects/53/19f2e61a889d14439972f95359ac7121ebc9be542e8264feaea401b1aa0a40.filez b/repo/objects/53/19f2e61a889d14439972f95359ac7121ebc9be542e8264feaea401b1aa0a40.filez new file mode 100644 index 00000000000..be5813928c9 Binary files /dev/null and b/repo/objects/53/19f2e61a889d14439972f95359ac7121ebc9be542e8264feaea401b1aa0a40.filez differ diff --git a/repo/objects/53/235512cd116b53e1cbbc50b3c336d6cbc94ed946db064edf676814186310d5.filez b/repo/objects/53/235512cd116b53e1cbbc50b3c336d6cbc94ed946db064edf676814186310d5.filez new file mode 100644 index 00000000000..e9d3b4dd86a Binary files /dev/null and b/repo/objects/53/235512cd116b53e1cbbc50b3c336d6cbc94ed946db064edf676814186310d5.filez differ diff --git a/repo/objects/53/24454c28cdf333fcb0b07d5ad7f5662e03094894f58f4bde126c75750bb432.dirtree b/repo/objects/53/24454c28cdf333fcb0b07d5ad7f5662e03094894f58f4bde126c75750bb432.dirtree new file mode 100644 index 00000000000..6a6f7cbb3a5 Binary files /dev/null and b/repo/objects/53/24454c28cdf333fcb0b07d5ad7f5662e03094894f58f4bde126c75750bb432.dirtree differ diff --git a/repo/objects/53/427933c729f3947cd88d0ccb14677a840594c6eb0a332cc27776b5df66a61f.filez b/repo/objects/53/427933c729f3947cd88d0ccb14677a840594c6eb0a332cc27776b5df66a61f.filez new file mode 100644 index 00000000000..1bda87e76c8 Binary files /dev/null and b/repo/objects/53/427933c729f3947cd88d0ccb14677a840594c6eb0a332cc27776b5df66a61f.filez differ diff --git a/repo/objects/53/4a0909d9d139a75a91cc150f5a98207a82af7fcf7188c51aa6310623375e52.filez b/repo/objects/53/4a0909d9d139a75a91cc150f5a98207a82af7fcf7188c51aa6310623375e52.filez new file mode 100644 index 00000000000..293be91a083 Binary files /dev/null and b/repo/objects/53/4a0909d9d139a75a91cc150f5a98207a82af7fcf7188c51aa6310623375e52.filez differ diff --git a/repo/objects/53/72ae159d2840fe4ce1c3f5015cb64ebadd2622c562f899f966fe402489a570.dirtree b/repo/objects/53/72ae159d2840fe4ce1c3f5015cb64ebadd2622c562f899f966fe402489a570.dirtree new file mode 100644 index 00000000000..88ace1d32cb Binary files /dev/null and b/repo/objects/53/72ae159d2840fe4ce1c3f5015cb64ebadd2622c562f899f966fe402489a570.dirtree differ diff --git a/repo/objects/53/cf67e261885ed59f59cea02aa82b72b234869141faea177c77499e693664cf.filez b/repo/objects/53/cf67e261885ed59f59cea02aa82b72b234869141faea177c77499e693664cf.filez new file mode 100644 index 00000000000..4703335e9bf Binary files /dev/null and b/repo/objects/53/cf67e261885ed59f59cea02aa82b72b234869141faea177c77499e693664cf.filez differ diff --git a/repo/objects/53/e41e22de8f42d7817a83420c4999c04e68526543af0e6940453b9e8c8ab4c3.filez b/repo/objects/53/e41e22de8f42d7817a83420c4999c04e68526543af0e6940453b9e8c8ab4c3.filez new file mode 100644 index 00000000000..a22d5b2f61f Binary files /dev/null and b/repo/objects/53/e41e22de8f42d7817a83420c4999c04e68526543af0e6940453b9e8c8ab4c3.filez differ diff --git a/repo/objects/53/f15505dd4a13f8c4baa731a08c98b9284f8b5275c9b8437d199404bb0099b0.dirtree b/repo/objects/53/f15505dd4a13f8c4baa731a08c98b9284f8b5275c9b8437d199404bb0099b0.dirtree new file mode 100644 index 00000000000..c3a2eb349e9 Binary files /dev/null and b/repo/objects/53/f15505dd4a13f8c4baa731a08c98b9284f8b5275c9b8437d199404bb0099b0.dirtree differ diff --git a/repo/objects/53/fc6f138fa3d2e802d55fd3b153f3d1f6578c8bf54220cc724c63deca051dd8.filez b/repo/objects/53/fc6f138fa3d2e802d55fd3b153f3d1f6578c8bf54220cc724c63deca051dd8.filez new file mode 100644 index 00000000000..93c7aa2ae48 Binary files /dev/null and b/repo/objects/53/fc6f138fa3d2e802d55fd3b153f3d1f6578c8bf54220cc724c63deca051dd8.filez differ diff --git a/repo/objects/54/044d2729543eab6b2c2fe40956d4dbe3ef41d219e877c1955921104d91f277.filez b/repo/objects/54/044d2729543eab6b2c2fe40956d4dbe3ef41d219e877c1955921104d91f277.filez new file mode 100644 index 00000000000..699a2a472e7 Binary files /dev/null and b/repo/objects/54/044d2729543eab6b2c2fe40956d4dbe3ef41d219e877c1955921104d91f277.filez differ diff --git a/repo/objects/54/43d38f16b535ac835b7d3db28544f750506b35790f66a4cb0333f95dc122e4.filez b/repo/objects/54/43d38f16b535ac835b7d3db28544f750506b35790f66a4cb0333f95dc122e4.filez new file mode 100644 index 00000000000..69c09dbe310 Binary files /dev/null and b/repo/objects/54/43d38f16b535ac835b7d3db28544f750506b35790f66a4cb0333f95dc122e4.filez differ diff --git a/repo/objects/54/58df1c915e1e06020c9c74b5b5ab7a4bdf492aed0d0f3ef3ecb20472f1aea6.filez b/repo/objects/54/58df1c915e1e06020c9c74b5b5ab7a4bdf492aed0d0f3ef3ecb20472f1aea6.filez new file mode 100644 index 00000000000..6ab39449af6 Binary files /dev/null and b/repo/objects/54/58df1c915e1e06020c9c74b5b5ab7a4bdf492aed0d0f3ef3ecb20472f1aea6.filez differ diff --git a/repo/objects/54/6bf0c82f6056c82c32896f4bb27fa53a45328ed63894f1a8cce2c8fc004a92.dirtree b/repo/objects/54/6bf0c82f6056c82c32896f4bb27fa53a45328ed63894f1a8cce2c8fc004a92.dirtree new file mode 100644 index 00000000000..67902c72ba3 Binary files /dev/null and b/repo/objects/54/6bf0c82f6056c82c32896f4bb27fa53a45328ed63894f1a8cce2c8fc004a92.dirtree differ diff --git a/repo/objects/54/6d9e01fa984b9df039940a4589b0e1d19283a4a1472355df1f1a69bfa53650.filez b/repo/objects/54/6d9e01fa984b9df039940a4589b0e1d19283a4a1472355df1f1a69bfa53650.filez new file mode 100644 index 00000000000..80251add5f6 Binary files /dev/null and b/repo/objects/54/6d9e01fa984b9df039940a4589b0e1d19283a4a1472355df1f1a69bfa53650.filez differ diff --git a/repo/objects/54/7bb50aafc28134157997d9cf04387e8007707c6a8ede0cde21fefc642bb85c.dirtree b/repo/objects/54/7bb50aafc28134157997d9cf04387e8007707c6a8ede0cde21fefc642bb85c.dirtree new file mode 100644 index 00000000000..63e91f10a1c Binary files /dev/null and b/repo/objects/54/7bb50aafc28134157997d9cf04387e8007707c6a8ede0cde21fefc642bb85c.dirtree differ diff --git a/repo/objects/54/9d80b1047aa59889324130484da9fea4573c6985580a6b8e95cbd91566e1fa.filez b/repo/objects/54/9d80b1047aa59889324130484da9fea4573c6985580a6b8e95cbd91566e1fa.filez new file mode 100644 index 00000000000..86584549225 Binary files /dev/null and b/repo/objects/54/9d80b1047aa59889324130484da9fea4573c6985580a6b8e95cbd91566e1fa.filez differ diff --git a/repo/objects/54/d335322613d8b65e62cdcdd91964aa116fe2568e02155fcc18567d2eaa6bc5.filez b/repo/objects/54/d335322613d8b65e62cdcdd91964aa116fe2568e02155fcc18567d2eaa6bc5.filez new file mode 100644 index 00000000000..210b4e62d24 Binary files /dev/null and b/repo/objects/54/d335322613d8b65e62cdcdd91964aa116fe2568e02155fcc18567d2eaa6bc5.filez differ diff --git a/repo/objects/54/f8bd470aeeba008922ddb6108130e5f22e1f62a9c0916c6846a73e66e11e75.filez b/repo/objects/54/f8bd470aeeba008922ddb6108130e5f22e1f62a9c0916c6846a73e66e11e75.filez new file mode 100644 index 00000000000..ac221cf1f6d Binary files /dev/null and b/repo/objects/54/f8bd470aeeba008922ddb6108130e5f22e1f62a9c0916c6846a73e66e11e75.filez differ diff --git a/repo/objects/55/06b7f1019344f4f60c15ddedf46203ce515fe269461bde7b54c31341e8d08f.filez b/repo/objects/55/06b7f1019344f4f60c15ddedf46203ce515fe269461bde7b54c31341e8d08f.filez new file mode 100644 index 00000000000..1f09a0209ef Binary files /dev/null and b/repo/objects/55/06b7f1019344f4f60c15ddedf46203ce515fe269461bde7b54c31341e8d08f.filez differ diff --git a/repo/objects/55/0a76763869a44802b9444124dbf225e13a51aecca7d63261fc8b2836273a40.filez b/repo/objects/55/0a76763869a44802b9444124dbf225e13a51aecca7d63261fc8b2836273a40.filez new file mode 100644 index 00000000000..b794dd67b7f Binary files /dev/null and b/repo/objects/55/0a76763869a44802b9444124dbf225e13a51aecca7d63261fc8b2836273a40.filez differ diff --git a/repo/objects/55/29d7239d84cff8bcc9f12c85d30b9e3b306ee3e95a72ed480deebabadc0340.filez b/repo/objects/55/29d7239d84cff8bcc9f12c85d30b9e3b306ee3e95a72ed480deebabadc0340.filez new file mode 100644 index 00000000000..229ab84414e Binary files /dev/null and b/repo/objects/55/29d7239d84cff8bcc9f12c85d30b9e3b306ee3e95a72ed480deebabadc0340.filez differ diff --git a/repo/objects/55/29da1c2fc40471ef757fd93c98276be75d270bac35f18b287a385004280d30.filez b/repo/objects/55/29da1c2fc40471ef757fd93c98276be75d270bac35f18b287a385004280d30.filez new file mode 100644 index 00000000000..bcc8c2d72b4 Binary files /dev/null and b/repo/objects/55/29da1c2fc40471ef757fd93c98276be75d270bac35f18b287a385004280d30.filez differ diff --git a/repo/objects/55/46edb0fc684ee5c23a13c04c6f377280164410888c72d4b620f2aac3612361.filez b/repo/objects/55/46edb0fc684ee5c23a13c04c6f377280164410888c72d4b620f2aac3612361.filez new file mode 100644 index 00000000000..bf64b4c481c Binary files /dev/null and b/repo/objects/55/46edb0fc684ee5c23a13c04c6f377280164410888c72d4b620f2aac3612361.filez differ diff --git a/repo/objects/55/4f4ee049b84aedff18e6a74052a4ca50483421bf87948b6e21d8d2f5b49a4b.dirtree b/repo/objects/55/4f4ee049b84aedff18e6a74052a4ca50483421bf87948b6e21d8d2f5b49a4b.dirtree new file mode 100644 index 00000000000..4b76e3b3c96 Binary files /dev/null and b/repo/objects/55/4f4ee049b84aedff18e6a74052a4ca50483421bf87948b6e21d8d2f5b49a4b.dirtree differ diff --git a/repo/objects/55/5598d2d19af6ed8e62852b09c68434cc08d5e3a55f6d1dcdf31aa018e86bb2.dirtree b/repo/objects/55/5598d2d19af6ed8e62852b09c68434cc08d5e3a55f6d1dcdf31aa018e86bb2.dirtree new file mode 100644 index 00000000000..13b9eaf9a41 Binary files /dev/null and b/repo/objects/55/5598d2d19af6ed8e62852b09c68434cc08d5e3a55f6d1dcdf31aa018e86bb2.dirtree differ diff --git a/repo/objects/55/64d5497afdfa5484bfb626e8170aebc631c0b32ad4b420a4b118da0ccfe3ac.filez b/repo/objects/55/64d5497afdfa5484bfb626e8170aebc631c0b32ad4b420a4b118da0ccfe3ac.filez new file mode 100644 index 00000000000..c82bfc2eafb Binary files /dev/null and b/repo/objects/55/64d5497afdfa5484bfb626e8170aebc631c0b32ad4b420a4b118da0ccfe3ac.filez differ diff --git a/repo/objects/55/6adc0999a4f4a310334aba26cf830c90a09e4479f0ceaed69ae8b4bfd2471e.dirtree b/repo/objects/55/6adc0999a4f4a310334aba26cf830c90a09e4479f0ceaed69ae8b4bfd2471e.dirtree new file mode 100644 index 00000000000..c429ba9919f Binary files /dev/null and b/repo/objects/55/6adc0999a4f4a310334aba26cf830c90a09e4479f0ceaed69ae8b4bfd2471e.dirtree differ diff --git a/repo/objects/55/6ffc96c0f065a2cfc7bff58912966a09bd618ecb98e1487a94b5a6da0f176a.filez b/repo/objects/55/6ffc96c0f065a2cfc7bff58912966a09bd618ecb98e1487a94b5a6da0f176a.filez new file mode 100644 index 00000000000..705e9595c9f Binary files /dev/null and b/repo/objects/55/6ffc96c0f065a2cfc7bff58912966a09bd618ecb98e1487a94b5a6da0f176a.filez differ diff --git a/repo/objects/55/9c295a8e598909f6da90a49a7e644eadde4b70f040a2c079cc6b86c573cfaf.dirtree b/repo/objects/55/9c295a8e598909f6da90a49a7e644eadde4b70f040a2c079cc6b86c573cfaf.dirtree new file mode 100644 index 00000000000..2e3b16f6af5 Binary files /dev/null and b/repo/objects/55/9c295a8e598909f6da90a49a7e644eadde4b70f040a2c079cc6b86c573cfaf.dirtree differ diff --git a/repo/objects/55/a1688f11b9e54c2a78d4697b310c86348fe6a7ff571efda153c0a5c14d333f.filez b/repo/objects/55/a1688f11b9e54c2a78d4697b310c86348fe6a7ff571efda153c0a5c14d333f.filez new file mode 100644 index 00000000000..fbd7a0f6622 Binary files /dev/null and b/repo/objects/55/a1688f11b9e54c2a78d4697b310c86348fe6a7ff571efda153c0a5c14d333f.filez differ diff --git a/repo/objects/55/ccb982c563a0fd23e387a10f45d444c345defbda187f0388a16b2947eb0b86.filez b/repo/objects/55/ccb982c563a0fd23e387a10f45d444c345defbda187f0388a16b2947eb0b86.filez new file mode 100644 index 00000000000..648e5d30bf7 Binary files /dev/null and b/repo/objects/55/ccb982c563a0fd23e387a10f45d444c345defbda187f0388a16b2947eb0b86.filez differ diff --git a/repo/objects/55/cdecece00a699579ffa5efe67634a56d9e92059873c7475a7ad72fdda8a8d8.filez b/repo/objects/55/cdecece00a699579ffa5efe67634a56d9e92059873c7475a7ad72fdda8a8d8.filez new file mode 100644 index 00000000000..8a86bb1855a Binary files /dev/null and b/repo/objects/55/cdecece00a699579ffa5efe67634a56d9e92059873c7475a7ad72fdda8a8d8.filez differ diff --git a/repo/objects/55/d7e01194aacecee8dddb78085625c27e8c2b0994def77c1d4e9dffc0eefd24.filez b/repo/objects/55/d7e01194aacecee8dddb78085625c27e8c2b0994def77c1d4e9dffc0eefd24.filez new file mode 100644 index 00000000000..726c7d4a7e4 Binary files /dev/null and b/repo/objects/55/d7e01194aacecee8dddb78085625c27e8c2b0994def77c1d4e9dffc0eefd24.filez differ diff --git a/repo/objects/55/eef090ac3422bbb29118666852ea5c9c994c197e70ebd99bc1c8e7065d889a.filez b/repo/objects/55/eef090ac3422bbb29118666852ea5c9c994c197e70ebd99bc1c8e7065d889a.filez new file mode 100644 index 00000000000..fd2050ada6d Binary files /dev/null and b/repo/objects/55/eef090ac3422bbb29118666852ea5c9c994c197e70ebd99bc1c8e7065d889a.filez differ diff --git a/repo/objects/55/f12ee66959c5edfb43c7d6101bf17b2b49f102f812b38bdba2a82640c0316b.filez b/repo/objects/55/f12ee66959c5edfb43c7d6101bf17b2b49f102f812b38bdba2a82640c0316b.filez new file mode 100644 index 00000000000..78ca8e82bbe Binary files /dev/null and b/repo/objects/55/f12ee66959c5edfb43c7d6101bf17b2b49f102f812b38bdba2a82640c0316b.filez differ diff --git a/repo/objects/56/49bd1eff989b6f4d192b38a5b4829473d06e0a9c425d8ad4517de5e5c9cc89.filez b/repo/objects/56/49bd1eff989b6f4d192b38a5b4829473d06e0a9c425d8ad4517de5e5c9cc89.filez new file mode 100644 index 00000000000..a10d22e5d42 Binary files /dev/null and b/repo/objects/56/49bd1eff989b6f4d192b38a5b4829473d06e0a9c425d8ad4517de5e5c9cc89.filez differ diff --git a/repo/objects/56/66c708c81ab6b2b0b9b422482d770229c128e01141b9606297ae7ae049c6d1.filez b/repo/objects/56/66c708c81ab6b2b0b9b422482d770229c128e01141b9606297ae7ae049c6d1.filez new file mode 100644 index 00000000000..ca91c26aa12 Binary files /dev/null and b/repo/objects/56/66c708c81ab6b2b0b9b422482d770229c128e01141b9606297ae7ae049c6d1.filez differ diff --git a/repo/objects/56/6e54e008658f1d9cfa6137128f2a11ffeba7e45657949cc73814971000a3c7.filez b/repo/objects/56/6e54e008658f1d9cfa6137128f2a11ffeba7e45657949cc73814971000a3c7.filez new file mode 100644 index 00000000000..91d9d424fb3 Binary files /dev/null and b/repo/objects/56/6e54e008658f1d9cfa6137128f2a11ffeba7e45657949cc73814971000a3c7.filez differ diff --git a/repo/objects/56/8ee206eb6e9f6d8ca8ad27bee54628968b70b5cc898936e02a26e4b8167f1e.filez b/repo/objects/56/8ee206eb6e9f6d8ca8ad27bee54628968b70b5cc898936e02a26e4b8167f1e.filez new file mode 100644 index 00000000000..7f9051615bd Binary files /dev/null and b/repo/objects/56/8ee206eb6e9f6d8ca8ad27bee54628968b70b5cc898936e02a26e4b8167f1e.filez differ diff --git a/repo/objects/56/93b5214d5742ea3fe22b5d9b107ceeaaef60273e3bb77ebf8176d7d102339a.dirtree b/repo/objects/56/93b5214d5742ea3fe22b5d9b107ceeaaef60273e3bb77ebf8176d7d102339a.dirtree new file mode 100644 index 00000000000..b92ffc31e6e Binary files /dev/null and b/repo/objects/56/93b5214d5742ea3fe22b5d9b107ceeaaef60273e3bb77ebf8176d7d102339a.dirtree differ diff --git a/repo/objects/56/a13fc97b95ab3feb3588420b0dd367b2e131b9c9d1d3003d9f8a16d8fe7815.filez b/repo/objects/56/a13fc97b95ab3feb3588420b0dd367b2e131b9c9d1d3003d9f8a16d8fe7815.filez new file mode 100644 index 00000000000..46c9dcc7142 Binary files /dev/null and b/repo/objects/56/a13fc97b95ab3feb3588420b0dd367b2e131b9c9d1d3003d9f8a16d8fe7815.filez differ diff --git a/repo/objects/56/abc467335914b643606a29c5bf8385f88a38dcfb70ae60f246ed7f0e9d9880.filez b/repo/objects/56/abc467335914b643606a29c5bf8385f88a38dcfb70ae60f246ed7f0e9d9880.filez new file mode 100644 index 00000000000..0937471c9eb Binary files /dev/null and b/repo/objects/56/abc467335914b643606a29c5bf8385f88a38dcfb70ae60f246ed7f0e9d9880.filez differ diff --git a/repo/objects/56/f785b809b70fa79f33db1fb48e5015b8cff7d508c5547d066da61e88ccefbe.dirtree b/repo/objects/56/f785b809b70fa79f33db1fb48e5015b8cff7d508c5547d066da61e88ccefbe.dirtree new file mode 100644 index 00000000000..a65344e2eee Binary files /dev/null and b/repo/objects/56/f785b809b70fa79f33db1fb48e5015b8cff7d508c5547d066da61e88ccefbe.dirtree differ diff --git a/repo/objects/57/030b343fdd799a54c1a6bd8263f6f598b75ce368644607b91f19421105cb9a.filez b/repo/objects/57/030b343fdd799a54c1a6bd8263f6f598b75ce368644607b91f19421105cb9a.filez new file mode 100644 index 00000000000..06235c7505c Binary files /dev/null and b/repo/objects/57/030b343fdd799a54c1a6bd8263f6f598b75ce368644607b91f19421105cb9a.filez differ diff --git a/repo/objects/57/20f469adc5050f5c68925859714ab2b0448f6a98af1d19465abfec44370ac7.filez b/repo/objects/57/20f469adc5050f5c68925859714ab2b0448f6a98af1d19465abfec44370ac7.filez new file mode 100644 index 00000000000..54eb0225115 Binary files /dev/null and b/repo/objects/57/20f469adc5050f5c68925859714ab2b0448f6a98af1d19465abfec44370ac7.filez differ diff --git a/repo/objects/57/36c4442b65e93b01c18a1065c9113d74e7e52560ce69793b840f43f0f2e9fc.filez b/repo/objects/57/36c4442b65e93b01c18a1065c9113d74e7e52560ce69793b840f43f0f2e9fc.filez new file mode 100644 index 00000000000..8976b239ee6 Binary files /dev/null and b/repo/objects/57/36c4442b65e93b01c18a1065c9113d74e7e52560ce69793b840f43f0f2e9fc.filez differ diff --git a/repo/objects/57/98f49e15b55163f637dfdf31a76ac5117d44561b7281826126f4969629d0fb.filez b/repo/objects/57/98f49e15b55163f637dfdf31a76ac5117d44561b7281826126f4969629d0fb.filez new file mode 100644 index 00000000000..7fb7f398859 Binary files /dev/null and b/repo/objects/57/98f49e15b55163f637dfdf31a76ac5117d44561b7281826126f4969629d0fb.filez differ diff --git a/repo/objects/57/a4f8ffd6f9cb552d363edf092bd47286539c0c9b99ef1bd66b2d11e8d4a0ed.filez b/repo/objects/57/a4f8ffd6f9cb552d363edf092bd47286539c0c9b99ef1bd66b2d11e8d4a0ed.filez new file mode 100644 index 00000000000..79f43cc25f6 Binary files /dev/null and b/repo/objects/57/a4f8ffd6f9cb552d363edf092bd47286539c0c9b99ef1bd66b2d11e8d4a0ed.filez differ diff --git a/repo/objects/57/b37b289f82d36ffa6b39ebb5f742a76af63ae2212af187d9a26f2980320ced.filez b/repo/objects/57/b37b289f82d36ffa6b39ebb5f742a76af63ae2212af187d9a26f2980320ced.filez new file mode 100644 index 00000000000..36a0840c74c Binary files /dev/null and b/repo/objects/57/b37b289f82d36ffa6b39ebb5f742a76af63ae2212af187d9a26f2980320ced.filez differ diff --git a/repo/objects/57/e1948fa520d18f59e1311d8d4bc9eaafb0f21e00a58abd3eb36bd468605bf9.filez b/repo/objects/57/e1948fa520d18f59e1311d8d4bc9eaafb0f21e00a58abd3eb36bd468605bf9.filez new file mode 100644 index 00000000000..4b5be0ece18 Binary files /dev/null and b/repo/objects/57/e1948fa520d18f59e1311d8d4bc9eaafb0f21e00a58abd3eb36bd468605bf9.filez differ diff --git a/repo/objects/58/07f0836c591162f52663b44964f41a4a60403f97a29fd257eb1d5f410a0d37.dirtree b/repo/objects/58/07f0836c591162f52663b44964f41a4a60403f97a29fd257eb1d5f410a0d37.dirtree new file mode 100644 index 00000000000..54bed39955b Binary files /dev/null and b/repo/objects/58/07f0836c591162f52663b44964f41a4a60403f97a29fd257eb1d5f410a0d37.dirtree differ diff --git a/repo/objects/58/0bc0fc1dba81d375dbaebf2afde5ba8b8476d138bb9da7ec0312a93308b356.dirtree b/repo/objects/58/0bc0fc1dba81d375dbaebf2afde5ba8b8476d138bb9da7ec0312a93308b356.dirtree new file mode 100644 index 00000000000..a0d2d8a7700 Binary files /dev/null and b/repo/objects/58/0bc0fc1dba81d375dbaebf2afde5ba8b8476d138bb9da7ec0312a93308b356.dirtree differ diff --git a/repo/objects/58/4013477c6c3f9669e3adf29b5afd9e2f983669f4540370e543a9975603d2be.filez b/repo/objects/58/4013477c6c3f9669e3adf29b5afd9e2f983669f4540370e543a9975603d2be.filez new file mode 100644 index 00000000000..9592864f993 Binary files /dev/null and b/repo/objects/58/4013477c6c3f9669e3adf29b5afd9e2f983669f4540370e543a9975603d2be.filez differ diff --git a/repo/objects/58/9996607c42cf9989d63c27299f4c25d0daa029986731f7d50fe4d6ed7c98e0.filez b/repo/objects/58/9996607c42cf9989d63c27299f4c25d0daa029986731f7d50fe4d6ed7c98e0.filez new file mode 100644 index 00000000000..712dc18339b Binary files /dev/null and b/repo/objects/58/9996607c42cf9989d63c27299f4c25d0daa029986731f7d50fe4d6ed7c98e0.filez differ diff --git a/repo/objects/58/aa3ff0b306a8346e1e1afd40080985659be6228ec94f14b6b1be772a2a8cc5.dirtree b/repo/objects/58/aa3ff0b306a8346e1e1afd40080985659be6228ec94f14b6b1be772a2a8cc5.dirtree new file mode 100644 index 00000000000..2faf14cafa0 Binary files /dev/null and b/repo/objects/58/aa3ff0b306a8346e1e1afd40080985659be6228ec94f14b6b1be772a2a8cc5.dirtree differ diff --git a/repo/objects/58/b2fbfe0468bd0e318bd6e43f6db3d607a2fb83bd0c3dec0dd9d013fa213032.filez b/repo/objects/58/b2fbfe0468bd0e318bd6e43f6db3d607a2fb83bd0c3dec0dd9d013fa213032.filez new file mode 100644 index 00000000000..1173042f31c Binary files /dev/null and b/repo/objects/58/b2fbfe0468bd0e318bd6e43f6db3d607a2fb83bd0c3dec0dd9d013fa213032.filez differ diff --git a/repo/objects/58/c44c3d5a0780e373fbd03624bd1a4c7cfa9c33ce6d0251c18fd729cd93a515.filez b/repo/objects/58/c44c3d5a0780e373fbd03624bd1a4c7cfa9c33ce6d0251c18fd729cd93a515.filez new file mode 100644 index 00000000000..44798b351f8 Binary files /dev/null and b/repo/objects/58/c44c3d5a0780e373fbd03624bd1a4c7cfa9c33ce6d0251c18fd729cd93a515.filez differ diff --git a/repo/objects/59/07248c96f2d09c4a0c3c7f483b34dfe0521d5315e59350dfdd6854fbcc5539.filez b/repo/objects/59/07248c96f2d09c4a0c3c7f483b34dfe0521d5315e59350dfdd6854fbcc5539.filez new file mode 100644 index 00000000000..e76f25861f5 Binary files /dev/null and b/repo/objects/59/07248c96f2d09c4a0c3c7f483b34dfe0521d5315e59350dfdd6854fbcc5539.filez differ diff --git a/repo/objects/59/1e5392b67a097423c07b2376a341647a19192feeaf4beebc467463b126e9cf.dirtree b/repo/objects/59/1e5392b67a097423c07b2376a341647a19192feeaf4beebc467463b126e9cf.dirtree new file mode 100644 index 00000000000..77bacbdc668 Binary files /dev/null and b/repo/objects/59/1e5392b67a097423c07b2376a341647a19192feeaf4beebc467463b126e9cf.dirtree differ diff --git a/repo/objects/59/205bb048a0bf0bb6101ebf72124dca12ab4f725ae783b1431cf5947da2179e.dirtree b/repo/objects/59/205bb048a0bf0bb6101ebf72124dca12ab4f725ae783b1431cf5947da2179e.dirtree new file mode 100644 index 00000000000..63b08125c73 Binary files /dev/null and b/repo/objects/59/205bb048a0bf0bb6101ebf72124dca12ab4f725ae783b1431cf5947da2179e.dirtree differ diff --git a/repo/objects/59/6112b68c43992344253bfa748eb733742b5e1e3ec4112d655381d3a80e6b05.filez b/repo/objects/59/6112b68c43992344253bfa748eb733742b5e1e3ec4112d655381d3a80e6b05.filez new file mode 100644 index 00000000000..62d057f63ec Binary files /dev/null and b/repo/objects/59/6112b68c43992344253bfa748eb733742b5e1e3ec4112d655381d3a80e6b05.filez differ diff --git a/repo/objects/59/8e8387f28104d48a2b8d6753ee8b1b5f4c9f4b0072b15dbd6b8235f15db54d.filez b/repo/objects/59/8e8387f28104d48a2b8d6753ee8b1b5f4c9f4b0072b15dbd6b8235f15db54d.filez new file mode 100644 index 00000000000..79629ccfd43 Binary files /dev/null and b/repo/objects/59/8e8387f28104d48a2b8d6753ee8b1b5f4c9f4b0072b15dbd6b8235f15db54d.filez differ diff --git a/repo/objects/59/961d96ac3030f0e355db49d1009698b064d225fce339e211d6b466d70050c7.filez b/repo/objects/59/961d96ac3030f0e355db49d1009698b064d225fce339e211d6b466d70050c7.filez new file mode 100644 index 00000000000..ce44c67fa04 Binary files /dev/null and b/repo/objects/59/961d96ac3030f0e355db49d1009698b064d225fce339e211d6b466d70050c7.filez differ diff --git a/repo/objects/59/9be31300c6557d863a5701ecc998aab696bb082a3ab267a7c8b29165c86756.filez b/repo/objects/59/9be31300c6557d863a5701ecc998aab696bb082a3ab267a7c8b29165c86756.filez new file mode 100644 index 00000000000..59f219d419d Binary files /dev/null and b/repo/objects/59/9be31300c6557d863a5701ecc998aab696bb082a3ab267a7c8b29165c86756.filez differ diff --git a/repo/objects/59/ad07e4c265126070c8763f2cd1b2143375407e3ea7f0683224d9de75421a09.filez b/repo/objects/59/ad07e4c265126070c8763f2cd1b2143375407e3ea7f0683224d9de75421a09.filez new file mode 100644 index 00000000000..0a139b8eb77 Binary files /dev/null and b/repo/objects/59/ad07e4c265126070c8763f2cd1b2143375407e3ea7f0683224d9de75421a09.filez differ diff --git a/repo/objects/59/b7870d423fca0c46b766b9b7ad16931f14751207816feaad3c0e1da2015e6d.filez b/repo/objects/59/b7870d423fca0c46b766b9b7ad16931f14751207816feaad3c0e1da2015e6d.filez new file mode 100644 index 00000000000..bf7fbadff3b Binary files /dev/null and b/repo/objects/59/b7870d423fca0c46b766b9b7ad16931f14751207816feaad3c0e1da2015e6d.filez differ diff --git a/repo/objects/59/c98dce8663823bfdc4a343675fe742fa98c846fb1b7d3b96e12e27edd66e99.filez b/repo/objects/59/c98dce8663823bfdc4a343675fe742fa98c846fb1b7d3b96e12e27edd66e99.filez new file mode 100644 index 00000000000..5e6353b7530 Binary files /dev/null and b/repo/objects/59/c98dce8663823bfdc4a343675fe742fa98c846fb1b7d3b96e12e27edd66e99.filez differ diff --git a/repo/objects/59/d82d78827f479ad6dcddd70a4055c3bba54c3c357003da97878a496be4dbec.filez b/repo/objects/59/d82d78827f479ad6dcddd70a4055c3bba54c3c357003da97878a496be4dbec.filez new file mode 100644 index 00000000000..1e0d36dc865 Binary files /dev/null and b/repo/objects/59/d82d78827f479ad6dcddd70a4055c3bba54c3c357003da97878a496be4dbec.filez differ diff --git a/repo/objects/59/dba3b54a3e4d7f7c94614a789bf8515a0b62e066b87a73dafb89c0e015fd00.filez b/repo/objects/59/dba3b54a3e4d7f7c94614a789bf8515a0b62e066b87a73dafb89c0e015fd00.filez new file mode 100644 index 00000000000..01caa91691c Binary files /dev/null and b/repo/objects/59/dba3b54a3e4d7f7c94614a789bf8515a0b62e066b87a73dafb89c0e015fd00.filez differ diff --git a/repo/objects/59/f0bcec3e5fbc445be567018e58ee0091d7eaf31797e5ca2da969411e02bbe0.filez b/repo/objects/59/f0bcec3e5fbc445be567018e58ee0091d7eaf31797e5ca2da969411e02bbe0.filez new file mode 100644 index 00000000000..4dd22c99df6 Binary files /dev/null and b/repo/objects/59/f0bcec3e5fbc445be567018e58ee0091d7eaf31797e5ca2da969411e02bbe0.filez differ diff --git a/repo/objects/59/f57e14112fa474c3171b3c80999d977097d93422818cb3bb4960a9331cd453.filez b/repo/objects/59/f57e14112fa474c3171b3c80999d977097d93422818cb3bb4960a9331cd453.filez new file mode 100644 index 00000000000..ae665bf4eb7 Binary files /dev/null and b/repo/objects/59/f57e14112fa474c3171b3c80999d977097d93422818cb3bb4960a9331cd453.filez differ diff --git a/repo/objects/5a/3dc42cefc4475f9beaad73bf45aaa70aecc18ac844ec627102f4710e52c6b8.filez b/repo/objects/5a/3dc42cefc4475f9beaad73bf45aaa70aecc18ac844ec627102f4710e52c6b8.filez new file mode 100644 index 00000000000..05c527ccdf0 Binary files /dev/null and b/repo/objects/5a/3dc42cefc4475f9beaad73bf45aaa70aecc18ac844ec627102f4710e52c6b8.filez differ diff --git a/repo/objects/5a/75bba4c3e3362be624cba83993df3d7ebe93a48dd6a541ee90c27629bcb0a1.filez b/repo/objects/5a/75bba4c3e3362be624cba83993df3d7ebe93a48dd6a541ee90c27629bcb0a1.filez new file mode 100644 index 00000000000..65b1af33adf Binary files /dev/null and b/repo/objects/5a/75bba4c3e3362be624cba83993df3d7ebe93a48dd6a541ee90c27629bcb0a1.filez differ diff --git a/repo/objects/5a/855cea580775e89f910ab589c079822e1235c4668283c15d9786dea88a2a36.filez b/repo/objects/5a/855cea580775e89f910ab589c079822e1235c4668283c15d9786dea88a2a36.filez new file mode 100644 index 00000000000..0f4470c2765 Binary files /dev/null and b/repo/objects/5a/855cea580775e89f910ab589c079822e1235c4668283c15d9786dea88a2a36.filez differ diff --git a/repo/objects/5a/8a66529cb2c3d8e7d486f29b9ce5d7095fb8b93aa582a0984779bc1fdce358.filez b/repo/objects/5a/8a66529cb2c3d8e7d486f29b9ce5d7095fb8b93aa582a0984779bc1fdce358.filez new file mode 100644 index 00000000000..6d5d9fbf23f Binary files /dev/null and b/repo/objects/5a/8a66529cb2c3d8e7d486f29b9ce5d7095fb8b93aa582a0984779bc1fdce358.filez differ diff --git a/repo/objects/5a/962d554b11d759be408c19362cfef8c2e9f816c016d48014e7237a29efa3de.filez b/repo/objects/5a/962d554b11d759be408c19362cfef8c2e9f816c016d48014e7237a29efa3de.filez new file mode 100644 index 00000000000..d7b21a97db3 Binary files /dev/null and b/repo/objects/5a/962d554b11d759be408c19362cfef8c2e9f816c016d48014e7237a29efa3de.filez differ diff --git a/repo/objects/5a/c179e578a954ba5942a8620da4b9d04e1450d284c3f81e321cf913260d6aab.filez b/repo/objects/5a/c179e578a954ba5942a8620da4b9d04e1450d284c3f81e321cf913260d6aab.filez new file mode 100644 index 00000000000..83d16743b03 Binary files /dev/null and b/repo/objects/5a/c179e578a954ba5942a8620da4b9d04e1450d284c3f81e321cf913260d6aab.filez differ diff --git a/repo/objects/5a/cbb8281c7bddbe2be7e330a18b6cf5bcb9717955ebc005cca8b997b05a57b5.filez b/repo/objects/5a/cbb8281c7bddbe2be7e330a18b6cf5bcb9717955ebc005cca8b997b05a57b5.filez new file mode 100644 index 00000000000..afe5b224dc6 Binary files /dev/null and b/repo/objects/5a/cbb8281c7bddbe2be7e330a18b6cf5bcb9717955ebc005cca8b997b05a57b5.filez differ diff --git a/repo/objects/5a/f65ac713a2f75de595c480cbd6be207414190018b26aa140c81bc2bac53034.dirtree b/repo/objects/5a/f65ac713a2f75de595c480cbd6be207414190018b26aa140c81bc2bac53034.dirtree new file mode 100644 index 00000000000..c0c42a19002 Binary files /dev/null and b/repo/objects/5a/f65ac713a2f75de595c480cbd6be207414190018b26aa140c81bc2bac53034.dirtree differ diff --git a/repo/objects/5b/017f158d7f6fcdd31f2f22fef54f0e4bd1cf2d00f0c2b6d19f7d5b8635d281.filez b/repo/objects/5b/017f158d7f6fcdd31f2f22fef54f0e4bd1cf2d00f0c2b6d19f7d5b8635d281.filez new file mode 100644 index 00000000000..6ec4c57b1d3 Binary files /dev/null and b/repo/objects/5b/017f158d7f6fcdd31f2f22fef54f0e4bd1cf2d00f0c2b6d19f7d5b8635d281.filez differ diff --git a/repo/objects/5b/151bea6d9ade3e5e11650f8ab0962b48bb2340d98dd2e7f22436fcd83ad388.filez b/repo/objects/5b/151bea6d9ade3e5e11650f8ab0962b48bb2340d98dd2e7f22436fcd83ad388.filez new file mode 100644 index 00000000000..2efbe615fdf Binary files /dev/null and b/repo/objects/5b/151bea6d9ade3e5e11650f8ab0962b48bb2340d98dd2e7f22436fcd83ad388.filez differ diff --git a/repo/objects/5b/15d14a6a5f3d9da0cb4893dc0948021b892a09dda52619b8f2937eee63246e.filez b/repo/objects/5b/15d14a6a5f3d9da0cb4893dc0948021b892a09dda52619b8f2937eee63246e.filez new file mode 100644 index 00000000000..514ec5f9ff4 Binary files /dev/null and b/repo/objects/5b/15d14a6a5f3d9da0cb4893dc0948021b892a09dda52619b8f2937eee63246e.filez differ diff --git a/repo/objects/5b/20d1606ba2a0bf041bcfb0acbed24d96dc7ec5e292ef229e247480102cd4b9.filez b/repo/objects/5b/20d1606ba2a0bf041bcfb0acbed24d96dc7ec5e292ef229e247480102cd4b9.filez new file mode 100644 index 00000000000..34d7b352650 Binary files /dev/null and b/repo/objects/5b/20d1606ba2a0bf041bcfb0acbed24d96dc7ec5e292ef229e247480102cd4b9.filez differ diff --git a/repo/objects/5b/892b77791c1edc3bd9447aaa4ddab4ab367d45c2f375dde9ad5ef6febf51f2.filez b/repo/objects/5b/892b77791c1edc3bd9447aaa4ddab4ab367d45c2f375dde9ad5ef6febf51f2.filez new file mode 100644 index 00000000000..fd935df59f6 Binary files /dev/null and b/repo/objects/5b/892b77791c1edc3bd9447aaa4ddab4ab367d45c2f375dde9ad5ef6febf51f2.filez differ diff --git a/repo/objects/5b/954c6db5dca54fd12223f964114961c96d03bbea7660a2b06e429165e19a04.filez b/repo/objects/5b/954c6db5dca54fd12223f964114961c96d03bbea7660a2b06e429165e19a04.filez new file mode 100644 index 00000000000..e412ef35077 Binary files /dev/null and b/repo/objects/5b/954c6db5dca54fd12223f964114961c96d03bbea7660a2b06e429165e19a04.filez differ diff --git a/repo/objects/5b/c6fffd95f2a25f48ec69ef82e89591bfb76ef6813a3c6829dedd96004fd633.filez b/repo/objects/5b/c6fffd95f2a25f48ec69ef82e89591bfb76ef6813a3c6829dedd96004fd633.filez new file mode 100644 index 00000000000..f4a335037a0 Binary files /dev/null and b/repo/objects/5b/c6fffd95f2a25f48ec69ef82e89591bfb76ef6813a3c6829dedd96004fd633.filez differ diff --git a/repo/objects/5b/ca433d0c6243b3d216ebf8dc70b27b990a74c6e7d729f6e3d5fa5ef8ea1394.filez b/repo/objects/5b/ca433d0c6243b3d216ebf8dc70b27b990a74c6e7d729f6e3d5fa5ef8ea1394.filez new file mode 100644 index 00000000000..bd1dfded03f Binary files /dev/null and b/repo/objects/5b/ca433d0c6243b3d216ebf8dc70b27b990a74c6e7d729f6e3d5fa5ef8ea1394.filez differ diff --git a/repo/objects/5b/f468662646dbc88963d675e269c6c1b7b5b318512ec49243035c00754feea5.filez b/repo/objects/5b/f468662646dbc88963d675e269c6c1b7b5b318512ec49243035c00754feea5.filez new file mode 100644 index 00000000000..4ec3bf35d1a Binary files /dev/null and b/repo/objects/5b/f468662646dbc88963d675e269c6c1b7b5b318512ec49243035c00754feea5.filez differ diff --git a/repo/objects/5b/fd914d6d33aa32895962004545b5896ed5ee5ba2a57fb73ec32f1042ea3191.filez b/repo/objects/5b/fd914d6d33aa32895962004545b5896ed5ee5ba2a57fb73ec32f1042ea3191.filez new file mode 100644 index 00000000000..c4e19696b33 Binary files /dev/null and b/repo/objects/5b/fd914d6d33aa32895962004545b5896ed5ee5ba2a57fb73ec32f1042ea3191.filez differ diff --git a/repo/objects/5c/013caf21ce77d935fd59a4a5f849c11b86141dda783ca871b43cc13ca295c8.dirtree b/repo/objects/5c/013caf21ce77d935fd59a4a5f849c11b86141dda783ca871b43cc13ca295c8.dirtree new file mode 100644 index 00000000000..75e064b3f38 Binary files /dev/null and b/repo/objects/5c/013caf21ce77d935fd59a4a5f849c11b86141dda783ca871b43cc13ca295c8.dirtree differ diff --git a/repo/objects/5c/06f4f6dc85d3f9bb6dfd2e3fc62c0d825fe7fe967a3026c4983ce272f3b1d4.dirtree b/repo/objects/5c/06f4f6dc85d3f9bb6dfd2e3fc62c0d825fe7fe967a3026c4983ce272f3b1d4.dirtree new file mode 100644 index 00000000000..55de6dc6944 Binary files /dev/null and b/repo/objects/5c/06f4f6dc85d3f9bb6dfd2e3fc62c0d825fe7fe967a3026c4983ce272f3b1d4.dirtree differ diff --git a/repo/objects/5c/32336afaf336b019ab20822a5e340a6cc88348091dabf52a5929a1e696e865.filez b/repo/objects/5c/32336afaf336b019ab20822a5e340a6cc88348091dabf52a5929a1e696e865.filez new file mode 100644 index 00000000000..51a16269172 Binary files /dev/null and b/repo/objects/5c/32336afaf336b019ab20822a5e340a6cc88348091dabf52a5929a1e696e865.filez differ diff --git a/repo/objects/5c/3eb5b42ffed1f34db161ef85fb41f54bd56ba4aadc0baa45f5518a7d839dd4.filez b/repo/objects/5c/3eb5b42ffed1f34db161ef85fb41f54bd56ba4aadc0baa45f5518a7d839dd4.filez new file mode 100644 index 00000000000..acb6b836c3d Binary files /dev/null and b/repo/objects/5c/3eb5b42ffed1f34db161ef85fb41f54bd56ba4aadc0baa45f5518a7d839dd4.filez differ diff --git a/repo/objects/5c/7a4b80d633f9ef27630c98e404947568e4ac7d0e2810a0649ae12eab6bff77.filez b/repo/objects/5c/7a4b80d633f9ef27630c98e404947568e4ac7d0e2810a0649ae12eab6bff77.filez new file mode 100644 index 00000000000..951c4fc5ef8 Binary files /dev/null and b/repo/objects/5c/7a4b80d633f9ef27630c98e404947568e4ac7d0e2810a0649ae12eab6bff77.filez differ diff --git a/repo/objects/5c/7add6c8ce358eafa8fa57455207a8e49f9a35e9512e33a0e97cef5cd3751d0.filez b/repo/objects/5c/7add6c8ce358eafa8fa57455207a8e49f9a35e9512e33a0e97cef5cd3751d0.filez new file mode 100644 index 00000000000..da6be077276 Binary files /dev/null and b/repo/objects/5c/7add6c8ce358eafa8fa57455207a8e49f9a35e9512e33a0e97cef5cd3751d0.filez differ diff --git a/repo/objects/5c/7c49d4c8ade2a76ecf2f1a04f532291c274851ee01765296b83bc5b2b14865.dirtree b/repo/objects/5c/7c49d4c8ade2a76ecf2f1a04f532291c274851ee01765296b83bc5b2b14865.dirtree new file mode 100644 index 00000000000..e1fdd24899f Binary files /dev/null and b/repo/objects/5c/7c49d4c8ade2a76ecf2f1a04f532291c274851ee01765296b83bc5b2b14865.dirtree differ diff --git a/repo/objects/5c/818925722efc3da0b883acc452a20b118fdbe61b2ad10d89265ba1ca8df754.filez b/repo/objects/5c/818925722efc3da0b883acc452a20b118fdbe61b2ad10d89265ba1ca8df754.filez new file mode 100644 index 00000000000..c5a502b802d Binary files /dev/null and b/repo/objects/5c/818925722efc3da0b883acc452a20b118fdbe61b2ad10d89265ba1ca8df754.filez differ diff --git a/repo/objects/5c/8757775ba10a52dc0c72e58ff1cac0a438bae8ebfe5b15cd584e8df8ac40b8.filez b/repo/objects/5c/8757775ba10a52dc0c72e58ff1cac0a438bae8ebfe5b15cd584e8df8ac40b8.filez new file mode 100644 index 00000000000..91e301c6158 Binary files /dev/null and b/repo/objects/5c/8757775ba10a52dc0c72e58ff1cac0a438bae8ebfe5b15cd584e8df8ac40b8.filez differ diff --git a/repo/objects/5c/902370467e36841b88076b3f552879f13ff31a1a24ac5916957a766d5342d9.filez b/repo/objects/5c/902370467e36841b88076b3f552879f13ff31a1a24ac5916957a766d5342d9.filez new file mode 100644 index 00000000000..b4665b4b8a1 Binary files /dev/null and b/repo/objects/5c/902370467e36841b88076b3f552879f13ff31a1a24ac5916957a766d5342d9.filez differ diff --git a/repo/objects/5c/91496ba6dea22a9a2c9587f5e3bc95e8b31629ec55f1c79e679688dc6dc76d.dirtree b/repo/objects/5c/91496ba6dea22a9a2c9587f5e3bc95e8b31629ec55f1c79e679688dc6dc76d.dirtree new file mode 100644 index 00000000000..c463651a81f Binary files /dev/null and b/repo/objects/5c/91496ba6dea22a9a2c9587f5e3bc95e8b31629ec55f1c79e679688dc6dc76d.dirtree differ diff --git a/repo/objects/5c/97d5d779dc3e5880770a2023c2c7593cccb6d7db05dd88bd7bae6905b5ee44.filez b/repo/objects/5c/97d5d779dc3e5880770a2023c2c7593cccb6d7db05dd88bd7bae6905b5ee44.filez new file mode 100644 index 00000000000..74af1450edc Binary files /dev/null and b/repo/objects/5c/97d5d779dc3e5880770a2023c2c7593cccb6d7db05dd88bd7bae6905b5ee44.filez differ diff --git a/repo/objects/5c/bccb30212264375c0f14ed23f2327d99290ccb4a0cbea1625664e0a11e117f.dirtree b/repo/objects/5c/bccb30212264375c0f14ed23f2327d99290ccb4a0cbea1625664e0a11e117f.dirtree new file mode 100644 index 00000000000..a2fc4837e10 Binary files /dev/null and b/repo/objects/5c/bccb30212264375c0f14ed23f2327d99290ccb4a0cbea1625664e0a11e117f.dirtree differ diff --git a/repo/objects/5c/ce7622fa10de2ca0b5ef6d0460b604216dbac9b2a6e09c23e119dc605325c1.filez b/repo/objects/5c/ce7622fa10de2ca0b5ef6d0460b604216dbac9b2a6e09c23e119dc605325c1.filez new file mode 100644 index 00000000000..7b09ed0ea07 Binary files /dev/null and b/repo/objects/5c/ce7622fa10de2ca0b5ef6d0460b604216dbac9b2a6e09c23e119dc605325c1.filez differ diff --git a/repo/objects/5c/f5678362f2ee8dcc4ce9322f9a449d0a8fde1747c8efb3438eb2be2379cce7.filez b/repo/objects/5c/f5678362f2ee8dcc4ce9322f9a449d0a8fde1747c8efb3438eb2be2379cce7.filez new file mode 100644 index 00000000000..3e7c8925542 Binary files /dev/null and b/repo/objects/5c/f5678362f2ee8dcc4ce9322f9a449d0a8fde1747c8efb3438eb2be2379cce7.filez differ diff --git a/repo/objects/5d/358d00a814545777322d0454079941a3c9488587d422534b72d151be32ae93.filez b/repo/objects/5d/358d00a814545777322d0454079941a3c9488587d422534b72d151be32ae93.filez new file mode 100644 index 00000000000..bfd6f1d1555 Binary files /dev/null and b/repo/objects/5d/358d00a814545777322d0454079941a3c9488587d422534b72d151be32ae93.filez differ diff --git a/repo/objects/5d/44790142b835b5271331a1e6d48215f0a75534e8cda6a308b4c5fdb1d771b4.dirtree b/repo/objects/5d/44790142b835b5271331a1e6d48215f0a75534e8cda6a308b4c5fdb1d771b4.dirtree new file mode 100644 index 00000000000..6e22d5398d6 Binary files /dev/null and b/repo/objects/5d/44790142b835b5271331a1e6d48215f0a75534e8cda6a308b4c5fdb1d771b4.dirtree differ diff --git a/repo/objects/5d/7588aef7fd111dc9f1ba3cbfd15da67be51ec16f20bda94f48561b86d4fda1.filez b/repo/objects/5d/7588aef7fd111dc9f1ba3cbfd15da67be51ec16f20bda94f48561b86d4fda1.filez new file mode 100644 index 00000000000..5caeb361c31 Binary files /dev/null and b/repo/objects/5d/7588aef7fd111dc9f1ba3cbfd15da67be51ec16f20bda94f48561b86d4fda1.filez differ diff --git a/repo/objects/5d/941eb3c604bad845ea810f81d0a8329bddd29e320e797c728dd005bedb0a20.dirtree b/repo/objects/5d/941eb3c604bad845ea810f81d0a8329bddd29e320e797c728dd005bedb0a20.dirtree new file mode 100644 index 00000000000..c87c08abe63 Binary files /dev/null and b/repo/objects/5d/941eb3c604bad845ea810f81d0a8329bddd29e320e797c728dd005bedb0a20.dirtree differ diff --git a/repo/objects/5d/b8e08328e255b266e2926f9747f5357eb2110fb7568a0374add209db55c186.filez b/repo/objects/5d/b8e08328e255b266e2926f9747f5357eb2110fb7568a0374add209db55c186.filez new file mode 100644 index 00000000000..7f80b4ef76f Binary files /dev/null and b/repo/objects/5d/b8e08328e255b266e2926f9747f5357eb2110fb7568a0374add209db55c186.filez differ diff --git a/repo/objects/5d/d45790b28bdcdbf537d1761692c731452ff693f16cdeda1807b339030754f3.filez b/repo/objects/5d/d45790b28bdcdbf537d1761692c731452ff693f16cdeda1807b339030754f3.filez new file mode 100644 index 00000000000..18ecb18dad3 Binary files /dev/null and b/repo/objects/5d/d45790b28bdcdbf537d1761692c731452ff693f16cdeda1807b339030754f3.filez differ diff --git a/repo/objects/5d/f6181b131490405dcea69dce8a4170aeef40ec59eaeb33ede078553064f800.filez b/repo/objects/5d/f6181b131490405dcea69dce8a4170aeef40ec59eaeb33ede078553064f800.filez new file mode 100644 index 00000000000..ebdb4f5addf Binary files /dev/null and b/repo/objects/5d/f6181b131490405dcea69dce8a4170aeef40ec59eaeb33ede078553064f800.filez differ diff --git a/repo/objects/5e/11a6c56896ae60b285c0d28b19a220c1143d4ffe9c70fc19a0857a760677cb.filez b/repo/objects/5e/11a6c56896ae60b285c0d28b19a220c1143d4ffe9c70fc19a0857a760677cb.filez new file mode 100644 index 00000000000..233fb378445 Binary files /dev/null and b/repo/objects/5e/11a6c56896ae60b285c0d28b19a220c1143d4ffe9c70fc19a0857a760677cb.filez differ diff --git a/repo/objects/5e/1baa7051ad197e5381a354b415ae227107c0f675306cf91576182580c30f6e.filez b/repo/objects/5e/1baa7051ad197e5381a354b415ae227107c0f675306cf91576182580c30f6e.filez new file mode 100644 index 00000000000..9886f7716c6 Binary files /dev/null and b/repo/objects/5e/1baa7051ad197e5381a354b415ae227107c0f675306cf91576182580c30f6e.filez differ diff --git a/repo/objects/5e/23ceb594eaeaed927386092949deb8d506159285d3c9af26421254b4b27cbe.filez b/repo/objects/5e/23ceb594eaeaed927386092949deb8d506159285d3c9af26421254b4b27cbe.filez new file mode 100644 index 00000000000..483baab1794 Binary files /dev/null and b/repo/objects/5e/23ceb594eaeaed927386092949deb8d506159285d3c9af26421254b4b27cbe.filez differ diff --git a/repo/objects/5e/4031eb8c6d5ab84165eec7d4664d9f6068c19313210c1b8d3b40b41db82143.filez b/repo/objects/5e/4031eb8c6d5ab84165eec7d4664d9f6068c19313210c1b8d3b40b41db82143.filez new file mode 100644 index 00000000000..5172cfb0710 Binary files /dev/null and b/repo/objects/5e/4031eb8c6d5ab84165eec7d4664d9f6068c19313210c1b8d3b40b41db82143.filez differ diff --git a/repo/objects/5e/5e59165aace5a045bc4227300998f7fd088c8d9c76dbe43180c836fe4f12c3.dirtree b/repo/objects/5e/5e59165aace5a045bc4227300998f7fd088c8d9c76dbe43180c836fe4f12c3.dirtree new file mode 100644 index 00000000000..9ef616b171d Binary files /dev/null and b/repo/objects/5e/5e59165aace5a045bc4227300998f7fd088c8d9c76dbe43180c836fe4f12c3.dirtree differ diff --git a/repo/objects/5e/7ab27978150ffde4f5a9501e1b06443535ce9a041ff190d29130a06340503f.filez b/repo/objects/5e/7ab27978150ffde4f5a9501e1b06443535ce9a041ff190d29130a06340503f.filez new file mode 100644 index 00000000000..b8fc45ec573 Binary files /dev/null and b/repo/objects/5e/7ab27978150ffde4f5a9501e1b06443535ce9a041ff190d29130a06340503f.filez differ diff --git a/repo/objects/5e/9eb28b5a34174cb8275139ce254bab396845057dab25efdd9b801c32295ffd.filez b/repo/objects/5e/9eb28b5a34174cb8275139ce254bab396845057dab25efdd9b801c32295ffd.filez new file mode 100644 index 00000000000..05ae96b47af Binary files /dev/null and b/repo/objects/5e/9eb28b5a34174cb8275139ce254bab396845057dab25efdd9b801c32295ffd.filez differ diff --git a/repo/objects/5e/c31668e2174e893b6ed561a0017b61c3e56fc7af879d86b6d64538e1311d6d.filez b/repo/objects/5e/c31668e2174e893b6ed561a0017b61c3e56fc7af879d86b6d64538e1311d6d.filez new file mode 100644 index 00000000000..e06e204c3a9 Binary files /dev/null and b/repo/objects/5e/c31668e2174e893b6ed561a0017b61c3e56fc7af879d86b6d64538e1311d6d.filez differ diff --git a/repo/objects/5e/fa9d9e0788ca700f7c67b9c1bc58d83d8617f2daf322ac32b48aca17b91f2e.filez b/repo/objects/5e/fa9d9e0788ca700f7c67b9c1bc58d83d8617f2daf322ac32b48aca17b91f2e.filez new file mode 100644 index 00000000000..a8cc0fd518c Binary files /dev/null and b/repo/objects/5e/fa9d9e0788ca700f7c67b9c1bc58d83d8617f2daf322ac32b48aca17b91f2e.filez differ diff --git a/repo/objects/5f/2644e6956971cb1b2701331fe13fc9744ef4bf8895862e2f27da71f670b157.dirtree b/repo/objects/5f/2644e6956971cb1b2701331fe13fc9744ef4bf8895862e2f27da71f670b157.dirtree new file mode 100644 index 00000000000..059e2875e0f Binary files /dev/null and b/repo/objects/5f/2644e6956971cb1b2701331fe13fc9744ef4bf8895862e2f27da71f670b157.dirtree differ diff --git a/repo/objects/5f/44be09d99c924bf0643fc0e8236956f610ba24111c374aec54bf9715cb5fb1.filez b/repo/objects/5f/44be09d99c924bf0643fc0e8236956f610ba24111c374aec54bf9715cb5fb1.filez new file mode 100644 index 00000000000..2c00dbce737 Binary files /dev/null and b/repo/objects/5f/44be09d99c924bf0643fc0e8236956f610ba24111c374aec54bf9715cb5fb1.filez differ diff --git a/repo/objects/5f/881d6e67a579d2eb596858cfd244daac6de46325fe48a33849a2db6a47cb39.filez b/repo/objects/5f/881d6e67a579d2eb596858cfd244daac6de46325fe48a33849a2db6a47cb39.filez new file mode 100644 index 00000000000..45509da95b4 Binary files /dev/null and b/repo/objects/5f/881d6e67a579d2eb596858cfd244daac6de46325fe48a33849a2db6a47cb39.filez differ diff --git a/repo/objects/5f/e7545a8aac0131477a712f5a5a75e4b7bfe5bf13e7d02c16c4dc2f25aa7311.filez b/repo/objects/5f/e7545a8aac0131477a712f5a5a75e4b7bfe5bf13e7d02c16c4dc2f25aa7311.filez new file mode 100644 index 00000000000..806cb84a096 Binary files /dev/null and b/repo/objects/5f/e7545a8aac0131477a712f5a5a75e4b7bfe5bf13e7d02c16c4dc2f25aa7311.filez differ diff --git a/repo/objects/5f/ed47a92fc2d49e716a6587653530b09455bd85fc62c95d678be0770dcdaf43.filez b/repo/objects/5f/ed47a92fc2d49e716a6587653530b09455bd85fc62c95d678be0770dcdaf43.filez new file mode 100644 index 00000000000..1c07c67ea24 Binary files /dev/null and b/repo/objects/5f/ed47a92fc2d49e716a6587653530b09455bd85fc62c95d678be0770dcdaf43.filez differ diff --git a/repo/objects/60/2c3a15f6f2b2fe59ce0ef408477628b001396b93ecd1087a9e3242a948de22.dirtree b/repo/objects/60/2c3a15f6f2b2fe59ce0ef408477628b001396b93ecd1087a9e3242a948de22.dirtree new file mode 100644 index 00000000000..08289b650b3 Binary files /dev/null and b/repo/objects/60/2c3a15f6f2b2fe59ce0ef408477628b001396b93ecd1087a9e3242a948de22.dirtree differ diff --git a/repo/objects/60/368173726c8a0c710978075faf94d1a97d7baec1692c23b882df10939c8fcb.filez b/repo/objects/60/368173726c8a0c710978075faf94d1a97d7baec1692c23b882df10939c8fcb.filez new file mode 100644 index 00000000000..371c6c82c8e Binary files /dev/null and b/repo/objects/60/368173726c8a0c710978075faf94d1a97d7baec1692c23b882df10939c8fcb.filez differ diff --git a/repo/objects/60/3d1ed915479984ea35c9c60dc43f9ce41d267e8a1f3b4e57b0d1bf03d10b53.dirtree b/repo/objects/60/3d1ed915479984ea35c9c60dc43f9ce41d267e8a1f3b4e57b0d1bf03d10b53.dirtree new file mode 100644 index 00000000000..9be0b41f286 Binary files /dev/null and b/repo/objects/60/3d1ed915479984ea35c9c60dc43f9ce41d267e8a1f3b4e57b0d1bf03d10b53.dirtree differ diff --git a/repo/objects/60/469300f5a7034ed70eb86d4e191c2e83db0c9f593710cff898cd24d6b9c869.filez b/repo/objects/60/469300f5a7034ed70eb86d4e191c2e83db0c9f593710cff898cd24d6b9c869.filez new file mode 100644 index 00000000000..0cee6748e2f Binary files /dev/null and b/repo/objects/60/469300f5a7034ed70eb86d4e191c2e83db0c9f593710cff898cd24d6b9c869.filez differ diff --git a/repo/objects/60/545f4e99a21178e65eee55b9aed857b1a714b874f1d98911891a3e7ceb493b.dirtree b/repo/objects/60/545f4e99a21178e65eee55b9aed857b1a714b874f1d98911891a3e7ceb493b.dirtree new file mode 100644 index 00000000000..e4c526307e3 Binary files /dev/null and b/repo/objects/60/545f4e99a21178e65eee55b9aed857b1a714b874f1d98911891a3e7ceb493b.dirtree differ diff --git a/repo/objects/60/7eacd0234869f283c5442899480757682f4bfabc2000d4a3f1d0f4c3329b80.filez b/repo/objects/60/7eacd0234869f283c5442899480757682f4bfabc2000d4a3f1d0f4c3329b80.filez new file mode 100644 index 00000000000..6279ce561f5 Binary files /dev/null and b/repo/objects/60/7eacd0234869f283c5442899480757682f4bfabc2000d4a3f1d0f4c3329b80.filez differ diff --git a/repo/objects/60/87328a108261a6564c50408ab9555d7a7deb77baa17f15571f159e53df9069.filez b/repo/objects/60/87328a108261a6564c50408ab9555d7a7deb77baa17f15571f159e53df9069.filez new file mode 100644 index 00000000000..196f418e7b3 Binary files /dev/null and b/repo/objects/60/87328a108261a6564c50408ab9555d7a7deb77baa17f15571f159e53df9069.filez differ diff --git a/repo/objects/60/a50b0eb2a276b017218004282fc89d20f89dd4b0b344e650bd9976221b1cac.filez b/repo/objects/60/a50b0eb2a276b017218004282fc89d20f89dd4b0b344e650bd9976221b1cac.filez new file mode 100644 index 00000000000..6d57d27792f Binary files /dev/null and b/repo/objects/60/a50b0eb2a276b017218004282fc89d20f89dd4b0b344e650bd9976221b1cac.filez differ diff --git a/repo/objects/60/c402363d1cf742e283de8420a2cfddfe6285bdc7cad2655946ae3310a29204.filez b/repo/objects/60/c402363d1cf742e283de8420a2cfddfe6285bdc7cad2655946ae3310a29204.filez new file mode 100644 index 00000000000..78b78473b5d Binary files /dev/null and b/repo/objects/60/c402363d1cf742e283de8420a2cfddfe6285bdc7cad2655946ae3310a29204.filez differ diff --git a/repo/objects/60/e59a7617af094da5323ac61ebacb358c2d62208fa5ee238a27d176f4b1c34a.filez b/repo/objects/60/e59a7617af094da5323ac61ebacb358c2d62208fa5ee238a27d176f4b1c34a.filez new file mode 100644 index 00000000000..55cfcba8ee4 Binary files /dev/null and b/repo/objects/60/e59a7617af094da5323ac61ebacb358c2d62208fa5ee238a27d176f4b1c34a.filez differ diff --git a/repo/objects/60/f55b3a4868c72104f935ea5555ee2fe741ce553ef61d47c3a24cf4e2f48428.filez b/repo/objects/60/f55b3a4868c72104f935ea5555ee2fe741ce553ef61d47c3a24cf4e2f48428.filez new file mode 100644 index 00000000000..3ae9cc379ad Binary files /dev/null and b/repo/objects/60/f55b3a4868c72104f935ea5555ee2fe741ce553ef61d47c3a24cf4e2f48428.filez differ diff --git a/repo/objects/60/f5a5b9077d6ffb8ad452eba12eb8c491da4c523342dd8d133d2035405a0365.filez b/repo/objects/60/f5a5b9077d6ffb8ad452eba12eb8c491da4c523342dd8d133d2035405a0365.filez new file mode 100644 index 00000000000..5dc0328622c Binary files /dev/null and b/repo/objects/60/f5a5b9077d6ffb8ad452eba12eb8c491da4c523342dd8d133d2035405a0365.filez differ diff --git a/repo/objects/60/f60fd25317b87c3cac63d6a46308697395e27491734e186e87113541b32437.filez b/repo/objects/60/f60fd25317b87c3cac63d6a46308697395e27491734e186e87113541b32437.filez new file mode 100644 index 00000000000..077853c2842 Binary files /dev/null and b/repo/objects/60/f60fd25317b87c3cac63d6a46308697395e27491734e186e87113541b32437.filez differ diff --git a/repo/objects/61/034cbdc520b3a974c384d968b97dbcba97b7a07bc397838b0a3a8ab6bfe0d1.filez b/repo/objects/61/034cbdc520b3a974c384d968b97dbcba97b7a07bc397838b0a3a8ab6bfe0d1.filez new file mode 100644 index 00000000000..f3ea3d4b378 Binary files /dev/null and b/repo/objects/61/034cbdc520b3a974c384d968b97dbcba97b7a07bc397838b0a3a8ab6bfe0d1.filez differ diff --git a/repo/objects/61/627e6f27e5b7bb62490daf25bfe3ee46cc605778f531cc84f1e1e522056f91.dirtree b/repo/objects/61/627e6f27e5b7bb62490daf25bfe3ee46cc605778f531cc84f1e1e522056f91.dirtree new file mode 100644 index 00000000000..38dd2ce03ee Binary files /dev/null and b/repo/objects/61/627e6f27e5b7bb62490daf25bfe3ee46cc605778f531cc84f1e1e522056f91.dirtree differ diff --git a/repo/objects/61/773d050686ac9a59f82d743d3e52c685be38019ee93e7f7551ea2e69fe77fd.dirtree b/repo/objects/61/773d050686ac9a59f82d743d3e52c685be38019ee93e7f7551ea2e69fe77fd.dirtree new file mode 100644 index 00000000000..556678ae063 Binary files /dev/null and b/repo/objects/61/773d050686ac9a59f82d743d3e52c685be38019ee93e7f7551ea2e69fe77fd.dirtree differ diff --git a/repo/objects/61/7c3b1e0b305cb62fe042a7323ca2039279a92104f3b09c448db15328a58838.filez b/repo/objects/61/7c3b1e0b305cb62fe042a7323ca2039279a92104f3b09c448db15328a58838.filez new file mode 100644 index 00000000000..a4a9f128e31 Binary files /dev/null and b/repo/objects/61/7c3b1e0b305cb62fe042a7323ca2039279a92104f3b09c448db15328a58838.filez differ diff --git a/repo/objects/61/c135bc7f65f6ccc3f58798e6d1035cf7ac155216e868a41e75aa9eeea415d2.filez b/repo/objects/61/c135bc7f65f6ccc3f58798e6d1035cf7ac155216e868a41e75aa9eeea415d2.filez new file mode 100644 index 00000000000..46f24ee72f3 Binary files /dev/null and b/repo/objects/61/c135bc7f65f6ccc3f58798e6d1035cf7ac155216e868a41e75aa9eeea415d2.filez differ diff --git a/repo/objects/61/cc17036848c4b95839f1bf027d172b1a7f0f065413917ec0ff54e7875833b7.dirtree b/repo/objects/61/cc17036848c4b95839f1bf027d172b1a7f0f065413917ec0ff54e7875833b7.dirtree new file mode 100644 index 00000000000..990472f2640 Binary files /dev/null and b/repo/objects/61/cc17036848c4b95839f1bf027d172b1a7f0f065413917ec0ff54e7875833b7.dirtree differ diff --git a/repo/objects/61/d381da77e28bd7e6e88485f38011b9153ee6104af3e3fc950472692b073721.filez b/repo/objects/61/d381da77e28bd7e6e88485f38011b9153ee6104af3e3fc950472692b073721.filez new file mode 100644 index 00000000000..416c7f7f22b Binary files /dev/null and b/repo/objects/61/d381da77e28bd7e6e88485f38011b9153ee6104af3e3fc950472692b073721.filez differ diff --git a/repo/objects/61/db07de858bc074113cccc542f69dccb7f32047176c8a0773d12132f7b92d2a.filez b/repo/objects/61/db07de858bc074113cccc542f69dccb7f32047176c8a0773d12132f7b92d2a.filez new file mode 100644 index 00000000000..0d2e6d936b8 Binary files /dev/null and b/repo/objects/61/db07de858bc074113cccc542f69dccb7f32047176c8a0773d12132f7b92d2a.filez differ diff --git a/repo/objects/61/e9e5c7b256611db1f3b1811e948ec6d07093fa012819724f274ad1bd87fbcf.filez b/repo/objects/61/e9e5c7b256611db1f3b1811e948ec6d07093fa012819724f274ad1bd87fbcf.filez new file mode 100644 index 00000000000..7b2bbd099be Binary files /dev/null and b/repo/objects/61/e9e5c7b256611db1f3b1811e948ec6d07093fa012819724f274ad1bd87fbcf.filez differ diff --git a/repo/objects/61/eff4c7a7c5228167184f3c10cf83289f89b007b0a7f3978b592b69a68a4c9d.filez b/repo/objects/61/eff4c7a7c5228167184f3c10cf83289f89b007b0a7f3978b592b69a68a4c9d.filez new file mode 100644 index 00000000000..c3f5d398d98 Binary files /dev/null and b/repo/objects/61/eff4c7a7c5228167184f3c10cf83289f89b007b0a7f3978b592b69a68a4c9d.filez differ diff --git a/repo/objects/62/010587ef0a7fc022944b4aa4d4f20bb91f7cf80bd52b151a487577f9c73426.filez b/repo/objects/62/010587ef0a7fc022944b4aa4d4f20bb91f7cf80bd52b151a487577f9c73426.filez new file mode 100644 index 00000000000..dd484dcdbde Binary files /dev/null and b/repo/objects/62/010587ef0a7fc022944b4aa4d4f20bb91f7cf80bd52b151a487577f9c73426.filez differ diff --git a/repo/objects/62/2362d060777877c86d6d06830c0986b8a3ea3fa118024728986202dca5b669.filez b/repo/objects/62/2362d060777877c86d6d06830c0986b8a3ea3fa118024728986202dca5b669.filez new file mode 100644 index 00000000000..7f503b66142 Binary files /dev/null and b/repo/objects/62/2362d060777877c86d6d06830c0986b8a3ea3fa118024728986202dca5b669.filez differ diff --git a/repo/objects/62/2f629528a6d8f1adfb8bcd45d37d995d2e692bf58108f196b59ab5ff50e08c.filez b/repo/objects/62/2f629528a6d8f1adfb8bcd45d37d995d2e692bf58108f196b59ab5ff50e08c.filez new file mode 100644 index 00000000000..cad95497490 Binary files /dev/null and b/repo/objects/62/2f629528a6d8f1adfb8bcd45d37d995d2e692bf58108f196b59ab5ff50e08c.filez differ diff --git a/repo/objects/62/485d7ffcba6c4aeea483ca43a3a1829a50220f89bbdca908c4753d026a8caf.filez b/repo/objects/62/485d7ffcba6c4aeea483ca43a3a1829a50220f89bbdca908c4753d026a8caf.filez new file mode 100644 index 00000000000..4d6a942197c Binary files /dev/null and b/repo/objects/62/485d7ffcba6c4aeea483ca43a3a1829a50220f89bbdca908c4753d026a8caf.filez differ diff --git a/repo/objects/62/4f6d040198563dc8286eaf8f28f2a687f0ca27202228ebb86d13e43b3b20f3.filez b/repo/objects/62/4f6d040198563dc8286eaf8f28f2a687f0ca27202228ebb86d13e43b3b20f3.filez new file mode 100644 index 00000000000..38578a7feda Binary files /dev/null and b/repo/objects/62/4f6d040198563dc8286eaf8f28f2a687f0ca27202228ebb86d13e43b3b20f3.filez differ diff --git a/repo/objects/62/5bbb1914c305f8664644a0b26daabbd609c3d3a1a9d141087449ad303858bb.filez b/repo/objects/62/5bbb1914c305f8664644a0b26daabbd609c3d3a1a9d141087449ad303858bb.filez new file mode 100644 index 00000000000..12879b2e8aa Binary files /dev/null and b/repo/objects/62/5bbb1914c305f8664644a0b26daabbd609c3d3a1a9d141087449ad303858bb.filez differ diff --git a/repo/objects/62/85ff015aab1ed641a9a2b993300226ec6e0aadbc1927ad5262b8f89f811f3b.filez b/repo/objects/62/85ff015aab1ed641a9a2b993300226ec6e0aadbc1927ad5262b8f89f811f3b.filez new file mode 100644 index 00000000000..9c948829ead Binary files /dev/null and b/repo/objects/62/85ff015aab1ed641a9a2b993300226ec6e0aadbc1927ad5262b8f89f811f3b.filez differ diff --git a/repo/objects/62/91b764d9088cdde2f0bdb13a199d7d19e62d085fa71faa5279b3e6bc4fcca0.filez b/repo/objects/62/91b764d9088cdde2f0bdb13a199d7d19e62d085fa71faa5279b3e6bc4fcca0.filez new file mode 100644 index 00000000000..89f2f04d4d0 Binary files /dev/null and b/repo/objects/62/91b764d9088cdde2f0bdb13a199d7d19e62d085fa71faa5279b3e6bc4fcca0.filez differ diff --git a/repo/objects/62/99dc771dcfaac325be1c4afb7f18f3fbe7b9967adeae24b11f8d227c74d202.filez b/repo/objects/62/99dc771dcfaac325be1c4afb7f18f3fbe7b9967adeae24b11f8d227c74d202.filez new file mode 100644 index 00000000000..0c35c6c538b Binary files /dev/null and b/repo/objects/62/99dc771dcfaac325be1c4afb7f18f3fbe7b9967adeae24b11f8d227c74d202.filez differ diff --git a/repo/objects/62/a56563a946243bcdb1af8332d9a63c3187faf99bca6f4179d1b264749364bb.dirtree b/repo/objects/62/a56563a946243bcdb1af8332d9a63c3187faf99bca6f4179d1b264749364bb.dirtree new file mode 100644 index 00000000000..a44bc8694fd Binary files /dev/null and b/repo/objects/62/a56563a946243bcdb1af8332d9a63c3187faf99bca6f4179d1b264749364bb.dirtree differ diff --git a/repo/objects/62/a59bce86d8d514e5c6eb444191225a68590ecbaec900ed9067ad65efe5fbfb.filez b/repo/objects/62/a59bce86d8d514e5c6eb444191225a68590ecbaec900ed9067ad65efe5fbfb.filez new file mode 100644 index 00000000000..a58295b8ed3 Binary files /dev/null and b/repo/objects/62/a59bce86d8d514e5c6eb444191225a68590ecbaec900ed9067ad65efe5fbfb.filez differ diff --git a/repo/objects/62/aa2126f82063f7f6328515c9e0d6487041c000d2e97a215df4a37d3d88ed04.filez b/repo/objects/62/aa2126f82063f7f6328515c9e0d6487041c000d2e97a215df4a37d3d88ed04.filez new file mode 100644 index 00000000000..73e40c559b9 Binary files /dev/null and b/repo/objects/62/aa2126f82063f7f6328515c9e0d6487041c000d2e97a215df4a37d3d88ed04.filez differ diff --git a/repo/objects/62/c7f47db1d9a70ddd7e9cace533fd2baaa25944ab058bd334e87b4359d29caf.dirtree b/repo/objects/62/c7f47db1d9a70ddd7e9cace533fd2baaa25944ab058bd334e87b4359d29caf.dirtree new file mode 100644 index 00000000000..ba50bc92bde Binary files /dev/null and b/repo/objects/62/c7f47db1d9a70ddd7e9cace533fd2baaa25944ab058bd334e87b4359d29caf.dirtree differ diff --git a/repo/objects/63/04bab5f4d4e2782bd7b8e8466f06fd7694bf2fb74952e5773d47e7135c0b63.filez b/repo/objects/63/04bab5f4d4e2782bd7b8e8466f06fd7694bf2fb74952e5773d47e7135c0b63.filez new file mode 100644 index 00000000000..2862802b13a Binary files /dev/null and b/repo/objects/63/04bab5f4d4e2782bd7b8e8466f06fd7694bf2fb74952e5773d47e7135c0b63.filez differ diff --git a/repo/objects/63/4e2ece696f09435c9f0f13df4aba4e47c52eb77cb4b696d0abea4a5ec1888d.filez b/repo/objects/63/4e2ece696f09435c9f0f13df4aba4e47c52eb77cb4b696d0abea4a5ec1888d.filez new file mode 100644 index 00000000000..b0dfb9c6c0c Binary files /dev/null and b/repo/objects/63/4e2ece696f09435c9f0f13df4aba4e47c52eb77cb4b696d0abea4a5ec1888d.filez differ diff --git a/repo/objects/63/4e40ae45f5915070926f66e6185ab15f60da6ed3cb831fb592c09490d16940.filez b/repo/objects/63/4e40ae45f5915070926f66e6185ab15f60da6ed3cb831fb592c09490d16940.filez new file mode 100644 index 00000000000..d9f46ca6f14 Binary files /dev/null and b/repo/objects/63/4e40ae45f5915070926f66e6185ab15f60da6ed3cb831fb592c09490d16940.filez differ diff --git a/repo/objects/63/7d22aa431bde5e04fc2ae51416e48ec9ac26e1f448c3febe0a38afd98486ca.filez b/repo/objects/63/7d22aa431bde5e04fc2ae51416e48ec9ac26e1f448c3febe0a38afd98486ca.filez new file mode 100644 index 00000000000..cefa2cd0ec7 Binary files /dev/null and b/repo/objects/63/7d22aa431bde5e04fc2ae51416e48ec9ac26e1f448c3febe0a38afd98486ca.filez differ diff --git a/repo/objects/63/8a1dabb2d25d53401185e4614d215872d2153fa62cc830b202ffb6e908fff8.filez b/repo/objects/63/8a1dabb2d25d53401185e4614d215872d2153fa62cc830b202ffb6e908fff8.filez new file mode 100644 index 00000000000..25d2bdb466a Binary files /dev/null and b/repo/objects/63/8a1dabb2d25d53401185e4614d215872d2153fa62cc830b202ffb6e908fff8.filez differ diff --git a/repo/objects/63/a294f9f94d0984e4f2380f748d64bd39c6164c4970c3aec38c21640ef17699.filez b/repo/objects/63/a294f9f94d0984e4f2380f748d64bd39c6164c4970c3aec38c21640ef17699.filez new file mode 100644 index 00000000000..6e66b334190 Binary files /dev/null and b/repo/objects/63/a294f9f94d0984e4f2380f748d64bd39c6164c4970c3aec38c21640ef17699.filez differ diff --git a/repo/objects/63/c563ac17ef2995d623f5c03724b079400ee93a8ed3f8a290e369089c906ba0.filez b/repo/objects/63/c563ac17ef2995d623f5c03724b079400ee93a8ed3f8a290e369089c906ba0.filez new file mode 100644 index 00000000000..3e1cbc905bf Binary files /dev/null and b/repo/objects/63/c563ac17ef2995d623f5c03724b079400ee93a8ed3f8a290e369089c906ba0.filez differ diff --git a/repo/objects/63/d78bf51ec87c1ef05429917c9dab8b14086131a72995718fb2fc775fc6c5b0.filez b/repo/objects/63/d78bf51ec87c1ef05429917c9dab8b14086131a72995718fb2fc775fc6c5b0.filez new file mode 100644 index 00000000000..3b70c1b8447 Binary files /dev/null and b/repo/objects/63/d78bf51ec87c1ef05429917c9dab8b14086131a72995718fb2fc775fc6c5b0.filez differ diff --git a/repo/objects/63/e947e862c37c54f2c83b0857c1af8c2dfbe89bebd7acee78cbcd1cd8b77f63.filez b/repo/objects/63/e947e862c37c54f2c83b0857c1af8c2dfbe89bebd7acee78cbcd1cd8b77f63.filez new file mode 100644 index 00000000000..781d614cb49 Binary files /dev/null and b/repo/objects/63/e947e862c37c54f2c83b0857c1af8c2dfbe89bebd7acee78cbcd1cd8b77f63.filez differ diff --git a/repo/objects/63/ee4c4ae2d9cf2fe2919e7e81d5834a634f9287a3c8cf7ab4786818c5972348.filez b/repo/objects/63/ee4c4ae2d9cf2fe2919e7e81d5834a634f9287a3c8cf7ab4786818c5972348.filez new file mode 100644 index 00000000000..1f720a2d55e Binary files /dev/null and b/repo/objects/63/ee4c4ae2d9cf2fe2919e7e81d5834a634f9287a3c8cf7ab4786818c5972348.filez differ diff --git a/repo/objects/63/f18504b4524c538b55b62fb4f1013d35ad7c7d73336e747cc0244edff04bfd.filez b/repo/objects/63/f18504b4524c538b55b62fb4f1013d35ad7c7d73336e747cc0244edff04bfd.filez new file mode 100644 index 00000000000..d4919df5974 Binary files /dev/null and b/repo/objects/63/f18504b4524c538b55b62fb4f1013d35ad7c7d73336e747cc0244edff04bfd.filez differ diff --git a/repo/objects/63/f77d921de8f6f6e9bbb88a76cc234c83866222225baaaa3dcee126afdf0177.dirtree b/repo/objects/63/f77d921de8f6f6e9bbb88a76cc234c83866222225baaaa3dcee126afdf0177.dirtree new file mode 100644 index 00000000000..5d7d6355846 Binary files /dev/null and b/repo/objects/63/f77d921de8f6f6e9bbb88a76cc234c83866222225baaaa3dcee126afdf0177.dirtree differ diff --git a/repo/objects/64/08aadc8f6bff58f0f99cd3d7bc7780012c6aa2ff967fd950e11de154360647.dirtree b/repo/objects/64/08aadc8f6bff58f0f99cd3d7bc7780012c6aa2ff967fd950e11de154360647.dirtree new file mode 100644 index 00000000000..6500337ff71 Binary files /dev/null and b/repo/objects/64/08aadc8f6bff58f0f99cd3d7bc7780012c6aa2ff967fd950e11de154360647.dirtree differ diff --git a/repo/objects/64/32f76560a12ae7cc98540155ca2c118e06c861f75963f8dc64f577ffda0bae.filez b/repo/objects/64/32f76560a12ae7cc98540155ca2c118e06c861f75963f8dc64f577ffda0bae.filez new file mode 100644 index 00000000000..e9e7ddf6dbe Binary files /dev/null and b/repo/objects/64/32f76560a12ae7cc98540155ca2c118e06c861f75963f8dc64f577ffda0bae.filez differ diff --git a/repo/objects/64/6e8ff6d4ad4629677be6ea5cf9fb846f4d2f29000ce92c74bc4212349b9fbd.filez b/repo/objects/64/6e8ff6d4ad4629677be6ea5cf9fb846f4d2f29000ce92c74bc4212349b9fbd.filez new file mode 100644 index 00000000000..9743c4240eb Binary files /dev/null and b/repo/objects/64/6e8ff6d4ad4629677be6ea5cf9fb846f4d2f29000ce92c74bc4212349b9fbd.filez differ diff --git a/repo/objects/64/8918c113f789dcb9bef0e319c47b9730b4a117f5c4e8584aa48d96d8000810.filez b/repo/objects/64/8918c113f789dcb9bef0e319c47b9730b4a117f5c4e8584aa48d96d8000810.filez new file mode 100644 index 00000000000..383335f3622 Binary files /dev/null and b/repo/objects/64/8918c113f789dcb9bef0e319c47b9730b4a117f5c4e8584aa48d96d8000810.filez differ diff --git a/repo/objects/64/9b3a2904768043905c45bf0255de6cd5dc66e40eeeb9addf1fed9c590b01c5.dirtree b/repo/objects/64/9b3a2904768043905c45bf0255de6cd5dc66e40eeeb9addf1fed9c590b01c5.dirtree new file mode 100644 index 00000000000..ebd4abd5ff7 Binary files /dev/null and b/repo/objects/64/9b3a2904768043905c45bf0255de6cd5dc66e40eeeb9addf1fed9c590b01c5.dirtree differ diff --git a/repo/objects/64/a8ae524f729ca1751273558afd44b134e5690ce42a8501567a439e4ffe1a38.filez b/repo/objects/64/a8ae524f729ca1751273558afd44b134e5690ce42a8501567a439e4ffe1a38.filez new file mode 100644 index 00000000000..25ba3641b1a Binary files /dev/null and b/repo/objects/64/a8ae524f729ca1751273558afd44b134e5690ce42a8501567a439e4ffe1a38.filez differ diff --git a/repo/objects/64/be5d5178185f2f9af3aaf1299a77c9c154b6be33ea8d72d25c3760373aed51.dirtree b/repo/objects/64/be5d5178185f2f9af3aaf1299a77c9c154b6be33ea8d72d25c3760373aed51.dirtree new file mode 100644 index 00000000000..78debc4d15f Binary files /dev/null and b/repo/objects/64/be5d5178185f2f9af3aaf1299a77c9c154b6be33ea8d72d25c3760373aed51.dirtree differ diff --git a/repo/objects/64/f50faf4fb550989feb50c7174e3d860ee4940ff2d9bdd63b797a446e0da7c5.dirtree b/repo/objects/64/f50faf4fb550989feb50c7174e3d860ee4940ff2d9bdd63b797a446e0da7c5.dirtree new file mode 100644 index 00000000000..22c7772b11a Binary files /dev/null and b/repo/objects/64/f50faf4fb550989feb50c7174e3d860ee4940ff2d9bdd63b797a446e0da7c5.dirtree differ diff --git a/repo/objects/64/f656acef182c3f63c561555e77f998eab7376998106fe0e9a1a3129c23fa93.filez b/repo/objects/64/f656acef182c3f63c561555e77f998eab7376998106fe0e9a1a3129c23fa93.filez new file mode 100644 index 00000000000..57a799ef0f5 Binary files /dev/null and b/repo/objects/64/f656acef182c3f63c561555e77f998eab7376998106fe0e9a1a3129c23fa93.filez differ diff --git a/repo/objects/65/165471b74f57f6267c3ff90d051aefb06c7629820321637022e8802fe2aba5.filez b/repo/objects/65/165471b74f57f6267c3ff90d051aefb06c7629820321637022e8802fe2aba5.filez new file mode 100644 index 00000000000..e6658b2ba00 Binary files /dev/null and b/repo/objects/65/165471b74f57f6267c3ff90d051aefb06c7629820321637022e8802fe2aba5.filez differ diff --git a/repo/objects/65/1ba3ab0639de55e946e37364e0e5371a3d67fe681428c0e0ea9e5fed6d0a6e.filez b/repo/objects/65/1ba3ab0639de55e946e37364e0e5371a3d67fe681428c0e0ea9e5fed6d0a6e.filez new file mode 100644 index 00000000000..0435083eaf5 Binary files /dev/null and b/repo/objects/65/1ba3ab0639de55e946e37364e0e5371a3d67fe681428c0e0ea9e5fed6d0a6e.filez differ diff --git a/repo/objects/65/5163e0c80b96506cb30ccf45faca93c8c762750e8b285ed96399333ee4abab.filez b/repo/objects/65/5163e0c80b96506cb30ccf45faca93c8c762750e8b285ed96399333ee4abab.filez new file mode 100644 index 00000000000..13748d62989 Binary files /dev/null and b/repo/objects/65/5163e0c80b96506cb30ccf45faca93c8c762750e8b285ed96399333ee4abab.filez differ diff --git a/repo/objects/65/53c3ad8a7f6176785c55d64c98b22894f8736c184ff80984333a385a6aa0fd.filez b/repo/objects/65/53c3ad8a7f6176785c55d64c98b22894f8736c184ff80984333a385a6aa0fd.filez new file mode 100644 index 00000000000..554597efcb7 Binary files /dev/null and b/repo/objects/65/53c3ad8a7f6176785c55d64c98b22894f8736c184ff80984333a385a6aa0fd.filez differ diff --git a/repo/objects/65/562e0f450383e37f3c6e64e073a63e4fe7a05f465337bb33721c56a7fcd353.dirtree b/repo/objects/65/562e0f450383e37f3c6e64e073a63e4fe7a05f465337bb33721c56a7fcd353.dirtree new file mode 100644 index 00000000000..7b9d26892e9 Binary files /dev/null and b/repo/objects/65/562e0f450383e37f3c6e64e073a63e4fe7a05f465337bb33721c56a7fcd353.dirtree differ diff --git a/repo/objects/65/62e0eee15eaa571b9cbf0c33c116322a25253be1fde5f5af005c7e5470aba1.filez b/repo/objects/65/62e0eee15eaa571b9cbf0c33c116322a25253be1fde5f5af005c7e5470aba1.filez new file mode 100644 index 00000000000..ed73cedab82 Binary files /dev/null and b/repo/objects/65/62e0eee15eaa571b9cbf0c33c116322a25253be1fde5f5af005c7e5470aba1.filez differ diff --git a/repo/objects/65/6e2fdd0650e172851a2b2b433d31ae1cb0963f4ebc354362b334edb26ee5f1.filez b/repo/objects/65/6e2fdd0650e172851a2b2b433d31ae1cb0963f4ebc354362b334edb26ee5f1.filez new file mode 100644 index 00000000000..7309b327088 Binary files /dev/null and b/repo/objects/65/6e2fdd0650e172851a2b2b433d31ae1cb0963f4ebc354362b334edb26ee5f1.filez differ diff --git a/repo/objects/65/7f59f4b581ccc91bef68583dfbd27d337befb7391231b5dca1b10da3f64a9c.filez b/repo/objects/65/7f59f4b581ccc91bef68583dfbd27d337befb7391231b5dca1b10da3f64a9c.filez new file mode 100644 index 00000000000..74abb534550 Binary files /dev/null and b/repo/objects/65/7f59f4b581ccc91bef68583dfbd27d337befb7391231b5dca1b10da3f64a9c.filez differ diff --git a/repo/objects/65/d1742209327d6a4545c2b54c0b0e0ec2d5ad60481a447524c4fbd8994b8dfe.filez b/repo/objects/65/d1742209327d6a4545c2b54c0b0e0ec2d5ad60481a447524c4fbd8994b8dfe.filez new file mode 100644 index 00000000000..6e95cd07a16 Binary files /dev/null and b/repo/objects/65/d1742209327d6a4545c2b54c0b0e0ec2d5ad60481a447524c4fbd8994b8dfe.filez differ diff --git a/repo/objects/65/dec6b7411689dccc5fff31b0d40f8f056fe2fa8b754bc8dc92b7c3b6083cee.filez b/repo/objects/65/dec6b7411689dccc5fff31b0d40f8f056fe2fa8b754bc8dc92b7c3b6083cee.filez new file mode 100644 index 00000000000..dd7674f1f55 Binary files /dev/null and b/repo/objects/65/dec6b7411689dccc5fff31b0d40f8f056fe2fa8b754bc8dc92b7c3b6083cee.filez differ diff --git a/repo/objects/65/e9f921425ddc04cf19513184ce952eb50995d72115746a578fd5afefc593bb.filez b/repo/objects/65/e9f921425ddc04cf19513184ce952eb50995d72115746a578fd5afefc593bb.filez new file mode 100644 index 00000000000..4fdc49e22b2 Binary files /dev/null and b/repo/objects/65/e9f921425ddc04cf19513184ce952eb50995d72115746a578fd5afefc593bb.filez differ diff --git a/repo/objects/65/f80bfef8c49e4a670eece604411c110b1f01476162c6f58115078c6bef9795.filez b/repo/objects/65/f80bfef8c49e4a670eece604411c110b1f01476162c6f58115078c6bef9795.filez new file mode 100644 index 00000000000..7ec46230ba9 Binary files /dev/null and b/repo/objects/65/f80bfef8c49e4a670eece604411c110b1f01476162c6f58115078c6bef9795.filez differ diff --git a/repo/objects/66/43237019c929b0584dd51314b2da00e854e8fc88d641ef2a96be263a3e94b4.filez b/repo/objects/66/43237019c929b0584dd51314b2da00e854e8fc88d641ef2a96be263a3e94b4.filez new file mode 100644 index 00000000000..b00c43b48b3 Binary files /dev/null and b/repo/objects/66/43237019c929b0584dd51314b2da00e854e8fc88d641ef2a96be263a3e94b4.filez differ diff --git a/repo/objects/66/840338781550dda7fb4e319259a877a8ac0ff728e99c51ca98d14c81cbd321.filez b/repo/objects/66/840338781550dda7fb4e319259a877a8ac0ff728e99c51ca98d14c81cbd321.filez new file mode 100644 index 00000000000..8bb9d1053e4 Binary files /dev/null and b/repo/objects/66/840338781550dda7fb4e319259a877a8ac0ff728e99c51ca98d14c81cbd321.filez differ diff --git a/repo/objects/66/89ac7aa5307c18734b7cb338ffdab6de9f1f30b2e05289e3b8bbe66945d36d.filez b/repo/objects/66/89ac7aa5307c18734b7cb338ffdab6de9f1f30b2e05289e3b8bbe66945d36d.filez new file mode 100644 index 00000000000..a5f8ce4225c Binary files /dev/null and b/repo/objects/66/89ac7aa5307c18734b7cb338ffdab6de9f1f30b2e05289e3b8bbe66945d36d.filez differ diff --git a/repo/objects/66/a6f05467d638c4d0e6d60be6373030b6efe7a00e1faa6b99d06553a994f9df.dirtree b/repo/objects/66/a6f05467d638c4d0e6d60be6373030b6efe7a00e1faa6b99d06553a994f9df.dirtree new file mode 100644 index 00000000000..7292d2ddb87 Binary files /dev/null and b/repo/objects/66/a6f05467d638c4d0e6d60be6373030b6efe7a00e1faa6b99d06553a994f9df.dirtree differ diff --git a/repo/objects/66/fa2d88433f74e2622d713dda5b50012da868adfcade84a910b207daeacef5e.filez b/repo/objects/66/fa2d88433f74e2622d713dda5b50012da868adfcade84a910b207daeacef5e.filez new file mode 100644 index 00000000000..df19d7c0042 Binary files /dev/null and b/repo/objects/66/fa2d88433f74e2622d713dda5b50012da868adfcade84a910b207daeacef5e.filez differ diff --git a/repo/objects/67/0023398c17131e8382a77320efd38b2b0a17595435a5b523c9ad04fd4cd790.filez b/repo/objects/67/0023398c17131e8382a77320efd38b2b0a17595435a5b523c9ad04fd4cd790.filez new file mode 100644 index 00000000000..829100f8948 Binary files /dev/null and b/repo/objects/67/0023398c17131e8382a77320efd38b2b0a17595435a5b523c9ad04fd4cd790.filez differ diff --git a/repo/objects/67/45668da163dc8bd0c1b636d6494c8731b9ecb5b430fae86e248cb437031d5e.filez b/repo/objects/67/45668da163dc8bd0c1b636d6494c8731b9ecb5b430fae86e248cb437031d5e.filez new file mode 100644 index 00000000000..82478f82ace Binary files /dev/null and b/repo/objects/67/45668da163dc8bd0c1b636d6494c8731b9ecb5b430fae86e248cb437031d5e.filez differ diff --git a/repo/objects/67/626c819ef7800ece7b32007f504f45dc2084f62abd1a59591c8400dc8847aa.filez b/repo/objects/67/626c819ef7800ece7b32007f504f45dc2084f62abd1a59591c8400dc8847aa.filez new file mode 100644 index 00000000000..ecbfcb56b89 Binary files /dev/null and b/repo/objects/67/626c819ef7800ece7b32007f504f45dc2084f62abd1a59591c8400dc8847aa.filez differ diff --git a/repo/objects/67/66b751fd0fee63948cb0d6e39c7b58c6352b7825cffe05f2007bf6c9686ff7.filez b/repo/objects/67/66b751fd0fee63948cb0d6e39c7b58c6352b7825cffe05f2007bf6c9686ff7.filez new file mode 100644 index 00000000000..088003a67ef Binary files /dev/null and b/repo/objects/67/66b751fd0fee63948cb0d6e39c7b58c6352b7825cffe05f2007bf6c9686ff7.filez differ diff --git a/repo/objects/67/9fd0719e7eb3dc7edf03a4793271dd8f3f0e1f22d8516ebe1d0185b0224a7c.dirtree b/repo/objects/67/9fd0719e7eb3dc7edf03a4793271dd8f3f0e1f22d8516ebe1d0185b0224a7c.dirtree new file mode 100644 index 00000000000..3b0db6dea5c Binary files /dev/null and b/repo/objects/67/9fd0719e7eb3dc7edf03a4793271dd8f3f0e1f22d8516ebe1d0185b0224a7c.dirtree differ diff --git a/repo/objects/67/c4c62ef5c395ea175bd530f6d183f4be58e1647e7ab67e8b0869eadb934033.filez b/repo/objects/67/c4c62ef5c395ea175bd530f6d183f4be58e1647e7ab67e8b0869eadb934033.filez new file mode 100644 index 00000000000..3029b256579 Binary files /dev/null and b/repo/objects/67/c4c62ef5c395ea175bd530f6d183f4be58e1647e7ab67e8b0869eadb934033.filez differ diff --git a/repo/objects/67/edd64260e042733c638f15e6a5a952919eea656752fef10b2b6c272a08f7e8.dirtree b/repo/objects/67/edd64260e042733c638f15e6a5a952919eea656752fef10b2b6c272a08f7e8.dirtree new file mode 100644 index 00000000000..176eca9d2af Binary files /dev/null and b/repo/objects/67/edd64260e042733c638f15e6a5a952919eea656752fef10b2b6c272a08f7e8.dirtree differ diff --git a/repo/objects/68/2c211b2cfeb0eef819dea321cfa478c07f68c2c50a8623a7b83945b793c7e9.filez b/repo/objects/68/2c211b2cfeb0eef819dea321cfa478c07f68c2c50a8623a7b83945b793c7e9.filez new file mode 100644 index 00000000000..8c68d3a8bb1 Binary files /dev/null and b/repo/objects/68/2c211b2cfeb0eef819dea321cfa478c07f68c2c50a8623a7b83945b793c7e9.filez differ diff --git a/repo/objects/68/466969dd9bf93170d4095a504fefb1785709e76ab5703d653ba5d2b34d0522.dirtree b/repo/objects/68/466969dd9bf93170d4095a504fefb1785709e76ab5703d653ba5d2b34d0522.dirtree new file mode 100644 index 00000000000..7ca99c6317d Binary files /dev/null and b/repo/objects/68/466969dd9bf93170d4095a504fefb1785709e76ab5703d653ba5d2b34d0522.dirtree differ diff --git a/repo/objects/68/5b709578bd0150fb5235a5fc966cd18d4970eeddc8bd02555f59a0bebbedce.filez b/repo/objects/68/5b709578bd0150fb5235a5fc966cd18d4970eeddc8bd02555f59a0bebbedce.filez new file mode 100644 index 00000000000..e58f93ad9aa Binary files /dev/null and b/repo/objects/68/5b709578bd0150fb5235a5fc966cd18d4970eeddc8bd02555f59a0bebbedce.filez differ diff --git a/repo/objects/68/9e3cff10a720d5fa74c14c48a49c4602a4bacedfbd00d4b1bb2aaeaef743b9.filez b/repo/objects/68/9e3cff10a720d5fa74c14c48a49c4602a4bacedfbd00d4b1bb2aaeaef743b9.filez new file mode 100644 index 00000000000..80b00937aa7 Binary files /dev/null and b/repo/objects/68/9e3cff10a720d5fa74c14c48a49c4602a4bacedfbd00d4b1bb2aaeaef743b9.filez differ diff --git a/repo/objects/69/0ca66205b3563ce32fcd9c6e00aa907f0341291ecee763ad1e21383f55461c.filez b/repo/objects/69/0ca66205b3563ce32fcd9c6e00aa907f0341291ecee763ad1e21383f55461c.filez new file mode 100644 index 00000000000..f8c5052fa83 Binary files /dev/null and b/repo/objects/69/0ca66205b3563ce32fcd9c6e00aa907f0341291ecee763ad1e21383f55461c.filez differ diff --git a/repo/objects/69/0e0bf77ef4edf48d773d9888f35d8efff4da139b551748cc55f8940f04a347.filez b/repo/objects/69/0e0bf77ef4edf48d773d9888f35d8efff4da139b551748cc55f8940f04a347.filez new file mode 100644 index 00000000000..d938b9fdf6e Binary files /dev/null and b/repo/objects/69/0e0bf77ef4edf48d773d9888f35d8efff4da139b551748cc55f8940f04a347.filez differ diff --git a/repo/objects/69/39ea1124e1614f411ad93243b28bbc33fa2a0201429a17f6b2f8524fbd5221.dirtree b/repo/objects/69/39ea1124e1614f411ad93243b28bbc33fa2a0201429a17f6b2f8524fbd5221.dirtree new file mode 100644 index 00000000000..510e4ab4597 Binary files /dev/null and b/repo/objects/69/39ea1124e1614f411ad93243b28bbc33fa2a0201429a17f6b2f8524fbd5221.dirtree differ diff --git a/repo/objects/69/3bc02cabddea1e804eed8394e0abbdc5c285d1bdda6a696a475269078351bc.filez b/repo/objects/69/3bc02cabddea1e804eed8394e0abbdc5c285d1bdda6a696a475269078351bc.filez new file mode 100644 index 00000000000..5778488e0cf Binary files /dev/null and b/repo/objects/69/3bc02cabddea1e804eed8394e0abbdc5c285d1bdda6a696a475269078351bc.filez differ diff --git a/repo/objects/69/55507756e8b9c7955bb54fa9229b0919f3cb1477f794cddebc2ab1bdf01a14.filez b/repo/objects/69/55507756e8b9c7955bb54fa9229b0919f3cb1477f794cddebc2ab1bdf01a14.filez new file mode 100644 index 00000000000..1e1e7f6ade7 Binary files /dev/null and b/repo/objects/69/55507756e8b9c7955bb54fa9229b0919f3cb1477f794cddebc2ab1bdf01a14.filez differ diff --git a/repo/objects/69/5a7e12cffc4342480f8a435d40374525820bdbe329d223e9141a6553057603.dirtree b/repo/objects/69/5a7e12cffc4342480f8a435d40374525820bdbe329d223e9141a6553057603.dirtree new file mode 100644 index 00000000000..1a364a5052c Binary files /dev/null and b/repo/objects/69/5a7e12cffc4342480f8a435d40374525820bdbe329d223e9141a6553057603.dirtree differ diff --git a/repo/objects/69/71aebf5bc95a95b2b38f88c4a892c16e2d5a038a92066e96769d093964bb83.filez b/repo/objects/69/71aebf5bc95a95b2b38f88c4a892c16e2d5a038a92066e96769d093964bb83.filez new file mode 100644 index 00000000000..a26b637f7ff Binary files /dev/null and b/repo/objects/69/71aebf5bc95a95b2b38f88c4a892c16e2d5a038a92066e96769d093964bb83.filez differ diff --git a/repo/objects/69/737a346ce8c92c183ee041029dbee91a593b7a14818b46fef1eadf28766d62.filez b/repo/objects/69/737a346ce8c92c183ee041029dbee91a593b7a14818b46fef1eadf28766d62.filez new file mode 100644 index 00000000000..0a9c2890b9f Binary files /dev/null and b/repo/objects/69/737a346ce8c92c183ee041029dbee91a593b7a14818b46fef1eadf28766d62.filez differ diff --git a/repo/objects/69/c22d191447059ef423a00e8edec56c0cea85780e40fce7a2e371caaa028256.filez b/repo/objects/69/c22d191447059ef423a00e8edec56c0cea85780e40fce7a2e371caaa028256.filez new file mode 100644 index 00000000000..4e35c8f41a3 Binary files /dev/null and b/repo/objects/69/c22d191447059ef423a00e8edec56c0cea85780e40fce7a2e371caaa028256.filez differ diff --git a/repo/objects/69/ece78c5564513a701e301b288155338526629a4ad2219cd7787a729651d93f.dirtree b/repo/objects/69/ece78c5564513a701e301b288155338526629a4ad2219cd7787a729651d93f.dirtree new file mode 100644 index 00000000000..7e184306f63 Binary files /dev/null and b/repo/objects/69/ece78c5564513a701e301b288155338526629a4ad2219cd7787a729651d93f.dirtree differ diff --git a/repo/objects/69/f086944d462624a9a2c476cb4f9cf8390e6b2753d72e0f32c15a1a26af0c8d.dirtree b/repo/objects/69/f086944d462624a9a2c476cb4f9cf8390e6b2753d72e0f32c15a1a26af0c8d.dirtree new file mode 100644 index 00000000000..57d3df4a671 Binary files /dev/null and b/repo/objects/69/f086944d462624a9a2c476cb4f9cf8390e6b2753d72e0f32c15a1a26af0c8d.dirtree differ diff --git a/repo/objects/69/f4647ad003ac99a71e1a7edbbc9325e57900c2151163a64f7a930628d24b18.filez b/repo/objects/69/f4647ad003ac99a71e1a7edbbc9325e57900c2151163a64f7a930628d24b18.filez new file mode 100644 index 00000000000..0861f9f88f8 Binary files /dev/null and b/repo/objects/69/f4647ad003ac99a71e1a7edbbc9325e57900c2151163a64f7a930628d24b18.filez differ diff --git a/repo/objects/69/f9cdeb1cb22105bc94e391c9bffe1af25ccfec9b290c5c056422dfd4598117.filez b/repo/objects/69/f9cdeb1cb22105bc94e391c9bffe1af25ccfec9b290c5c056422dfd4598117.filez new file mode 100644 index 00000000000..b8794cb7ccc Binary files /dev/null and b/repo/objects/69/f9cdeb1cb22105bc94e391c9bffe1af25ccfec9b290c5c056422dfd4598117.filez differ diff --git a/repo/objects/6a/450d1b691acfb642cd45d771e545a6a14a9d88fda2eb7bdfa9f90bf0098958.dirtree b/repo/objects/6a/450d1b691acfb642cd45d771e545a6a14a9d88fda2eb7bdfa9f90bf0098958.dirtree new file mode 100644 index 00000000000..c79d5e94e15 Binary files /dev/null and b/repo/objects/6a/450d1b691acfb642cd45d771e545a6a14a9d88fda2eb7bdfa9f90bf0098958.dirtree differ diff --git a/repo/objects/6a/49b234160ef90a50f01a34efbd8828521b39c2f9774bacd1a9ec01eea2cd87.filez b/repo/objects/6a/49b234160ef90a50f01a34efbd8828521b39c2f9774bacd1a9ec01eea2cd87.filez new file mode 100644 index 00000000000..f49a5397728 Binary files /dev/null and b/repo/objects/6a/49b234160ef90a50f01a34efbd8828521b39c2f9774bacd1a9ec01eea2cd87.filez differ diff --git a/repo/objects/6a/64b96bfe817719aadd1ff47a09573f2c846d820854042188741233de8591e3.filez b/repo/objects/6a/64b96bfe817719aadd1ff47a09573f2c846d820854042188741233de8591e3.filez new file mode 100644 index 00000000000..7b905642052 Binary files /dev/null and b/repo/objects/6a/64b96bfe817719aadd1ff47a09573f2c846d820854042188741233de8591e3.filez differ diff --git a/repo/objects/6a/68da4b9b5ee801692b654a85b9fa2ff2f4ee5dcd6e5efc2ce305af44bc7d94.filez b/repo/objects/6a/68da4b9b5ee801692b654a85b9fa2ff2f4ee5dcd6e5efc2ce305af44bc7d94.filez new file mode 100644 index 00000000000..a364b414d9a Binary files /dev/null and b/repo/objects/6a/68da4b9b5ee801692b654a85b9fa2ff2f4ee5dcd6e5efc2ce305af44bc7d94.filez differ diff --git a/repo/objects/6a/9946e74349370cbbfd7cd81eaee0f449d95c9ab194801163e3a5ab669592f7.filez b/repo/objects/6a/9946e74349370cbbfd7cd81eaee0f449d95c9ab194801163e3a5ab669592f7.filez new file mode 100644 index 00000000000..fdd925b771a Binary files /dev/null and b/repo/objects/6a/9946e74349370cbbfd7cd81eaee0f449d95c9ab194801163e3a5ab669592f7.filez differ diff --git a/repo/objects/6a/a86dcbdcbed5e259f53b85ddcca43bc4375331ac433d25b3edf3f6bc3c504e.filez b/repo/objects/6a/a86dcbdcbed5e259f53b85ddcca43bc4375331ac433d25b3edf3f6bc3c504e.filez new file mode 100644 index 00000000000..c71f2eab1d0 Binary files /dev/null and b/repo/objects/6a/a86dcbdcbed5e259f53b85ddcca43bc4375331ac433d25b3edf3f6bc3c504e.filez differ diff --git a/repo/objects/6b/042f5db44a7b7ecbd9294685b5f36f28611bfdee0bd2b7fdd2645cc1c3adc7.filez b/repo/objects/6b/042f5db44a7b7ecbd9294685b5f36f28611bfdee0bd2b7fdd2645cc1c3adc7.filez new file mode 100644 index 00000000000..876a912d471 Binary files /dev/null and b/repo/objects/6b/042f5db44a7b7ecbd9294685b5f36f28611bfdee0bd2b7fdd2645cc1c3adc7.filez differ diff --git a/repo/objects/6b/0a7560b9a0b6e38b1059a614aa93887fc58b9eb8f8b4dedfecf7911bfa155b.filez b/repo/objects/6b/0a7560b9a0b6e38b1059a614aa93887fc58b9eb8f8b4dedfecf7911bfa155b.filez new file mode 100644 index 00000000000..f282d2c1572 Binary files /dev/null and b/repo/objects/6b/0a7560b9a0b6e38b1059a614aa93887fc58b9eb8f8b4dedfecf7911bfa155b.filez differ diff --git a/repo/objects/6b/2823509ce2130aa1ceedf899e0b892b43ce3f08b18dda31054b3f0699c3e6c.filez b/repo/objects/6b/2823509ce2130aa1ceedf899e0b892b43ce3f08b18dda31054b3f0699c3e6c.filez new file mode 100644 index 00000000000..7a0a6816134 Binary files /dev/null and b/repo/objects/6b/2823509ce2130aa1ceedf899e0b892b43ce3f08b18dda31054b3f0699c3e6c.filez differ diff --git a/repo/objects/6b/a6d7f163fc769e2546d7ae33253074fbcedeec1bda1cdecaeaab6bab0442b1.filez b/repo/objects/6b/a6d7f163fc769e2546d7ae33253074fbcedeec1bda1cdecaeaab6bab0442b1.filez new file mode 100644 index 00000000000..458777a0144 Binary files /dev/null and b/repo/objects/6b/a6d7f163fc769e2546d7ae33253074fbcedeec1bda1cdecaeaab6bab0442b1.filez differ diff --git a/repo/objects/6b/b2e47ccc8b1f51d67aee08ee0bebd4b3f9f9bcf79505073c444abf5f244e90.filez b/repo/objects/6b/b2e47ccc8b1f51d67aee08ee0bebd4b3f9f9bcf79505073c444abf5f244e90.filez new file mode 100644 index 00000000000..1db30317292 Binary files /dev/null and b/repo/objects/6b/b2e47ccc8b1f51d67aee08ee0bebd4b3f9f9bcf79505073c444abf5f244e90.filez differ diff --git a/repo/objects/6b/c2641865059929b85809eb5f4fddd542d50721b5d7add992ed61864f16fc83.dirtree b/repo/objects/6b/c2641865059929b85809eb5f4fddd542d50721b5d7add992ed61864f16fc83.dirtree new file mode 100644 index 00000000000..88ef1e2c47c Binary files /dev/null and b/repo/objects/6b/c2641865059929b85809eb5f4fddd542d50721b5d7add992ed61864f16fc83.dirtree differ diff --git a/repo/objects/6b/d015dfb2fe4de1dbd6b4177a6852ca13f4be4f01e575b349ece2ab2d7f34e1.dirtree b/repo/objects/6b/d015dfb2fe4de1dbd6b4177a6852ca13f4be4f01e575b349ece2ab2d7f34e1.dirtree new file mode 100644 index 00000000000..806689f7f31 Binary files /dev/null and b/repo/objects/6b/d015dfb2fe4de1dbd6b4177a6852ca13f4be4f01e575b349ece2ab2d7f34e1.dirtree differ diff --git a/repo/objects/6b/e9145cc822aa72f23bf74c48d3c9dadab4279ede1c2143c1e3e7de0a06c5e6.filez b/repo/objects/6b/e9145cc822aa72f23bf74c48d3c9dadab4279ede1c2143c1e3e7de0a06c5e6.filez new file mode 100644 index 00000000000..e1b62458392 Binary files /dev/null and b/repo/objects/6b/e9145cc822aa72f23bf74c48d3c9dadab4279ede1c2143c1e3e7de0a06c5e6.filez differ diff --git a/repo/objects/6b/fe8bfa2a42b958a8f6eeaf7f2c2a2b0608243f2acb70e5d02378973ceefac0.filez b/repo/objects/6b/fe8bfa2a42b958a8f6eeaf7f2c2a2b0608243f2acb70e5d02378973ceefac0.filez new file mode 100644 index 00000000000..9985d7adee7 Binary files /dev/null and b/repo/objects/6b/fe8bfa2a42b958a8f6eeaf7f2c2a2b0608243f2acb70e5d02378973ceefac0.filez differ diff --git a/repo/objects/6c/21bac404f921aca745b9b32553f564eb4441dcce89f970192dcf690440584a.filez b/repo/objects/6c/21bac404f921aca745b9b32553f564eb4441dcce89f970192dcf690440584a.filez new file mode 100644 index 00000000000..8310fb3df94 Binary files /dev/null and b/repo/objects/6c/21bac404f921aca745b9b32553f564eb4441dcce89f970192dcf690440584a.filez differ diff --git a/repo/objects/6c/22742974604418a40e9f55de549a32c1a594b15e62c93445aee8b70360fef4.filez b/repo/objects/6c/22742974604418a40e9f55de549a32c1a594b15e62c93445aee8b70360fef4.filez new file mode 100644 index 00000000000..6d5e918c2cb Binary files /dev/null and b/repo/objects/6c/22742974604418a40e9f55de549a32c1a594b15e62c93445aee8b70360fef4.filez differ diff --git a/repo/objects/6c/542c2acdca14f5390af78c57754373e53349dc4379397f06c10a341add9e18.filez b/repo/objects/6c/542c2acdca14f5390af78c57754373e53349dc4379397f06c10a341add9e18.filez new file mode 100644 index 00000000000..81d89da34f5 Binary files /dev/null and b/repo/objects/6c/542c2acdca14f5390af78c57754373e53349dc4379397f06c10a341add9e18.filez differ diff --git a/repo/objects/6c/6736f992fe04c0864901231853e2da7db640963695cec872ce4ddb8cb3c5c0.filez b/repo/objects/6c/6736f992fe04c0864901231853e2da7db640963695cec872ce4ddb8cb3c5c0.filez new file mode 100644 index 00000000000..e5e98daf09e Binary files /dev/null and b/repo/objects/6c/6736f992fe04c0864901231853e2da7db640963695cec872ce4ddb8cb3c5c0.filez differ diff --git a/repo/objects/6c/a7b91cca67abead328335916ed745e6618378d16b649325ebd75a1498d9b03.filez b/repo/objects/6c/a7b91cca67abead328335916ed745e6618378d16b649325ebd75a1498d9b03.filez new file mode 100644 index 00000000000..3681cf8989e Binary files /dev/null and b/repo/objects/6c/a7b91cca67abead328335916ed745e6618378d16b649325ebd75a1498d9b03.filez differ diff --git a/repo/objects/6c/ace5afeafcf4d3ad00d63b9e03406e77f335ade2dd85f6ef213eaa7e430cde.dirtree b/repo/objects/6c/ace5afeafcf4d3ad00d63b9e03406e77f335ade2dd85f6ef213eaa7e430cde.dirtree new file mode 100644 index 00000000000..823d2b6c9b1 Binary files /dev/null and b/repo/objects/6c/ace5afeafcf4d3ad00d63b9e03406e77f335ade2dd85f6ef213eaa7e430cde.dirtree differ diff --git a/repo/objects/6c/b8507e24d5d68184bf9266fb94ce7aad24f97bd8a63d842ac93ba5a68c8812.filez b/repo/objects/6c/b8507e24d5d68184bf9266fb94ce7aad24f97bd8a63d842ac93ba5a68c8812.filez new file mode 100644 index 00000000000..d67f44afaab Binary files /dev/null and b/repo/objects/6c/b8507e24d5d68184bf9266fb94ce7aad24f97bd8a63d842ac93ba5a68c8812.filez differ diff --git a/repo/objects/6c/b8ec7f86d5758c59ec24bc2b2cc60b656633e6179e83484e93922a873a4cb9.filez b/repo/objects/6c/b8ec7f86d5758c59ec24bc2b2cc60b656633e6179e83484e93922a873a4cb9.filez new file mode 100644 index 00000000000..6eeb8bc9a42 Binary files /dev/null and b/repo/objects/6c/b8ec7f86d5758c59ec24bc2b2cc60b656633e6179e83484e93922a873a4cb9.filez differ diff --git a/repo/objects/6c/bdda3af2e7160aff7cd38a813b97c1284bde92081deb85e207373146bf94ff.filez b/repo/objects/6c/bdda3af2e7160aff7cd38a813b97c1284bde92081deb85e207373146bf94ff.filez new file mode 100644 index 00000000000..91e739e589e Binary files /dev/null and b/repo/objects/6c/bdda3af2e7160aff7cd38a813b97c1284bde92081deb85e207373146bf94ff.filez differ diff --git a/repo/objects/6c/ceca58ad8a56eaadb7486f8cac7a5f2c9c24d205e59f7b32231bfd184a826b.dirtree b/repo/objects/6c/ceca58ad8a56eaadb7486f8cac7a5f2c9c24d205e59f7b32231bfd184a826b.dirtree new file mode 100644 index 00000000000..7001a5622bc Binary files /dev/null and b/repo/objects/6c/ceca58ad8a56eaadb7486f8cac7a5f2c9c24d205e59f7b32231bfd184a826b.dirtree differ diff --git a/repo/objects/6c/e7b7a05da505685f6bdaf7384c41b42922ef1f9b9b1472a21242c7e3b99944.filez b/repo/objects/6c/e7b7a05da505685f6bdaf7384c41b42922ef1f9b9b1472a21242c7e3b99944.filez new file mode 100644 index 00000000000..d0cf1c83181 Binary files /dev/null and b/repo/objects/6c/e7b7a05da505685f6bdaf7384c41b42922ef1f9b9b1472a21242c7e3b99944.filez differ diff --git a/repo/objects/6d/0113e8fa90cdc71b185a4727a36d16be2c7c2907d064544563c6bcdeff799e.filez b/repo/objects/6d/0113e8fa90cdc71b185a4727a36d16be2c7c2907d064544563c6bcdeff799e.filez new file mode 100644 index 00000000000..31e3633fca5 Binary files /dev/null and b/repo/objects/6d/0113e8fa90cdc71b185a4727a36d16be2c7c2907d064544563c6bcdeff799e.filez differ diff --git a/repo/objects/6d/13d82f4441c7bfedb100fec4a579a3e85624d8df87e243a3087c1dae1dd0ea.filez b/repo/objects/6d/13d82f4441c7bfedb100fec4a579a3e85624d8df87e243a3087c1dae1dd0ea.filez new file mode 100644 index 00000000000..2ab33daf393 Binary files /dev/null and b/repo/objects/6d/13d82f4441c7bfedb100fec4a579a3e85624d8df87e243a3087c1dae1dd0ea.filez differ diff --git a/repo/objects/6d/2b10fef8d3451d941ea9b9c576b3b79d040e58262b174d8d551252cba826c0.filez b/repo/objects/6d/2b10fef8d3451d941ea9b9c576b3b79d040e58262b174d8d551252cba826c0.filez new file mode 100644 index 00000000000..68c79045b78 Binary files /dev/null and b/repo/objects/6d/2b10fef8d3451d941ea9b9c576b3b79d040e58262b174d8d551252cba826c0.filez differ diff --git a/repo/objects/6d/3991ce2a33bf6bd0af5870a8aa0b33a2743eee1d41d6cf4499253fd4094efa.filez b/repo/objects/6d/3991ce2a33bf6bd0af5870a8aa0b33a2743eee1d41d6cf4499253fd4094efa.filez new file mode 100644 index 00000000000..68d4c46df65 Binary files /dev/null and b/repo/objects/6d/3991ce2a33bf6bd0af5870a8aa0b33a2743eee1d41d6cf4499253fd4094efa.filez differ diff --git a/repo/objects/6d/4b68ec84d39f612049c6a519cf91be2561d2036ccc1adb58cc61d774c6bd36.filez b/repo/objects/6d/4b68ec84d39f612049c6a519cf91be2561d2036ccc1adb58cc61d774c6bd36.filez new file mode 100644 index 00000000000..0d3b854bd2f Binary files /dev/null and b/repo/objects/6d/4b68ec84d39f612049c6a519cf91be2561d2036ccc1adb58cc61d774c6bd36.filez differ diff --git a/repo/objects/6d/7ccdb41a0ba655f515e13b1e01de5fe13e3f3018a126f150300cdfd8365f28.filez b/repo/objects/6d/7ccdb41a0ba655f515e13b1e01de5fe13e3f3018a126f150300cdfd8365f28.filez new file mode 100644 index 00000000000..57105622116 Binary files /dev/null and b/repo/objects/6d/7ccdb41a0ba655f515e13b1e01de5fe13e3f3018a126f150300cdfd8365f28.filez differ diff --git a/repo/objects/6d/b1928e7052362d0964be8eb42f2ff6212c27826ed67a80f7acb83d055fa15e.filez b/repo/objects/6d/b1928e7052362d0964be8eb42f2ff6212c27826ed67a80f7acb83d055fa15e.filez new file mode 100644 index 00000000000..074547bfb21 Binary files /dev/null and b/repo/objects/6d/b1928e7052362d0964be8eb42f2ff6212c27826ed67a80f7acb83d055fa15e.filez differ diff --git a/repo/objects/6d/cd879f42866c54271255ade678d3b2bcc22ed9c4fc5a6a03c68a006e5d09d1.filez b/repo/objects/6d/cd879f42866c54271255ade678d3b2bcc22ed9c4fc5a6a03c68a006e5d09d1.filez new file mode 100644 index 00000000000..f781da01c78 Binary files /dev/null and b/repo/objects/6d/cd879f42866c54271255ade678d3b2bcc22ed9c4fc5a6a03c68a006e5d09d1.filez differ diff --git a/repo/objects/6e/04d5319edaa7a084f4a6519cd5324dc9b235ea94da9562c1b745fca12e65ac.filez b/repo/objects/6e/04d5319edaa7a084f4a6519cd5324dc9b235ea94da9562c1b745fca12e65ac.filez new file mode 100644 index 00000000000..ce6a7bab770 Binary files /dev/null and b/repo/objects/6e/04d5319edaa7a084f4a6519cd5324dc9b235ea94da9562c1b745fca12e65ac.filez differ diff --git a/repo/objects/6e/340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d.dirtree b/repo/objects/6e/340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d.dirtree new file mode 100644 index 00000000000..f76dd238ade Binary files /dev/null and b/repo/objects/6e/340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d.dirtree differ diff --git a/repo/objects/6e/3867d9d1eb308528b6b976b11478a72f17cb2b032e1774b7367c5411758b31.dirtree b/repo/objects/6e/3867d9d1eb308528b6b976b11478a72f17cb2b032e1774b7367c5411758b31.dirtree new file mode 100644 index 00000000000..fc3064dce6e Binary files /dev/null and b/repo/objects/6e/3867d9d1eb308528b6b976b11478a72f17cb2b032e1774b7367c5411758b31.dirtree differ diff --git a/repo/objects/6e/4b6db0d6ca52907494cdd567edde18442776779515900da3a370a35b8880be.filez b/repo/objects/6e/4b6db0d6ca52907494cdd567edde18442776779515900da3a370a35b8880be.filez new file mode 100644 index 00000000000..56283832f32 Binary files /dev/null and b/repo/objects/6e/4b6db0d6ca52907494cdd567edde18442776779515900da3a370a35b8880be.filez differ diff --git a/repo/objects/6e/702c3317b4228df3698c7211a7b1e8e794aea7f7579ade168577a4d36f754e.filez b/repo/objects/6e/702c3317b4228df3698c7211a7b1e8e794aea7f7579ade168577a4d36f754e.filez new file mode 100644 index 00000000000..64e52599b18 Binary files /dev/null and b/repo/objects/6e/702c3317b4228df3698c7211a7b1e8e794aea7f7579ade168577a4d36f754e.filez differ diff --git a/repo/objects/6e/70b69638716027da2bae88196f2a87e7ba107684c31c031b90ae522b5e02a3.filez b/repo/objects/6e/70b69638716027da2bae88196f2a87e7ba107684c31c031b90ae522b5e02a3.filez new file mode 100644 index 00000000000..b3c6f77ad9e Binary files /dev/null and b/repo/objects/6e/70b69638716027da2bae88196f2a87e7ba107684c31c031b90ae522b5e02a3.filez differ diff --git a/repo/objects/6e/7b847561fb4e76b4525f99101d71bbd722249fbd860aa6a07ffdbae9f9d075.filez b/repo/objects/6e/7b847561fb4e76b4525f99101d71bbd722249fbd860aa6a07ffdbae9f9d075.filez new file mode 100644 index 00000000000..ae0d2c21d65 Binary files /dev/null and b/repo/objects/6e/7b847561fb4e76b4525f99101d71bbd722249fbd860aa6a07ffdbae9f9d075.filez differ diff --git a/repo/objects/6e/be7f7418bc2226fbc2d66a498eccf722fe054026220099ef2efe193f1d4884.dirtree b/repo/objects/6e/be7f7418bc2226fbc2d66a498eccf722fe054026220099ef2efe193f1d4884.dirtree new file mode 100644 index 00000000000..1be0db22a74 Binary files /dev/null and b/repo/objects/6e/be7f7418bc2226fbc2d66a498eccf722fe054026220099ef2efe193f1d4884.dirtree differ diff --git a/repo/objects/6e/d0e49377c4777768445b734ade9411780acef55bea2391f31792c5b5fcd709.dirtree b/repo/objects/6e/d0e49377c4777768445b734ade9411780acef55bea2391f31792c5b5fcd709.dirtree new file mode 100644 index 00000000000..d4b8d324e41 Binary files /dev/null and b/repo/objects/6e/d0e49377c4777768445b734ade9411780acef55bea2391f31792c5b5fcd709.dirtree differ diff --git a/repo/objects/6e/dfb0b59d0a1f73c0122acf775634d6796c5bca340cd09722100b8a7e05c2ba.dirtree b/repo/objects/6e/dfb0b59d0a1f73c0122acf775634d6796c5bca340cd09722100b8a7e05c2ba.dirtree new file mode 100644 index 00000000000..c1e8dc2dba4 Binary files /dev/null and b/repo/objects/6e/dfb0b59d0a1f73c0122acf775634d6796c5bca340cd09722100b8a7e05c2ba.dirtree differ diff --git a/repo/objects/6e/ed9aabd7fba37e6f39e499f07ddd33cf1728710ed2c2ced5d655d06f7accef.filez b/repo/objects/6e/ed9aabd7fba37e6f39e499f07ddd33cf1728710ed2c2ced5d655d06f7accef.filez new file mode 100644 index 00000000000..3b66cd30d4c Binary files /dev/null and b/repo/objects/6e/ed9aabd7fba37e6f39e499f07ddd33cf1728710ed2c2ced5d655d06f7accef.filez differ diff --git a/repo/objects/6e/f0d2c25a24f320e86f9fb5fc0bf41f3c1a21e74f46284b7017f90d57f142cb.dirtree b/repo/objects/6e/f0d2c25a24f320e86f9fb5fc0bf41f3c1a21e74f46284b7017f90d57f142cb.dirtree new file mode 100644 index 00000000000..6aa8411a1d3 Binary files /dev/null and b/repo/objects/6e/f0d2c25a24f320e86f9fb5fc0bf41f3c1a21e74f46284b7017f90d57f142cb.dirtree differ diff --git a/repo/objects/6f/087181e60a1e18fe42b0d3286d8dd19cda577f4044ce898fcf23e845d8e7ac.dirtree b/repo/objects/6f/087181e60a1e18fe42b0d3286d8dd19cda577f4044ce898fcf23e845d8e7ac.dirtree new file mode 100644 index 00000000000..46c77da66c7 Binary files /dev/null and b/repo/objects/6f/087181e60a1e18fe42b0d3286d8dd19cda577f4044ce898fcf23e845d8e7ac.dirtree differ diff --git a/repo/objects/6f/40d2cd95e8698184a36f4ca8386468ec5a7b292f464a41b6c653c74aa5a271.filez b/repo/objects/6f/40d2cd95e8698184a36f4ca8386468ec5a7b292f464a41b6c653c74aa5a271.filez new file mode 100644 index 00000000000..2cc9aef0abe Binary files /dev/null and b/repo/objects/6f/40d2cd95e8698184a36f4ca8386468ec5a7b292f464a41b6c653c74aa5a271.filez differ diff --git a/repo/objects/6f/4da7128916529b0bfc7351b03f1a2ec9abf0ea3dfcd9386e52aea7806d94ee.filez b/repo/objects/6f/4da7128916529b0bfc7351b03f1a2ec9abf0ea3dfcd9386e52aea7806d94ee.filez new file mode 100644 index 00000000000..2623176aaea Binary files /dev/null and b/repo/objects/6f/4da7128916529b0bfc7351b03f1a2ec9abf0ea3dfcd9386e52aea7806d94ee.filez differ diff --git a/repo/objects/6f/7af3514098342d18980fda528f80e1bd369b04a4cce1f4371b68112129e060.dirtree b/repo/objects/6f/7af3514098342d18980fda528f80e1bd369b04a4cce1f4371b68112129e060.dirtree new file mode 100644 index 00000000000..99a7a0eb564 Binary files /dev/null and b/repo/objects/6f/7af3514098342d18980fda528f80e1bd369b04a4cce1f4371b68112129e060.dirtree differ diff --git a/repo/objects/6f/832f1ea21f1d3dfb135eade378dc88e9c53e6c5c682b93f851a2d7beb94b04.filez b/repo/objects/6f/832f1ea21f1d3dfb135eade378dc88e9c53e6c5c682b93f851a2d7beb94b04.filez new file mode 100644 index 00000000000..f64321d41f1 Binary files /dev/null and b/repo/objects/6f/832f1ea21f1d3dfb135eade378dc88e9c53e6c5c682b93f851a2d7beb94b04.filez differ diff --git a/repo/objects/6f/c3bae055e01eea02f92c6b545c14e6fb8e63ede7a62764bff8e972d45d9326.filez b/repo/objects/6f/c3bae055e01eea02f92c6b545c14e6fb8e63ede7a62764bff8e972d45d9326.filez new file mode 100644 index 00000000000..b707e9cc08d Binary files /dev/null and b/repo/objects/6f/c3bae055e01eea02f92c6b545c14e6fb8e63ede7a62764bff8e972d45d9326.filez differ diff --git a/repo/objects/6f/d41b8095250041ebcf839ddf9406b86dc1842667ccfa9be2fb495e0da64b03.filez b/repo/objects/6f/d41b8095250041ebcf839ddf9406b86dc1842667ccfa9be2fb495e0da64b03.filez new file mode 100644 index 00000000000..934a26ed9ef Binary files /dev/null and b/repo/objects/6f/d41b8095250041ebcf839ddf9406b86dc1842667ccfa9be2fb495e0da64b03.filez differ diff --git a/repo/objects/6f/dbea660cd9e618947f4ad860c9edd8d1949cc50584c87dfedbef3723a92d64.filez b/repo/objects/6f/dbea660cd9e618947f4ad860c9edd8d1949cc50584c87dfedbef3723a92d64.filez new file mode 100644 index 00000000000..3478953fe33 Binary files /dev/null and b/repo/objects/6f/dbea660cd9e618947f4ad860c9edd8d1949cc50584c87dfedbef3723a92d64.filez differ diff --git a/repo/objects/6f/e69a3b5511a19c404db7dc0eb8a36bfeecf5e5cf1353dda7be9d90d05357aa.filez b/repo/objects/6f/e69a3b5511a19c404db7dc0eb8a36bfeecf5e5cf1353dda7be9d90d05357aa.filez new file mode 100644 index 00000000000..15f6833bbef Binary files /dev/null and b/repo/objects/6f/e69a3b5511a19c404db7dc0eb8a36bfeecf5e5cf1353dda7be9d90d05357aa.filez differ diff --git a/repo/objects/6f/f1068df163f9542dfee44cd1f967639fb53f08caaeab256f8f63c7e9f8ee13.filez b/repo/objects/6f/f1068df163f9542dfee44cd1f967639fb53f08caaeab256f8f63c7e9f8ee13.filez new file mode 100644 index 00000000000..a76decd330b Binary files /dev/null and b/repo/objects/6f/f1068df163f9542dfee44cd1f967639fb53f08caaeab256f8f63c7e9f8ee13.filez differ diff --git a/repo/objects/6f/f3a7bba2a7ab1a7cea7ad8922f6b211a37067d3d438b0d7899e61133e7b645.filez b/repo/objects/6f/f3a7bba2a7ab1a7cea7ad8922f6b211a37067d3d438b0d7899e61133e7b645.filez new file mode 100644 index 00000000000..071e3c8252b Binary files /dev/null and b/repo/objects/6f/f3a7bba2a7ab1a7cea7ad8922f6b211a37067d3d438b0d7899e61133e7b645.filez differ diff --git a/repo/objects/70/0bc42f49fa0d3f8884ad4853f0a2637d089238308dcf8fed3238c9c66748ba.filez b/repo/objects/70/0bc42f49fa0d3f8884ad4853f0a2637d089238308dcf8fed3238c9c66748ba.filez new file mode 100644 index 00000000000..894d4ebdf69 Binary files /dev/null and b/repo/objects/70/0bc42f49fa0d3f8884ad4853f0a2637d089238308dcf8fed3238c9c66748ba.filez differ diff --git a/repo/objects/70/1c90f53a7fa83ac24752c7be141e882923fc5f8c8cf8474190803e7fe8f838.filez b/repo/objects/70/1c90f53a7fa83ac24752c7be141e882923fc5f8c8cf8474190803e7fe8f838.filez new file mode 100644 index 00000000000..8ec8c045abf Binary files /dev/null and b/repo/objects/70/1c90f53a7fa83ac24752c7be141e882923fc5f8c8cf8474190803e7fe8f838.filez differ diff --git a/repo/objects/70/2125b3a816472f69b69654e27d0b14f46420cb02f2104683bf84d30f5340a3.filez b/repo/objects/70/2125b3a816472f69b69654e27d0b14f46420cb02f2104683bf84d30f5340a3.filez new file mode 100644 index 00000000000..8e06e7bfeba Binary files /dev/null and b/repo/objects/70/2125b3a816472f69b69654e27d0b14f46420cb02f2104683bf84d30f5340a3.filez differ diff --git a/repo/objects/70/280e88745dff7018b856882b579f45e49721c0f1d9855ce281555d53a66086.filez b/repo/objects/70/280e88745dff7018b856882b579f45e49721c0f1d9855ce281555d53a66086.filez new file mode 100644 index 00000000000..780a5c12210 Binary files /dev/null and b/repo/objects/70/280e88745dff7018b856882b579f45e49721c0f1d9855ce281555d53a66086.filez differ diff --git a/repo/objects/70/52fc88e8b9885de14a8d266e0433af1a9a431072a3d78db1ecd5b2dcf3c365.filez b/repo/objects/70/52fc88e8b9885de14a8d266e0433af1a9a431072a3d78db1ecd5b2dcf3c365.filez new file mode 100644 index 00000000000..5301086a073 Binary files /dev/null and b/repo/objects/70/52fc88e8b9885de14a8d266e0433af1a9a431072a3d78db1ecd5b2dcf3c365.filez differ diff --git a/repo/objects/70/6efc19ec9551d2e9076d87ba4906a1233b99ea52cc87e31e18d8cf1d113ea6.dirtree b/repo/objects/70/6efc19ec9551d2e9076d87ba4906a1233b99ea52cc87e31e18d8cf1d113ea6.dirtree new file mode 100644 index 00000000000..936273bcab0 Binary files /dev/null and b/repo/objects/70/6efc19ec9551d2e9076d87ba4906a1233b99ea52cc87e31e18d8cf1d113ea6.dirtree differ diff --git a/repo/objects/70/93753fbf3ebb805ac548630c55e39b3d77462373e81381ff5bc77d68dd4f91.dirtree b/repo/objects/70/93753fbf3ebb805ac548630c55e39b3d77462373e81381ff5bc77d68dd4f91.dirtree new file mode 100644 index 00000000000..498c52b7fec Binary files /dev/null and b/repo/objects/70/93753fbf3ebb805ac548630c55e39b3d77462373e81381ff5bc77d68dd4f91.dirtree differ diff --git a/repo/objects/70/a28cc48b229d7e43bb229aa0a16be1b28c35209091377b6168c8d24c52cee2.filez b/repo/objects/70/a28cc48b229d7e43bb229aa0a16be1b28c35209091377b6168c8d24c52cee2.filez new file mode 100644 index 00000000000..00f7bf34442 Binary files /dev/null and b/repo/objects/70/a28cc48b229d7e43bb229aa0a16be1b28c35209091377b6168c8d24c52cee2.filez differ diff --git a/repo/objects/70/bae0c9bf8afd179d584a73c909935865e8b563213c7d32079761d6390f455c.filez b/repo/objects/70/bae0c9bf8afd179d584a73c909935865e8b563213c7d32079761d6390f455c.filez new file mode 100644 index 00000000000..cedfacc7a7c Binary files /dev/null and b/repo/objects/70/bae0c9bf8afd179d584a73c909935865e8b563213c7d32079761d6390f455c.filez differ diff --git a/repo/objects/70/c2686bdab67354db317253acdc1a11b132881ba97806c21b60c4611835bc11.filez b/repo/objects/70/c2686bdab67354db317253acdc1a11b132881ba97806c21b60c4611835bc11.filez new file mode 100644 index 00000000000..a8b074bb1cc Binary files /dev/null and b/repo/objects/70/c2686bdab67354db317253acdc1a11b132881ba97806c21b60c4611835bc11.filez differ diff --git a/repo/objects/70/ca3e1503bba8c796b13b4b7232b46fe83683a31a695f6b12cc37de406ec2a8.dirtree b/repo/objects/70/ca3e1503bba8c796b13b4b7232b46fe83683a31a695f6b12cc37de406ec2a8.dirtree new file mode 100644 index 00000000000..c36ed0af441 Binary files /dev/null and b/repo/objects/70/ca3e1503bba8c796b13b4b7232b46fe83683a31a695f6b12cc37de406ec2a8.dirtree differ diff --git a/repo/objects/70/cf3401ba3a653470c8e366e0c11664197dbe8d2f5f7aca551a37f03c4562c8.filez b/repo/objects/70/cf3401ba3a653470c8e366e0c11664197dbe8d2f5f7aca551a37f03c4562c8.filez new file mode 100644 index 00000000000..19c6b39ec9e Binary files /dev/null and b/repo/objects/70/cf3401ba3a653470c8e366e0c11664197dbe8d2f5f7aca551a37f03c4562c8.filez differ diff --git a/repo/objects/70/d5747d0ff4deb8bff99c68ed246861f8381c7486bb119288303dba38c09f7a.dirtree b/repo/objects/70/d5747d0ff4deb8bff99c68ed246861f8381c7486bb119288303dba38c09f7a.dirtree new file mode 100644 index 00000000000..c93e45c0f6a Binary files /dev/null and b/repo/objects/70/d5747d0ff4deb8bff99c68ed246861f8381c7486bb119288303dba38c09f7a.dirtree differ diff --git a/repo/objects/70/f265e9bcef25dc2e3de6f9cc3411b483a9bc33461bb6b42b4ecd7af339f098.filez b/repo/objects/70/f265e9bcef25dc2e3de6f9cc3411b483a9bc33461bb6b42b4ecd7af339f098.filez new file mode 100644 index 00000000000..bb5a2b668b3 Binary files /dev/null and b/repo/objects/70/f265e9bcef25dc2e3de6f9cc3411b483a9bc33461bb6b42b4ecd7af339f098.filez differ diff --git a/repo/objects/71/052467877ad020840267bd38ae703b92b0f9bec50751d1ba97fac0205ea595.filez b/repo/objects/71/052467877ad020840267bd38ae703b92b0f9bec50751d1ba97fac0205ea595.filez new file mode 100644 index 00000000000..e0f8d1e5f71 Binary files /dev/null and b/repo/objects/71/052467877ad020840267bd38ae703b92b0f9bec50751d1ba97fac0205ea595.filez differ diff --git a/repo/objects/71/1a23b988a9e36ff1213755749e414c7f6c2c2917e66396d0384e0a032e4d94.dirtree b/repo/objects/71/1a23b988a9e36ff1213755749e414c7f6c2c2917e66396d0384e0a032e4d94.dirtree new file mode 100644 index 00000000000..28e64730f01 Binary files /dev/null and b/repo/objects/71/1a23b988a9e36ff1213755749e414c7f6c2c2917e66396d0384e0a032e4d94.dirtree differ diff --git a/repo/objects/71/27586aae42029c9216703e988f2d43f588dc697288b9c26383baf1bf8c0daa.filez b/repo/objects/71/27586aae42029c9216703e988f2d43f588dc697288b9c26383baf1bf8c0daa.filez new file mode 100644 index 00000000000..65332abd8d1 Binary files /dev/null and b/repo/objects/71/27586aae42029c9216703e988f2d43f588dc697288b9c26383baf1bf8c0daa.filez differ diff --git a/repo/objects/71/2773b51975c80b83c5dc609b9958c02a5fccbe96235bba305af3148069c161.filez b/repo/objects/71/2773b51975c80b83c5dc609b9958c02a5fccbe96235bba305af3148069c161.filez new file mode 100644 index 00000000000..8be899ad40d Binary files /dev/null and b/repo/objects/71/2773b51975c80b83c5dc609b9958c02a5fccbe96235bba305af3148069c161.filez differ diff --git a/repo/objects/71/9a3725dcb95a86a05bd302580549e7bd0935d23d146c69ccc4c6f463b3f6f2.filez b/repo/objects/71/9a3725dcb95a86a05bd302580549e7bd0935d23d146c69ccc4c6f463b3f6f2.filez new file mode 100644 index 00000000000..b03135f1590 Binary files /dev/null and b/repo/objects/71/9a3725dcb95a86a05bd302580549e7bd0935d23d146c69ccc4c6f463b3f6f2.filez differ diff --git a/repo/objects/71/d9d07cb123a79b9dd7f0f9c428431c51244bed256420661d065e1135bf32cd.filez b/repo/objects/71/d9d07cb123a79b9dd7f0f9c428431c51244bed256420661d065e1135bf32cd.filez new file mode 100644 index 00000000000..290e42b23a9 Binary files /dev/null and b/repo/objects/71/d9d07cb123a79b9dd7f0f9c428431c51244bed256420661d065e1135bf32cd.filez differ diff --git a/repo/objects/71/da7447a27cd1ba5d6752c8acffa80851c2108f22dc44b6b95b4986064d093b.filez b/repo/objects/71/da7447a27cd1ba5d6752c8acffa80851c2108f22dc44b6b95b4986064d093b.filez new file mode 100644 index 00000000000..13241fc3595 Binary files /dev/null and b/repo/objects/71/da7447a27cd1ba5d6752c8acffa80851c2108f22dc44b6b95b4986064d093b.filez differ diff --git a/repo/objects/72/2a6cced9d3ee10703bed611b8e0ff2650576fda956e103a4b67ef34d182437.dirtree b/repo/objects/72/2a6cced9d3ee10703bed611b8e0ff2650576fda956e103a4b67ef34d182437.dirtree new file mode 100644 index 00000000000..c7f15efd138 Binary files /dev/null and b/repo/objects/72/2a6cced9d3ee10703bed611b8e0ff2650576fda956e103a4b67ef34d182437.dirtree differ diff --git a/repo/objects/72/42698b960368ade208f64d25bf6e0b08802d6ed66d265156c4514af2c5a6bd.filez b/repo/objects/72/42698b960368ade208f64d25bf6e0b08802d6ed66d265156c4514af2c5a6bd.filez new file mode 100644 index 00000000000..10271446726 Binary files /dev/null and b/repo/objects/72/42698b960368ade208f64d25bf6e0b08802d6ed66d265156c4514af2c5a6bd.filez differ diff --git a/repo/objects/72/457127cface549d88cbb01bb08781396df5a7c6c78bca7b7aedbd45274ddee.filez b/repo/objects/72/457127cface549d88cbb01bb08781396df5a7c6c78bca7b7aedbd45274ddee.filez new file mode 100644 index 00000000000..04e1cdacde9 Binary files /dev/null and b/repo/objects/72/457127cface549d88cbb01bb08781396df5a7c6c78bca7b7aedbd45274ddee.filez differ diff --git a/repo/objects/72/4d4bf1f64185e80af8dbcab6472f4979f4ea66873afa07654963e37758e0af.filez b/repo/objects/72/4d4bf1f64185e80af8dbcab6472f4979f4ea66873afa07654963e37758e0af.filez new file mode 100644 index 00000000000..8eb62b0312f Binary files /dev/null and b/repo/objects/72/4d4bf1f64185e80af8dbcab6472f4979f4ea66873afa07654963e37758e0af.filez differ diff --git a/repo/objects/72/9c67afb4749695e70dc11f736142d0f393b007bba29596166ce0b30a0620b9.filez b/repo/objects/72/9c67afb4749695e70dc11f736142d0f393b007bba29596166ce0b30a0620b9.filez new file mode 100644 index 00000000000..f11da0b4c43 Binary files /dev/null and b/repo/objects/72/9c67afb4749695e70dc11f736142d0f393b007bba29596166ce0b30a0620b9.filez differ diff --git a/repo/objects/72/a2edff8414c6c189b725e646e7dc30479a9019c7d41c8a4d45f1afe967c172.filez b/repo/objects/72/a2edff8414c6c189b725e646e7dc30479a9019c7d41c8a4d45f1afe967c172.filez new file mode 100644 index 00000000000..996e42b6473 Binary files /dev/null and b/repo/objects/72/a2edff8414c6c189b725e646e7dc30479a9019c7d41c8a4d45f1afe967c172.filez differ diff --git a/repo/objects/72/a301d331df0a2ded46192e4e62956a38e71c134cbe484f8923381f13dc1dc7.filez b/repo/objects/72/a301d331df0a2ded46192e4e62956a38e71c134cbe484f8923381f13dc1dc7.filez new file mode 100644 index 00000000000..9b4a8131008 Binary files /dev/null and b/repo/objects/72/a301d331df0a2ded46192e4e62956a38e71c134cbe484f8923381f13dc1dc7.filez differ diff --git a/repo/objects/72/b5f8176eb92eed56b52ba2bce40bc53b21fc521052c0e31c41cf4bd8fe5f6c.filez b/repo/objects/72/b5f8176eb92eed56b52ba2bce40bc53b21fc521052c0e31c41cf4bd8fe5f6c.filez new file mode 100644 index 00000000000..74a1818beca Binary files /dev/null and b/repo/objects/72/b5f8176eb92eed56b52ba2bce40bc53b21fc521052c0e31c41cf4bd8fe5f6c.filez differ diff --git a/repo/objects/72/ca10576bec2aed2bc8c825f2952c58b3f97e75d9e87cd6f45c1d0a46b6e07b.filez b/repo/objects/72/ca10576bec2aed2bc8c825f2952c58b3f97e75d9e87cd6f45c1d0a46b6e07b.filez new file mode 100644 index 00000000000..516f63b385d Binary files /dev/null and b/repo/objects/72/ca10576bec2aed2bc8c825f2952c58b3f97e75d9e87cd6f45c1d0a46b6e07b.filez differ diff --git a/repo/objects/72/d44a59b6fef393c917deb78aee9c58c8d28d613b44d9076af4bb9b3624edca.dirtree b/repo/objects/72/d44a59b6fef393c917deb78aee9c58c8d28d613b44d9076af4bb9b3624edca.dirtree new file mode 100644 index 00000000000..9917e22e679 Binary files /dev/null and b/repo/objects/72/d44a59b6fef393c917deb78aee9c58c8d28d613b44d9076af4bb9b3624edca.dirtree differ diff --git a/repo/objects/72/d60758074e878140fdba69f6b05441dc838969f0ef3995f54ce62a2df6576e.filez b/repo/objects/72/d60758074e878140fdba69f6b05441dc838969f0ef3995f54ce62a2df6576e.filez new file mode 100644 index 00000000000..efa0044c1cc Binary files /dev/null and b/repo/objects/72/d60758074e878140fdba69f6b05441dc838969f0ef3995f54ce62a2df6576e.filez differ diff --git a/repo/objects/72/f319a7f5f4314553626bd5ebbe5d18643f1e75af26aa760d2980bc74032933.dirtree b/repo/objects/72/f319a7f5f4314553626bd5ebbe5d18643f1e75af26aa760d2980bc74032933.dirtree new file mode 100644 index 00000000000..c8bf53d3d26 Binary files /dev/null and b/repo/objects/72/f319a7f5f4314553626bd5ebbe5d18643f1e75af26aa760d2980bc74032933.dirtree differ diff --git a/repo/objects/73/0a85fd2227fbf85c1ee28be58c0f62ac0b7a8afd8aa0d6861a077d0d7cc0ea.filez b/repo/objects/73/0a85fd2227fbf85c1ee28be58c0f62ac0b7a8afd8aa0d6861a077d0d7cc0ea.filez new file mode 100644 index 00000000000..15954e62949 Binary files /dev/null and b/repo/objects/73/0a85fd2227fbf85c1ee28be58c0f62ac0b7a8afd8aa0d6861a077d0d7cc0ea.filez differ diff --git a/repo/objects/73/0ad7f11c159794492f6becaf4e97c28e6c0978459dfcd7b9e2bd406286d325.dirtree b/repo/objects/73/0ad7f11c159794492f6becaf4e97c28e6c0978459dfcd7b9e2bd406286d325.dirtree new file mode 100644 index 00000000000..250e8492894 Binary files /dev/null and b/repo/objects/73/0ad7f11c159794492f6becaf4e97c28e6c0978459dfcd7b9e2bd406286d325.dirtree differ diff --git a/repo/objects/73/1fd98e5d75f7a7694ad6c399a88ee6e5d01d8f34912a54a48ad5904917cc9f.filez b/repo/objects/73/1fd98e5d75f7a7694ad6c399a88ee6e5d01d8f34912a54a48ad5904917cc9f.filez new file mode 100644 index 00000000000..785f513ea79 Binary files /dev/null and b/repo/objects/73/1fd98e5d75f7a7694ad6c399a88ee6e5d01d8f34912a54a48ad5904917cc9f.filez differ diff --git a/repo/objects/73/20e195a02c10dc237f943b0b3d63fda586369d5292f5385a27c3b576570492.filez b/repo/objects/73/20e195a02c10dc237f943b0b3d63fda586369d5292f5385a27c3b576570492.filez new file mode 100644 index 00000000000..bb38d8ad303 Binary files /dev/null and b/repo/objects/73/20e195a02c10dc237f943b0b3d63fda586369d5292f5385a27c3b576570492.filez differ diff --git a/repo/objects/73/432162a50747ab066a4832d907913df10829be99407ad56c5b03d462a918e4.filez b/repo/objects/73/432162a50747ab066a4832d907913df10829be99407ad56c5b03d462a918e4.filez new file mode 100644 index 00000000000..a9b45f834d9 Binary files /dev/null and b/repo/objects/73/432162a50747ab066a4832d907913df10829be99407ad56c5b03d462a918e4.filez differ diff --git a/repo/objects/73/a4ed2f7dcbd948373c48b6fdc0b092683f15234eadbe57194be68d555156d6.filez b/repo/objects/73/a4ed2f7dcbd948373c48b6fdc0b092683f15234eadbe57194be68d555156d6.filez new file mode 100644 index 00000000000..8b9f7bb0167 Binary files /dev/null and b/repo/objects/73/a4ed2f7dcbd948373c48b6fdc0b092683f15234eadbe57194be68d555156d6.filez differ diff --git a/repo/objects/73/c0f1c0e0d3ce3316169f063493b29a9aa881c79f8dcbf4bae3d5189c04e257.dirtree b/repo/objects/73/c0f1c0e0d3ce3316169f063493b29a9aa881c79f8dcbf4bae3d5189c04e257.dirtree new file mode 100644 index 00000000000..3311d32631a Binary files /dev/null and b/repo/objects/73/c0f1c0e0d3ce3316169f063493b29a9aa881c79f8dcbf4bae3d5189c04e257.dirtree differ diff --git a/repo/objects/73/da198857e5191c0f5bbc96850d9382a777fec9770328c59cf5318de74e8419.filez b/repo/objects/73/da198857e5191c0f5bbc96850d9382a777fec9770328c59cf5318de74e8419.filez new file mode 100644 index 00000000000..69d9dda686b Binary files /dev/null and b/repo/objects/73/da198857e5191c0f5bbc96850d9382a777fec9770328c59cf5318de74e8419.filez differ diff --git a/repo/objects/73/dcbc570bda6099f77ff1371dd9be666ec43f3151f10da7b4dd3a05eb7030ec.dirtree b/repo/objects/73/dcbc570bda6099f77ff1371dd9be666ec43f3151f10da7b4dd3a05eb7030ec.dirtree new file mode 100644 index 00000000000..c460eb6c7e2 Binary files /dev/null and b/repo/objects/73/dcbc570bda6099f77ff1371dd9be666ec43f3151f10da7b4dd3a05eb7030ec.dirtree differ diff --git a/repo/objects/73/e915b282e4def3ce952b94b893a7ee966d11ddb99e4ed541489db2c2a2b16a.filez b/repo/objects/73/e915b282e4def3ce952b94b893a7ee966d11ddb99e4ed541489db2c2a2b16a.filez new file mode 100644 index 00000000000..1064b5a3018 Binary files /dev/null and b/repo/objects/73/e915b282e4def3ce952b94b893a7ee966d11ddb99e4ed541489db2c2a2b16a.filez differ diff --git a/repo/objects/73/ecdd85518d2923aca01390879076c251d49a98d653b44f87c22c346b923e10.filez b/repo/objects/73/ecdd85518d2923aca01390879076c251d49a98d653b44f87c22c346b923e10.filez new file mode 100644 index 00000000000..8ceb2b6b3aa Binary files /dev/null and b/repo/objects/73/ecdd85518d2923aca01390879076c251d49a98d653b44f87c22c346b923e10.filez differ diff --git a/repo/objects/73/f3261fe411f1e6e7d4d9d1da9bbe95bb0d4c838d7e10c0374649ed24079bf3.dirtree b/repo/objects/73/f3261fe411f1e6e7d4d9d1da9bbe95bb0d4c838d7e10c0374649ed24079bf3.dirtree new file mode 100644 index 00000000000..5cf66c7760b Binary files /dev/null and b/repo/objects/73/f3261fe411f1e6e7d4d9d1da9bbe95bb0d4c838d7e10c0374649ed24079bf3.dirtree differ diff --git a/repo/objects/74/0a4b267fa65ee15c2e86078ebeb3d767aca87c4f63a187a6341640a985743e.filez b/repo/objects/74/0a4b267fa65ee15c2e86078ebeb3d767aca87c4f63a187a6341640a985743e.filez new file mode 100644 index 00000000000..a34558c9878 Binary files /dev/null and b/repo/objects/74/0a4b267fa65ee15c2e86078ebeb3d767aca87c4f63a187a6341640a985743e.filez differ diff --git a/repo/objects/74/0ca062fc641395e7581ebe14bfbc0cedd2f6aa66dee9377ca73304a4d559ca.filez b/repo/objects/74/0ca062fc641395e7581ebe14bfbc0cedd2f6aa66dee9377ca73304a4d559ca.filez new file mode 100644 index 00000000000..01c4869b36b Binary files /dev/null and b/repo/objects/74/0ca062fc641395e7581ebe14bfbc0cedd2f6aa66dee9377ca73304a4d559ca.filez differ diff --git a/repo/objects/74/31f38fe18115c7f9fd177bd397faa2aa9c1d6d80ab143cf201feab2883d2c7.dirtree b/repo/objects/74/31f38fe18115c7f9fd177bd397faa2aa9c1d6d80ab143cf201feab2883d2c7.dirtree new file mode 100644 index 00000000000..1ff517528fd Binary files /dev/null and b/repo/objects/74/31f38fe18115c7f9fd177bd397faa2aa9c1d6d80ab143cf201feab2883d2c7.dirtree differ diff --git a/repo/objects/74/574f589a4ca1b3ef3d4d710e9dd4d7252a24cb9a8a123f588f2470116df618.filez b/repo/objects/74/574f589a4ca1b3ef3d4d710e9dd4d7252a24cb9a8a123f588f2470116df618.filez new file mode 100644 index 00000000000..d3b83041cba Binary files /dev/null and b/repo/objects/74/574f589a4ca1b3ef3d4d710e9dd4d7252a24cb9a8a123f588f2470116df618.filez differ diff --git a/repo/objects/74/9e21a8740a015c94661daab7491de2680f8b41232eb7582f4d34404b073a27.dirtree b/repo/objects/74/9e21a8740a015c94661daab7491de2680f8b41232eb7582f4d34404b073a27.dirtree new file mode 100644 index 00000000000..2832fa1ed06 Binary files /dev/null and b/repo/objects/74/9e21a8740a015c94661daab7491de2680f8b41232eb7582f4d34404b073a27.dirtree differ diff --git a/repo/objects/74/bd190e5d60333747d20a02f7c4f55313bf6ccb284e2c0632fcacfa688a70a1.dirtree b/repo/objects/74/bd190e5d60333747d20a02f7c4f55313bf6ccb284e2c0632fcacfa688a70a1.dirtree new file mode 100644 index 00000000000..50545d0094d Binary files /dev/null and b/repo/objects/74/bd190e5d60333747d20a02f7c4f55313bf6ccb284e2c0632fcacfa688a70a1.dirtree differ diff --git a/repo/objects/74/cc3019570e8a3b8df17b72df740986031d39e2702e816edd73006fd3d66f5d.filez b/repo/objects/74/cc3019570e8a3b8df17b72df740986031d39e2702e816edd73006fd3d66f5d.filez new file mode 100644 index 00000000000..e779e8539d1 Binary files /dev/null and b/repo/objects/74/cc3019570e8a3b8df17b72df740986031d39e2702e816edd73006fd3d66f5d.filez differ diff --git a/repo/objects/74/cf78f5448955cbfe0cb06ad4bc26d8cdfb759257f6a97b5c5e91f550f648fe.dirtree b/repo/objects/74/cf78f5448955cbfe0cb06ad4bc26d8cdfb759257f6a97b5c5e91f550f648fe.dirtree new file mode 100644 index 00000000000..cf7e4ba02aa Binary files /dev/null and b/repo/objects/74/cf78f5448955cbfe0cb06ad4bc26d8cdfb759257f6a97b5c5e91f550f648fe.dirtree differ diff --git a/repo/objects/74/ff1a68e026c9fc5ef6e65afa0f3f7b2582f4f5eca3cc349ce3c9d9a49df62d.filez b/repo/objects/74/ff1a68e026c9fc5ef6e65afa0f3f7b2582f4f5eca3cc349ce3c9d9a49df62d.filez new file mode 100644 index 00000000000..1d2cc62ea28 Binary files /dev/null and b/repo/objects/74/ff1a68e026c9fc5ef6e65afa0f3f7b2582f4f5eca3cc349ce3c9d9a49df62d.filez differ diff --git a/repo/objects/75/237f51337b29bbb74e8bb8b97fa76dd69ebc67a7fb94cf21dee1c4381232df.filez b/repo/objects/75/237f51337b29bbb74e8bb8b97fa76dd69ebc67a7fb94cf21dee1c4381232df.filez new file mode 100644 index 00000000000..43126847443 Binary files /dev/null and b/repo/objects/75/237f51337b29bbb74e8bb8b97fa76dd69ebc67a7fb94cf21dee1c4381232df.filez differ diff --git a/repo/objects/75/3b82d5d5c8e4145cc640ed3c84bbadb6bac092fce38a6f4d53761796aaada2.filez b/repo/objects/75/3b82d5d5c8e4145cc640ed3c84bbadb6bac092fce38a6f4d53761796aaada2.filez new file mode 100644 index 00000000000..0e966ee8dca Binary files /dev/null and b/repo/objects/75/3b82d5d5c8e4145cc640ed3c84bbadb6bac092fce38a6f4d53761796aaada2.filez differ diff --git a/repo/objects/75/3f35d1d62168e78c8ecb8cbe9316f266ada77f2821b8dd2fb05c0e1f10a393.filez b/repo/objects/75/3f35d1d62168e78c8ecb8cbe9316f266ada77f2821b8dd2fb05c0e1f10a393.filez new file mode 100644 index 00000000000..b4fdaa6688d Binary files /dev/null and b/repo/objects/75/3f35d1d62168e78c8ecb8cbe9316f266ada77f2821b8dd2fb05c0e1f10a393.filez differ diff --git a/repo/objects/75/56d8b66e52c60bec11096e4f76ef683ad043d4ef696d7ca46404135b8d5a79.filez b/repo/objects/75/56d8b66e52c60bec11096e4f76ef683ad043d4ef696d7ca46404135b8d5a79.filez new file mode 100644 index 00000000000..6a811d120c6 Binary files /dev/null and b/repo/objects/75/56d8b66e52c60bec11096e4f76ef683ad043d4ef696d7ca46404135b8d5a79.filez differ diff --git a/repo/objects/75/6485291c0fac87c73a5ec9b80fd27bc55be6ad14b1efbf656d537efa338492.filez b/repo/objects/75/6485291c0fac87c73a5ec9b80fd27bc55be6ad14b1efbf656d537efa338492.filez new file mode 100644 index 00000000000..d9446438e28 Binary files /dev/null and b/repo/objects/75/6485291c0fac87c73a5ec9b80fd27bc55be6ad14b1efbf656d537efa338492.filez differ diff --git a/repo/objects/75/85ad2962fd62f58be1951446cd5d638ed66311130cb5b590a26b1f54afc3e7.filez b/repo/objects/75/85ad2962fd62f58be1951446cd5d638ed66311130cb5b590a26b1f54afc3e7.filez new file mode 100644 index 00000000000..780a120b03c Binary files /dev/null and b/repo/objects/75/85ad2962fd62f58be1951446cd5d638ed66311130cb5b590a26b1f54afc3e7.filez differ diff --git a/repo/objects/75/af8f33ed634ca7dedfe14ddfddb7b05c15ea91aaf232b5a0b141b67567b4ca.dirtree b/repo/objects/75/af8f33ed634ca7dedfe14ddfddb7b05c15ea91aaf232b5a0b141b67567b4ca.dirtree new file mode 100644 index 00000000000..9c275ad4ccd Binary files /dev/null and b/repo/objects/75/af8f33ed634ca7dedfe14ddfddb7b05c15ea91aaf232b5a0b141b67567b4ca.dirtree differ diff --git a/repo/objects/75/b5c6749c7fe8ff061f81c3a0eded35b3b21068425035a8e6741f6a348298e0.dirtree b/repo/objects/75/b5c6749c7fe8ff061f81c3a0eded35b3b21068425035a8e6741f6a348298e0.dirtree new file mode 100644 index 00000000000..1d287db6e0c Binary files /dev/null and b/repo/objects/75/b5c6749c7fe8ff061f81c3a0eded35b3b21068425035a8e6741f6a348298e0.dirtree differ diff --git a/repo/objects/75/d716d6dead3c531fd48f6fd9494a1bd2ee0b9b3dd06b941e533b903c7c5218.dirtree b/repo/objects/75/d716d6dead3c531fd48f6fd9494a1bd2ee0b9b3dd06b941e533b903c7c5218.dirtree new file mode 100644 index 00000000000..368dfcebe01 Binary files /dev/null and b/repo/objects/75/d716d6dead3c531fd48f6fd9494a1bd2ee0b9b3dd06b941e533b903c7c5218.dirtree differ diff --git a/repo/objects/76/0243de9e85fc8eedee382e3cce296d40f7051d325a23e9a6583f8a59e6a329.filez b/repo/objects/76/0243de9e85fc8eedee382e3cce296d40f7051d325a23e9a6583f8a59e6a329.filez new file mode 100644 index 00000000000..ac2c8f48e4c Binary files /dev/null and b/repo/objects/76/0243de9e85fc8eedee382e3cce296d40f7051d325a23e9a6583f8a59e6a329.filez differ diff --git a/repo/objects/76/0259672e34adffae26a7b0b56b77e6ab4e2062a8e61c9748424769ca69df67.dirtree b/repo/objects/76/0259672e34adffae26a7b0b56b77e6ab4e2062a8e61c9748424769ca69df67.dirtree new file mode 100644 index 00000000000..3d99ac7e663 Binary files /dev/null and b/repo/objects/76/0259672e34adffae26a7b0b56b77e6ab4e2062a8e61c9748424769ca69df67.dirtree differ diff --git a/repo/objects/76/071da84dbd9f67c1f6e5ca93e07c522d3a3bef16d0626e2a2e2ed17d6a816f.filez b/repo/objects/76/071da84dbd9f67c1f6e5ca93e07c522d3a3bef16d0626e2a2e2ed17d6a816f.filez new file mode 100644 index 00000000000..d6ff3b09ab4 Binary files /dev/null and b/repo/objects/76/071da84dbd9f67c1f6e5ca93e07c522d3a3bef16d0626e2a2e2ed17d6a816f.filez differ diff --git a/repo/objects/76/200a0eeffd16f2f0f32cea573d498c665ee2c15de21f0fd5c508339e63406d.filez b/repo/objects/76/200a0eeffd16f2f0f32cea573d498c665ee2c15de21f0fd5c508339e63406d.filez new file mode 100644 index 00000000000..1cf5e596384 Binary files /dev/null and b/repo/objects/76/200a0eeffd16f2f0f32cea573d498c665ee2c15de21f0fd5c508339e63406d.filez differ diff --git a/repo/objects/76/3f002bc0e3c06311e96b8a0109b3b3b8339b7454659883f7e058ecbec71609.dirtree b/repo/objects/76/3f002bc0e3c06311e96b8a0109b3b3b8339b7454659883f7e058ecbec71609.dirtree new file mode 100644 index 00000000000..52e3f418d99 Binary files /dev/null and b/repo/objects/76/3f002bc0e3c06311e96b8a0109b3b3b8339b7454659883f7e058ecbec71609.dirtree differ diff --git a/repo/objects/76/45df9e0506043f40c64eab3f544d2e2f9b8ac73b08de2fe0a0fe8231d7fa73.filez b/repo/objects/76/45df9e0506043f40c64eab3f544d2e2f9b8ac73b08de2fe0a0fe8231d7fa73.filez new file mode 100644 index 00000000000..89e67d7c495 Binary files /dev/null and b/repo/objects/76/45df9e0506043f40c64eab3f544d2e2f9b8ac73b08de2fe0a0fe8231d7fa73.filez differ diff --git a/repo/objects/76/55a3b51c54375f9792a5a2168a33b9dc385e3a865c62942d197ae7949ee09f.filez b/repo/objects/76/55a3b51c54375f9792a5a2168a33b9dc385e3a865c62942d197ae7949ee09f.filez new file mode 100644 index 00000000000..9f868efb882 Binary files /dev/null and b/repo/objects/76/55a3b51c54375f9792a5a2168a33b9dc385e3a865c62942d197ae7949ee09f.filez differ diff --git a/repo/objects/76/565fb8340538678662651ccf6fea16f5e5fd8988ded06c7ba84d03f42f5010.filez b/repo/objects/76/565fb8340538678662651ccf6fea16f5e5fd8988ded06c7ba84d03f42f5010.filez new file mode 100644 index 00000000000..eea4a7ddd81 Binary files /dev/null and b/repo/objects/76/565fb8340538678662651ccf6fea16f5e5fd8988ded06c7ba84d03f42f5010.filez differ diff --git a/repo/objects/76/6460508eb068291ac9e08c4fb0580ca1b9d7dd593ba02eea524c170482b506.filez b/repo/objects/76/6460508eb068291ac9e08c4fb0580ca1b9d7dd593ba02eea524c170482b506.filez new file mode 100644 index 00000000000..5b5319efa69 Binary files /dev/null and b/repo/objects/76/6460508eb068291ac9e08c4fb0580ca1b9d7dd593ba02eea524c170482b506.filez differ diff --git a/repo/objects/76/a48e5e2f916fbcc7565e19dc0c27c47a5ee0b6ec096cfb0771ff9893eb6bfa.filez b/repo/objects/76/a48e5e2f916fbcc7565e19dc0c27c47a5ee0b6ec096cfb0771ff9893eb6bfa.filez new file mode 100644 index 00000000000..768245cc57c Binary files /dev/null and b/repo/objects/76/a48e5e2f916fbcc7565e19dc0c27c47a5ee0b6ec096cfb0771ff9893eb6bfa.filez differ diff --git a/repo/objects/76/afca12ea06b8b707297100d569d26d15cf6595a1efb6e2f7f258839e64b27e.filez b/repo/objects/76/afca12ea06b8b707297100d569d26d15cf6595a1efb6e2f7f258839e64b27e.filez new file mode 100644 index 00000000000..7b199fb8cf0 Binary files /dev/null and b/repo/objects/76/afca12ea06b8b707297100d569d26d15cf6595a1efb6e2f7f258839e64b27e.filez differ diff --git a/repo/objects/76/ffeaf8b9457adc615a29bfef022ed5658796eab4a769d9484f38cd81b92836.filez b/repo/objects/76/ffeaf8b9457adc615a29bfef022ed5658796eab4a769d9484f38cd81b92836.filez new file mode 100644 index 00000000000..c110ff5078f Binary files /dev/null and b/repo/objects/76/ffeaf8b9457adc615a29bfef022ed5658796eab4a769d9484f38cd81b92836.filez differ diff --git a/repo/objects/77/0a98b25104fcd322f33bfbc19e546462e56bab3c14518f457d70943454592b.dirtree b/repo/objects/77/0a98b25104fcd322f33bfbc19e546462e56bab3c14518f457d70943454592b.dirtree new file mode 100644 index 00000000000..0009c9dfeab Binary files /dev/null and b/repo/objects/77/0a98b25104fcd322f33bfbc19e546462e56bab3c14518f457d70943454592b.dirtree differ diff --git a/repo/objects/77/0e2e12501ade4c0500cf5f114d7e7930bf0607258095146941ebab4cabecd7.dirtree b/repo/objects/77/0e2e12501ade4c0500cf5f114d7e7930bf0607258095146941ebab4cabecd7.dirtree new file mode 100644 index 00000000000..f032c5195b1 Binary files /dev/null and b/repo/objects/77/0e2e12501ade4c0500cf5f114d7e7930bf0607258095146941ebab4cabecd7.dirtree differ diff --git a/repo/objects/77/29f24828afdbc900be4b09b11e559f9c7ad3125b7a70f14a8c56d76db275c7.dirtree b/repo/objects/77/29f24828afdbc900be4b09b11e559f9c7ad3125b7a70f14a8c56d76db275c7.dirtree new file mode 100644 index 00000000000..94f539fafbe Binary files /dev/null and b/repo/objects/77/29f24828afdbc900be4b09b11e559f9c7ad3125b7a70f14a8c56d76db275c7.dirtree differ diff --git a/repo/objects/77/508f9d43d45d0749adaaa58c9d9d8b32c8d711e3fc0e50f2396b1fe2d6c0d5.filez b/repo/objects/77/508f9d43d45d0749adaaa58c9d9d8b32c8d711e3fc0e50f2396b1fe2d6c0d5.filez new file mode 100644 index 00000000000..62653e33ba3 Binary files /dev/null and b/repo/objects/77/508f9d43d45d0749adaaa58c9d9d8b32c8d711e3fc0e50f2396b1fe2d6c0d5.filez differ diff --git a/repo/objects/77/6a063b81a414810693a4e88bef1768d9a3ad6ac518547963ad5e2e6f019212.filez b/repo/objects/77/6a063b81a414810693a4e88bef1768d9a3ad6ac518547963ad5e2e6f019212.filez new file mode 100644 index 00000000000..e309a0e5488 Binary files /dev/null and b/repo/objects/77/6a063b81a414810693a4e88bef1768d9a3ad6ac518547963ad5e2e6f019212.filez differ diff --git a/repo/objects/77/71742cbef1478b5ff1b717adf5a366672a7002ba3ec7e3df1c1a6639151f00.filez b/repo/objects/77/71742cbef1478b5ff1b717adf5a366672a7002ba3ec7e3df1c1a6639151f00.filez new file mode 100644 index 00000000000..5cad1f698c7 Binary files /dev/null and b/repo/objects/77/71742cbef1478b5ff1b717adf5a366672a7002ba3ec7e3df1c1a6639151f00.filez differ diff --git a/repo/objects/77/9f70a1173adcfa7a611742f57f75d1dff3a538645519f3c562c020d571216b.filez b/repo/objects/77/9f70a1173adcfa7a611742f57f75d1dff3a538645519f3c562c020d571216b.filez new file mode 100644 index 00000000000..56375ff9401 Binary files /dev/null and b/repo/objects/77/9f70a1173adcfa7a611742f57f75d1dff3a538645519f3c562c020d571216b.filez differ diff --git a/repo/objects/77/b142b407cdca393fd272530e52c7d1c3077532168af203ba56fe02d2b75bbd.filez b/repo/objects/77/b142b407cdca393fd272530e52c7d1c3077532168af203ba56fe02d2b75bbd.filez new file mode 100644 index 00000000000..71814f43159 Binary files /dev/null and b/repo/objects/77/b142b407cdca393fd272530e52c7d1c3077532168af203ba56fe02d2b75bbd.filez differ diff --git a/repo/objects/77/b5ea11b3eb3df59b5962386c7ddeb7871e2a519fdf52bef6b91e77e00d871e.filez b/repo/objects/77/b5ea11b3eb3df59b5962386c7ddeb7871e2a519fdf52bef6b91e77e00d871e.filez new file mode 100644 index 00000000000..d57255bc252 Binary files /dev/null and b/repo/objects/77/b5ea11b3eb3df59b5962386c7ddeb7871e2a519fdf52bef6b91e77e00d871e.filez differ diff --git a/repo/objects/77/c84f0a235565ef4c4c87c14ae95030dd4b297bae2d00a4d9bd9cf18e556338.filez b/repo/objects/77/c84f0a235565ef4c4c87c14ae95030dd4b297bae2d00a4d9bd9cf18e556338.filez new file mode 100644 index 00000000000..9f33803253c Binary files /dev/null and b/repo/objects/77/c84f0a235565ef4c4c87c14ae95030dd4b297bae2d00a4d9bd9cf18e556338.filez differ diff --git a/repo/objects/77/ded6c39374bc7d2f78f3833b7629227b9198b3c73220ec68587cbefc559232.filez b/repo/objects/77/ded6c39374bc7d2f78f3833b7629227b9198b3c73220ec68587cbefc559232.filez new file mode 100644 index 00000000000..578af0b670c Binary files /dev/null and b/repo/objects/77/ded6c39374bc7d2f78f3833b7629227b9198b3c73220ec68587cbefc559232.filez differ diff --git a/repo/objects/77/e65e1c97b2d4b61c7bec8ce82e63f827e0dfe2f1cf9a9f44a2cdb6124479b0.filez b/repo/objects/77/e65e1c97b2d4b61c7bec8ce82e63f827e0dfe2f1cf9a9f44a2cdb6124479b0.filez new file mode 100644 index 00000000000..b90ad8c2f74 Binary files /dev/null and b/repo/objects/77/e65e1c97b2d4b61c7bec8ce82e63f827e0dfe2f1cf9a9f44a2cdb6124479b0.filez differ diff --git a/repo/objects/77/ed74fa737b51fed4da09dad3a3a003c8224ebe1273ef25678f1a2c92c3af66.filez b/repo/objects/77/ed74fa737b51fed4da09dad3a3a003c8224ebe1273ef25678f1a2c92c3af66.filez new file mode 100644 index 00000000000..c258d5f0967 Binary files /dev/null and b/repo/objects/77/ed74fa737b51fed4da09dad3a3a003c8224ebe1273ef25678f1a2c92c3af66.filez differ diff --git a/repo/objects/78/129c40a6e4e04424bfd2dd532f1a0c9b04eeeac56db73be1b3daafcab10341.dirtree b/repo/objects/78/129c40a6e4e04424bfd2dd532f1a0c9b04eeeac56db73be1b3daafcab10341.dirtree new file mode 100644 index 00000000000..4aacd94d2fa Binary files /dev/null and b/repo/objects/78/129c40a6e4e04424bfd2dd532f1a0c9b04eeeac56db73be1b3daafcab10341.dirtree differ diff --git a/repo/objects/78/19d95eba35472f13399444b26c0051d667370ef52a89148cb7f9310f20d07e.filez b/repo/objects/78/19d95eba35472f13399444b26c0051d667370ef52a89148cb7f9310f20d07e.filez new file mode 100644 index 00000000000..56a0735b040 Binary files /dev/null and b/repo/objects/78/19d95eba35472f13399444b26c0051d667370ef52a89148cb7f9310f20d07e.filez differ diff --git a/repo/objects/78/3a12de531ad96b8fe2f9074cd4557bfcb466c344a5827da915f5ce64b2b95b.dirtree b/repo/objects/78/3a12de531ad96b8fe2f9074cd4557bfcb466c344a5827da915f5ce64b2b95b.dirtree new file mode 100644 index 00000000000..7472950b1f6 Binary files /dev/null and b/repo/objects/78/3a12de531ad96b8fe2f9074cd4557bfcb466c344a5827da915f5ce64b2b95b.dirtree differ diff --git a/repo/objects/78/4be85f5b35ce99e8a2b41cd2311d0484d9fe0e6c077acc9a3a29b2f01ba4f0.filez b/repo/objects/78/4be85f5b35ce99e8a2b41cd2311d0484d9fe0e6c077acc9a3a29b2f01ba4f0.filez new file mode 100644 index 00000000000..97577cfe5e2 Binary files /dev/null and b/repo/objects/78/4be85f5b35ce99e8a2b41cd2311d0484d9fe0e6c077acc9a3a29b2f01ba4f0.filez differ diff --git a/repo/objects/78/4c253e69c27bbf910078e76c201526d86380f0dcb3a765fba3d8c1b549662a.filez b/repo/objects/78/4c253e69c27bbf910078e76c201526d86380f0dcb3a765fba3d8c1b549662a.filez new file mode 100644 index 00000000000..fc77a502d38 Binary files /dev/null and b/repo/objects/78/4c253e69c27bbf910078e76c201526d86380f0dcb3a765fba3d8c1b549662a.filez differ diff --git a/repo/objects/78/523fa2cef140dd345d06d643d74d5103af867582076315640e0be0b356980e.filez b/repo/objects/78/523fa2cef140dd345d06d643d74d5103af867582076315640e0be0b356980e.filez new file mode 100644 index 00000000000..9182a21d05f Binary files /dev/null and b/repo/objects/78/523fa2cef140dd345d06d643d74d5103af867582076315640e0be0b356980e.filez differ diff --git a/repo/objects/78/6bcd2968ed5ff48969d0451dddcf6085984adae92afbf241e7131a163f231a.dirtree b/repo/objects/78/6bcd2968ed5ff48969d0451dddcf6085984adae92afbf241e7131a163f231a.dirtree new file mode 100644 index 00000000000..49711b27bee Binary files /dev/null and b/repo/objects/78/6bcd2968ed5ff48969d0451dddcf6085984adae92afbf241e7131a163f231a.dirtree differ diff --git a/repo/objects/78/7c7e385b9a3e88213da25344ee1f2192bd6fcf4ea0bf1eeaaa98cb89003393.filez b/repo/objects/78/7c7e385b9a3e88213da25344ee1f2192bd6fcf4ea0bf1eeaaa98cb89003393.filez new file mode 100644 index 00000000000..64abb4735b9 Binary files /dev/null and b/repo/objects/78/7c7e385b9a3e88213da25344ee1f2192bd6fcf4ea0bf1eeaaa98cb89003393.filez differ diff --git a/repo/objects/78/80e34346537452125588e79088675420d05e7a22494b4b8a13ca2f6d870115.dirtree b/repo/objects/78/80e34346537452125588e79088675420d05e7a22494b4b8a13ca2f6d870115.dirtree new file mode 100644 index 00000000000..b6df5f7c279 Binary files /dev/null and b/repo/objects/78/80e34346537452125588e79088675420d05e7a22494b4b8a13ca2f6d870115.dirtree differ diff --git a/repo/objects/78/880b50fcd82853acde76a38c3d9b56b5a5e5d08c23bb59b81f9aba0bd865b2.filez b/repo/objects/78/880b50fcd82853acde76a38c3d9b56b5a5e5d08c23bb59b81f9aba0bd865b2.filez new file mode 100644 index 00000000000..cf30474e1fb Binary files /dev/null and b/repo/objects/78/880b50fcd82853acde76a38c3d9b56b5a5e5d08c23bb59b81f9aba0bd865b2.filez differ diff --git a/repo/objects/78/a99131c0b6d93abacefc19c2ec1e717feffbe59c747d3b37514bafa9e50f63.filez b/repo/objects/78/a99131c0b6d93abacefc19c2ec1e717feffbe59c747d3b37514bafa9e50f63.filez new file mode 100644 index 00000000000..f1b2c8b09a0 Binary files /dev/null and b/repo/objects/78/a99131c0b6d93abacefc19c2ec1e717feffbe59c747d3b37514bafa9e50f63.filez differ diff --git a/repo/objects/78/b4646bc0b045251cf0a08f536febba840f654b623e0358af6b91deb27333fd.filez b/repo/objects/78/b4646bc0b045251cf0a08f536febba840f654b623e0358af6b91deb27333fd.filez new file mode 100644 index 00000000000..430772f9e52 Binary files /dev/null and b/repo/objects/78/b4646bc0b045251cf0a08f536febba840f654b623e0358af6b91deb27333fd.filez differ diff --git a/repo/objects/78/bd31c4358ae0b133474b4c9fcaf6980f2068eec13c96f42a59852d9cdcca04.dirtree b/repo/objects/78/bd31c4358ae0b133474b4c9fcaf6980f2068eec13c96f42a59852d9cdcca04.dirtree new file mode 100644 index 00000000000..99d0092395d Binary files /dev/null and b/repo/objects/78/bd31c4358ae0b133474b4c9fcaf6980f2068eec13c96f42a59852d9cdcca04.dirtree differ diff --git a/repo/objects/78/ebbbd20f95006dbdbf911ac657dfdcddeeb608aa2b29980b4ed583e108cbe3.dirtree b/repo/objects/78/ebbbd20f95006dbdbf911ac657dfdcddeeb608aa2b29980b4ed583e108cbe3.dirtree new file mode 100644 index 00000000000..7baab06f6c6 Binary files /dev/null and b/repo/objects/78/ebbbd20f95006dbdbf911ac657dfdcddeeb608aa2b29980b4ed583e108cbe3.dirtree differ diff --git a/repo/objects/78/f6cef95ad00b1485655e32d835fa94a5975533c49d66050e02b7efe3c18f34.filez b/repo/objects/78/f6cef95ad00b1485655e32d835fa94a5975533c49d66050e02b7efe3c18f34.filez new file mode 100644 index 00000000000..4d81457cedb Binary files /dev/null and b/repo/objects/78/f6cef95ad00b1485655e32d835fa94a5975533c49d66050e02b7efe3c18f34.filez differ diff --git a/repo/objects/78/ff651fa03ee3ae4838ee679652165bc804ac1581bc758873430e90a6180e92.filez b/repo/objects/78/ff651fa03ee3ae4838ee679652165bc804ac1581bc758873430e90a6180e92.filez new file mode 100644 index 00000000000..7c051585395 Binary files /dev/null and b/repo/objects/78/ff651fa03ee3ae4838ee679652165bc804ac1581bc758873430e90a6180e92.filez differ diff --git a/repo/objects/79/00bb2a7cb2f65645d0f86f41d6d7dcfafdd752b7b1bf8ff5fe05537cff3459.filez b/repo/objects/79/00bb2a7cb2f65645d0f86f41d6d7dcfafdd752b7b1bf8ff5fe05537cff3459.filez new file mode 100644 index 00000000000..0ef54301191 Binary files /dev/null and b/repo/objects/79/00bb2a7cb2f65645d0f86f41d6d7dcfafdd752b7b1bf8ff5fe05537cff3459.filez differ diff --git a/repo/objects/79/052a73356e59b2020313b4f2dab4f0aa39083acdedcf4c67c300cf5fcf1202.filez b/repo/objects/79/052a73356e59b2020313b4f2dab4f0aa39083acdedcf4c67c300cf5fcf1202.filez new file mode 100644 index 00000000000..c792680f674 Binary files /dev/null and b/repo/objects/79/052a73356e59b2020313b4f2dab4f0aa39083acdedcf4c67c300cf5fcf1202.filez differ diff --git a/repo/objects/79/50f79136879c4237aff0e88aced0b39c6da49ffb5e7a15a61a6ca7b8f91c45.filez b/repo/objects/79/50f79136879c4237aff0e88aced0b39c6da49ffb5e7a15a61a6ca7b8f91c45.filez new file mode 100644 index 00000000000..be89d91cd4e Binary files /dev/null and b/repo/objects/79/50f79136879c4237aff0e88aced0b39c6da49ffb5e7a15a61a6ca7b8f91c45.filez differ diff --git a/repo/objects/79/642e7f1d80b0d0e1f31ef532e0b7a1616a084e6fb14d8109cd5fb6ba6f17d4.filez b/repo/objects/79/642e7f1d80b0d0e1f31ef532e0b7a1616a084e6fb14d8109cd5fb6ba6f17d4.filez new file mode 100644 index 00000000000..c857556aca3 Binary files /dev/null and b/repo/objects/79/642e7f1d80b0d0e1f31ef532e0b7a1616a084e6fb14d8109cd5fb6ba6f17d4.filez differ diff --git a/repo/objects/79/7ad04ddb88ad200a3423e71ffa4c4c8481407a869a9b73ffca69f0c50d634c.filez b/repo/objects/79/7ad04ddb88ad200a3423e71ffa4c4c8481407a869a9b73ffca69f0c50d634c.filez new file mode 100644 index 00000000000..fbca9cd3057 Binary files /dev/null and b/repo/objects/79/7ad04ddb88ad200a3423e71ffa4c4c8481407a869a9b73ffca69f0c50d634c.filez differ diff --git a/repo/objects/79/b7c5650bc1fc3822e13ed5849d263422ed967c34f2f5369b176a9fe0ae1a0c.filez b/repo/objects/79/b7c5650bc1fc3822e13ed5849d263422ed967c34f2f5369b176a9fe0ae1a0c.filez new file mode 100644 index 00000000000..03bdcd7b729 Binary files /dev/null and b/repo/objects/79/b7c5650bc1fc3822e13ed5849d263422ed967c34f2f5369b176a9fe0ae1a0c.filez differ diff --git a/repo/objects/79/c3ac5a80802a5554166098e277f25557649f00e0ed5fe77011da5e2c22d9c4.dirtree b/repo/objects/79/c3ac5a80802a5554166098e277f25557649f00e0ed5fe77011da5e2c22d9c4.dirtree new file mode 100644 index 00000000000..4e842f8444c Binary files /dev/null and b/repo/objects/79/c3ac5a80802a5554166098e277f25557649f00e0ed5fe77011da5e2c22d9c4.dirtree differ diff --git a/repo/objects/79/c986ecfee0125d629f193b3ba8f2e29ebfbcd873ee0c3d660d8b006189ffb7.filez b/repo/objects/79/c986ecfee0125d629f193b3ba8f2e29ebfbcd873ee0c3d660d8b006189ffb7.filez new file mode 100644 index 00000000000..410cb9be1bb Binary files /dev/null and b/repo/objects/79/c986ecfee0125d629f193b3ba8f2e29ebfbcd873ee0c3d660d8b006189ffb7.filez differ diff --git a/repo/objects/79/e90e42dd78e4db568267b44cf4a8dce98e04b1e5f5bde41231116d30b316fa.filez b/repo/objects/79/e90e42dd78e4db568267b44cf4a8dce98e04b1e5f5bde41231116d30b316fa.filez new file mode 100644 index 00000000000..34d55c4b153 Binary files /dev/null and b/repo/objects/79/e90e42dd78e4db568267b44cf4a8dce98e04b1e5f5bde41231116d30b316fa.filez differ diff --git a/repo/objects/79/f166d668633085467820fef584e9dde62c442096ac20ac6d029e0c4bc6fc2a.filez b/repo/objects/79/f166d668633085467820fef584e9dde62c442096ac20ac6d029e0c4bc6fc2a.filez new file mode 100644 index 00000000000..e859137d90a Binary files /dev/null and b/repo/objects/79/f166d668633085467820fef584e9dde62c442096ac20ac6d029e0c4bc6fc2a.filez differ diff --git a/repo/objects/79/fdb8182553db1194fd47feae04d5519b0e88eab9228ecb463edd871055e094.filez b/repo/objects/79/fdb8182553db1194fd47feae04d5519b0e88eab9228ecb463edd871055e094.filez new file mode 100644 index 00000000000..40ef537fa77 Binary files /dev/null and b/repo/objects/79/fdb8182553db1194fd47feae04d5519b0e88eab9228ecb463edd871055e094.filez differ diff --git a/repo/objects/7a/590f5b926ee95f7241b442b4849a7100fdd260c8e727dc8efdae31cf35f03d.dirtree b/repo/objects/7a/590f5b926ee95f7241b442b4849a7100fdd260c8e727dc8efdae31cf35f03d.dirtree new file mode 100644 index 00000000000..f39cf4ddd83 Binary files /dev/null and b/repo/objects/7a/590f5b926ee95f7241b442b4849a7100fdd260c8e727dc8efdae31cf35f03d.dirtree differ diff --git a/repo/objects/7a/a148ea7127cae5c85a84850599aa3729e1b4bd8d68ef41d23602be6df57939.dirtree b/repo/objects/7a/a148ea7127cae5c85a84850599aa3729e1b4bd8d68ef41d23602be6df57939.dirtree new file mode 100644 index 00000000000..3a675bec708 Binary files /dev/null and b/repo/objects/7a/a148ea7127cae5c85a84850599aa3729e1b4bd8d68ef41d23602be6df57939.dirtree differ diff --git a/repo/objects/7a/b3046525e3b6b7074c7e21740983b2e6b9b4e92a5a7311b663bc81f4523009.dirtree b/repo/objects/7a/b3046525e3b6b7074c7e21740983b2e6b9b4e92a5a7311b663bc81f4523009.dirtree new file mode 100644 index 00000000000..dbd8c0eeb27 Binary files /dev/null and b/repo/objects/7a/b3046525e3b6b7074c7e21740983b2e6b9b4e92a5a7311b663bc81f4523009.dirtree differ diff --git a/repo/objects/7a/bb1822b927dad99e1a543c4daec8b39d8464dc55fee1b5704330f0c4cb35b0.filez b/repo/objects/7a/bb1822b927dad99e1a543c4daec8b39d8464dc55fee1b5704330f0c4cb35b0.filez new file mode 100644 index 00000000000..43c70964e2e Binary files /dev/null and b/repo/objects/7a/bb1822b927dad99e1a543c4daec8b39d8464dc55fee1b5704330f0c4cb35b0.filez differ diff --git a/repo/objects/7a/cd160e35d578121dfca950c6a3e23e7898c0f65921b1acadb85069f53c6e9f.filez b/repo/objects/7a/cd160e35d578121dfca950c6a3e23e7898c0f65921b1acadb85069f53c6e9f.filez new file mode 100644 index 00000000000..8e4d042e5ee Binary files /dev/null and b/repo/objects/7a/cd160e35d578121dfca950c6a3e23e7898c0f65921b1acadb85069f53c6e9f.filez differ diff --git a/repo/objects/7a/d11f0f60c82f5e1c599bff6d32f8c36269dd7ddb9ff84974ac89577410478e.filez b/repo/objects/7a/d11f0f60c82f5e1c599bff6d32f8c36269dd7ddb9ff84974ac89577410478e.filez new file mode 100644 index 00000000000..e9534d43e53 Binary files /dev/null and b/repo/objects/7a/d11f0f60c82f5e1c599bff6d32f8c36269dd7ddb9ff84974ac89577410478e.filez differ diff --git a/repo/objects/7a/e58e7c9bb718cb7a70045606aa56a4fad56c3962924bd39962953de1bee347.filez b/repo/objects/7a/e58e7c9bb718cb7a70045606aa56a4fad56c3962924bd39962953de1bee347.filez new file mode 100644 index 00000000000..8ef3872657d Binary files /dev/null and b/repo/objects/7a/e58e7c9bb718cb7a70045606aa56a4fad56c3962924bd39962953de1bee347.filez differ diff --git a/repo/objects/7b/080230dc4901b8b22a131fbd5acba77f77f117f4b8aecaaf3e5616d0923569.filez b/repo/objects/7b/080230dc4901b8b22a131fbd5acba77f77f117f4b8aecaaf3e5616d0923569.filez new file mode 100644 index 00000000000..b024e4dbc6b Binary files /dev/null and b/repo/objects/7b/080230dc4901b8b22a131fbd5acba77f77f117f4b8aecaaf3e5616d0923569.filez differ diff --git a/repo/objects/7b/1102dfcd4229dec2d3c0ae5daa0e3118b638cf2ff8f915dc95e6ed1be21364.filez b/repo/objects/7b/1102dfcd4229dec2d3c0ae5daa0e3118b638cf2ff8f915dc95e6ed1be21364.filez new file mode 100644 index 00000000000..68db6aa23d9 Binary files /dev/null and b/repo/objects/7b/1102dfcd4229dec2d3c0ae5daa0e3118b638cf2ff8f915dc95e6ed1be21364.filez differ diff --git a/repo/objects/7b/1814484d26569c541267f174851e41927fc29609f3357125b5a96f5f3cb58c.filez b/repo/objects/7b/1814484d26569c541267f174851e41927fc29609f3357125b5a96f5f3cb58c.filez new file mode 100644 index 00000000000..fd060fc2921 Binary files /dev/null and b/repo/objects/7b/1814484d26569c541267f174851e41927fc29609f3357125b5a96f5f3cb58c.filez differ diff --git a/repo/objects/7b/1c5327f4bb61ea124c0da55b82085f0c6ed3b275f1a979c33d2b056894b706.filez b/repo/objects/7b/1c5327f4bb61ea124c0da55b82085f0c6ed3b275f1a979c33d2b056894b706.filez new file mode 100644 index 00000000000..aac82f1ba07 Binary files /dev/null and b/repo/objects/7b/1c5327f4bb61ea124c0da55b82085f0c6ed3b275f1a979c33d2b056894b706.filez differ diff --git a/repo/objects/7b/2817b7fa82aa4e6599b6dacbf188070bf4d26656ae64313eb960e60356b490.filez b/repo/objects/7b/2817b7fa82aa4e6599b6dacbf188070bf4d26656ae64313eb960e60356b490.filez new file mode 100644 index 00000000000..21edbd23183 Binary files /dev/null and b/repo/objects/7b/2817b7fa82aa4e6599b6dacbf188070bf4d26656ae64313eb960e60356b490.filez differ diff --git a/repo/objects/7b/2fe624a18edf3036da38efe4915e16a28829db2c0ea43929ac081c3fba3174.filez b/repo/objects/7b/2fe624a18edf3036da38efe4915e16a28829db2c0ea43929ac081c3fba3174.filez new file mode 100644 index 00000000000..4cfa3612571 Binary files /dev/null and b/repo/objects/7b/2fe624a18edf3036da38efe4915e16a28829db2c0ea43929ac081c3fba3174.filez differ diff --git a/repo/objects/7b/73d7b01e6185c62e77b3c4103541804348240364a6d84f2dc3f35637b9527c.dirtree b/repo/objects/7b/73d7b01e6185c62e77b3c4103541804348240364a6d84f2dc3f35637b9527c.dirtree new file mode 100644 index 00000000000..a52468b69e5 Binary files /dev/null and b/repo/objects/7b/73d7b01e6185c62e77b3c4103541804348240364a6d84f2dc3f35637b9527c.dirtree differ diff --git a/repo/objects/7b/8990226810aa5738cd15be24f3b1c6ff92bf4499b2470bc1cca88dc3021a2a.dirtree b/repo/objects/7b/8990226810aa5738cd15be24f3b1c6ff92bf4499b2470bc1cca88dc3021a2a.dirtree new file mode 100644 index 00000000000..ea82674d1f7 Binary files /dev/null and b/repo/objects/7b/8990226810aa5738cd15be24f3b1c6ff92bf4499b2470bc1cca88dc3021a2a.dirtree differ diff --git a/repo/objects/7b/b9954c6452f5927c595db57fdcc91c936269f83969a1acf4b6f92b2e028ca8.filez b/repo/objects/7b/b9954c6452f5927c595db57fdcc91c936269f83969a1acf4b6f92b2e028ca8.filez new file mode 100644 index 00000000000..4e0c7fb2e56 Binary files /dev/null and b/repo/objects/7b/b9954c6452f5927c595db57fdcc91c936269f83969a1acf4b6f92b2e028ca8.filez differ diff --git a/repo/objects/7b/d77d3806bd5edef6e33d31a7b0db6506cf62649129410d84655bae3ba50b7a.filez b/repo/objects/7b/d77d3806bd5edef6e33d31a7b0db6506cf62649129410d84655bae3ba50b7a.filez new file mode 100644 index 00000000000..6c56b02f296 Binary files /dev/null and b/repo/objects/7b/d77d3806bd5edef6e33d31a7b0db6506cf62649129410d84655bae3ba50b7a.filez differ diff --git a/repo/objects/7c/179f643ded5ee65645e482029d7c55251d0e89e2af5baaee65f32be96f7805.filez b/repo/objects/7c/179f643ded5ee65645e482029d7c55251d0e89e2af5baaee65f32be96f7805.filez new file mode 100644 index 00000000000..58cac104ce1 Binary files /dev/null and b/repo/objects/7c/179f643ded5ee65645e482029d7c55251d0e89e2af5baaee65f32be96f7805.filez differ diff --git a/repo/objects/7c/2fbb79986b425600ea35352d4610de38323282c312e3306acc2cc7c48989f8.filez b/repo/objects/7c/2fbb79986b425600ea35352d4610de38323282c312e3306acc2cc7c48989f8.filez new file mode 100644 index 00000000000..d58a5d50124 Binary files /dev/null and b/repo/objects/7c/2fbb79986b425600ea35352d4610de38323282c312e3306acc2cc7c48989f8.filez differ diff --git a/repo/objects/7c/354d4dea9ce8727fde981f00ed209fafd97c1fdc5f5f6f740ebebd12023064.dirtree b/repo/objects/7c/354d4dea9ce8727fde981f00ed209fafd97c1fdc5f5f6f740ebebd12023064.dirtree new file mode 100644 index 00000000000..e6811ef99ab Binary files /dev/null and b/repo/objects/7c/354d4dea9ce8727fde981f00ed209fafd97c1fdc5f5f6f740ebebd12023064.dirtree differ diff --git a/repo/objects/7c/36ad1283a33ee6fa4f0f8c22c837807f76deed680dbd1878d0f43edd3b14ad.dirtree b/repo/objects/7c/36ad1283a33ee6fa4f0f8c22c837807f76deed680dbd1878d0f43edd3b14ad.dirtree new file mode 100644 index 00000000000..e88e0867475 Binary files /dev/null and b/repo/objects/7c/36ad1283a33ee6fa4f0f8c22c837807f76deed680dbd1878d0f43edd3b14ad.dirtree differ diff --git a/repo/objects/7c/37141ed03afa6a4d591592d5fa750fc3e4c26d7221ecd2efe6b2558d943f4a.filez b/repo/objects/7c/37141ed03afa6a4d591592d5fa750fc3e4c26d7221ecd2efe6b2558d943f4a.filez new file mode 100644 index 00000000000..6803096576b Binary files /dev/null and b/repo/objects/7c/37141ed03afa6a4d591592d5fa750fc3e4c26d7221ecd2efe6b2558d943f4a.filez differ diff --git a/repo/objects/7c/3f6df9e83fd322f7f0bc2462dfeb6f9e332c5e180536632969dc64e0dfca52.filez b/repo/objects/7c/3f6df9e83fd322f7f0bc2462dfeb6f9e332c5e180536632969dc64e0dfca52.filez new file mode 100644 index 00000000000..d1553258053 Binary files /dev/null and b/repo/objects/7c/3f6df9e83fd322f7f0bc2462dfeb6f9e332c5e180536632969dc64e0dfca52.filez differ diff --git a/repo/objects/7c/495a5399609a394dd38c7b80598ec4c29544dd11798d234091a1250f7c3228.filez b/repo/objects/7c/495a5399609a394dd38c7b80598ec4c29544dd11798d234091a1250f7c3228.filez new file mode 100644 index 00000000000..b24e409f756 Binary files /dev/null and b/repo/objects/7c/495a5399609a394dd38c7b80598ec4c29544dd11798d234091a1250f7c3228.filez differ diff --git a/repo/objects/7c/5fe23eac8e0709290057e82fc6c83d797cfd5749988f09452966f5a4bc2c06.filez b/repo/objects/7c/5fe23eac8e0709290057e82fc6c83d797cfd5749988f09452966f5a4bc2c06.filez new file mode 100644 index 00000000000..f325db674ac Binary files /dev/null and b/repo/objects/7c/5fe23eac8e0709290057e82fc6c83d797cfd5749988f09452966f5a4bc2c06.filez differ diff --git a/repo/objects/7c/7c2609987116db680980c1f621cac8a2cfb666e698aa3f9dcad3cf55eba53f.filez b/repo/objects/7c/7c2609987116db680980c1f621cac8a2cfb666e698aa3f9dcad3cf55eba53f.filez new file mode 100644 index 00000000000..c10ec2f07f4 Binary files /dev/null and b/repo/objects/7c/7c2609987116db680980c1f621cac8a2cfb666e698aa3f9dcad3cf55eba53f.filez differ diff --git a/repo/objects/7c/81c8a9dde33123dbddc57f234a3d04dcfd44e1922413bd3e535a9130cc6610.dirtree b/repo/objects/7c/81c8a9dde33123dbddc57f234a3d04dcfd44e1922413bd3e535a9130cc6610.dirtree new file mode 100644 index 00000000000..227c1bddfac Binary files /dev/null and b/repo/objects/7c/81c8a9dde33123dbddc57f234a3d04dcfd44e1922413bd3e535a9130cc6610.dirtree differ diff --git a/repo/objects/7c/88016fcf68713d930d4d870f292e054a562cdec0d6c1fd42c23bd2cd0664a4.filez b/repo/objects/7c/88016fcf68713d930d4d870f292e054a562cdec0d6c1fd42c23bd2cd0664a4.filez new file mode 100644 index 00000000000..1b03671d83f Binary files /dev/null and b/repo/objects/7c/88016fcf68713d930d4d870f292e054a562cdec0d6c1fd42c23bd2cd0664a4.filez differ diff --git a/repo/objects/7c/90e512f80f54caaa0144dd044f2ccd9b3d5b721682fb8a6fbcf1a90c7c1f39.dirtree b/repo/objects/7c/90e512f80f54caaa0144dd044f2ccd9b3d5b721682fb8a6fbcf1a90c7c1f39.dirtree new file mode 100644 index 00000000000..5a4b45cee6a Binary files /dev/null and b/repo/objects/7c/90e512f80f54caaa0144dd044f2ccd9b3d5b721682fb8a6fbcf1a90c7c1f39.dirtree differ diff --git a/repo/objects/7c/a3de328b826e26e009f40b04b7e677e36083bf32fc5bab0e32d9a8e1d14802.filez b/repo/objects/7c/a3de328b826e26e009f40b04b7e677e36083bf32fc5bab0e32d9a8e1d14802.filez new file mode 100644 index 00000000000..6f8e02bf251 Binary files /dev/null and b/repo/objects/7c/a3de328b826e26e009f40b04b7e677e36083bf32fc5bab0e32d9a8e1d14802.filez differ diff --git a/repo/objects/7c/b31acf7ad2a69679458c5cba87d8c7f3ef0f1be8b08da5f23a9fcf0e0b3c51.dirtree b/repo/objects/7c/b31acf7ad2a69679458c5cba87d8c7f3ef0f1be8b08da5f23a9fcf0e0b3c51.dirtree new file mode 100644 index 00000000000..d21fc50bc3d Binary files /dev/null and b/repo/objects/7c/b31acf7ad2a69679458c5cba87d8c7f3ef0f1be8b08da5f23a9fcf0e0b3c51.dirtree differ diff --git a/repo/objects/7c/bdd864dc246d78403eae2afa01ff69e42b81b93fd5f8eaec01fb55e96ff13b.filez b/repo/objects/7c/bdd864dc246d78403eae2afa01ff69e42b81b93fd5f8eaec01fb55e96ff13b.filez new file mode 100644 index 00000000000..dc11752353b Binary files /dev/null and b/repo/objects/7c/bdd864dc246d78403eae2afa01ff69e42b81b93fd5f8eaec01fb55e96ff13b.filez differ diff --git a/repo/objects/7c/eda9ff18c1a3f69194217e24cc8b65543f3b371e45f4a042bf1e6fe75b49b4.filez b/repo/objects/7c/eda9ff18c1a3f69194217e24cc8b65543f3b371e45f4a042bf1e6fe75b49b4.filez new file mode 100644 index 00000000000..b7739bdcf4f Binary files /dev/null and b/repo/objects/7c/eda9ff18c1a3f69194217e24cc8b65543f3b371e45f4a042bf1e6fe75b49b4.filez differ diff --git a/repo/objects/7d/069cc9fd65c272ab2cc5be31b684b8bc64760ef1e556afa63ab209e3e51ac9.filez b/repo/objects/7d/069cc9fd65c272ab2cc5be31b684b8bc64760ef1e556afa63ab209e3e51ac9.filez new file mode 100644 index 00000000000..3001dc28bb4 Binary files /dev/null and b/repo/objects/7d/069cc9fd65c272ab2cc5be31b684b8bc64760ef1e556afa63ab209e3e51ac9.filez differ diff --git a/repo/objects/7d/2cb7d356d52904c784e416bacdb23619d6396f4a45dc4187986e9a4ba3ef0f.filez b/repo/objects/7d/2cb7d356d52904c784e416bacdb23619d6396f4a45dc4187986e9a4ba3ef0f.filez new file mode 100644 index 00000000000..998043f75ff Binary files /dev/null and b/repo/objects/7d/2cb7d356d52904c784e416bacdb23619d6396f4a45dc4187986e9a4ba3ef0f.filez differ diff --git a/repo/objects/7d/4461fbbaa234efbc4d1246c251602dcc1385f945ca67392bf8baacc8352d60.filez b/repo/objects/7d/4461fbbaa234efbc4d1246c251602dcc1385f945ca67392bf8baacc8352d60.filez new file mode 100644 index 00000000000..1090dacd1bc Binary files /dev/null and b/repo/objects/7d/4461fbbaa234efbc4d1246c251602dcc1385f945ca67392bf8baacc8352d60.filez differ diff --git a/repo/objects/7d/4aaedb9d9aed1d53a8dcff68476222f9be08d3bac370860ec915680b6f97d0.filez b/repo/objects/7d/4aaedb9d9aed1d53a8dcff68476222f9be08d3bac370860ec915680b6f97d0.filez new file mode 100644 index 00000000000..6a4b23240a3 Binary files /dev/null and b/repo/objects/7d/4aaedb9d9aed1d53a8dcff68476222f9be08d3bac370860ec915680b6f97d0.filez differ diff --git a/repo/objects/7d/67def54f3fd23fd7a48169494e241868243248addf3f0630718c76b4781716.filez b/repo/objects/7d/67def54f3fd23fd7a48169494e241868243248addf3f0630718c76b4781716.filez new file mode 100644 index 00000000000..d5debd4ace4 Binary files /dev/null and b/repo/objects/7d/67def54f3fd23fd7a48169494e241868243248addf3f0630718c76b4781716.filez differ diff --git a/repo/objects/7d/eb81795a51c237e55f4d8aab295f64e04ea73159bbe969aedc7f617055850d.filez b/repo/objects/7d/eb81795a51c237e55f4d8aab295f64e04ea73159bbe969aedc7f617055850d.filez new file mode 100644 index 00000000000..73b0e7d4e47 Binary files /dev/null and b/repo/objects/7d/eb81795a51c237e55f4d8aab295f64e04ea73159bbe969aedc7f617055850d.filez differ diff --git a/repo/objects/7e/2a53b9856d0218dbe9cc5fa6951e7ad51e3078f5d7d384ac97d0613962ccd1.filez b/repo/objects/7e/2a53b9856d0218dbe9cc5fa6951e7ad51e3078f5d7d384ac97d0613962ccd1.filez new file mode 100644 index 00000000000..a785e5a817d Binary files /dev/null and b/repo/objects/7e/2a53b9856d0218dbe9cc5fa6951e7ad51e3078f5d7d384ac97d0613962ccd1.filez differ diff --git a/repo/objects/7e/43554abbf5e2bd616e6a12cadf93e59931fc25a0a34278033cecd2c8ee22f4.filez b/repo/objects/7e/43554abbf5e2bd616e6a12cadf93e59931fc25a0a34278033cecd2c8ee22f4.filez new file mode 100644 index 00000000000..3e2dedb5d34 Binary files /dev/null and b/repo/objects/7e/43554abbf5e2bd616e6a12cadf93e59931fc25a0a34278033cecd2c8ee22f4.filez differ diff --git a/repo/objects/7e/44a2271c6674991bafe44896b4fcb4fbf055182de0039f8113a8798ed6b43b.filez b/repo/objects/7e/44a2271c6674991bafe44896b4fcb4fbf055182de0039f8113a8798ed6b43b.filez new file mode 100644 index 00000000000..80c2aa56a6c Binary files /dev/null and b/repo/objects/7e/44a2271c6674991bafe44896b4fcb4fbf055182de0039f8113a8798ed6b43b.filez differ diff --git a/repo/objects/7e/50732c90bad71462a1379bddef6458bf88f6a6f1bf23fa8f38a83f9d485e98.filez b/repo/objects/7e/50732c90bad71462a1379bddef6458bf88f6a6f1bf23fa8f38a83f9d485e98.filez new file mode 100644 index 00000000000..ce1faa69de0 Binary files /dev/null and b/repo/objects/7e/50732c90bad71462a1379bddef6458bf88f6a6f1bf23fa8f38a83f9d485e98.filez differ diff --git a/repo/objects/7e/5bb038ea658b1d7b5719402e420092875e82affcc009b94bafb789db757c92.filez b/repo/objects/7e/5bb038ea658b1d7b5719402e420092875e82affcc009b94bafb789db757c92.filez new file mode 100644 index 00000000000..fd38451db9f Binary files /dev/null and b/repo/objects/7e/5bb038ea658b1d7b5719402e420092875e82affcc009b94bafb789db757c92.filez differ diff --git a/repo/objects/7e/5e15fc7dd8d6e252565082d0f8aae4b040df3a903f05bcf8a792bb569222bb.filez b/repo/objects/7e/5e15fc7dd8d6e252565082d0f8aae4b040df3a903f05bcf8a792bb569222bb.filez new file mode 100644 index 00000000000..512a853e000 Binary files /dev/null and b/repo/objects/7e/5e15fc7dd8d6e252565082d0f8aae4b040df3a903f05bcf8a792bb569222bb.filez differ diff --git a/repo/objects/7e/609113eae5532dfc1439394680bffd1211bbdea1c667093f5ca47e3313eed2.filez b/repo/objects/7e/609113eae5532dfc1439394680bffd1211bbdea1c667093f5ca47e3313eed2.filez new file mode 100644 index 00000000000..d30f502295f Binary files /dev/null and b/repo/objects/7e/609113eae5532dfc1439394680bffd1211bbdea1c667093f5ca47e3313eed2.filez differ diff --git a/repo/objects/7e/86dc33fc7884b4b516bcb3f15bec348d48c2518c47887685a36fb17cbd6ef1.dirtree b/repo/objects/7e/86dc33fc7884b4b516bcb3f15bec348d48c2518c47887685a36fb17cbd6ef1.dirtree new file mode 100644 index 00000000000..9bfc722624c Binary files /dev/null and b/repo/objects/7e/86dc33fc7884b4b516bcb3f15bec348d48c2518c47887685a36fb17cbd6ef1.dirtree differ diff --git a/repo/objects/7e/8aa0d0017e7197e89b90d65754a8b9c946b04afd88bf715b27d75e8665597c.filez b/repo/objects/7e/8aa0d0017e7197e89b90d65754a8b9c946b04afd88bf715b27d75e8665597c.filez new file mode 100644 index 00000000000..1709cb46e93 Binary files /dev/null and b/repo/objects/7e/8aa0d0017e7197e89b90d65754a8b9c946b04afd88bf715b27d75e8665597c.filez differ diff --git a/repo/objects/7e/90b7b0acf1010e13ccd973dbe9e27a548e0ddbe17eac8bef68648500e75eab.dirtree b/repo/objects/7e/90b7b0acf1010e13ccd973dbe9e27a548e0ddbe17eac8bef68648500e75eab.dirtree new file mode 100644 index 00000000000..3bc56a2bb55 Binary files /dev/null and b/repo/objects/7e/90b7b0acf1010e13ccd973dbe9e27a548e0ddbe17eac8bef68648500e75eab.dirtree differ diff --git a/repo/objects/7f/03858309b90bfb049950cdfb3190b6988808eed539613eb8f4dcd768f052f0.filez b/repo/objects/7f/03858309b90bfb049950cdfb3190b6988808eed539613eb8f4dcd768f052f0.filez new file mode 100644 index 00000000000..358e0175b3a Binary files /dev/null and b/repo/objects/7f/03858309b90bfb049950cdfb3190b6988808eed539613eb8f4dcd768f052f0.filez differ diff --git a/repo/objects/7f/1c95669a17b2a923c10ee926c68752c0138f1de39f024351b504c24f074868.dirtree b/repo/objects/7f/1c95669a17b2a923c10ee926c68752c0138f1de39f024351b504c24f074868.dirtree new file mode 100644 index 00000000000..0cc89e4fcc0 Binary files /dev/null and b/repo/objects/7f/1c95669a17b2a923c10ee926c68752c0138f1de39f024351b504c24f074868.dirtree differ diff --git a/repo/objects/7f/21e3cc1c7521625eca83f3ce67290e06a301e6e4074e94ace23f1f5f0fb1df.dirtree b/repo/objects/7f/21e3cc1c7521625eca83f3ce67290e06a301e6e4074e94ace23f1f5f0fb1df.dirtree new file mode 100644 index 00000000000..1024f1fdfa3 Binary files /dev/null and b/repo/objects/7f/21e3cc1c7521625eca83f3ce67290e06a301e6e4074e94ace23f1f5f0fb1df.dirtree differ diff --git a/repo/objects/7f/2505c5b00b44b4fc81f9941d30a1c54107c5f77f7099301b3033fe6000921c.filez b/repo/objects/7f/2505c5b00b44b4fc81f9941d30a1c54107c5f77f7099301b3033fe6000921c.filez new file mode 100644 index 00000000000..c9c78e14219 Binary files /dev/null and b/repo/objects/7f/2505c5b00b44b4fc81f9941d30a1c54107c5f77f7099301b3033fe6000921c.filez differ diff --git a/repo/objects/7f/4878312a96c52b8b0f298bdb5adc6e4b548c32fd40a29e0d8bf1889af0cf74.filez b/repo/objects/7f/4878312a96c52b8b0f298bdb5adc6e4b548c32fd40a29e0d8bf1889af0cf74.filez new file mode 100644 index 00000000000..ebf71c945fe Binary files /dev/null and b/repo/objects/7f/4878312a96c52b8b0f298bdb5adc6e4b548c32fd40a29e0d8bf1889af0cf74.filez differ diff --git a/repo/objects/7f/4a794c594b858f295d414060f150650c0c007baaa56f7d8cbd32a431fe6b64.filez b/repo/objects/7f/4a794c594b858f295d414060f150650c0c007baaa56f7d8cbd32a431fe6b64.filez new file mode 100644 index 00000000000..b8db7a3b6d9 Binary files /dev/null and b/repo/objects/7f/4a794c594b858f295d414060f150650c0c007baaa56f7d8cbd32a431fe6b64.filez differ diff --git a/repo/objects/7f/599eb8114039bb1bf7cd8a34d929140b31bdd514d90239dd495d8c4607f57f.filez b/repo/objects/7f/599eb8114039bb1bf7cd8a34d929140b31bdd514d90239dd495d8c4607f57f.filez new file mode 100644 index 00000000000..bacaac5ac21 Binary files /dev/null and b/repo/objects/7f/599eb8114039bb1bf7cd8a34d929140b31bdd514d90239dd495d8c4607f57f.filez differ diff --git a/repo/objects/7f/5eb16275a06d312d547b335cd925cde3ad22c81892a20abfce8a08473a8473.filez b/repo/objects/7f/5eb16275a06d312d547b335cd925cde3ad22c81892a20abfce8a08473a8473.filez new file mode 100644 index 00000000000..e4cff398658 Binary files /dev/null and b/repo/objects/7f/5eb16275a06d312d547b335cd925cde3ad22c81892a20abfce8a08473a8473.filez differ diff --git a/repo/objects/7f/64efe1129e596721c9dfd202faee2ef22feb1e1bfe7821568de0ecf1377aab.filez b/repo/objects/7f/64efe1129e596721c9dfd202faee2ef22feb1e1bfe7821568de0ecf1377aab.filez new file mode 100644 index 00000000000..a804ccd71b7 Binary files /dev/null and b/repo/objects/7f/64efe1129e596721c9dfd202faee2ef22feb1e1bfe7821568de0ecf1377aab.filez differ diff --git a/repo/objects/7f/98fd28be66058e73fcbce25291913a14989a62a65dfa3db477205b35750f29.filez b/repo/objects/7f/98fd28be66058e73fcbce25291913a14989a62a65dfa3db477205b35750f29.filez new file mode 100644 index 00000000000..ec15fe74c70 Binary files /dev/null and b/repo/objects/7f/98fd28be66058e73fcbce25291913a14989a62a65dfa3db477205b35750f29.filez differ diff --git a/repo/objects/7f/acfecacfcea036afe158ffb80113a655c9bd3eef4d832a8ccb32bd53ac509c.filez b/repo/objects/7f/acfecacfcea036afe158ffb80113a655c9bd3eef4d832a8ccb32bd53ac509c.filez new file mode 100644 index 00000000000..297012ba336 Binary files /dev/null and b/repo/objects/7f/acfecacfcea036afe158ffb80113a655c9bd3eef4d832a8ccb32bd53ac509c.filez differ diff --git a/repo/objects/7f/bc0f75e0b665c938c2a73a56f3fa26022193321783b44f2c9a89b6d7723517.filez b/repo/objects/7f/bc0f75e0b665c938c2a73a56f3fa26022193321783b44f2c9a89b6d7723517.filez new file mode 100644 index 00000000000..c5b0acbaff0 Binary files /dev/null and b/repo/objects/7f/bc0f75e0b665c938c2a73a56f3fa26022193321783b44f2c9a89b6d7723517.filez differ diff --git a/repo/objects/7f/e3ff536961811852ff2a25e73573e0799d95363fb7a1fb8400dcc21dee4736.dirtree b/repo/objects/7f/e3ff536961811852ff2a25e73573e0799d95363fb7a1fb8400dcc21dee4736.dirtree new file mode 100644 index 00000000000..b680fb375e4 Binary files /dev/null and b/repo/objects/7f/e3ff536961811852ff2a25e73573e0799d95363fb7a1fb8400dcc21dee4736.dirtree differ diff --git a/repo/objects/80/229e523a8ce5d8ed11328c56730428aa316448cd7cedc1c8e8ff8ffe020f7b.filez b/repo/objects/80/229e523a8ce5d8ed11328c56730428aa316448cd7cedc1c8e8ff8ffe020f7b.filez new file mode 100644 index 00000000000..2ce990c3ee1 Binary files /dev/null and b/repo/objects/80/229e523a8ce5d8ed11328c56730428aa316448cd7cedc1c8e8ff8ffe020f7b.filez differ diff --git a/repo/objects/80/34a4b11b0f2f622cd3d9444c09cf2c24511a61e116980c04df667babfb65c6.filez b/repo/objects/80/34a4b11b0f2f622cd3d9444c09cf2c24511a61e116980c04df667babfb65c6.filez new file mode 100644 index 00000000000..a2b63da2ed6 Binary files /dev/null and b/repo/objects/80/34a4b11b0f2f622cd3d9444c09cf2c24511a61e116980c04df667babfb65c6.filez differ diff --git a/repo/objects/80/3e89b1b23a6ce9318d5ec47eaeeef8825eb9bbd1ca9856d23e0d8795752675.filez b/repo/objects/80/3e89b1b23a6ce9318d5ec47eaeeef8825eb9bbd1ca9856d23e0d8795752675.filez new file mode 100644 index 00000000000..6a2f06e43af Binary files /dev/null and b/repo/objects/80/3e89b1b23a6ce9318d5ec47eaeeef8825eb9bbd1ca9856d23e0d8795752675.filez differ diff --git a/repo/objects/80/4e794bfa80ca4dc0a8a950daffd938556a3c7ae7d4db6eaa4be272931f9142.dirtree b/repo/objects/80/4e794bfa80ca4dc0a8a950daffd938556a3c7ae7d4db6eaa4be272931f9142.dirtree new file mode 100644 index 00000000000..e356f834fc2 Binary files /dev/null and b/repo/objects/80/4e794bfa80ca4dc0a8a950daffd938556a3c7ae7d4db6eaa4be272931f9142.dirtree differ diff --git a/repo/objects/80/57fd63ad21b5fe968e6e773c9bdbcfab33c2323bbbc1fb31a3c12686734bb5.filez b/repo/objects/80/57fd63ad21b5fe968e6e773c9bdbcfab33c2323bbbc1fb31a3c12686734bb5.filez new file mode 100644 index 00000000000..5d1b2c7f609 Binary files /dev/null and b/repo/objects/80/57fd63ad21b5fe968e6e773c9bdbcfab33c2323bbbc1fb31a3c12686734bb5.filez differ diff --git a/repo/objects/80/aeeb7c1d0bd44b1d2db624c894fc0d46bc329fc68feaecc85605ce43288d8a.filez b/repo/objects/80/aeeb7c1d0bd44b1d2db624c894fc0d46bc329fc68feaecc85605ce43288d8a.filez new file mode 100644 index 00000000000..52964e219c0 Binary files /dev/null and b/repo/objects/80/aeeb7c1d0bd44b1d2db624c894fc0d46bc329fc68feaecc85605ce43288d8a.filez differ diff --git a/repo/objects/80/c6b16f287e60392abb3177db9d2e7b90d45a26dd9f0cf6cdaba16363946a06.filez b/repo/objects/80/c6b16f287e60392abb3177db9d2e7b90d45a26dd9f0cf6cdaba16363946a06.filez new file mode 100644 index 00000000000..664913bc5b8 Binary files /dev/null and b/repo/objects/80/c6b16f287e60392abb3177db9d2e7b90d45a26dd9f0cf6cdaba16363946a06.filez differ diff --git a/repo/objects/80/d5452531642c6107bf8b75375a6f83456b27f5569a69ae7095941880b94a61.filez b/repo/objects/80/d5452531642c6107bf8b75375a6f83456b27f5569a69ae7095941880b94a61.filez new file mode 100644 index 00000000000..57df0a3c2c2 Binary files /dev/null and b/repo/objects/80/d5452531642c6107bf8b75375a6f83456b27f5569a69ae7095941880b94a61.filez differ diff --git a/repo/objects/80/d562eebe1b36adbed0936245c3bbc730d2566dd3d49ae5545db2da89c847fc.filez b/repo/objects/80/d562eebe1b36adbed0936245c3bbc730d2566dd3d49ae5545db2da89c847fc.filez new file mode 100644 index 00000000000..0f15265d4e9 Binary files /dev/null and b/repo/objects/80/d562eebe1b36adbed0936245c3bbc730d2566dd3d49ae5545db2da89c847fc.filez differ diff --git a/repo/objects/80/df963fb1afef1f35b3658312cba6d69deaf3db23b9d59776843ee5f48f0acb.filez b/repo/objects/80/df963fb1afef1f35b3658312cba6d69deaf3db23b9d59776843ee5f48f0acb.filez new file mode 100644 index 00000000000..a2b89428ab9 Binary files /dev/null and b/repo/objects/80/df963fb1afef1f35b3658312cba6d69deaf3db23b9d59776843ee5f48f0acb.filez differ diff --git a/repo/objects/80/ff52afcec659bf26440fdd8ea6e0ce04646d426d6d35a1857674555d0dec5b.filez b/repo/objects/80/ff52afcec659bf26440fdd8ea6e0ce04646d426d6d35a1857674555d0dec5b.filez new file mode 100644 index 00000000000..069a04ca88f Binary files /dev/null and b/repo/objects/80/ff52afcec659bf26440fdd8ea6e0ce04646d426d6d35a1857674555d0dec5b.filez differ diff --git a/repo/objects/81/008c3966e65d552a2ca513b60106970b269f9d3270aae9fa28ecf3f4e1ebc9.filez b/repo/objects/81/008c3966e65d552a2ca513b60106970b269f9d3270aae9fa28ecf3f4e1ebc9.filez new file mode 100644 index 00000000000..ed77edc4450 Binary files /dev/null and b/repo/objects/81/008c3966e65d552a2ca513b60106970b269f9d3270aae9fa28ecf3f4e1ebc9.filez differ diff --git a/repo/objects/81/3740897a36d4c06c09892ed5355c1de47f07f49b52cfafee2c13c7169fb3ee.dirtree b/repo/objects/81/3740897a36d4c06c09892ed5355c1de47f07f49b52cfafee2c13c7169fb3ee.dirtree new file mode 100644 index 00000000000..79f1eeeda31 Binary files /dev/null and b/repo/objects/81/3740897a36d4c06c09892ed5355c1de47f07f49b52cfafee2c13c7169fb3ee.dirtree differ diff --git a/repo/objects/81/44c474fd5fb0364ddfd9dce5ad287c9aa0ab5988ebb2c42e19aa0536d63318.filez b/repo/objects/81/44c474fd5fb0364ddfd9dce5ad287c9aa0ab5988ebb2c42e19aa0536d63318.filez new file mode 100644 index 00000000000..8b4b47ec0e0 Binary files /dev/null and b/repo/objects/81/44c474fd5fb0364ddfd9dce5ad287c9aa0ab5988ebb2c42e19aa0536d63318.filez differ diff --git a/repo/objects/81/57636d9ff6d9b2d0eca3e7e4e09e0fddcbe89b2faa0f62b99d9dbbd4490746.filez b/repo/objects/81/57636d9ff6d9b2d0eca3e7e4e09e0fddcbe89b2faa0f62b99d9dbbd4490746.filez new file mode 100644 index 00000000000..d5b463aa903 Binary files /dev/null and b/repo/objects/81/57636d9ff6d9b2d0eca3e7e4e09e0fddcbe89b2faa0f62b99d9dbbd4490746.filez differ diff --git a/repo/objects/81/59c43288f029cce717c1520a79180cd595ff6c5faff397a949147bddb3d28e.dirtree b/repo/objects/81/59c43288f029cce717c1520a79180cd595ff6c5faff397a949147bddb3d28e.dirtree new file mode 100644 index 00000000000..6fb9d62be8f Binary files /dev/null and b/repo/objects/81/59c43288f029cce717c1520a79180cd595ff6c5faff397a949147bddb3d28e.dirtree differ diff --git a/repo/objects/81/6bec816e0e683c8773681845b7085ae60c67bc74d6eb778342d93f350547f7.dirtree b/repo/objects/81/6bec816e0e683c8773681845b7085ae60c67bc74d6eb778342d93f350547f7.dirtree new file mode 100644 index 00000000000..518a40957d9 Binary files /dev/null and b/repo/objects/81/6bec816e0e683c8773681845b7085ae60c67bc74d6eb778342d93f350547f7.dirtree differ diff --git a/repo/objects/81/6c940317f66e8a20b373df94315c68c0ced7ce3f7a1b5ca878ec55b29af99f.filez b/repo/objects/81/6c940317f66e8a20b373df94315c68c0ced7ce3f7a1b5ca878ec55b29af99f.filez new file mode 100644 index 00000000000..9583a5d9f94 Binary files /dev/null and b/repo/objects/81/6c940317f66e8a20b373df94315c68c0ced7ce3f7a1b5ca878ec55b29af99f.filez differ diff --git a/repo/objects/81/71cedffe3972765f1844e92dabccbb6422911cab8220c5268d892e4b2daa53.filez b/repo/objects/81/71cedffe3972765f1844e92dabccbb6422911cab8220c5268d892e4b2daa53.filez new file mode 100644 index 00000000000..310a9e8bd4e Binary files /dev/null and b/repo/objects/81/71cedffe3972765f1844e92dabccbb6422911cab8220c5268d892e4b2daa53.filez differ diff --git a/repo/objects/81/a78f11a46b883224f6de28f08518525e75652cfad8496f32241d2e10212ec4.filez b/repo/objects/81/a78f11a46b883224f6de28f08518525e75652cfad8496f32241d2e10212ec4.filez new file mode 100644 index 00000000000..362d0d83e89 Binary files /dev/null and b/repo/objects/81/a78f11a46b883224f6de28f08518525e75652cfad8496f32241d2e10212ec4.filez differ diff --git a/repo/objects/81/afcdb778eb362d8ce46b21128bae24cf4e2e6296caf94df0878c09563d5a71.filez b/repo/objects/81/afcdb778eb362d8ce46b21128bae24cf4e2e6296caf94df0878c09563d5a71.filez new file mode 100644 index 00000000000..ee913ef03a0 Binary files /dev/null and b/repo/objects/81/afcdb778eb362d8ce46b21128bae24cf4e2e6296caf94df0878c09563d5a71.filez differ diff --git a/repo/objects/81/bb174a106370209e90f480ab845c33f8ec9eca5751c920ba1b3492dd3f7be8.dirtree b/repo/objects/81/bb174a106370209e90f480ab845c33f8ec9eca5751c920ba1b3492dd3f7be8.dirtree new file mode 100644 index 00000000000..2e09980c1eb Binary files /dev/null and b/repo/objects/81/bb174a106370209e90f480ab845c33f8ec9eca5751c920ba1b3492dd3f7be8.dirtree differ diff --git a/repo/objects/81/c53028dd5598a090130ed483f6dea5916b39f80701b6c3825b05bb8850b6f4.filez b/repo/objects/81/c53028dd5598a090130ed483f6dea5916b39f80701b6c3825b05bb8850b6f4.filez new file mode 100644 index 00000000000..c881069b451 Binary files /dev/null and b/repo/objects/81/c53028dd5598a090130ed483f6dea5916b39f80701b6c3825b05bb8850b6f4.filez differ diff --git a/repo/objects/81/c75e5c56857fc1195d5ed1069f2d456ee53418de41dc92269b23bcda7c825b.filez b/repo/objects/81/c75e5c56857fc1195d5ed1069f2d456ee53418de41dc92269b23bcda7c825b.filez new file mode 100644 index 00000000000..78592e33783 Binary files /dev/null and b/repo/objects/81/c75e5c56857fc1195d5ed1069f2d456ee53418de41dc92269b23bcda7c825b.filez differ diff --git a/repo/objects/81/e09981116e8126d44388090d1e9558bacf51b6e8a44d7a1d627d31d2a8335d.filez b/repo/objects/81/e09981116e8126d44388090d1e9558bacf51b6e8a44d7a1d627d31d2a8335d.filez new file mode 100644 index 00000000000..2459ccb9a14 Binary files /dev/null and b/repo/objects/81/e09981116e8126d44388090d1e9558bacf51b6e8a44d7a1d627d31d2a8335d.filez differ diff --git a/repo/objects/81/fa41fe0564882fe3c1a40829b94c1a5f6e48a53ad2d1b4f0e07d5c4813174f.filez b/repo/objects/81/fa41fe0564882fe3c1a40829b94c1a5f6e48a53ad2d1b4f0e07d5c4813174f.filez new file mode 100644 index 00000000000..8004cbfb380 Binary files /dev/null and b/repo/objects/81/fa41fe0564882fe3c1a40829b94c1a5f6e48a53ad2d1b4f0e07d5c4813174f.filez differ diff --git a/repo/objects/82/13efeb07c5ee9c1b410cde50894017509f39964ed74a12534340eee64f81ac.dirtree b/repo/objects/82/13efeb07c5ee9c1b410cde50894017509f39964ed74a12534340eee64f81ac.dirtree new file mode 100644 index 00000000000..3a2e65d5bd5 Binary files /dev/null and b/repo/objects/82/13efeb07c5ee9c1b410cde50894017509f39964ed74a12534340eee64f81ac.dirtree differ diff --git a/repo/objects/82/3d33a2bff521051f55213c6aa9149351f0391bb85c0eb796ff4a18cb8e85fe.filez b/repo/objects/82/3d33a2bff521051f55213c6aa9149351f0391bb85c0eb796ff4a18cb8e85fe.filez new file mode 100644 index 00000000000..07ced905f20 Binary files /dev/null and b/repo/objects/82/3d33a2bff521051f55213c6aa9149351f0391bb85c0eb796ff4a18cb8e85fe.filez differ diff --git a/repo/objects/82/40e5fd90e218e0185ef07437c6db14c94ab1ea1eecb9475d8028a8ed421048.filez b/repo/objects/82/40e5fd90e218e0185ef07437c6db14c94ab1ea1eecb9475d8028a8ed421048.filez new file mode 100644 index 00000000000..6d3fdb03a1a Binary files /dev/null and b/repo/objects/82/40e5fd90e218e0185ef07437c6db14c94ab1ea1eecb9475d8028a8ed421048.filez differ diff --git a/repo/objects/82/85a980e67e0e1cf4e649eec1994bc25873d9824fd3a5f89ed095884943adab.filez b/repo/objects/82/85a980e67e0e1cf4e649eec1994bc25873d9824fd3a5f89ed095884943adab.filez new file mode 100644 index 00000000000..3931ebfe525 Binary files /dev/null and b/repo/objects/82/85a980e67e0e1cf4e649eec1994bc25873d9824fd3a5f89ed095884943adab.filez differ diff --git a/repo/objects/82/88b84b0cb8829bf647ac767e6f6eb4d7f234a622c6bc5c6cfae1a60cf5f711.dirtree b/repo/objects/82/88b84b0cb8829bf647ac767e6f6eb4d7f234a622c6bc5c6cfae1a60cf5f711.dirtree new file mode 100644 index 00000000000..c43bb8e46dc Binary files /dev/null and b/repo/objects/82/88b84b0cb8829bf647ac767e6f6eb4d7f234a622c6bc5c6cfae1a60cf5f711.dirtree differ diff --git a/repo/objects/82/fc235564c6b5df6ddcfb1b69beac2a4f455855ebe0474e517bdd2065e538bc.filez b/repo/objects/82/fc235564c6b5df6ddcfb1b69beac2a4f455855ebe0474e517bdd2065e538bc.filez new file mode 100644 index 00000000000..ac15b344d3d Binary files /dev/null and b/repo/objects/82/fc235564c6b5df6ddcfb1b69beac2a4f455855ebe0474e517bdd2065e538bc.filez differ diff --git a/repo/objects/83/05acb61102457984f824651b2827a0f06f35c817da7ae1f46b6425dd2f2854.filez b/repo/objects/83/05acb61102457984f824651b2827a0f06f35c817da7ae1f46b6425dd2f2854.filez new file mode 100644 index 00000000000..c52cccd8eae Binary files /dev/null and b/repo/objects/83/05acb61102457984f824651b2827a0f06f35c817da7ae1f46b6425dd2f2854.filez differ diff --git a/repo/objects/83/4b35b6ed4478dacbfc786e04b54f3c83889184f9e10115b955b16fb6a564fe.filez b/repo/objects/83/4b35b6ed4478dacbfc786e04b54f3c83889184f9e10115b955b16fb6a564fe.filez new file mode 100644 index 00000000000..62c12c1187a Binary files /dev/null and b/repo/objects/83/4b35b6ed4478dacbfc786e04b54f3c83889184f9e10115b955b16fb6a564fe.filez differ diff --git a/repo/objects/83/6f109ac136787356202c2fd11dc8b1688a5b9289bb981c498b173fee8ac302.filez b/repo/objects/83/6f109ac136787356202c2fd11dc8b1688a5b9289bb981c498b173fee8ac302.filez new file mode 100644 index 00000000000..4408871ce6b Binary files /dev/null and b/repo/objects/83/6f109ac136787356202c2fd11dc8b1688a5b9289bb981c498b173fee8ac302.filez differ diff --git a/repo/objects/83/75646fa613cb76ba80af94ceb0342b4339e8a79ceee1c28f324560b8684f75.dirtree b/repo/objects/83/75646fa613cb76ba80af94ceb0342b4339e8a79ceee1c28f324560b8684f75.dirtree new file mode 100644 index 00000000000..ed0cc2904b4 Binary files /dev/null and b/repo/objects/83/75646fa613cb76ba80af94ceb0342b4339e8a79ceee1c28f324560b8684f75.dirtree differ diff --git a/repo/objects/83/817001eac8c17aa206e7fd5508e016c0d1b9d4541f3da65753aa9f268df6d7.filez b/repo/objects/83/817001eac8c17aa206e7fd5508e016c0d1b9d4541f3da65753aa9f268df6d7.filez new file mode 100644 index 00000000000..225a42fb0fb Binary files /dev/null and b/repo/objects/83/817001eac8c17aa206e7fd5508e016c0d1b9d4541f3da65753aa9f268df6d7.filez differ diff --git a/repo/objects/83/92b0146bb37cf4376fd87ebe74e17dce06a60f6f4ff24af7aa5f9cdc04b74a.dirtree b/repo/objects/83/92b0146bb37cf4376fd87ebe74e17dce06a60f6f4ff24af7aa5f9cdc04b74a.dirtree new file mode 100644 index 00000000000..bc23094baa3 Binary files /dev/null and b/repo/objects/83/92b0146bb37cf4376fd87ebe74e17dce06a60f6f4ff24af7aa5f9cdc04b74a.dirtree differ diff --git a/repo/objects/83/b629dffca936243336675dfaae22a120b6865b80805673f48b3bef9231c206.filez b/repo/objects/83/b629dffca936243336675dfaae22a120b6865b80805673f48b3bef9231c206.filez new file mode 100644 index 00000000000..4b3efb49f5f Binary files /dev/null and b/repo/objects/83/b629dffca936243336675dfaae22a120b6865b80805673f48b3bef9231c206.filez differ diff --git a/repo/objects/83/c651ade55d8d02e0007682c3648ca10e4fa56adb04d43db0800287396309b4.dirtree b/repo/objects/83/c651ade55d8d02e0007682c3648ca10e4fa56adb04d43db0800287396309b4.dirtree new file mode 100644 index 00000000000..c4013b34d93 Binary files /dev/null and b/repo/objects/83/c651ade55d8d02e0007682c3648ca10e4fa56adb04d43db0800287396309b4.dirtree differ diff --git a/repo/objects/83/ce3bd21251129fb598c956a3cccc241ead3a854c7b951717902f119982a85d.filez b/repo/objects/83/ce3bd21251129fb598c956a3cccc241ead3a854c7b951717902f119982a85d.filez new file mode 100644 index 00000000000..12ac017c32a Binary files /dev/null and b/repo/objects/83/ce3bd21251129fb598c956a3cccc241ead3a854c7b951717902f119982a85d.filez differ diff --git a/repo/objects/83/d7600c783faa0f975d29dd17551df9f57b11d334e10c8d51e957d4e1692525.filez b/repo/objects/83/d7600c783faa0f975d29dd17551df9f57b11d334e10c8d51e957d4e1692525.filez new file mode 100644 index 00000000000..6f5748c85b4 Binary files /dev/null and b/repo/objects/83/d7600c783faa0f975d29dd17551df9f57b11d334e10c8d51e957d4e1692525.filez differ diff --git a/repo/objects/83/dba16c0dc3e209bd758ef50fa1ec806662195e0f1a3d18b90820eb7317a586.filez b/repo/objects/83/dba16c0dc3e209bd758ef50fa1ec806662195e0f1a3d18b90820eb7317a586.filez new file mode 100644 index 00000000000..c4322dbcf6e Binary files /dev/null and b/repo/objects/83/dba16c0dc3e209bd758ef50fa1ec806662195e0f1a3d18b90820eb7317a586.filez differ diff --git a/repo/objects/83/e17f1df760eb96e4a65e02ae708aad6c325824aa308e0b26339e1c5735d47a.filez b/repo/objects/83/e17f1df760eb96e4a65e02ae708aad6c325824aa308e0b26339e1c5735d47a.filez new file mode 100644 index 00000000000..eb419d41bf0 Binary files /dev/null and b/repo/objects/83/e17f1df760eb96e4a65e02ae708aad6c325824aa308e0b26339e1c5735d47a.filez differ diff --git a/repo/objects/83/fa9ac076d85104d1a79d9bd5d045e9b47f90e9d57a20794ce2521c0d60aa14.filez b/repo/objects/83/fa9ac076d85104d1a79d9bd5d045e9b47f90e9d57a20794ce2521c0d60aa14.filez new file mode 100644 index 00000000000..56ef61eaa00 Binary files /dev/null and b/repo/objects/83/fa9ac076d85104d1a79d9bd5d045e9b47f90e9d57a20794ce2521c0d60aa14.filez differ diff --git a/repo/objects/84/154c210c433137a456f4729a81ae34583b5bebb6e1152d8d0befb075de94c9.filez b/repo/objects/84/154c210c433137a456f4729a81ae34583b5bebb6e1152d8d0befb075de94c9.filez new file mode 100644 index 00000000000..cacfdd849ad Binary files /dev/null and b/repo/objects/84/154c210c433137a456f4729a81ae34583b5bebb6e1152d8d0befb075de94c9.filez differ diff --git a/repo/objects/84/23746565b1c1701c3b876fd4745fed5b65ee235629f2adfcc2f5ddc16689a1.filez b/repo/objects/84/23746565b1c1701c3b876fd4745fed5b65ee235629f2adfcc2f5ddc16689a1.filez new file mode 100644 index 00000000000..f11688690e6 Binary files /dev/null and b/repo/objects/84/23746565b1c1701c3b876fd4745fed5b65ee235629f2adfcc2f5ddc16689a1.filez differ diff --git a/repo/objects/84/259d3db8ff0d51a67e68d302c436676a54d55bec70f306cf58811931f7338d.filez b/repo/objects/84/259d3db8ff0d51a67e68d302c436676a54d55bec70f306cf58811931f7338d.filez new file mode 100644 index 00000000000..5f1858be3db Binary files /dev/null and b/repo/objects/84/259d3db8ff0d51a67e68d302c436676a54d55bec70f306cf58811931f7338d.filez differ diff --git a/repo/objects/84/3b8fe150fdb442ca4828adec3243a747bc48f88750cc97f0bf1650a1af3234.dirtree b/repo/objects/84/3b8fe150fdb442ca4828adec3243a747bc48f88750cc97f0bf1650a1af3234.dirtree new file mode 100644 index 00000000000..157bf6fd1b6 Binary files /dev/null and b/repo/objects/84/3b8fe150fdb442ca4828adec3243a747bc48f88750cc97f0bf1650a1af3234.dirtree differ diff --git a/repo/objects/84/40208205ac9ded16a7080bfcc26a29cc8ffa33707eda06021b3f6c909bcb88.filez b/repo/objects/84/40208205ac9ded16a7080bfcc26a29cc8ffa33707eda06021b3f6c909bcb88.filez new file mode 100644 index 00000000000..a278b7cc306 Binary files /dev/null and b/repo/objects/84/40208205ac9ded16a7080bfcc26a29cc8ffa33707eda06021b3f6c909bcb88.filez differ diff --git a/repo/objects/84/60fe8002ee1c40ade925982fe42ce40ab62a42b2da6861d645d028443b5feb.dirtree b/repo/objects/84/60fe8002ee1c40ade925982fe42ce40ab62a42b2da6861d645d028443b5feb.dirtree new file mode 100644 index 00000000000..8f1ab6b12f8 Binary files /dev/null and b/repo/objects/84/60fe8002ee1c40ade925982fe42ce40ab62a42b2da6861d645d028443b5feb.dirtree differ diff --git a/repo/objects/84/84f3ec822f76f3b57412a40026b9062c8c6c4fe42dce90922dd6d04c67a0bf.dirtree b/repo/objects/84/84f3ec822f76f3b57412a40026b9062c8c6c4fe42dce90922dd6d04c67a0bf.dirtree new file mode 100644 index 00000000000..e2b08e88476 Binary files /dev/null and b/repo/objects/84/84f3ec822f76f3b57412a40026b9062c8c6c4fe42dce90922dd6d04c67a0bf.dirtree differ diff --git a/repo/objects/84/a2e8178b5e5c779cc6c3ec1ead67fbeaff404c1586c4fac8ba0aee1799751a.filez b/repo/objects/84/a2e8178b5e5c779cc6c3ec1ead67fbeaff404c1586c4fac8ba0aee1799751a.filez new file mode 100644 index 00000000000..aedbd08f6ac Binary files /dev/null and b/repo/objects/84/a2e8178b5e5c779cc6c3ec1ead67fbeaff404c1586c4fac8ba0aee1799751a.filez differ diff --git a/repo/objects/84/bacedfec3d9768cbfe4173e51db4762d4d83eaa7515918544f83ecf1707db7.filez b/repo/objects/84/bacedfec3d9768cbfe4173e51db4762d4d83eaa7515918544f83ecf1707db7.filez new file mode 100644 index 00000000000..bcf4d3f8f25 Binary files /dev/null and b/repo/objects/84/bacedfec3d9768cbfe4173e51db4762d4d83eaa7515918544f83ecf1707db7.filez differ diff --git a/repo/objects/84/c23d418fedae37f54ce625fbaabaf7fe778542465155189d38bacc21016329.filez b/repo/objects/84/c23d418fedae37f54ce625fbaabaf7fe778542465155189d38bacc21016329.filez new file mode 100644 index 00000000000..3bea3d8174a Binary files /dev/null and b/repo/objects/84/c23d418fedae37f54ce625fbaabaf7fe778542465155189d38bacc21016329.filez differ diff --git a/repo/objects/85/2d1c5ee50d05238b89b2b3df4cc305030eb4edec6da3d0279cab112ea03099.dirtree b/repo/objects/85/2d1c5ee50d05238b89b2b3df4cc305030eb4edec6da3d0279cab112ea03099.dirtree new file mode 100644 index 00000000000..39cf0103213 Binary files /dev/null and b/repo/objects/85/2d1c5ee50d05238b89b2b3df4cc305030eb4edec6da3d0279cab112ea03099.dirtree differ diff --git a/repo/objects/85/316c1f8815c1b4f242f145ad007ce09853008e04ff00bb8433af3cc125e702.filez b/repo/objects/85/316c1f8815c1b4f242f145ad007ce09853008e04ff00bb8433af3cc125e702.filez new file mode 100644 index 00000000000..98d78c8be4d Binary files /dev/null and b/repo/objects/85/316c1f8815c1b4f242f145ad007ce09853008e04ff00bb8433af3cc125e702.filez differ diff --git a/repo/objects/85/36366ac8a46c2ec3d9828d73db81aba8aa05c5d14627301a6d625482ebbd8a.dirtree b/repo/objects/85/36366ac8a46c2ec3d9828d73db81aba8aa05c5d14627301a6d625482ebbd8a.dirtree new file mode 100644 index 00000000000..2d2c2ab0739 Binary files /dev/null and b/repo/objects/85/36366ac8a46c2ec3d9828d73db81aba8aa05c5d14627301a6d625482ebbd8a.dirtree differ diff --git a/repo/objects/85/5f95633a08c08f91d800c85a649b005fb52965bf77b83fdd532a9e9368d7d3.filez b/repo/objects/85/5f95633a08c08f91d800c85a649b005fb52965bf77b83fdd532a9e9368d7d3.filez new file mode 100644 index 00000000000..6e0d54f3c38 Binary files /dev/null and b/repo/objects/85/5f95633a08c08f91d800c85a649b005fb52965bf77b83fdd532a9e9368d7d3.filez differ diff --git a/repo/objects/85/6824b77003ff6f8494e7f1f734aefa9f1adef20e3f3aa40a7ae6380389e038.filez b/repo/objects/85/6824b77003ff6f8494e7f1f734aefa9f1adef20e3f3aa40a7ae6380389e038.filez new file mode 100644 index 00000000000..dcc084fc478 Binary files /dev/null and b/repo/objects/85/6824b77003ff6f8494e7f1f734aefa9f1adef20e3f3aa40a7ae6380389e038.filez differ diff --git a/repo/objects/85/7a7a40e78d0791c4ab3dd614bb56fe3b66a5028ed5fd9644d3dac652a81a82.filez b/repo/objects/85/7a7a40e78d0791c4ab3dd614bb56fe3b66a5028ed5fd9644d3dac652a81a82.filez new file mode 100644 index 00000000000..e529f51e102 Binary files /dev/null and b/repo/objects/85/7a7a40e78d0791c4ab3dd614bb56fe3b66a5028ed5fd9644d3dac652a81a82.filez differ diff --git a/repo/objects/85/891d628ff178f718d5a1a56b43ffc6fd8bdd9280bfecb9befc589ed61337b3.filez b/repo/objects/85/891d628ff178f718d5a1a56b43ffc6fd8bdd9280bfecb9befc589ed61337b3.filez new file mode 100644 index 00000000000..60e4dcf64c2 Binary files /dev/null and b/repo/objects/85/891d628ff178f718d5a1a56b43ffc6fd8bdd9280bfecb9befc589ed61337b3.filez differ diff --git a/repo/objects/85/9061b0d2f9968c3ccb68fd5ced6b8dc8cdc57afc953ca81171b867e51bc41c.filez b/repo/objects/85/9061b0d2f9968c3ccb68fd5ced6b8dc8cdc57afc953ca81171b867e51bc41c.filez new file mode 100644 index 00000000000..b7620e6f202 Binary files /dev/null and b/repo/objects/85/9061b0d2f9968c3ccb68fd5ced6b8dc8cdc57afc953ca81171b867e51bc41c.filez differ diff --git a/repo/objects/85/a6507df09f8fc1861b795cd448de5a6a7b39deac7e0e6294150a181c7d2ffe.filez b/repo/objects/85/a6507df09f8fc1861b795cd448de5a6a7b39deac7e0e6294150a181c7d2ffe.filez new file mode 100644 index 00000000000..e5dfc35580c Binary files /dev/null and b/repo/objects/85/a6507df09f8fc1861b795cd448de5a6a7b39deac7e0e6294150a181c7d2ffe.filez differ diff --git a/repo/objects/85/b02c30583cc9b7a6642cc269da3b9072180f959957f042d16aab161b800365.dirtree b/repo/objects/85/b02c30583cc9b7a6642cc269da3b9072180f959957f042d16aab161b800365.dirtree new file mode 100644 index 00000000000..236cfd32057 Binary files /dev/null and b/repo/objects/85/b02c30583cc9b7a6642cc269da3b9072180f959957f042d16aab161b800365.dirtree differ diff --git a/repo/objects/85/bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca.commit b/repo/objects/85/bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca.commit new file mode 100644 index 00000000000..f0ebd984a2c Binary files /dev/null and b/repo/objects/85/bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca.commit differ diff --git a/repo/objects/85/bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca.commitmeta b/repo/objects/85/bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca.commitmeta new file mode 100644 index 00000000000..67ecd2ae6f7 Binary files /dev/null and b/repo/objects/85/bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca.commitmeta differ diff --git a/repo/objects/85/c54cd9bfb063822a776a1b74e387082c919b4faa36d98a56149ebcd5b81eca.filez b/repo/objects/85/c54cd9bfb063822a776a1b74e387082c919b4faa36d98a56149ebcd5b81eca.filez new file mode 100644 index 00000000000..9f94b245c63 Binary files /dev/null and b/repo/objects/85/c54cd9bfb063822a776a1b74e387082c919b4faa36d98a56149ebcd5b81eca.filez differ diff --git a/repo/objects/85/c5e00d07f0f84795f992a8a6d8bc02d4d05a44aeafe3d2cf31a50c1b9a4996.filez b/repo/objects/85/c5e00d07f0f84795f992a8a6d8bc02d4d05a44aeafe3d2cf31a50c1b9a4996.filez new file mode 100644 index 00000000000..b98bd045b74 Binary files /dev/null and b/repo/objects/85/c5e00d07f0f84795f992a8a6d8bc02d4d05a44aeafe3d2cf31a50c1b9a4996.filez differ diff --git a/repo/objects/85/ef35271d20342e6a5568422c8f776e92fe7a9a0ae680adc0b5126ccb43b01f.filez b/repo/objects/85/ef35271d20342e6a5568422c8f776e92fe7a9a0ae680adc0b5126ccb43b01f.filez new file mode 100644 index 00000000000..a61cb16450f Binary files /dev/null and b/repo/objects/85/ef35271d20342e6a5568422c8f776e92fe7a9a0ae680adc0b5126ccb43b01f.filez differ diff --git a/repo/objects/85/f4d81810a34daf01108bd5180a9211fb3949da4043f5f1c225f0412f2d7054.filez b/repo/objects/85/f4d81810a34daf01108bd5180a9211fb3949da4043f5f1c225f0412f2d7054.filez new file mode 100644 index 00000000000..7686b9cc1fb Binary files /dev/null and b/repo/objects/85/f4d81810a34daf01108bd5180a9211fb3949da4043f5f1c225f0412f2d7054.filez differ diff --git a/repo/objects/86/2dffc6c92e77ba7d7e5b256adb2ba3aae88aa710939ff9e0671654c0b592be.filez b/repo/objects/86/2dffc6c92e77ba7d7e5b256adb2ba3aae88aa710939ff9e0671654c0b592be.filez new file mode 100644 index 00000000000..6523c57be6f Binary files /dev/null and b/repo/objects/86/2dffc6c92e77ba7d7e5b256adb2ba3aae88aa710939ff9e0671654c0b592be.filez differ diff --git a/repo/objects/86/317d11d6ebcd4d702fa8b6954330659a3f0b9c57d92b7ad962a6afe9e2559f.dirtree b/repo/objects/86/317d11d6ebcd4d702fa8b6954330659a3f0b9c57d92b7ad962a6afe9e2559f.dirtree new file mode 100644 index 00000000000..c62a3845c41 Binary files /dev/null and b/repo/objects/86/317d11d6ebcd4d702fa8b6954330659a3f0b9c57d92b7ad962a6afe9e2559f.dirtree differ diff --git a/repo/objects/86/4487db497e7b61a4a2d762caa485d9fd672bd2bc3b62fc253577b900341ab4.filez b/repo/objects/86/4487db497e7b61a4a2d762caa485d9fd672bd2bc3b62fc253577b900341ab4.filez new file mode 100644 index 00000000000..4f89bd6ca2c Binary files /dev/null and b/repo/objects/86/4487db497e7b61a4a2d762caa485d9fd672bd2bc3b62fc253577b900341ab4.filez differ diff --git a/repo/objects/86/55a568a5ad0019b51a011900341654499d4fb998b679c6ad8125cdb2cf640b.filez b/repo/objects/86/55a568a5ad0019b51a011900341654499d4fb998b679c6ad8125cdb2cf640b.filez new file mode 100644 index 00000000000..1c561679b4f Binary files /dev/null and b/repo/objects/86/55a568a5ad0019b51a011900341654499d4fb998b679c6ad8125cdb2cf640b.filez differ diff --git a/repo/objects/86/5e5292450de4ce1b92cc16a6331ae3b2acfdbad79484cdd078dbebde2b5baa.filez b/repo/objects/86/5e5292450de4ce1b92cc16a6331ae3b2acfdbad79484cdd078dbebde2b5baa.filez new file mode 100644 index 00000000000..ed65840fcf3 Binary files /dev/null and b/repo/objects/86/5e5292450de4ce1b92cc16a6331ae3b2acfdbad79484cdd078dbebde2b5baa.filez differ diff --git a/repo/objects/86/70578f70322703ec59f14a19ffd755981298c19f7085f24b81d13b3aa05bfb.filez b/repo/objects/86/70578f70322703ec59f14a19ffd755981298c19f7085f24b81d13b3aa05bfb.filez new file mode 100644 index 00000000000..9747c5983ec Binary files /dev/null and b/repo/objects/86/70578f70322703ec59f14a19ffd755981298c19f7085f24b81d13b3aa05bfb.filez differ diff --git a/repo/objects/86/a6d75ad7addef2290d9fa4ab626d0ec63c038283abc607db6a4922ff96cf93.dirtree b/repo/objects/86/a6d75ad7addef2290d9fa4ab626d0ec63c038283abc607db6a4922ff96cf93.dirtree new file mode 100644 index 00000000000..b54a4a97e7e Binary files /dev/null and b/repo/objects/86/a6d75ad7addef2290d9fa4ab626d0ec63c038283abc607db6a4922ff96cf93.dirtree differ diff --git a/repo/objects/86/a8c298adbf803a1694b0ea2f26f737d868b0ba7dbfdf1c59ff80c90d56a789.filez b/repo/objects/86/a8c298adbf803a1694b0ea2f26f737d868b0ba7dbfdf1c59ff80c90d56a789.filez new file mode 100644 index 00000000000..d85bcd6d653 Binary files /dev/null and b/repo/objects/86/a8c298adbf803a1694b0ea2f26f737d868b0ba7dbfdf1c59ff80c90d56a789.filez differ diff --git a/repo/objects/86/bcb3b8786216fc865cdf069923e8b8bc7c88841d8530a8c6dd7071f378ea20.filez b/repo/objects/86/bcb3b8786216fc865cdf069923e8b8bc7c88841d8530a8c6dd7071f378ea20.filez new file mode 100644 index 00000000000..690ab9ce6a6 Binary files /dev/null and b/repo/objects/86/bcb3b8786216fc865cdf069923e8b8bc7c88841d8530a8c6dd7071f378ea20.filez differ diff --git a/repo/objects/86/cf21089203f6bf6bafa0e153c7f557767c9432593fbfcdcb5a48a6e44d5995.filez b/repo/objects/86/cf21089203f6bf6bafa0e153c7f557767c9432593fbfcdcb5a48a6e44d5995.filez new file mode 100644 index 00000000000..d1527498586 Binary files /dev/null and b/repo/objects/86/cf21089203f6bf6bafa0e153c7f557767c9432593fbfcdcb5a48a6e44d5995.filez differ diff --git a/repo/objects/86/d04c8bba5bc2b0a94af88ba96080ef83bed3b9db3fe4abc08c57bf13724053.filez b/repo/objects/86/d04c8bba5bc2b0a94af88ba96080ef83bed3b9db3fe4abc08c57bf13724053.filez new file mode 100644 index 00000000000..07e42901570 Binary files /dev/null and b/repo/objects/86/d04c8bba5bc2b0a94af88ba96080ef83bed3b9db3fe4abc08c57bf13724053.filez differ diff --git a/repo/objects/86/ec54293e2b4ca8af2529d951381bc8148e8a14b01da37734c203453653f5ef.filez b/repo/objects/86/ec54293e2b4ca8af2529d951381bc8148e8a14b01da37734c203453653f5ef.filez new file mode 100644 index 00000000000..c7f1030002c Binary files /dev/null and b/repo/objects/86/ec54293e2b4ca8af2529d951381bc8148e8a14b01da37734c203453653f5ef.filez differ diff --git a/repo/objects/87/05e458f574c9a3018ab4bfb11d405809a73839eeb5fc4d3660e30457058343.filez b/repo/objects/87/05e458f574c9a3018ab4bfb11d405809a73839eeb5fc4d3660e30457058343.filez new file mode 100644 index 00000000000..bb45279289c Binary files /dev/null and b/repo/objects/87/05e458f574c9a3018ab4bfb11d405809a73839eeb5fc4d3660e30457058343.filez differ diff --git a/repo/objects/87/1c8329a50056cb23c6886c312fa22c575eeef405997d0a19219c72f9fda73d.filez b/repo/objects/87/1c8329a50056cb23c6886c312fa22c575eeef405997d0a19219c72f9fda73d.filez new file mode 100644 index 00000000000..5ea969672dd Binary files /dev/null and b/repo/objects/87/1c8329a50056cb23c6886c312fa22c575eeef405997d0a19219c72f9fda73d.filez differ diff --git a/repo/objects/87/3de6e1dd24dc941ee008967011f470efb75e21295db86ef6d1ea5a6895defd.filez b/repo/objects/87/3de6e1dd24dc941ee008967011f470efb75e21295db86ef6d1ea5a6895defd.filez new file mode 100644 index 00000000000..f3496548702 Binary files /dev/null and b/repo/objects/87/3de6e1dd24dc941ee008967011f470efb75e21295db86ef6d1ea5a6895defd.filez differ diff --git a/repo/objects/87/42b8e1086a9527a960c9383c6048d0d30eb0829ce1091c4a6baceaf5598c0b.filez b/repo/objects/87/42b8e1086a9527a960c9383c6048d0d30eb0829ce1091c4a6baceaf5598c0b.filez new file mode 100644 index 00000000000..06b2e3f4506 Binary files /dev/null and b/repo/objects/87/42b8e1086a9527a960c9383c6048d0d30eb0829ce1091c4a6baceaf5598c0b.filez differ diff --git a/repo/objects/87/488297f100a4fd8e8b2762c1965c63cc1d2392aa837e9f93e566952011efb5.filez b/repo/objects/87/488297f100a4fd8e8b2762c1965c63cc1d2392aa837e9f93e566952011efb5.filez new file mode 100644 index 00000000000..85ed6a9231a Binary files /dev/null and b/repo/objects/87/488297f100a4fd8e8b2762c1965c63cc1d2392aa837e9f93e566952011efb5.filez differ diff --git a/repo/objects/87/51b49543cbe481253692f214c1979065804ab40f1c86d31fc7d61e4acf2481.filez b/repo/objects/87/51b49543cbe481253692f214c1979065804ab40f1c86d31fc7d61e4acf2481.filez new file mode 100644 index 00000000000..84232f322dd Binary files /dev/null and b/repo/objects/87/51b49543cbe481253692f214c1979065804ab40f1c86d31fc7d61e4acf2481.filez differ diff --git a/repo/objects/87/585cdd1fc825b247b224e2563be5d994602fdb604ace93a62cad960cb5f35a.dirtree b/repo/objects/87/585cdd1fc825b247b224e2563be5d994602fdb604ace93a62cad960cb5f35a.dirtree new file mode 100644 index 00000000000..8f94c8fa8d9 Binary files /dev/null and b/repo/objects/87/585cdd1fc825b247b224e2563be5d994602fdb604ace93a62cad960cb5f35a.dirtree differ diff --git a/repo/objects/87/686a9fc865bcddf5361baaabb0c8a42b0183ffd5419870029c558b4b3d1634.filez b/repo/objects/87/686a9fc865bcddf5361baaabb0c8a42b0183ffd5419870029c558b4b3d1634.filez new file mode 100644 index 00000000000..3056c5531a4 Binary files /dev/null and b/repo/objects/87/686a9fc865bcddf5361baaabb0c8a42b0183ffd5419870029c558b4b3d1634.filez differ diff --git a/repo/objects/87/7a0f099c24148460be36ada6755d8a60ed2859e877e25550aa892eba20f56f.filez b/repo/objects/87/7a0f099c24148460be36ada6755d8a60ed2859e877e25550aa892eba20f56f.filez new file mode 100644 index 00000000000..d03d02f4a57 Binary files /dev/null and b/repo/objects/87/7a0f099c24148460be36ada6755d8a60ed2859e877e25550aa892eba20f56f.filez differ diff --git a/repo/objects/87/881d91e315fcc639de9eb151d7300de6153a8f588d3f82eb68aa182af40748.filez b/repo/objects/87/881d91e315fcc639de9eb151d7300de6153a8f588d3f82eb68aa182af40748.filez new file mode 100644 index 00000000000..a4bdd77dcf0 Binary files /dev/null and b/repo/objects/87/881d91e315fcc639de9eb151d7300de6153a8f588d3f82eb68aa182af40748.filez differ diff --git a/repo/objects/87/8d5303c6b2a3be9207322e46a9072d1ab9ed7599f4a17844316c59f110fa44.filez b/repo/objects/87/8d5303c6b2a3be9207322e46a9072d1ab9ed7599f4a17844316c59f110fa44.filez new file mode 100644 index 00000000000..172618a4f1c Binary files /dev/null and b/repo/objects/87/8d5303c6b2a3be9207322e46a9072d1ab9ed7599f4a17844316c59f110fa44.filez differ diff --git a/repo/objects/87/8e51e4675528f0f02015d219fe0ea4c73062f7e4a7040ea97e2046be82a9be.dirtree b/repo/objects/87/8e51e4675528f0f02015d219fe0ea4c73062f7e4a7040ea97e2046be82a9be.dirtree new file mode 100644 index 00000000000..6b211ab032a Binary files /dev/null and b/repo/objects/87/8e51e4675528f0f02015d219fe0ea4c73062f7e4a7040ea97e2046be82a9be.dirtree differ diff --git a/repo/objects/87/93ab592bc4634f2de9b27afb4f5ac8d73d8f7fcc6b0c7dd89ad9af01367ac5.dirtree b/repo/objects/87/93ab592bc4634f2de9b27afb4f5ac8d73d8f7fcc6b0c7dd89ad9af01367ac5.dirtree new file mode 100644 index 00000000000..31c695e8350 Binary files /dev/null and b/repo/objects/87/93ab592bc4634f2de9b27afb4f5ac8d73d8f7fcc6b0c7dd89ad9af01367ac5.dirtree differ diff --git a/repo/objects/87/adb915430af16f993eba1041dab2614ef8c71840a6b79461a7f7b3c9b64235.filez b/repo/objects/87/adb915430af16f993eba1041dab2614ef8c71840a6b79461a7f7b3c9b64235.filez new file mode 100644 index 00000000000..87116d5d461 Binary files /dev/null and b/repo/objects/87/adb915430af16f993eba1041dab2614ef8c71840a6b79461a7f7b3c9b64235.filez differ diff --git a/repo/objects/87/c26023d8592138b8216918ce8d5d3ee267557222c3c0e1320914b2f6ffaee6.filez b/repo/objects/87/c26023d8592138b8216918ce8d5d3ee267557222c3c0e1320914b2f6ffaee6.filez new file mode 100644 index 00000000000..abf88b30141 Binary files /dev/null and b/repo/objects/87/c26023d8592138b8216918ce8d5d3ee267557222c3c0e1320914b2f6ffaee6.filez differ diff --git a/repo/objects/87/c9a7dc54a5156323ab1ba6310ea6320258e3d8bfff4feddc571e46bf0e0d2c.filez b/repo/objects/87/c9a7dc54a5156323ab1ba6310ea6320258e3d8bfff4feddc571e46bf0e0d2c.filez new file mode 100644 index 00000000000..eaeb032504a Binary files /dev/null and b/repo/objects/87/c9a7dc54a5156323ab1ba6310ea6320258e3d8bfff4feddc571e46bf0e0d2c.filez differ diff --git a/repo/objects/87/ceb8405e07981327e190947c39f98fbd4a843c857a0b7907e1faeb71e70032.dirtree b/repo/objects/87/ceb8405e07981327e190947c39f98fbd4a843c857a0b7907e1faeb71e70032.dirtree new file mode 100644 index 00000000000..32157749505 Binary files /dev/null and b/repo/objects/87/ceb8405e07981327e190947c39f98fbd4a843c857a0b7907e1faeb71e70032.dirtree differ diff --git a/repo/objects/87/d84705fe59a0914387d583cbadbd51dd80120977ccd908d7e84541b4197387.filez b/repo/objects/87/d84705fe59a0914387d583cbadbd51dd80120977ccd908d7e84541b4197387.filez new file mode 100644 index 00000000000..184c79bc6a1 Binary files /dev/null and b/repo/objects/87/d84705fe59a0914387d583cbadbd51dd80120977ccd908d7e84541b4197387.filez differ diff --git a/repo/objects/87/f1637cc8dca63fe47563274dd491e3654aacef077fada5c3533e745799284c.dirtree b/repo/objects/87/f1637cc8dca63fe47563274dd491e3654aacef077fada5c3533e745799284c.dirtree new file mode 100644 index 00000000000..4f293636308 Binary files /dev/null and b/repo/objects/87/f1637cc8dca63fe47563274dd491e3654aacef077fada5c3533e745799284c.dirtree differ diff --git a/repo/objects/88/1c994d8dfbc7a0e3256732e44ab9dc151acf5c7a3ccbac29f14e0dfd20ef26.filez b/repo/objects/88/1c994d8dfbc7a0e3256732e44ab9dc151acf5c7a3ccbac29f14e0dfd20ef26.filez new file mode 100644 index 00000000000..0bf481747d8 Binary files /dev/null and b/repo/objects/88/1c994d8dfbc7a0e3256732e44ab9dc151acf5c7a3ccbac29f14e0dfd20ef26.filez differ diff --git a/repo/objects/88/2c986cd99103e24d5b3c2b0626a5ab08b5d5e5dcc0300dbce04f30801b1a9e.filez b/repo/objects/88/2c986cd99103e24d5b3c2b0626a5ab08b5d5e5dcc0300dbce04f30801b1a9e.filez new file mode 100644 index 00000000000..30aa0b9c042 Binary files /dev/null and b/repo/objects/88/2c986cd99103e24d5b3c2b0626a5ab08b5d5e5dcc0300dbce04f30801b1a9e.filez differ diff --git a/repo/objects/88/5387b2fea9ced59a73e23c30ecd7fabc322f8e9978be6e97d7f59ba4cc7fcb.filez b/repo/objects/88/5387b2fea9ced59a73e23c30ecd7fabc322f8e9978be6e97d7f59ba4cc7fcb.filez new file mode 100644 index 00000000000..d7b3d5a0102 Binary files /dev/null and b/repo/objects/88/5387b2fea9ced59a73e23c30ecd7fabc322f8e9978be6e97d7f59ba4cc7fcb.filez differ diff --git a/repo/objects/88/6a3f1311da7bf81785742bbccbbfaa414700d3a5c8fdd40a52fc03fa47a931.filez b/repo/objects/88/6a3f1311da7bf81785742bbccbbfaa414700d3a5c8fdd40a52fc03fa47a931.filez new file mode 100644 index 00000000000..2cd4f8095e6 Binary files /dev/null and b/repo/objects/88/6a3f1311da7bf81785742bbccbbfaa414700d3a5c8fdd40a52fc03fa47a931.filez differ diff --git a/repo/objects/88/858cfd2bab570a0ea6f0300763a8b07527fcb7b80e3c5e5fe922dc277d4314.filez b/repo/objects/88/858cfd2bab570a0ea6f0300763a8b07527fcb7b80e3c5e5fe922dc277d4314.filez new file mode 100644 index 00000000000..f38ed00de6c Binary files /dev/null and b/repo/objects/88/858cfd2bab570a0ea6f0300763a8b07527fcb7b80e3c5e5fe922dc277d4314.filez differ diff --git a/repo/objects/88/ac01857a3fb9e77d4c048c963da085f7db4cb3db8239c7a57fd79d6a2d1b91.filez b/repo/objects/88/ac01857a3fb9e77d4c048c963da085f7db4cb3db8239c7a57fd79d6a2d1b91.filez new file mode 100644 index 00000000000..85b1737a9d9 Binary files /dev/null and b/repo/objects/88/ac01857a3fb9e77d4c048c963da085f7db4cb3db8239c7a57fd79d6a2d1b91.filez differ diff --git a/repo/objects/88/d14b8ee5bb4bb7831f626fd0e9be260bd2d6329c702eccb6154ee274adad67.filez b/repo/objects/88/d14b8ee5bb4bb7831f626fd0e9be260bd2d6329c702eccb6154ee274adad67.filez new file mode 100644 index 00000000000..b628bf49074 Binary files /dev/null and b/repo/objects/88/d14b8ee5bb4bb7831f626fd0e9be260bd2d6329c702eccb6154ee274adad67.filez differ diff --git a/repo/objects/88/dc932f62ab199bda39c4c03d7de4ad1075e540a569f673404dc9077b5ec1f4.filez b/repo/objects/88/dc932f62ab199bda39c4c03d7de4ad1075e540a569f673404dc9077b5ec1f4.filez new file mode 100644 index 00000000000..0463fa2c890 Binary files /dev/null and b/repo/objects/88/dc932f62ab199bda39c4c03d7de4ad1075e540a569f673404dc9077b5ec1f4.filez differ diff --git a/repo/objects/88/e729a58cfe30def9a657d55fdcdc77ec08c9e87e9f9f2141ac4cba8e3ca8f0.dirtree b/repo/objects/88/e729a58cfe30def9a657d55fdcdc77ec08c9e87e9f9f2141ac4cba8e3ca8f0.dirtree new file mode 100644 index 00000000000..ebef7e7f8d5 Binary files /dev/null and b/repo/objects/88/e729a58cfe30def9a657d55fdcdc77ec08c9e87e9f9f2141ac4cba8e3ca8f0.dirtree differ diff --git a/repo/objects/88/fbe28a5acfd7ce43e9c4bf0b0007795127f60866f1c2d2f2ab879acd612342.filez b/repo/objects/88/fbe28a5acfd7ce43e9c4bf0b0007795127f60866f1c2d2f2ab879acd612342.filez new file mode 100644 index 00000000000..03401ce8c4d Binary files /dev/null and b/repo/objects/88/fbe28a5acfd7ce43e9c4bf0b0007795127f60866f1c2d2f2ab879acd612342.filez differ diff --git a/repo/objects/89/0e74adc8805f41a7e6755f6d6e9c0b775c06a8f3f60a43e9947da1002ea485.filez b/repo/objects/89/0e74adc8805f41a7e6755f6d6e9c0b775c06a8f3f60a43e9947da1002ea485.filez new file mode 100644 index 00000000000..86a680fb241 Binary files /dev/null and b/repo/objects/89/0e74adc8805f41a7e6755f6d6e9c0b775c06a8f3f60a43e9947da1002ea485.filez differ diff --git a/repo/objects/89/0ff8d3f39b81e1a47457860b855090433fb3997a6ad28263f8bdc9b12c5ac8.filez b/repo/objects/89/0ff8d3f39b81e1a47457860b855090433fb3997a6ad28263f8bdc9b12c5ac8.filez new file mode 100644 index 00000000000..51eb7450123 Binary files /dev/null and b/repo/objects/89/0ff8d3f39b81e1a47457860b855090433fb3997a6ad28263f8bdc9b12c5ac8.filez differ diff --git a/repo/objects/89/1a3eec89d860c4323d2777e14df758d0091275c1ef796d8a94727bbe9ff73e.filez b/repo/objects/89/1a3eec89d860c4323d2777e14df758d0091275c1ef796d8a94727bbe9ff73e.filez new file mode 100644 index 00000000000..9cd0c9cafe3 Binary files /dev/null and b/repo/objects/89/1a3eec89d860c4323d2777e14df758d0091275c1ef796d8a94727bbe9ff73e.filez differ diff --git a/repo/objects/89/20b129aa747fd9a0a99803fea8cca6e7f9c77b632534d503f8bcf7f25670bf.filez b/repo/objects/89/20b129aa747fd9a0a99803fea8cca6e7f9c77b632534d503f8bcf7f25670bf.filez new file mode 100644 index 00000000000..39f0571178a Binary files /dev/null and b/repo/objects/89/20b129aa747fd9a0a99803fea8cca6e7f9c77b632534d503f8bcf7f25670bf.filez differ diff --git a/repo/objects/89/33b7141ad32aaa460d420b4d5eb3f88206a6a8e04c49691bb22b899c92780a.filez b/repo/objects/89/33b7141ad32aaa460d420b4d5eb3f88206a6a8e04c49691bb22b899c92780a.filez new file mode 100644 index 00000000000..cf4850fe4ff Binary files /dev/null and b/repo/objects/89/33b7141ad32aaa460d420b4d5eb3f88206a6a8e04c49691bb22b899c92780a.filez differ diff --git a/repo/objects/89/6d1ef3ff8e1ca9aa806db1502bd05bdcf228b07a823e4955d6b6cf521949ad.dirtree b/repo/objects/89/6d1ef3ff8e1ca9aa806db1502bd05bdcf228b07a823e4955d6b6cf521949ad.dirtree new file mode 100644 index 00000000000..0f1c718039e Binary files /dev/null and b/repo/objects/89/6d1ef3ff8e1ca9aa806db1502bd05bdcf228b07a823e4955d6b6cf521949ad.dirtree differ diff --git a/repo/objects/89/702ee10f1a065d324c628a311f5b569b71553bb84faa76fa3c2a56e61f434a.filez b/repo/objects/89/702ee10f1a065d324c628a311f5b569b71553bb84faa76fa3c2a56e61f434a.filez new file mode 100644 index 00000000000..a9c6d9a7ccb Binary files /dev/null and b/repo/objects/89/702ee10f1a065d324c628a311f5b569b71553bb84faa76fa3c2a56e61f434a.filez differ diff --git a/repo/objects/89/8b9d35a03719978689bd2791a9bfc082521fa65eff3fa561823e6e2f06f8e7.filez b/repo/objects/89/8b9d35a03719978689bd2791a9bfc082521fa65eff3fa561823e6e2f06f8e7.filez new file mode 100644 index 00000000000..80ba3ca41a0 Binary files /dev/null and b/repo/objects/89/8b9d35a03719978689bd2791a9bfc082521fa65eff3fa561823e6e2f06f8e7.filez differ diff --git a/repo/objects/89/8fb6f06f21dc61c47a4f59a3d4324fda191912671c9470b10eb79efbf72370.dirtree b/repo/objects/89/8fb6f06f21dc61c47a4f59a3d4324fda191912671c9470b10eb79efbf72370.dirtree new file mode 100644 index 00000000000..9180c6befdf Binary files /dev/null and b/repo/objects/89/8fb6f06f21dc61c47a4f59a3d4324fda191912671c9470b10eb79efbf72370.dirtree differ diff --git a/repo/objects/89/c52df65028ddac9dfb3bea76c82333fad1c864a71417027e8dcc4b2baf1a80.dirtree b/repo/objects/89/c52df65028ddac9dfb3bea76c82333fad1c864a71417027e8dcc4b2baf1a80.dirtree new file mode 100644 index 00000000000..c09d3074033 Binary files /dev/null and b/repo/objects/89/c52df65028ddac9dfb3bea76c82333fad1c864a71417027e8dcc4b2baf1a80.dirtree differ diff --git a/repo/objects/89/deef2a553213fd9b5c5dfcca4ee083f6783bf5dff11bf73ddcb291c7801a68.filez b/repo/objects/89/deef2a553213fd9b5c5dfcca4ee083f6783bf5dff11bf73ddcb291c7801a68.filez new file mode 100644 index 00000000000..85d7115a050 Binary files /dev/null and b/repo/objects/89/deef2a553213fd9b5c5dfcca4ee083f6783bf5dff11bf73ddcb291c7801a68.filez differ diff --git a/repo/objects/89/e70d66655ffb46aec1fc91f55ad2e4717261f2dd18d50131297bd16ea81dcc.filez b/repo/objects/89/e70d66655ffb46aec1fc91f55ad2e4717261f2dd18d50131297bd16ea81dcc.filez new file mode 100644 index 00000000000..346e97ccbc5 Binary files /dev/null and b/repo/objects/89/e70d66655ffb46aec1fc91f55ad2e4717261f2dd18d50131297bd16ea81dcc.filez differ diff --git a/repo/objects/8a/15caeb2b8e3edbc9a63b7c655bec7fb7215807a58219d816c1906e161dcd18.filez b/repo/objects/8a/15caeb2b8e3edbc9a63b7c655bec7fb7215807a58219d816c1906e161dcd18.filez new file mode 100644 index 00000000000..fc08ecd89e6 Binary files /dev/null and b/repo/objects/8a/15caeb2b8e3edbc9a63b7c655bec7fb7215807a58219d816c1906e161dcd18.filez differ diff --git a/repo/objects/8a/1b8d4a65960625e6d1f857e306a988632b4db533b9cd8e2d9b950eb584d8ff.filez b/repo/objects/8a/1b8d4a65960625e6d1f857e306a988632b4db533b9cd8e2d9b950eb584d8ff.filez new file mode 100644 index 00000000000..6b851a72af4 Binary files /dev/null and b/repo/objects/8a/1b8d4a65960625e6d1f857e306a988632b4db533b9cd8e2d9b950eb584d8ff.filez differ diff --git a/repo/objects/8a/23e68c20eb990c64c9c7382c1a0abc7dac1d8450478fe6f47072d617cd3504.dirtree b/repo/objects/8a/23e68c20eb990c64c9c7382c1a0abc7dac1d8450478fe6f47072d617cd3504.dirtree new file mode 100644 index 00000000000..59c5bf46afa Binary files /dev/null and b/repo/objects/8a/23e68c20eb990c64c9c7382c1a0abc7dac1d8450478fe6f47072d617cd3504.dirtree differ diff --git a/repo/objects/8a/24d10ddd978030981a58d3a7a35165fab7b4794bd46e75f562cb4359b95780.filez b/repo/objects/8a/24d10ddd978030981a58d3a7a35165fab7b4794bd46e75f562cb4359b95780.filez new file mode 100644 index 00000000000..28a5634d648 Binary files /dev/null and b/repo/objects/8a/24d10ddd978030981a58d3a7a35165fab7b4794bd46e75f562cb4359b95780.filez differ diff --git a/repo/objects/8a/3d6c975f99dfd88b9c8c5d4e0be6529e906bbffd2bf600fa759717dfb7e1e0.filez b/repo/objects/8a/3d6c975f99dfd88b9c8c5d4e0be6529e906bbffd2bf600fa759717dfb7e1e0.filez new file mode 100644 index 00000000000..90335b23a84 Binary files /dev/null and b/repo/objects/8a/3d6c975f99dfd88b9c8c5d4e0be6529e906bbffd2bf600fa759717dfb7e1e0.filez differ diff --git a/repo/objects/8a/6dfa4527e17469b162a95fad50eb42cd311947730b9d31c45ade8f25abd83d.filez b/repo/objects/8a/6dfa4527e17469b162a95fad50eb42cd311947730b9d31c45ade8f25abd83d.filez new file mode 100644 index 00000000000..9a74e5086ef Binary files /dev/null and b/repo/objects/8a/6dfa4527e17469b162a95fad50eb42cd311947730b9d31c45ade8f25abd83d.filez differ diff --git a/repo/objects/8a/6fd19d0b8d7fc5761931bed72eb2aa56d88e95b6d6be7f4f00b0691a9c769d.filez b/repo/objects/8a/6fd19d0b8d7fc5761931bed72eb2aa56d88e95b6d6be7f4f00b0691a9c769d.filez new file mode 100644 index 00000000000..ac1ed353e3a Binary files /dev/null and b/repo/objects/8a/6fd19d0b8d7fc5761931bed72eb2aa56d88e95b6d6be7f4f00b0691a9c769d.filez differ diff --git a/repo/objects/8a/73a48180c586ce275d1f7660a09478348a88711ccc57518b65a392dcb09745.filez b/repo/objects/8a/73a48180c586ce275d1f7660a09478348a88711ccc57518b65a392dcb09745.filez new file mode 100644 index 00000000000..34a03d59c1e Binary files /dev/null and b/repo/objects/8a/73a48180c586ce275d1f7660a09478348a88711ccc57518b65a392dcb09745.filez differ diff --git a/repo/objects/8a/81fcea0d335335378e9779c2e674905e9b24bf6f7f4e15b4f7066070be843e.filez b/repo/objects/8a/81fcea0d335335378e9779c2e674905e9b24bf6f7f4e15b4f7066070be843e.filez new file mode 100644 index 00000000000..20e4ffcd942 Binary files /dev/null and b/repo/objects/8a/81fcea0d335335378e9779c2e674905e9b24bf6f7f4e15b4f7066070be843e.filez differ diff --git a/repo/objects/8a/bfe79b2040c6f17d7a02c3fa68afb7fae5a05b71035ef610ff68819b4db529.dirtree b/repo/objects/8a/bfe79b2040c6f17d7a02c3fa68afb7fae5a05b71035ef610ff68819b4db529.dirtree new file mode 100644 index 00000000000..43659dbe607 Binary files /dev/null and b/repo/objects/8a/bfe79b2040c6f17d7a02c3fa68afb7fae5a05b71035ef610ff68819b4db529.dirtree differ diff --git a/repo/objects/8a/c8b90df301d6d14f92659c7fdc6aa7ddd1d0aae097d50c3cfaa74c52aa0def.filez b/repo/objects/8a/c8b90df301d6d14f92659c7fdc6aa7ddd1d0aae097d50c3cfaa74c52aa0def.filez new file mode 100644 index 00000000000..4ed1a5db0c4 Binary files /dev/null and b/repo/objects/8a/c8b90df301d6d14f92659c7fdc6aa7ddd1d0aae097d50c3cfaa74c52aa0def.filez differ diff --git a/repo/objects/8a/c8c68d5e181ffcf334123bbdae6edcf638b4dc7e4eba52639034d5f7d80797.filez b/repo/objects/8a/c8c68d5e181ffcf334123bbdae6edcf638b4dc7e4eba52639034d5f7d80797.filez new file mode 100644 index 00000000000..b5d6c8e0b4b Binary files /dev/null and b/repo/objects/8a/c8c68d5e181ffcf334123bbdae6edcf638b4dc7e4eba52639034d5f7d80797.filez differ diff --git a/repo/objects/8a/d5621d93f5e3f3f25f3ac06eb256ac1ad3be39fc071b8617a4c816caac414f.filez b/repo/objects/8a/d5621d93f5e3f3f25f3ac06eb256ac1ad3be39fc071b8617a4c816caac414f.filez new file mode 100644 index 00000000000..5bdd79ed8a0 Binary files /dev/null and b/repo/objects/8a/d5621d93f5e3f3f25f3ac06eb256ac1ad3be39fc071b8617a4c816caac414f.filez differ diff --git a/repo/objects/8a/d652ec80805d31957f33574d99e3af8a98921cbe80ffea8d8d416f988f9c58.filez b/repo/objects/8a/d652ec80805d31957f33574d99e3af8a98921cbe80ffea8d8d416f988f9c58.filez new file mode 100644 index 00000000000..594559ad245 Binary files /dev/null and b/repo/objects/8a/d652ec80805d31957f33574d99e3af8a98921cbe80ffea8d8d416f988f9c58.filez differ diff --git a/repo/objects/8a/da8759c6f5f613a7abb08ff25dbe6daf07497d96ca265254539ece67710129.filez b/repo/objects/8a/da8759c6f5f613a7abb08ff25dbe6daf07497d96ca265254539ece67710129.filez new file mode 100644 index 00000000000..a55f5e60754 Binary files /dev/null and b/repo/objects/8a/da8759c6f5f613a7abb08ff25dbe6daf07497d96ca265254539ece67710129.filez differ diff --git a/repo/objects/8b/00b695f49548fe8e3786cbae60ea98aff206eb2eec0179437008a812a56b45.filez b/repo/objects/8b/00b695f49548fe8e3786cbae60ea98aff206eb2eec0179437008a812a56b45.filez new file mode 100644 index 00000000000..e5704113409 Binary files /dev/null and b/repo/objects/8b/00b695f49548fe8e3786cbae60ea98aff206eb2eec0179437008a812a56b45.filez differ diff --git a/repo/objects/8b/15ed22bd7faa51bf8331e1b4ca51c4c01f6b566bd4a51b55d79e0e0c6e95cc.filez b/repo/objects/8b/15ed22bd7faa51bf8331e1b4ca51c4c01f6b566bd4a51b55d79e0e0c6e95cc.filez new file mode 100644 index 00000000000..50599a981db Binary files /dev/null and b/repo/objects/8b/15ed22bd7faa51bf8331e1b4ca51c4c01f6b566bd4a51b55d79e0e0c6e95cc.filez differ diff --git a/repo/objects/8b/23cfa6ef60f974e729d236aca3dbabee8b4c015f9636b611e55a8478947cd3.filez b/repo/objects/8b/23cfa6ef60f974e729d236aca3dbabee8b4c015f9636b611e55a8478947cd3.filez new file mode 100644 index 00000000000..5cd0f8b59cf Binary files /dev/null and b/repo/objects/8b/23cfa6ef60f974e729d236aca3dbabee8b4c015f9636b611e55a8478947cd3.filez differ diff --git a/repo/objects/8b/241fc9942e2b63b2f90c06b9b1db21e50fc52a9d536a7cd525bfe3411d0350.dirtree b/repo/objects/8b/241fc9942e2b63b2f90c06b9b1db21e50fc52a9d536a7cd525bfe3411d0350.dirtree new file mode 100644 index 00000000000..4b8ffadf5d5 Binary files /dev/null and b/repo/objects/8b/241fc9942e2b63b2f90c06b9b1db21e50fc52a9d536a7cd525bfe3411d0350.dirtree differ diff --git a/repo/objects/8b/40fabc9790f21cdc7728ccb6f30872298ba6f34479c312ecf7d806aa431aa3.filez b/repo/objects/8b/40fabc9790f21cdc7728ccb6f30872298ba6f34479c312ecf7d806aa431aa3.filez new file mode 100644 index 00000000000..310cbd6bf88 Binary files /dev/null and b/repo/objects/8b/40fabc9790f21cdc7728ccb6f30872298ba6f34479c312ecf7d806aa431aa3.filez differ diff --git a/repo/objects/8b/52a5bb42d4ec5bac21103fa71e8fd6f042199077a5dcc8a53711ca60de8702.filez b/repo/objects/8b/52a5bb42d4ec5bac21103fa71e8fd6f042199077a5dcc8a53711ca60de8702.filez new file mode 100644 index 00000000000..caf90abe2e4 Binary files /dev/null and b/repo/objects/8b/52a5bb42d4ec5bac21103fa71e8fd6f042199077a5dcc8a53711ca60de8702.filez differ diff --git a/repo/objects/8b/73dec391f35e5be5b23fd2b98e69caada4e333c7e5f8c7d93aa00cb5041d8d.filez b/repo/objects/8b/73dec391f35e5be5b23fd2b98e69caada4e333c7e5f8c7d93aa00cb5041d8d.filez new file mode 100644 index 00000000000..9affcd7952e Binary files /dev/null and b/repo/objects/8b/73dec391f35e5be5b23fd2b98e69caada4e333c7e5f8c7d93aa00cb5041d8d.filez differ diff --git a/repo/objects/8b/741ed7f6cf86a9ae30ff1fcd9da50f86078404d9c30250bf078f765159477a.filez b/repo/objects/8b/741ed7f6cf86a9ae30ff1fcd9da50f86078404d9c30250bf078f765159477a.filez new file mode 100644 index 00000000000..e9962daf04a Binary files /dev/null and b/repo/objects/8b/741ed7f6cf86a9ae30ff1fcd9da50f86078404d9c30250bf078f765159477a.filez differ diff --git a/repo/objects/8b/8586062fda6dcbcc2005944ff43bb789af7c81d9c4844754728ce2b41ff6f2.filez b/repo/objects/8b/8586062fda6dcbcc2005944ff43bb789af7c81d9c4844754728ce2b41ff6f2.filez new file mode 100644 index 00000000000..832da2122ac Binary files /dev/null and b/repo/objects/8b/8586062fda6dcbcc2005944ff43bb789af7c81d9c4844754728ce2b41ff6f2.filez differ diff --git a/repo/objects/8b/de292d49a9c62ef6bd7e04104a773b68c4135c0bde28983acdf888511bf3b8.filez b/repo/objects/8b/de292d49a9c62ef6bd7e04104a773b68c4135c0bde28983acdf888511bf3b8.filez new file mode 100644 index 00000000000..ac15374a094 Binary files /dev/null and b/repo/objects/8b/de292d49a9c62ef6bd7e04104a773b68c4135c0bde28983acdf888511bf3b8.filez differ diff --git a/repo/objects/8b/f367928af666a8e754bc9df4b2105e20b07172df542042f1d8c4ddec0d95b3.filez b/repo/objects/8b/f367928af666a8e754bc9df4b2105e20b07172df542042f1d8c4ddec0d95b3.filez new file mode 100644 index 00000000000..8c90f015f31 Binary files /dev/null and b/repo/objects/8b/f367928af666a8e754bc9df4b2105e20b07172df542042f1d8c4ddec0d95b3.filez differ diff --git a/repo/objects/8c/0fb4db1519ec6fce754ded67d2046674d5168839df4825c9472018d0ceda6d.filez b/repo/objects/8c/0fb4db1519ec6fce754ded67d2046674d5168839df4825c9472018d0ceda6d.filez new file mode 100644 index 00000000000..ccad312dafc Binary files /dev/null and b/repo/objects/8c/0fb4db1519ec6fce754ded67d2046674d5168839df4825c9472018d0ceda6d.filez differ diff --git a/repo/objects/8c/11487b1969b1bd291becca351c1069fa5ef126c1a9e34ea1ef7af7c9ac1e38.filez b/repo/objects/8c/11487b1969b1bd291becca351c1069fa5ef126c1a9e34ea1ef7af7c9ac1e38.filez new file mode 100644 index 00000000000..8243b680c9c Binary files /dev/null and b/repo/objects/8c/11487b1969b1bd291becca351c1069fa5ef126c1a9e34ea1ef7af7c9ac1e38.filez differ diff --git a/repo/objects/8c/1ed0bc7a88fb681b7a74fa8c6d3803805f6cef518b33afb8db3d5fe145efdc.filez b/repo/objects/8c/1ed0bc7a88fb681b7a74fa8c6d3803805f6cef518b33afb8db3d5fe145efdc.filez new file mode 100644 index 00000000000..59ddfc69fef Binary files /dev/null and b/repo/objects/8c/1ed0bc7a88fb681b7a74fa8c6d3803805f6cef518b33afb8db3d5fe145efdc.filez differ diff --git a/repo/objects/8c/30dc9bd1b999b23d81e94bc2391b323f2dc7790b16ac2e9ed4c2f4e1dfa84e.filez b/repo/objects/8c/30dc9bd1b999b23d81e94bc2391b323f2dc7790b16ac2e9ed4c2f4e1dfa84e.filez new file mode 100644 index 00000000000..02a9ac53e89 Binary files /dev/null and b/repo/objects/8c/30dc9bd1b999b23d81e94bc2391b323f2dc7790b16ac2e9ed4c2f4e1dfa84e.filez differ diff --git a/repo/objects/8c/43e026e62d78d369eb49792e6f7edf5d4225e5d779af1a484b42760366f979.filez b/repo/objects/8c/43e026e62d78d369eb49792e6f7edf5d4225e5d779af1a484b42760366f979.filez new file mode 100644 index 00000000000..f17e8b98ab7 Binary files /dev/null and b/repo/objects/8c/43e026e62d78d369eb49792e6f7edf5d4225e5d779af1a484b42760366f979.filez differ diff --git a/repo/objects/8c/93005c678e7b4bdbabbf2f4795e1c9d0d543ebf4c66e563967595358fb0907.filez b/repo/objects/8c/93005c678e7b4bdbabbf2f4795e1c9d0d543ebf4c66e563967595358fb0907.filez new file mode 100644 index 00000000000..bcd2c6250fa Binary files /dev/null and b/repo/objects/8c/93005c678e7b4bdbabbf2f4795e1c9d0d543ebf4c66e563967595358fb0907.filez differ diff --git a/repo/objects/8c/e34ee2e0dfac7ea7f7a37332073f80d12fa9c603cd68f96219bcd9f47b1b9c.dirtree b/repo/objects/8c/e34ee2e0dfac7ea7f7a37332073f80d12fa9c603cd68f96219bcd9f47b1b9c.dirtree new file mode 100644 index 00000000000..65d626e0618 Binary files /dev/null and b/repo/objects/8c/e34ee2e0dfac7ea7f7a37332073f80d12fa9c603cd68f96219bcd9f47b1b9c.dirtree differ diff --git a/repo/objects/8c/f9d067e93112cf7d9875775a75192cccf4ba1af6193f32e6cfe7a5c9269e1e.dirtree b/repo/objects/8c/f9d067e93112cf7d9875775a75192cccf4ba1af6193f32e6cfe7a5c9269e1e.dirtree new file mode 100644 index 00000000000..e0393d82ab1 Binary files /dev/null and b/repo/objects/8c/f9d067e93112cf7d9875775a75192cccf4ba1af6193f32e6cfe7a5c9269e1e.dirtree differ diff --git a/repo/objects/8d/0194cf76f10d791044ea7bf50403cbeee8ee6f0a980bdceb276a65c3dfbf17.filez b/repo/objects/8d/0194cf76f10d791044ea7bf50403cbeee8ee6f0a980bdceb276a65c3dfbf17.filez new file mode 100644 index 00000000000..cb63db77648 Binary files /dev/null and b/repo/objects/8d/0194cf76f10d791044ea7bf50403cbeee8ee6f0a980bdceb276a65c3dfbf17.filez differ diff --git a/repo/objects/8d/24654f19b57e0fbce436b4ae869ddb24c72375b483e6f8d5ff558d4eade566.dirtree b/repo/objects/8d/24654f19b57e0fbce436b4ae869ddb24c72375b483e6f8d5ff558d4eade566.dirtree new file mode 100644 index 00000000000..84f937da7f1 Binary files /dev/null and b/repo/objects/8d/24654f19b57e0fbce436b4ae869ddb24c72375b483e6f8d5ff558d4eade566.dirtree differ diff --git a/repo/objects/8d/5d15e701af10deb3f32783a070a4e432ad92f78b7fe281d985ac1aab70b18a.filez b/repo/objects/8d/5d15e701af10deb3f32783a070a4e432ad92f78b7fe281d985ac1aab70b18a.filez new file mode 100644 index 00000000000..30a75a22d7b Binary files /dev/null and b/repo/objects/8d/5d15e701af10deb3f32783a070a4e432ad92f78b7fe281d985ac1aab70b18a.filez differ diff --git a/repo/objects/8d/7bca2c4551d7c334f0f44693c9dafdafbf5cc32c052bdd6b1481afecf06013.filez b/repo/objects/8d/7bca2c4551d7c334f0f44693c9dafdafbf5cc32c052bdd6b1481afecf06013.filez new file mode 100644 index 00000000000..dcabe51c7f0 Binary files /dev/null and b/repo/objects/8d/7bca2c4551d7c334f0f44693c9dafdafbf5cc32c052bdd6b1481afecf06013.filez differ diff --git a/repo/objects/8d/89c0431aed5b392bfeea0f9cb1466647805a7c7e7816fa3a0b1e9bdcc1c230.dirtree b/repo/objects/8d/89c0431aed5b392bfeea0f9cb1466647805a7c7e7816fa3a0b1e9bdcc1c230.dirtree new file mode 100644 index 00000000000..01daaea12ee Binary files /dev/null and b/repo/objects/8d/89c0431aed5b392bfeea0f9cb1466647805a7c7e7816fa3a0b1e9bdcc1c230.dirtree differ diff --git a/repo/objects/8d/a337820dbea0c14f80f31d2533b0a8604dd089b82d2c51b2b703eaa91f86d6.filez b/repo/objects/8d/a337820dbea0c14f80f31d2533b0a8604dd089b82d2c51b2b703eaa91f86d6.filez new file mode 100644 index 00000000000..fb4969d611e Binary files /dev/null and b/repo/objects/8d/a337820dbea0c14f80f31d2533b0a8604dd089b82d2c51b2b703eaa91f86d6.filez differ diff --git a/repo/objects/8e/09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf.commit b/repo/objects/8e/09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf.commit new file mode 100644 index 00000000000..14738e4e63a Binary files /dev/null and b/repo/objects/8e/09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf.commit differ diff --git a/repo/objects/8e/09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf.commitmeta b/repo/objects/8e/09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf.commitmeta new file mode 100644 index 00000000000..b20a06d9c6a Binary files /dev/null and b/repo/objects/8e/09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf.commitmeta differ diff --git a/repo/objects/8e/17eb90d3325078b56fb163b34437087ef1d0119d3cdca1c12edf321246c4af.filez b/repo/objects/8e/17eb90d3325078b56fb163b34437087ef1d0119d3cdca1c12edf321246c4af.filez new file mode 100644 index 00000000000..53fc2d8d283 Binary files /dev/null and b/repo/objects/8e/17eb90d3325078b56fb163b34437087ef1d0119d3cdca1c12edf321246c4af.filez differ diff --git a/repo/objects/8e/334abb567ad5a57d7c41f20e3a1ad498910ac1d7a5e8c772a25b5f11cbf997.filez b/repo/objects/8e/334abb567ad5a57d7c41f20e3a1ad498910ac1d7a5e8c772a25b5f11cbf997.filez new file mode 100644 index 00000000000..4ed86d28884 Binary files /dev/null and b/repo/objects/8e/334abb567ad5a57d7c41f20e3a1ad498910ac1d7a5e8c772a25b5f11cbf997.filez differ diff --git a/repo/objects/8e/384ad19be5f8863508b466f41873282cf27c8f348506ad0270340730aa1dad.filez b/repo/objects/8e/384ad19be5f8863508b466f41873282cf27c8f348506ad0270340730aa1dad.filez new file mode 100644 index 00000000000..be25fde91ca Binary files /dev/null and b/repo/objects/8e/384ad19be5f8863508b466f41873282cf27c8f348506ad0270340730aa1dad.filez differ diff --git a/repo/objects/8e/61505e0fe9528b4fe92282079e5b49a42ae0158f9dee3474d4c5da68da919b.dirtree b/repo/objects/8e/61505e0fe9528b4fe92282079e5b49a42ae0158f9dee3474d4c5da68da919b.dirtree new file mode 100644 index 00000000000..5fa805303f4 Binary files /dev/null and b/repo/objects/8e/61505e0fe9528b4fe92282079e5b49a42ae0158f9dee3474d4c5da68da919b.dirtree differ diff --git a/repo/objects/8e/8eb635f62c5ff9d5c07b0cd941735d382f40812aa39ba3471d874b3b3bdef2.filez b/repo/objects/8e/8eb635f62c5ff9d5c07b0cd941735d382f40812aa39ba3471d874b3b3bdef2.filez new file mode 100644 index 00000000000..c06ca18cf74 Binary files /dev/null and b/repo/objects/8e/8eb635f62c5ff9d5c07b0cd941735d382f40812aa39ba3471d874b3b3bdef2.filez differ diff --git a/repo/objects/8e/aa4f2676245485dc1118d5b6d29096cca573fc08cce9a8ba51b1fc5bde9240.filez b/repo/objects/8e/aa4f2676245485dc1118d5b6d29096cca573fc08cce9a8ba51b1fc5bde9240.filez new file mode 100644 index 00000000000..dfa274aab07 Binary files /dev/null and b/repo/objects/8e/aa4f2676245485dc1118d5b6d29096cca573fc08cce9a8ba51b1fc5bde9240.filez differ diff --git a/repo/objects/8e/b37fa786b59d17ff659b09bd6559203b520783bf95262ddcd43dafc4ca1860.filez b/repo/objects/8e/b37fa786b59d17ff659b09bd6559203b520783bf95262ddcd43dafc4ca1860.filez new file mode 100644 index 00000000000..8ce7d9e2eff Binary files /dev/null and b/repo/objects/8e/b37fa786b59d17ff659b09bd6559203b520783bf95262ddcd43dafc4ca1860.filez differ diff --git a/repo/objects/8e/bcbbfe4b7a7350c38b047fbd410bbf8c9882b2b1b07696754ea7c8388ea224.dirtree b/repo/objects/8e/bcbbfe4b7a7350c38b047fbd410bbf8c9882b2b1b07696754ea7c8388ea224.dirtree new file mode 100644 index 00000000000..f6e47a95f32 Binary files /dev/null and b/repo/objects/8e/bcbbfe4b7a7350c38b047fbd410bbf8c9882b2b1b07696754ea7c8388ea224.dirtree differ diff --git a/repo/objects/8e/c1290318008173a89c415c72c1d282d182836eae486c67ccb5e414face6d64.filez b/repo/objects/8e/c1290318008173a89c415c72c1d282d182836eae486c67ccb5e414face6d64.filez new file mode 100644 index 00000000000..a33c744b604 Binary files /dev/null and b/repo/objects/8e/c1290318008173a89c415c72c1d282d182836eae486c67ccb5e414face6d64.filez differ diff --git a/repo/objects/8e/d6fcb9af0bd8440e06944da4dc5fcc5e42358370eb6947c667e7444b6f13a1.dirtree b/repo/objects/8e/d6fcb9af0bd8440e06944da4dc5fcc5e42358370eb6947c667e7444b6f13a1.dirtree new file mode 100644 index 00000000000..a5e5fcdae0c Binary files /dev/null and b/repo/objects/8e/d6fcb9af0bd8440e06944da4dc5fcc5e42358370eb6947c667e7444b6f13a1.dirtree differ diff --git a/repo/objects/8f/05ee85167d7b635a13debdab782714f758ea5341345128ea573ea5c910f5d2.dirtree b/repo/objects/8f/05ee85167d7b635a13debdab782714f758ea5341345128ea573ea5c910f5d2.dirtree new file mode 100644 index 00000000000..284d839f326 Binary files /dev/null and b/repo/objects/8f/05ee85167d7b635a13debdab782714f758ea5341345128ea573ea5c910f5d2.dirtree differ diff --git a/repo/objects/8f/07dccd86b429d4d3e5f9c95b1121d2deb3f26ef1469171dc1f00f5563c3e0b.dirtree b/repo/objects/8f/07dccd86b429d4d3e5f9c95b1121d2deb3f26ef1469171dc1f00f5563c3e0b.dirtree new file mode 100644 index 00000000000..82a54dae270 Binary files /dev/null and b/repo/objects/8f/07dccd86b429d4d3e5f9c95b1121d2deb3f26ef1469171dc1f00f5563c3e0b.dirtree differ diff --git a/repo/objects/8f/5f4fc61676d3e6eb9b499228879c93fb01f34eeaa7b66c944b0fd5dc4652e2.dirtree b/repo/objects/8f/5f4fc61676d3e6eb9b499228879c93fb01f34eeaa7b66c944b0fd5dc4652e2.dirtree new file mode 100644 index 00000000000..748cc89245f Binary files /dev/null and b/repo/objects/8f/5f4fc61676d3e6eb9b499228879c93fb01f34eeaa7b66c944b0fd5dc4652e2.dirtree differ diff --git a/repo/objects/8f/90979e8f8f1c3558daf39d5ff32b74fb2dd0eebed684113badc2e6ffeee4f4.filez b/repo/objects/8f/90979e8f8f1c3558daf39d5ff32b74fb2dd0eebed684113badc2e6ffeee4f4.filez new file mode 100644 index 00000000000..a616f6d55d5 Binary files /dev/null and b/repo/objects/8f/90979e8f8f1c3558daf39d5ff32b74fb2dd0eebed684113badc2e6ffeee4f4.filez differ diff --git a/repo/objects/8f/b1bc003b18bacb41ca7355a204414bc89503b7fde7bbc37c124c6c74ea9552.filez b/repo/objects/8f/b1bc003b18bacb41ca7355a204414bc89503b7fde7bbc37c124c6c74ea9552.filez new file mode 100644 index 00000000000..bbe7c2ee04a Binary files /dev/null and b/repo/objects/8f/b1bc003b18bacb41ca7355a204414bc89503b7fde7bbc37c124c6c74ea9552.filez differ diff --git a/repo/objects/8f/b6d211af87d782858d0486ad81a46a35b10038862143d00e3e1115c9ff0313.filez b/repo/objects/8f/b6d211af87d782858d0486ad81a46a35b10038862143d00e3e1115c9ff0313.filez new file mode 100644 index 00000000000..a590fcbd2a2 Binary files /dev/null and b/repo/objects/8f/b6d211af87d782858d0486ad81a46a35b10038862143d00e3e1115c9ff0313.filez differ diff --git a/repo/objects/8f/c31515840bcbc4b365f0e9413a447dfe0efc00565276378578b838e6ed699b.filez b/repo/objects/8f/c31515840bcbc4b365f0e9413a447dfe0efc00565276378578b838e6ed699b.filez new file mode 100644 index 00000000000..096548296ff Binary files /dev/null and b/repo/objects/8f/c31515840bcbc4b365f0e9413a447dfe0efc00565276378578b838e6ed699b.filez differ diff --git a/repo/objects/8f/cbae7d328516c05f5e2e4c5daa7e83cd65881c64809cccc015ecb7d3417814.filez b/repo/objects/8f/cbae7d328516c05f5e2e4c5daa7e83cd65881c64809cccc015ecb7d3417814.filez new file mode 100644 index 00000000000..4c15637c3c4 Binary files /dev/null and b/repo/objects/8f/cbae7d328516c05f5e2e4c5daa7e83cd65881c64809cccc015ecb7d3417814.filez differ diff --git a/repo/objects/8f/d00d263bb785136e82aaa520ea2a695acc4ff76cec3cb21ea14c820091f4cc.dirtree b/repo/objects/8f/d00d263bb785136e82aaa520ea2a695acc4ff76cec3cb21ea14c820091f4cc.dirtree new file mode 100644 index 00000000000..4a9e80b1d62 Binary files /dev/null and b/repo/objects/8f/d00d263bb785136e82aaa520ea2a695acc4ff76cec3cb21ea14c820091f4cc.dirtree differ diff --git a/repo/objects/8f/dcfae0b919759570f4ccced69b7431767f1deef411eda53f67bc967a968a46.filez b/repo/objects/8f/dcfae0b919759570f4ccced69b7431767f1deef411eda53f67bc967a968a46.filez new file mode 100644 index 00000000000..1bfa672faf6 Binary files /dev/null and b/repo/objects/8f/dcfae0b919759570f4ccced69b7431767f1deef411eda53f67bc967a968a46.filez differ diff --git a/repo/objects/8f/de5f00f616df72fd24efda0183543b1d2061ef109d81a41380b9340044602e.dirtree b/repo/objects/8f/de5f00f616df72fd24efda0183543b1d2061ef109d81a41380b9340044602e.dirtree new file mode 100644 index 00000000000..bbdf16e0374 Binary files /dev/null and b/repo/objects/8f/de5f00f616df72fd24efda0183543b1d2061ef109d81a41380b9340044602e.dirtree differ diff --git a/repo/objects/8f/e5c8b239eaf0e396f2ee423874cc77d3b378ea4d2b0792e498a60b8eb85350.filez b/repo/objects/8f/e5c8b239eaf0e396f2ee423874cc77d3b378ea4d2b0792e498a60b8eb85350.filez new file mode 100644 index 00000000000..ed7c392d5fa Binary files /dev/null and b/repo/objects/8f/e5c8b239eaf0e396f2ee423874cc77d3b378ea4d2b0792e498a60b8eb85350.filez differ diff --git a/repo/objects/90/08ec240d69ef026724316853d9d3aa86993109d3a6b7ae64306a294aba58dc.filez b/repo/objects/90/08ec240d69ef026724316853d9d3aa86993109d3a6b7ae64306a294aba58dc.filez new file mode 100644 index 00000000000..2e776bbd832 Binary files /dev/null and b/repo/objects/90/08ec240d69ef026724316853d9d3aa86993109d3a6b7ae64306a294aba58dc.filez differ diff --git a/repo/objects/90/27098d93af440238e71dad5b0be80a6ce822fd6368bd4a63c775e64ee43da7.filez b/repo/objects/90/27098d93af440238e71dad5b0be80a6ce822fd6368bd4a63c775e64ee43da7.filez new file mode 100644 index 00000000000..91a0e2b15aa Binary files /dev/null and b/repo/objects/90/27098d93af440238e71dad5b0be80a6ce822fd6368bd4a63c775e64ee43da7.filez differ diff --git a/repo/objects/90/32d873ba0a2875d295bc0cfb4b3e7f74357fb03c59d1cd8649f58ab7cc808d.dirtree b/repo/objects/90/32d873ba0a2875d295bc0cfb4b3e7f74357fb03c59d1cd8649f58ab7cc808d.dirtree new file mode 100644 index 00000000000..1ece1d10dd3 Binary files /dev/null and b/repo/objects/90/32d873ba0a2875d295bc0cfb4b3e7f74357fb03c59d1cd8649f58ab7cc808d.dirtree differ diff --git a/repo/objects/90/406661aeef5e320c1f4c8efb896376b9736fafb679daa625025677f8740ce2.filez b/repo/objects/90/406661aeef5e320c1f4c8efb896376b9736fafb679daa625025677f8740ce2.filez new file mode 100644 index 00000000000..1e8b04b96b2 Binary files /dev/null and b/repo/objects/90/406661aeef5e320c1f4c8efb896376b9736fafb679daa625025677f8740ce2.filez differ diff --git a/repo/objects/90/43ab4c3d87c82a99c4076ca9591a5402d6497dd32eb06b81372c01d928200a.filez b/repo/objects/90/43ab4c3d87c82a99c4076ca9591a5402d6497dd32eb06b81372c01d928200a.filez new file mode 100644 index 00000000000..dc2a849bf13 Binary files /dev/null and b/repo/objects/90/43ab4c3d87c82a99c4076ca9591a5402d6497dd32eb06b81372c01d928200a.filez differ diff --git a/repo/objects/90/49180a615a05ee460f30a7d982f99e113b418c36e7094e393020e754cd118d.dirtree b/repo/objects/90/49180a615a05ee460f30a7d982f99e113b418c36e7094e393020e754cd118d.dirtree new file mode 100644 index 00000000000..adcf952b263 Binary files /dev/null and b/repo/objects/90/49180a615a05ee460f30a7d982f99e113b418c36e7094e393020e754cd118d.dirtree differ diff --git a/repo/objects/90/5f85d256d61fa1d53d53abbf8ceec88ebf2d14dba04f73513b7ff5476d1926.filez b/repo/objects/90/5f85d256d61fa1d53d53abbf8ceec88ebf2d14dba04f73513b7ff5476d1926.filez new file mode 100644 index 00000000000..00ba555589c Binary files /dev/null and b/repo/objects/90/5f85d256d61fa1d53d53abbf8ceec88ebf2d14dba04f73513b7ff5476d1926.filez differ diff --git a/repo/objects/90/6230fd6465dc6b2c98e4e53db0a543b20c35fc6fa6a5af071e606870f082c5.filez b/repo/objects/90/6230fd6465dc6b2c98e4e53db0a543b20c35fc6fa6a5af071e606870f082c5.filez new file mode 100644 index 00000000000..ffebfabeb09 Binary files /dev/null and b/repo/objects/90/6230fd6465dc6b2c98e4e53db0a543b20c35fc6fa6a5af071e606870f082c5.filez differ diff --git a/repo/objects/90/8a47633c524af04e8ddf2c3374035f5b7cf91c936d2ec0fbeb6af9abc76ca3.filez b/repo/objects/90/8a47633c524af04e8ddf2c3374035f5b7cf91c936d2ec0fbeb6af9abc76ca3.filez new file mode 100644 index 00000000000..1c699faacf6 Binary files /dev/null and b/repo/objects/90/8a47633c524af04e8ddf2c3374035f5b7cf91c936d2ec0fbeb6af9abc76ca3.filez differ diff --git a/repo/objects/90/b1039cfab042b23ef46e060fffb1842a92e737e6aa7b6a4679ab7d7cf3d21e.filez b/repo/objects/90/b1039cfab042b23ef46e060fffb1842a92e737e6aa7b6a4679ab7d7cf3d21e.filez new file mode 100644 index 00000000000..582e86fabcf Binary files /dev/null and b/repo/objects/90/b1039cfab042b23ef46e060fffb1842a92e737e6aa7b6a4679ab7d7cf3d21e.filez differ diff --git a/repo/objects/90/b8c9e177bb5d613fb0d5a52ec11f5df96d3bdb1a4ddf06579217f20f33d3d7.filez b/repo/objects/90/b8c9e177bb5d613fb0d5a52ec11f5df96d3bdb1a4ddf06579217f20f33d3d7.filez new file mode 100644 index 00000000000..be41f32d8e9 Binary files /dev/null and b/repo/objects/90/b8c9e177bb5d613fb0d5a52ec11f5df96d3bdb1a4ddf06579217f20f33d3d7.filez differ diff --git a/repo/objects/90/b906d199bfcb11a0719f295d36ea14698a12a64372ad7211474748cd8ceb09.filez b/repo/objects/90/b906d199bfcb11a0719f295d36ea14698a12a64372ad7211474748cd8ceb09.filez new file mode 100644 index 00000000000..1f444941750 Binary files /dev/null and b/repo/objects/90/b906d199bfcb11a0719f295d36ea14698a12a64372ad7211474748cd8ceb09.filez differ diff --git a/repo/objects/90/f01a1eb27782029f12371125d2de88c3349bf88bcd5c59a16db58af08cfdc3.filez b/repo/objects/90/f01a1eb27782029f12371125d2de88c3349bf88bcd5c59a16db58af08cfdc3.filez new file mode 100644 index 00000000000..d0426ef5e76 Binary files /dev/null and b/repo/objects/90/f01a1eb27782029f12371125d2de88c3349bf88bcd5c59a16db58af08cfdc3.filez differ diff --git a/repo/objects/90/f9f7a33d47919dc8ad357e28599a9dee49e1102203ce323ef85c1726ed100f.filez b/repo/objects/90/f9f7a33d47919dc8ad357e28599a9dee49e1102203ce323ef85c1726ed100f.filez new file mode 100644 index 00000000000..9aaed6eb6d8 Binary files /dev/null and b/repo/objects/90/f9f7a33d47919dc8ad357e28599a9dee49e1102203ce323ef85c1726ed100f.filez differ diff --git a/repo/objects/91/231a725b05d58cf0873c241204c853ad4aa583a8c3d95848055e9d67a883a0.filez b/repo/objects/91/231a725b05d58cf0873c241204c853ad4aa583a8c3d95848055e9d67a883a0.filez new file mode 100644 index 00000000000..359dbee0751 Binary files /dev/null and b/repo/objects/91/231a725b05d58cf0873c241204c853ad4aa583a8c3d95848055e9d67a883a0.filez differ diff --git a/repo/objects/91/2fe2dbe2f6fb7705037edbc98a3e6a730f439a9eccb2638bfb0bfa8727f4a6.filez b/repo/objects/91/2fe2dbe2f6fb7705037edbc98a3e6a730f439a9eccb2638bfb0bfa8727f4a6.filez new file mode 100644 index 00000000000..168f8bc6a22 Binary files /dev/null and b/repo/objects/91/2fe2dbe2f6fb7705037edbc98a3e6a730f439a9eccb2638bfb0bfa8727f4a6.filez differ diff --git a/repo/objects/91/3223f6dc6cb7ca4daee47938381b1bcda18b8dd74f56614ee9fef5f9287851.filez b/repo/objects/91/3223f6dc6cb7ca4daee47938381b1bcda18b8dd74f56614ee9fef5f9287851.filez new file mode 100644 index 00000000000..73c304285c9 Binary files /dev/null and b/repo/objects/91/3223f6dc6cb7ca4daee47938381b1bcda18b8dd74f56614ee9fef5f9287851.filez differ diff --git a/repo/objects/91/7e698030047a4d339699f33310cf52dd096cbb7ae73d3bc1bcc411fae0bb64.filez b/repo/objects/91/7e698030047a4d339699f33310cf52dd096cbb7ae73d3bc1bcc411fae0bb64.filez new file mode 100644 index 00000000000..a83c81306a4 Binary files /dev/null and b/repo/objects/91/7e698030047a4d339699f33310cf52dd096cbb7ae73d3bc1bcc411fae0bb64.filez differ diff --git a/repo/objects/91/c8902dd4f60ff0ba30d8708d47274b4fc73af0aa1cc9f106af16a1d7cdbf51.filez b/repo/objects/91/c8902dd4f60ff0ba30d8708d47274b4fc73af0aa1cc9f106af16a1d7cdbf51.filez new file mode 100644 index 00000000000..b499fe591f1 Binary files /dev/null and b/repo/objects/91/c8902dd4f60ff0ba30d8708d47274b4fc73af0aa1cc9f106af16a1d7cdbf51.filez differ diff --git a/repo/objects/91/e0400737c13b35f2bf7c2173910e9bfd9e7b7b9530574a67e4a87fdde459a4.filez b/repo/objects/91/e0400737c13b35f2bf7c2173910e9bfd9e7b7b9530574a67e4a87fdde459a4.filez new file mode 100644 index 00000000000..8e2c9f911c6 Binary files /dev/null and b/repo/objects/91/e0400737c13b35f2bf7c2173910e9bfd9e7b7b9530574a67e4a87fdde459a4.filez differ diff --git a/repo/objects/91/ed232605ae9378b03f63d0eae55d3b90170e38e140734eefc39312f03c68e4.filez b/repo/objects/91/ed232605ae9378b03f63d0eae55d3b90170e38e140734eefc39312f03c68e4.filez new file mode 100644 index 00000000000..4afaedb115e Binary files /dev/null and b/repo/objects/91/ed232605ae9378b03f63d0eae55d3b90170e38e140734eefc39312f03c68e4.filez differ diff --git a/repo/objects/92/072bbb07a4bb1c8c065eabef5e8bce6655bcbe339f02e1ea9c1fc5a7efbfca.filez b/repo/objects/92/072bbb07a4bb1c8c065eabef5e8bce6655bcbe339f02e1ea9c1fc5a7efbfca.filez new file mode 100644 index 00000000000..bf6e2b537d6 Binary files /dev/null and b/repo/objects/92/072bbb07a4bb1c8c065eabef5e8bce6655bcbe339f02e1ea9c1fc5a7efbfca.filez differ diff --git a/repo/objects/92/1460dd245c16e69cd2790e919283110b82c503c52f2772605d25adf91d0635.filez b/repo/objects/92/1460dd245c16e69cd2790e919283110b82c503c52f2772605d25adf91d0635.filez new file mode 100644 index 00000000000..8300528f294 Binary files /dev/null and b/repo/objects/92/1460dd245c16e69cd2790e919283110b82c503c52f2772605d25adf91d0635.filez differ diff --git a/repo/objects/92/1ee51e3448138c00fd3a95329ab4daf6eccc48738392b449661bcd26e01f2d.filez b/repo/objects/92/1ee51e3448138c00fd3a95329ab4daf6eccc48738392b449661bcd26e01f2d.filez new file mode 100644 index 00000000000..d83531139fe Binary files /dev/null and b/repo/objects/92/1ee51e3448138c00fd3a95329ab4daf6eccc48738392b449661bcd26e01f2d.filez differ diff --git a/repo/objects/92/2ed3ec8bc963ac947ccba143c5b4ab9d814ba9b9bfa5b2e46114242c2da8f5.filez b/repo/objects/92/2ed3ec8bc963ac947ccba143c5b4ab9d814ba9b9bfa5b2e46114242c2da8f5.filez new file mode 100644 index 00000000000..a2e8291c9db Binary files /dev/null and b/repo/objects/92/2ed3ec8bc963ac947ccba143c5b4ab9d814ba9b9bfa5b2e46114242c2da8f5.filez differ diff --git a/repo/objects/92/33aaf6bf96e3526f276fde8ead653354d7028b441547f343a896d0a6a71c3a.filez b/repo/objects/92/33aaf6bf96e3526f276fde8ead653354d7028b441547f343a896d0a6a71c3a.filez new file mode 100644 index 00000000000..543f04f7634 Binary files /dev/null and b/repo/objects/92/33aaf6bf96e3526f276fde8ead653354d7028b441547f343a896d0a6a71c3a.filez differ diff --git a/repo/objects/92/357e982c2491dc8fdbe59ed8b1aef8fc00d295d9c61f05eb190a2389646c6d.filez b/repo/objects/92/357e982c2491dc8fdbe59ed8b1aef8fc00d295d9c61f05eb190a2389646c6d.filez new file mode 100644 index 00000000000..21fcfd7585e Binary files /dev/null and b/repo/objects/92/357e982c2491dc8fdbe59ed8b1aef8fc00d295d9c61f05eb190a2389646c6d.filez differ diff --git a/repo/objects/92/49260d261212092a39d47da98600ccb255b9dd93c4ee9a08b8ca8f9ce3f375.filez b/repo/objects/92/49260d261212092a39d47da98600ccb255b9dd93c4ee9a08b8ca8f9ce3f375.filez new file mode 100644 index 00000000000..7e28fd42818 Binary files /dev/null and b/repo/objects/92/49260d261212092a39d47da98600ccb255b9dd93c4ee9a08b8ca8f9ce3f375.filez differ diff --git a/repo/objects/92/6e6d7ccda025c3b0369ba511f36dac20f27af6c2c7f641ffc6a953b753aa56.filez b/repo/objects/92/6e6d7ccda025c3b0369ba511f36dac20f27af6c2c7f641ffc6a953b753aa56.filez new file mode 100644 index 00000000000..cc3c13743ee Binary files /dev/null and b/repo/objects/92/6e6d7ccda025c3b0369ba511f36dac20f27af6c2c7f641ffc6a953b753aa56.filez differ diff --git a/repo/objects/92/99771e590d434b212151d6b10ecc596c8055a9a7625aadc19a153f6bbe06e6.dirtree b/repo/objects/92/99771e590d434b212151d6b10ecc596c8055a9a7625aadc19a153f6bbe06e6.dirtree new file mode 100644 index 00000000000..fb095062949 Binary files /dev/null and b/repo/objects/92/99771e590d434b212151d6b10ecc596c8055a9a7625aadc19a153f6bbe06e6.dirtree differ diff --git a/repo/objects/93/143e754a75b640f2fb542daeb2e559fc8c070cfa721a7eef596f71271a21c3.dirtree b/repo/objects/93/143e754a75b640f2fb542daeb2e559fc8c070cfa721a7eef596f71271a21c3.dirtree new file mode 100644 index 00000000000..95bb3843d27 Binary files /dev/null and b/repo/objects/93/143e754a75b640f2fb542daeb2e559fc8c070cfa721a7eef596f71271a21c3.dirtree differ diff --git a/repo/objects/93/14d3c3258dac800df6d81bc22c7ecc9f3d877d5dad061b2d3e1e7a070a0cdf.filez b/repo/objects/93/14d3c3258dac800df6d81bc22c7ecc9f3d877d5dad061b2d3e1e7a070a0cdf.filez new file mode 100644 index 00000000000..36cf305f177 Binary files /dev/null and b/repo/objects/93/14d3c3258dac800df6d81bc22c7ecc9f3d877d5dad061b2d3e1e7a070a0cdf.filez differ diff --git a/repo/objects/93/6f0ae9480a1af0da86bd4642bf4d0ec996aeba4312cfdd8dce48c653c483a3.filez b/repo/objects/93/6f0ae9480a1af0da86bd4642bf4d0ec996aeba4312cfdd8dce48c653c483a3.filez new file mode 100644 index 00000000000..ac87eb08c56 Binary files /dev/null and b/repo/objects/93/6f0ae9480a1af0da86bd4642bf4d0ec996aeba4312cfdd8dce48c653c483a3.filez differ diff --git a/repo/objects/93/823d3890ce8559f311700914360507127c18e32cf7fa32b3a81d256f4a5dbe.dirtree b/repo/objects/93/823d3890ce8559f311700914360507127c18e32cf7fa32b3a81d256f4a5dbe.dirtree new file mode 100644 index 00000000000..dc75bbe0195 Binary files /dev/null and b/repo/objects/93/823d3890ce8559f311700914360507127c18e32cf7fa32b3a81d256f4a5dbe.dirtree differ diff --git a/repo/objects/93/826803fff833ca4004864b509f436b49261d660355c0fcc6aaeb170c113cd0.dirtree b/repo/objects/93/826803fff833ca4004864b509f436b49261d660355c0fcc6aaeb170c113cd0.dirtree new file mode 100644 index 00000000000..9c56aea29a3 Binary files /dev/null and b/repo/objects/93/826803fff833ca4004864b509f436b49261d660355c0fcc6aaeb170c113cd0.dirtree differ diff --git a/repo/objects/93/93df703f0b0ca4afc4c62f663ad14806928c2c675840c1b1cb478a094ac0e3.filez b/repo/objects/93/93df703f0b0ca4afc4c62f663ad14806928c2c675840c1b1cb478a094ac0e3.filez new file mode 100644 index 00000000000..53eec8d4280 Binary files /dev/null and b/repo/objects/93/93df703f0b0ca4afc4c62f663ad14806928c2c675840c1b1cb478a094ac0e3.filez differ diff --git a/repo/objects/93/979e76b488378656ec38728192fdcf30436d10a0613950587d7d800059551c.filez b/repo/objects/93/979e76b488378656ec38728192fdcf30436d10a0613950587d7d800059551c.filez new file mode 100644 index 00000000000..9ce4d9fd781 Binary files /dev/null and b/repo/objects/93/979e76b488378656ec38728192fdcf30436d10a0613950587d7d800059551c.filez differ diff --git a/repo/objects/93/988bb9c0032169bd75bdc9bff88738cc5d4f7350a22946a0dbe6d117b5ab90.filez b/repo/objects/93/988bb9c0032169bd75bdc9bff88738cc5d4f7350a22946a0dbe6d117b5ab90.filez new file mode 100644 index 00000000000..139be69a119 Binary files /dev/null and b/repo/objects/93/988bb9c0032169bd75bdc9bff88738cc5d4f7350a22946a0dbe6d117b5ab90.filez differ diff --git a/repo/objects/93/9c55686a2f9e4e0176feb82a9725e7ea9ec6d46546db2c54a85c1f9e981bda.filez b/repo/objects/93/9c55686a2f9e4e0176feb82a9725e7ea9ec6d46546db2c54a85c1f9e981bda.filez new file mode 100644 index 00000000000..e5d59c8f937 Binary files /dev/null and b/repo/objects/93/9c55686a2f9e4e0176feb82a9725e7ea9ec6d46546db2c54a85c1f9e981bda.filez differ diff --git a/repo/objects/93/ad1f1cd746bcdeb76e3d6d8b6b5741d5c04bbd282f17dc32971e4c34a294ed.filez b/repo/objects/93/ad1f1cd746bcdeb76e3d6d8b6b5741d5c04bbd282f17dc32971e4c34a294ed.filez new file mode 100644 index 00000000000..fa947128430 Binary files /dev/null and b/repo/objects/93/ad1f1cd746bcdeb76e3d6d8b6b5741d5c04bbd282f17dc32971e4c34a294ed.filez differ diff --git a/repo/objects/93/dbe24d16838d764533b30f94add308f11408c18d7612acf4866497b4f6ade1.filez b/repo/objects/93/dbe24d16838d764533b30f94add308f11408c18d7612acf4866497b4f6ade1.filez new file mode 100644 index 00000000000..76b9e7e68e1 Binary files /dev/null and b/repo/objects/93/dbe24d16838d764533b30f94add308f11408c18d7612acf4866497b4f6ade1.filez differ diff --git a/repo/objects/93/e2cefd9015a57c1f44a27cf091fd823ebb72979044fcd7270ab8c14e87f8df.filez b/repo/objects/93/e2cefd9015a57c1f44a27cf091fd823ebb72979044fcd7270ab8c14e87f8df.filez new file mode 100644 index 00000000000..82937f4cd32 Binary files /dev/null and b/repo/objects/93/e2cefd9015a57c1f44a27cf091fd823ebb72979044fcd7270ab8c14e87f8df.filez differ diff --git a/repo/objects/93/ff3dd13032216a9f3021435c854d128f22d458883a549bd48fc676516202bd.filez b/repo/objects/93/ff3dd13032216a9f3021435c854d128f22d458883a549bd48fc676516202bd.filez new file mode 100644 index 00000000000..6c16d9dfd8f Binary files /dev/null and b/repo/objects/93/ff3dd13032216a9f3021435c854d128f22d458883a549bd48fc676516202bd.filez differ diff --git a/repo/objects/94/328ddbab1a44d686d6fbd5856be841ed1783e9044401db627d57f1d6de7cae.dirtree b/repo/objects/94/328ddbab1a44d686d6fbd5856be841ed1783e9044401db627d57f1d6de7cae.dirtree new file mode 100644 index 00000000000..76b2d2088ae Binary files /dev/null and b/repo/objects/94/328ddbab1a44d686d6fbd5856be841ed1783e9044401db627d57f1d6de7cae.dirtree differ diff --git a/repo/objects/94/41d79fac76192d100b55785668243fad2dd49be81c427d40aa7c484a6b50f5.filez b/repo/objects/94/41d79fac76192d100b55785668243fad2dd49be81c427d40aa7c484a6b50f5.filez new file mode 100644 index 00000000000..ef5049d368a Binary files /dev/null and b/repo/objects/94/41d79fac76192d100b55785668243fad2dd49be81c427d40aa7c484a6b50f5.filez differ diff --git a/repo/objects/94/4bb5407bcd908d0fe618bf5c2b813e481398b3520d9c042109a615c6a0e9e5.filez b/repo/objects/94/4bb5407bcd908d0fe618bf5c2b813e481398b3520d9c042109a615c6a0e9e5.filez new file mode 100644 index 00000000000..53a2753d313 Binary files /dev/null and b/repo/objects/94/4bb5407bcd908d0fe618bf5c2b813e481398b3520d9c042109a615c6a0e9e5.filez differ diff --git a/repo/objects/94/8d3d49cc1e4ac986d9e7a32b05dcf5d33dcc4e4861aef6f3739122ed14d2ae.filez b/repo/objects/94/8d3d49cc1e4ac986d9e7a32b05dcf5d33dcc4e4861aef6f3739122ed14d2ae.filez new file mode 100644 index 00000000000..4a73f162dc6 Binary files /dev/null and b/repo/objects/94/8d3d49cc1e4ac986d9e7a32b05dcf5d33dcc4e4861aef6f3739122ed14d2ae.filez differ diff --git a/repo/objects/94/ab3a3f554221718ce0345999da9cfa1ac356721a3a31fe83d533a62d895c11.filez b/repo/objects/94/ab3a3f554221718ce0345999da9cfa1ac356721a3a31fe83d533a62d895c11.filez new file mode 100644 index 00000000000..c6f49be52d0 Binary files /dev/null and b/repo/objects/94/ab3a3f554221718ce0345999da9cfa1ac356721a3a31fe83d533a62d895c11.filez differ diff --git a/repo/objects/94/dbafddaa34a4715d767989e60e5823834b1f2ec12c455ec329ebd024f73858.filez b/repo/objects/94/dbafddaa34a4715d767989e60e5823834b1f2ec12c455ec329ebd024f73858.filez new file mode 100644 index 00000000000..cc5577e7716 Binary files /dev/null and b/repo/objects/94/dbafddaa34a4715d767989e60e5823834b1f2ec12c455ec329ebd024f73858.filez differ diff --git a/repo/objects/94/f1beea6309f7c586aea21608365f4578528131d21f7bfb3805455c46bda295.filez b/repo/objects/94/f1beea6309f7c586aea21608365f4578528131d21f7bfb3805455c46bda295.filez new file mode 100644 index 00000000000..aeb7e9c4fd3 Binary files /dev/null and b/repo/objects/94/f1beea6309f7c586aea21608365f4578528131d21f7bfb3805455c46bda295.filez differ diff --git a/repo/objects/94/fbd7130777a36fd497b5f9b2c4232f4589c7e191ff330b7791127dd8c55d9a.dirtree b/repo/objects/94/fbd7130777a36fd497b5f9b2c4232f4589c7e191ff330b7791127dd8c55d9a.dirtree new file mode 100644 index 00000000000..fa8f94b9ed8 Binary files /dev/null and b/repo/objects/94/fbd7130777a36fd497b5f9b2c4232f4589c7e191ff330b7791127dd8c55d9a.dirtree differ diff --git a/repo/objects/95/01044a28700cfeb686c51d14e8188d8eb44d88f2b2a93aa41574557d93fd0a.filez b/repo/objects/95/01044a28700cfeb686c51d14e8188d8eb44d88f2b2a93aa41574557d93fd0a.filez new file mode 100644 index 00000000000..177c8b84ac7 Binary files /dev/null and b/repo/objects/95/01044a28700cfeb686c51d14e8188d8eb44d88f2b2a93aa41574557d93fd0a.filez differ diff --git a/repo/objects/95/025a2a6cfad0bbde13d9005437435f054da1f4fb70f9ee8c0fdabbc48117e0.dirtree b/repo/objects/95/025a2a6cfad0bbde13d9005437435f054da1f4fb70f9ee8c0fdabbc48117e0.dirtree new file mode 100644 index 00000000000..a507c94bdf6 Binary files /dev/null and b/repo/objects/95/025a2a6cfad0bbde13d9005437435f054da1f4fb70f9ee8c0fdabbc48117e0.dirtree differ diff --git a/repo/objects/95/61a6fc5ecbf348cb43ba4db629894be5ba799e22e2f43ed408ee114570d6dc.dirtree b/repo/objects/95/61a6fc5ecbf348cb43ba4db629894be5ba799e22e2f43ed408ee114570d6dc.dirtree new file mode 100644 index 00000000000..9713a4fb1b0 Binary files /dev/null and b/repo/objects/95/61a6fc5ecbf348cb43ba4db629894be5ba799e22e2f43ed408ee114570d6dc.dirtree differ diff --git a/repo/objects/95/9a21e12712807891f52905a5f7897cc46721c5f029b4731e13f602748aef99.filez b/repo/objects/95/9a21e12712807891f52905a5f7897cc46721c5f029b4731e13f602748aef99.filez new file mode 100644 index 00000000000..5633c4ab4f8 Binary files /dev/null and b/repo/objects/95/9a21e12712807891f52905a5f7897cc46721c5f029b4731e13f602748aef99.filez differ diff --git a/repo/objects/95/c6f703bc0c9c02dc8d61e7d03b5b06f3f2ad1f69528c1dc580dfe1d1452914.filez b/repo/objects/95/c6f703bc0c9c02dc8d61e7d03b5b06f3f2ad1f69528c1dc580dfe1d1452914.filez new file mode 100644 index 00000000000..2ae75e1a1a3 Binary files /dev/null and b/repo/objects/95/c6f703bc0c9c02dc8d61e7d03b5b06f3f2ad1f69528c1dc580dfe1d1452914.filez differ diff --git a/repo/objects/95/da2fe624e54b4ce9de50d843a71da39df350c9eec92f31cb43757e942982a2.filez b/repo/objects/95/da2fe624e54b4ce9de50d843a71da39df350c9eec92f31cb43757e942982a2.filez new file mode 100644 index 00000000000..74d0dce281e Binary files /dev/null and b/repo/objects/95/da2fe624e54b4ce9de50d843a71da39df350c9eec92f31cb43757e942982a2.filez differ diff --git a/repo/objects/95/db12dd21805a3c316c6bbaaee3a53fc16faf93d694eea309cdb8546f445258.filez b/repo/objects/95/db12dd21805a3c316c6bbaaee3a53fc16faf93d694eea309cdb8546f445258.filez new file mode 100644 index 00000000000..bd91193d22d Binary files /dev/null and b/repo/objects/95/db12dd21805a3c316c6bbaaee3a53fc16faf93d694eea309cdb8546f445258.filez differ diff --git a/repo/objects/95/e0b66f6f7121c4e84383a27890b3b3c733b14620f7b3893bba734fa37fe573.filez b/repo/objects/95/e0b66f6f7121c4e84383a27890b3b3c733b14620f7b3893bba734fa37fe573.filez new file mode 100644 index 00000000000..24de236790b Binary files /dev/null and b/repo/objects/95/e0b66f6f7121c4e84383a27890b3b3c733b14620f7b3893bba734fa37fe573.filez differ diff --git a/repo/objects/96/1516a60e457b7e14439beea26528f9b366bfbced8dfb1c6f3262abebe88a55.filez b/repo/objects/96/1516a60e457b7e14439beea26528f9b366bfbced8dfb1c6f3262abebe88a55.filez new file mode 100644 index 00000000000..32f7d717426 Binary files /dev/null and b/repo/objects/96/1516a60e457b7e14439beea26528f9b366bfbced8dfb1c6f3262abebe88a55.filez differ diff --git a/repo/objects/96/6dfbbdd024ea2591f64588829d02ddf5392941d7a3bf3410e93ae6c8d546bb.dirtree b/repo/objects/96/6dfbbdd024ea2591f64588829d02ddf5392941d7a3bf3410e93ae6c8d546bb.dirtree new file mode 100644 index 00000000000..91f128a78bb Binary files /dev/null and b/repo/objects/96/6dfbbdd024ea2591f64588829d02ddf5392941d7a3bf3410e93ae6c8d546bb.dirtree differ diff --git a/repo/objects/96/7d59594830eafc65aee9af18ba0faf1e91b171d50d9e1bef54c6af1d8a8b0a.dirtree b/repo/objects/96/7d59594830eafc65aee9af18ba0faf1e91b171d50d9e1bef54c6af1d8a8b0a.dirtree new file mode 100644 index 00000000000..56310fc94fb Binary files /dev/null and b/repo/objects/96/7d59594830eafc65aee9af18ba0faf1e91b171d50d9e1bef54c6af1d8a8b0a.dirtree differ diff --git a/repo/objects/96/83add10c4c3ba4e6e8c9166e4e4d7bae3ed32d6c82c70c5fb6badeb3783f1f.filez b/repo/objects/96/83add10c4c3ba4e6e8c9166e4e4d7bae3ed32d6c82c70c5fb6badeb3783f1f.filez new file mode 100644 index 00000000000..66202e75f1c Binary files /dev/null and b/repo/objects/96/83add10c4c3ba4e6e8c9166e4e4d7bae3ed32d6c82c70c5fb6badeb3783f1f.filez differ diff --git a/repo/objects/96/914345b1016477dd169f27c4ae2b183138f023a63d4275bd7bec8327c70ec9.filez b/repo/objects/96/914345b1016477dd169f27c4ae2b183138f023a63d4275bd7bec8327c70ec9.filez new file mode 100644 index 00000000000..c09d562da70 Binary files /dev/null and b/repo/objects/96/914345b1016477dd169f27c4ae2b183138f023a63d4275bd7bec8327c70ec9.filez differ diff --git a/repo/objects/96/c27ee0b6320d307aaeb28d5438308de3d74cfb131f13126e588fcb565fda37.filez b/repo/objects/96/c27ee0b6320d307aaeb28d5438308de3d74cfb131f13126e588fcb565fda37.filez new file mode 100644 index 00000000000..6684e7833bd Binary files /dev/null and b/repo/objects/96/c27ee0b6320d307aaeb28d5438308de3d74cfb131f13126e588fcb565fda37.filez differ diff --git a/repo/objects/96/f07293343a79cb32562b7fead6e330c84cf77607805b2aa7178d6ef8ea06a8.filez b/repo/objects/96/f07293343a79cb32562b7fead6e330c84cf77607805b2aa7178d6ef8ea06a8.filez new file mode 100644 index 00000000000..a375675de1b Binary files /dev/null and b/repo/objects/96/f07293343a79cb32562b7fead6e330c84cf77607805b2aa7178d6ef8ea06a8.filez differ diff --git a/repo/objects/97/04a55b60dd7213d07e4bdc236ddfc66dc14a0a02df801494e22237a1339bf6.filez b/repo/objects/97/04a55b60dd7213d07e4bdc236ddfc66dc14a0a02df801494e22237a1339bf6.filez new file mode 100644 index 00000000000..c3815e5501b Binary files /dev/null and b/repo/objects/97/04a55b60dd7213d07e4bdc236ddfc66dc14a0a02df801494e22237a1339bf6.filez differ diff --git a/repo/objects/97/187771a422134de917967b64223cedc044f03ec5ae3fa47f2bd324c96a7a3d.filez b/repo/objects/97/187771a422134de917967b64223cedc044f03ec5ae3fa47f2bd324c96a7a3d.filez new file mode 100644 index 00000000000..b8d38c82d61 Binary files /dev/null and b/repo/objects/97/187771a422134de917967b64223cedc044f03ec5ae3fa47f2bd324c96a7a3d.filez differ diff --git a/repo/objects/97/20b7352015090507f30e1bbde57564eb732b4c5c992f59bc5405c8d4af54bb.filez b/repo/objects/97/20b7352015090507f30e1bbde57564eb732b4c5c992f59bc5405c8d4af54bb.filez new file mode 100644 index 00000000000..f1e1cdfe7cb Binary files /dev/null and b/repo/objects/97/20b7352015090507f30e1bbde57564eb732b4c5c992f59bc5405c8d4af54bb.filez differ diff --git a/repo/objects/97/3ee1490c762207ea26258799a70a17f11bdb54cbe90c3133a4b8c020a004a8.filez b/repo/objects/97/3ee1490c762207ea26258799a70a17f11bdb54cbe90c3133a4b8c020a004a8.filez new file mode 100644 index 00000000000..d624d6ab132 Binary files /dev/null and b/repo/objects/97/3ee1490c762207ea26258799a70a17f11bdb54cbe90c3133a4b8c020a004a8.filez differ diff --git a/repo/objects/97/3f1dc013c3a632849b91c421698fa44694c1e4895022ee6db58d3ea00fc045.dirtree b/repo/objects/97/3f1dc013c3a632849b91c421698fa44694c1e4895022ee6db58d3ea00fc045.dirtree new file mode 100644 index 00000000000..c82739484ca Binary files /dev/null and b/repo/objects/97/3f1dc013c3a632849b91c421698fa44694c1e4895022ee6db58d3ea00fc045.dirtree differ diff --git a/repo/objects/97/3fd24dabc3ff125bb97808562e8ae8cdfee2528ada1cf8223c2a78785741df.filez b/repo/objects/97/3fd24dabc3ff125bb97808562e8ae8cdfee2528ada1cf8223c2a78785741df.filez new file mode 100644 index 00000000000..de4a8f4ce9c Binary files /dev/null and b/repo/objects/97/3fd24dabc3ff125bb97808562e8ae8cdfee2528ada1cf8223c2a78785741df.filez differ diff --git a/repo/objects/97/5ccf140f3198e11cc86878ed1ab33b43e823c32d258821ac029cd9d83db997.dirtree b/repo/objects/97/5ccf140f3198e11cc86878ed1ab33b43e823c32d258821ac029cd9d83db997.dirtree new file mode 100644 index 00000000000..d8b41e5a231 Binary files /dev/null and b/repo/objects/97/5ccf140f3198e11cc86878ed1ab33b43e823c32d258821ac029cd9d83db997.dirtree differ diff --git a/repo/objects/97/93f38684f32aae9297b6685c799b1abe8a98e4f62492c276a32afe86268b8b.filez b/repo/objects/97/93f38684f32aae9297b6685c799b1abe8a98e4f62492c276a32afe86268b8b.filez new file mode 100644 index 00000000000..5165761a950 Binary files /dev/null and b/repo/objects/97/93f38684f32aae9297b6685c799b1abe8a98e4f62492c276a32afe86268b8b.filez differ diff --git a/repo/objects/97/a4569ddb51e7dc2fcb0fe4c2fd6cf40116c5cdf3c1ed60c74eeb9a228dc4da.dirtree b/repo/objects/97/a4569ddb51e7dc2fcb0fe4c2fd6cf40116c5cdf3c1ed60c74eeb9a228dc4da.dirtree new file mode 100644 index 00000000000..3fdd3a3aa11 Binary files /dev/null and b/repo/objects/97/a4569ddb51e7dc2fcb0fe4c2fd6cf40116c5cdf3c1ed60c74eeb9a228dc4da.dirtree differ diff --git a/repo/objects/97/ad43a561e825c62d6773cf0359ff0835818403a2d5fd8a46bd8e12a9f0e31d.filez b/repo/objects/97/ad43a561e825c62d6773cf0359ff0835818403a2d5fd8a46bd8e12a9f0e31d.filez new file mode 100644 index 00000000000..d1b292a219c Binary files /dev/null and b/repo/objects/97/ad43a561e825c62d6773cf0359ff0835818403a2d5fd8a46bd8e12a9f0e31d.filez differ diff --git a/repo/objects/97/f35db4ab516c0cd8edff5ae531157daf4f90533aa1722fea9554442e563d25.filez b/repo/objects/97/f35db4ab516c0cd8edff5ae531157daf4f90533aa1722fea9554442e563d25.filez new file mode 100644 index 00000000000..0873af7ce73 Binary files /dev/null and b/repo/objects/97/f35db4ab516c0cd8edff5ae531157daf4f90533aa1722fea9554442e563d25.filez differ diff --git a/repo/objects/98/136813d2b4845716901762ab8c7744a48087e9d28fd59f54ce05be8ad4e15f.filez b/repo/objects/98/136813d2b4845716901762ab8c7744a48087e9d28fd59f54ce05be8ad4e15f.filez new file mode 100644 index 00000000000..629dffc03b5 Binary files /dev/null and b/repo/objects/98/136813d2b4845716901762ab8c7744a48087e9d28fd59f54ce05be8ad4e15f.filez differ diff --git a/repo/objects/98/2ad4dc1d6959ab7147eb37fd5b5a3dfbe2dd7d4d485c3165e0355aa3c0a845.filez b/repo/objects/98/2ad4dc1d6959ab7147eb37fd5b5a3dfbe2dd7d4d485c3165e0355aa3c0a845.filez new file mode 100644 index 00000000000..afe07b1821d Binary files /dev/null and b/repo/objects/98/2ad4dc1d6959ab7147eb37fd5b5a3dfbe2dd7d4d485c3165e0355aa3c0a845.filez differ diff --git a/repo/objects/98/2f008c8695ced080ddd1707185f39762c0a3ff78313c60f56f089fb4df87c9.filez b/repo/objects/98/2f008c8695ced080ddd1707185f39762c0a3ff78313c60f56f089fb4df87c9.filez new file mode 100644 index 00000000000..1c3a36bc643 Binary files /dev/null and b/repo/objects/98/2f008c8695ced080ddd1707185f39762c0a3ff78313c60f56f089fb4df87c9.filez differ diff --git a/repo/objects/98/3d9f98802f8d8d1bfd7e05a3c4826e60ac1348fb8a17933e6812f2a01f45bb.filez b/repo/objects/98/3d9f98802f8d8d1bfd7e05a3c4826e60ac1348fb8a17933e6812f2a01f45bb.filez new file mode 100644 index 00000000000..e999af18f09 Binary files /dev/null and b/repo/objects/98/3d9f98802f8d8d1bfd7e05a3c4826e60ac1348fb8a17933e6812f2a01f45bb.filez differ diff --git a/repo/objects/98/65bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406.commit b/repo/objects/98/65bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406.commit new file mode 100644 index 00000000000..32fd281bb80 Binary files /dev/null and b/repo/objects/98/65bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406.commit differ diff --git a/repo/objects/98/65bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406.commitmeta b/repo/objects/98/65bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406.commitmeta new file mode 100644 index 00000000000..20f5044510f Binary files /dev/null and b/repo/objects/98/65bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406.commitmeta differ diff --git a/repo/objects/98/69a6a4f275203dfd2fc5d57f96632ee100ede9640a79a81fcc8e31c9abdb97.filez b/repo/objects/98/69a6a4f275203dfd2fc5d57f96632ee100ede9640a79a81fcc8e31c9abdb97.filez new file mode 100644 index 00000000000..391b3211db3 Binary files /dev/null and b/repo/objects/98/69a6a4f275203dfd2fc5d57f96632ee100ede9640a79a81fcc8e31c9abdb97.filez differ diff --git a/repo/objects/98/a98e382737633bad8f37cb777108200b6c9e124b1aeb2ed1f0b5cd57d47cac.dirtree b/repo/objects/98/a98e382737633bad8f37cb777108200b6c9e124b1aeb2ed1f0b5cd57d47cac.dirtree new file mode 100644 index 00000000000..52333ea356b Binary files /dev/null and b/repo/objects/98/a98e382737633bad8f37cb777108200b6c9e124b1aeb2ed1f0b5cd57d47cac.dirtree differ diff --git a/repo/objects/98/c17382af739b750da5ccf74bf6c1a783b1244ff35693a7ab436a7a4a8bfb57.filez b/repo/objects/98/c17382af739b750da5ccf74bf6c1a783b1244ff35693a7ab436a7a4a8bfb57.filez new file mode 100644 index 00000000000..e2c6ef467f0 Binary files /dev/null and b/repo/objects/98/c17382af739b750da5ccf74bf6c1a783b1244ff35693a7ab436a7a4a8bfb57.filez differ diff --git a/repo/objects/99/69d8761f828e08e5bcb020d652cccf2b3ab0ee3a6eef62ac379bd8eeab7217.filez b/repo/objects/99/69d8761f828e08e5bcb020d652cccf2b3ab0ee3a6eef62ac379bd8eeab7217.filez new file mode 100644 index 00000000000..389a30fad2a Binary files /dev/null and b/repo/objects/99/69d8761f828e08e5bcb020d652cccf2b3ab0ee3a6eef62ac379bd8eeab7217.filez differ diff --git a/repo/objects/99/6a01d005c2e20559d20c6907f2c850ea3aad5629af42fd67211556d5cd7084.filez b/repo/objects/99/6a01d005c2e20559d20c6907f2c850ea3aad5629af42fd67211556d5cd7084.filez new file mode 100644 index 00000000000..420c41b5aa4 Binary files /dev/null and b/repo/objects/99/6a01d005c2e20559d20c6907f2c850ea3aad5629af42fd67211556d5cd7084.filez differ diff --git a/repo/objects/99/6deea8282d91797b4167e5f6ee001619fe52c2499238d547615b9c1a3f035b.filez b/repo/objects/99/6deea8282d91797b4167e5f6ee001619fe52c2499238d547615b9c1a3f035b.filez new file mode 100644 index 00000000000..f88dc3360d5 Binary files /dev/null and b/repo/objects/99/6deea8282d91797b4167e5f6ee001619fe52c2499238d547615b9c1a3f035b.filez differ diff --git a/repo/objects/99/70fceac9753f1d740f5e341ce06e48a72dca1b02a2cc850f37625a9a64f21d.filez b/repo/objects/99/70fceac9753f1d740f5e341ce06e48a72dca1b02a2cc850f37625a9a64f21d.filez new file mode 100644 index 00000000000..4de9656dc34 Binary files /dev/null and b/repo/objects/99/70fceac9753f1d740f5e341ce06e48a72dca1b02a2cc850f37625a9a64f21d.filez differ diff --git a/repo/objects/99/801de0b8e1d2c77b59637b64d8f71cf6a7f5c9cde981a60bb9bcc6f5a2c983.filez b/repo/objects/99/801de0b8e1d2c77b59637b64d8f71cf6a7f5c9cde981a60bb9bcc6f5a2c983.filez new file mode 100644 index 00000000000..94caaa2edbd Binary files /dev/null and b/repo/objects/99/801de0b8e1d2c77b59637b64d8f71cf6a7f5c9cde981a60bb9bcc6f5a2c983.filez differ diff --git a/repo/objects/99/a804d12ce2016f2f25aee5c61ac4cff440a00725a0ec54d7cfd165ea06e351.filez b/repo/objects/99/a804d12ce2016f2f25aee5c61ac4cff440a00725a0ec54d7cfd165ea06e351.filez new file mode 100644 index 00000000000..56832c88387 Binary files /dev/null and b/repo/objects/99/a804d12ce2016f2f25aee5c61ac4cff440a00725a0ec54d7cfd165ea06e351.filez differ diff --git a/repo/objects/99/c3a023615e07be866e0d214b0bc05b2a661fbf5429473cca0f427100c9a9f2.filez b/repo/objects/99/c3a023615e07be866e0d214b0bc05b2a661fbf5429473cca0f427100c9a9f2.filez new file mode 100644 index 00000000000..c18743c4c4b Binary files /dev/null and b/repo/objects/99/c3a023615e07be866e0d214b0bc05b2a661fbf5429473cca0f427100c9a9f2.filez differ diff --git a/repo/objects/99/c4b700c47fb27257f413e59966f913515ea6ca42728c848c43bf349016e0de.filez b/repo/objects/99/c4b700c47fb27257f413e59966f913515ea6ca42728c848c43bf349016e0de.filez new file mode 100644 index 00000000000..b0678ba5ecd Binary files /dev/null and b/repo/objects/99/c4b700c47fb27257f413e59966f913515ea6ca42728c848c43bf349016e0de.filez differ diff --git a/repo/objects/99/d71bc7972bc5b4360d1db806d7c3cf94405037ec719a8cc7ba0f3ac2936995.filez b/repo/objects/99/d71bc7972bc5b4360d1db806d7c3cf94405037ec719a8cc7ba0f3ac2936995.filez new file mode 100644 index 00000000000..2dff55aa7a6 Binary files /dev/null and b/repo/objects/99/d71bc7972bc5b4360d1db806d7c3cf94405037ec719a8cc7ba0f3ac2936995.filez differ diff --git a/repo/objects/99/f1fe122b62d245f73ba25370b85258a2bc62ab23f20a6bb97116f71f638581.dirtree b/repo/objects/99/f1fe122b62d245f73ba25370b85258a2bc62ab23f20a6bb97116f71f638581.dirtree new file mode 100644 index 00000000000..0f3021c5041 Binary files /dev/null and b/repo/objects/99/f1fe122b62d245f73ba25370b85258a2bc62ab23f20a6bb97116f71f638581.dirtree differ diff --git a/repo/objects/9a/247aa3566bd66620e1a9bf29dcfd97caf2e087b3a3e295c695aa025fe459f4.dirtree b/repo/objects/9a/247aa3566bd66620e1a9bf29dcfd97caf2e087b3a3e295c695aa025fe459f4.dirtree new file mode 100644 index 00000000000..22719490140 Binary files /dev/null and b/repo/objects/9a/247aa3566bd66620e1a9bf29dcfd97caf2e087b3a3e295c695aa025fe459f4.dirtree differ diff --git a/repo/objects/9a/2f2239ad66cdcfa618436c4a12b93f5e7e95879141db0046cd1d52cc662955.dirtree b/repo/objects/9a/2f2239ad66cdcfa618436c4a12b93f5e7e95879141db0046cd1d52cc662955.dirtree new file mode 100644 index 00000000000..34831998aed Binary files /dev/null and b/repo/objects/9a/2f2239ad66cdcfa618436c4a12b93f5e7e95879141db0046cd1d52cc662955.dirtree differ diff --git a/repo/objects/9a/3648ac4bf73bbcdb194b79d6cf9382aa57fb0c02a78059a72b7ee2e8d95c7c.filez b/repo/objects/9a/3648ac4bf73bbcdb194b79d6cf9382aa57fb0c02a78059a72b7ee2e8d95c7c.filez new file mode 100644 index 00000000000..d8f28e26ab0 Binary files /dev/null and b/repo/objects/9a/3648ac4bf73bbcdb194b79d6cf9382aa57fb0c02a78059a72b7ee2e8d95c7c.filez differ diff --git a/repo/objects/9a/481dc7f2fba6200a948a5cc3279327a135f669e94b963975c2b3d28e007506.dirtree b/repo/objects/9a/481dc7f2fba6200a948a5cc3279327a135f669e94b963975c2b3d28e007506.dirtree new file mode 100644 index 00000000000..c376f7ba1f1 Binary files /dev/null and b/repo/objects/9a/481dc7f2fba6200a948a5cc3279327a135f669e94b963975c2b3d28e007506.dirtree differ diff --git a/repo/objects/9a/584adf5f6e58105b51d0bd9cb3a450130eb068598ba3a6fb84d9d37ba3b774.filez b/repo/objects/9a/584adf5f6e58105b51d0bd9cb3a450130eb068598ba3a6fb84d9d37ba3b774.filez new file mode 100644 index 00000000000..cecb3abe3c3 Binary files /dev/null and b/repo/objects/9a/584adf5f6e58105b51d0bd9cb3a450130eb068598ba3a6fb84d9d37ba3b774.filez differ diff --git a/repo/objects/9a/7237bd1d2319a9f4e22c9dd2aed66ed9f73173d72155ccae0d9c28bf7f242e.filez b/repo/objects/9a/7237bd1d2319a9f4e22c9dd2aed66ed9f73173d72155ccae0d9c28bf7f242e.filez new file mode 100644 index 00000000000..5691060f268 Binary files /dev/null and b/repo/objects/9a/7237bd1d2319a9f4e22c9dd2aed66ed9f73173d72155ccae0d9c28bf7f242e.filez differ diff --git a/repo/objects/9a/8b1c1caa9e5afc16beefb029df8bd8bd86ffc9bd2e57c1dec6f91fa0d7ecb3.filez b/repo/objects/9a/8b1c1caa9e5afc16beefb029df8bd8bd86ffc9bd2e57c1dec6f91fa0d7ecb3.filez new file mode 100644 index 00000000000..5902406a009 Binary files /dev/null and b/repo/objects/9a/8b1c1caa9e5afc16beefb029df8bd8bd86ffc9bd2e57c1dec6f91fa0d7ecb3.filez differ diff --git a/repo/objects/9a/8dfc8b55cdb55cf22ebd2c271d9121d060d2875a173460efc4fb0812655623.filez b/repo/objects/9a/8dfc8b55cdb55cf22ebd2c271d9121d060d2875a173460efc4fb0812655623.filez new file mode 100644 index 00000000000..5b2115848d8 Binary files /dev/null and b/repo/objects/9a/8dfc8b55cdb55cf22ebd2c271d9121d060d2875a173460efc4fb0812655623.filez differ diff --git a/repo/objects/9a/a8dbb17afa55bae1944957073113429ab04a4134a6652fa5c89af7363576fb.filez b/repo/objects/9a/a8dbb17afa55bae1944957073113429ab04a4134a6652fa5c89af7363576fb.filez new file mode 100644 index 00000000000..326c9f695e9 Binary files /dev/null and b/repo/objects/9a/a8dbb17afa55bae1944957073113429ab04a4134a6652fa5c89af7363576fb.filez differ diff --git a/repo/objects/9a/cc35f51634112b4c9135dbcf386675d0b47d6226eb3a2378c81aa63718448b.dirtree b/repo/objects/9a/cc35f51634112b4c9135dbcf386675d0b47d6226eb3a2378c81aa63718448b.dirtree new file mode 100644 index 00000000000..417831752f6 Binary files /dev/null and b/repo/objects/9a/cc35f51634112b4c9135dbcf386675d0b47d6226eb3a2378c81aa63718448b.dirtree differ diff --git a/repo/objects/9a/e9963b0b4dd408ca7da03f9422e788391320be4aa20ac943f1891b57be8beb.dirtree b/repo/objects/9a/e9963b0b4dd408ca7da03f9422e788391320be4aa20ac943f1891b57be8beb.dirtree new file mode 100644 index 00000000000..61bb0838a83 Binary files /dev/null and b/repo/objects/9a/e9963b0b4dd408ca7da03f9422e788391320be4aa20ac943f1891b57be8beb.dirtree differ diff --git a/repo/objects/9a/f5d8b54b1a97764dea612d57951139fd889609e28f02095cd80f7a65f2ada7.filez b/repo/objects/9a/f5d8b54b1a97764dea612d57951139fd889609e28f02095cd80f7a65f2ada7.filez new file mode 100644 index 00000000000..d418b294728 Binary files /dev/null and b/repo/objects/9a/f5d8b54b1a97764dea612d57951139fd889609e28f02095cd80f7a65f2ada7.filez differ diff --git a/repo/objects/9b/1cf493b85f1a8aab6ea0a4c5093207ad4da84932525371443e3c19242084fe.dirtree b/repo/objects/9b/1cf493b85f1a8aab6ea0a4c5093207ad4da84932525371443e3c19242084fe.dirtree new file mode 100644 index 00000000000..9df523e071d Binary files /dev/null and b/repo/objects/9b/1cf493b85f1a8aab6ea0a4c5093207ad4da84932525371443e3c19242084fe.dirtree differ diff --git a/repo/objects/9b/390d6dc763db772906525315bf4daa2ad393897619cda01dbe5288ac1a3f36.filez b/repo/objects/9b/390d6dc763db772906525315bf4daa2ad393897619cda01dbe5288ac1a3f36.filez new file mode 100644 index 00000000000..79d9c99bf3c Binary files /dev/null and b/repo/objects/9b/390d6dc763db772906525315bf4daa2ad393897619cda01dbe5288ac1a3f36.filez differ diff --git a/repo/objects/9b/57d248b7ed2cb781cd6db75739f7c79d6ea9354e05e0497eda570ccc3cb0fe.filez b/repo/objects/9b/57d248b7ed2cb781cd6db75739f7c79d6ea9354e05e0497eda570ccc3cb0fe.filez new file mode 100644 index 00000000000..644c3b41963 Binary files /dev/null and b/repo/objects/9b/57d248b7ed2cb781cd6db75739f7c79d6ea9354e05e0497eda570ccc3cb0fe.filez differ diff --git a/repo/objects/9b/6a5b54167789fdbd76b84eaf846cb1d89cf689b578738e650add25387af34b.filez b/repo/objects/9b/6a5b54167789fdbd76b84eaf846cb1d89cf689b578738e650add25387af34b.filez new file mode 100644 index 00000000000..ef80633692a Binary files /dev/null and b/repo/objects/9b/6a5b54167789fdbd76b84eaf846cb1d89cf689b578738e650add25387af34b.filez differ diff --git a/repo/objects/9b/98229b76618ab04c76d0860b96b984d984cf606d90138e1efe254bf87e9fdd.filez b/repo/objects/9b/98229b76618ab04c76d0860b96b984d984cf606d90138e1efe254bf87e9fdd.filez new file mode 100644 index 00000000000..d39bbfffc61 Binary files /dev/null and b/repo/objects/9b/98229b76618ab04c76d0860b96b984d984cf606d90138e1efe254bf87e9fdd.filez differ diff --git a/repo/objects/9b/bf4dec558c8091adc8a004785f145a90481267a1d0dde548e798909eed15ab.filez b/repo/objects/9b/bf4dec558c8091adc8a004785f145a90481267a1d0dde548e798909eed15ab.filez new file mode 100644 index 00000000000..c3048c87de7 Binary files /dev/null and b/repo/objects/9b/bf4dec558c8091adc8a004785f145a90481267a1d0dde548e798909eed15ab.filez differ diff --git a/repo/objects/9c/148e08a07f24d0c1f48c7272356b219917ac713705163302f5fe80ff076011.dirtree b/repo/objects/9c/148e08a07f24d0c1f48c7272356b219917ac713705163302f5fe80ff076011.dirtree new file mode 100644 index 00000000000..b38d56491fc Binary files /dev/null and b/repo/objects/9c/148e08a07f24d0c1f48c7272356b219917ac713705163302f5fe80ff076011.dirtree differ diff --git a/repo/objects/9c/39e03fc8f07c94bd869546a544004698a647a80ed2d8c3fd8a1b94edc4e9e4.filez b/repo/objects/9c/39e03fc8f07c94bd869546a544004698a647a80ed2d8c3fd8a1b94edc4e9e4.filez new file mode 100644 index 00000000000..7f0b8d46a33 Binary files /dev/null and b/repo/objects/9c/39e03fc8f07c94bd869546a544004698a647a80ed2d8c3fd8a1b94edc4e9e4.filez differ diff --git a/repo/objects/9c/45b3af0ab1ab0c7bf80ac27b33a1263f45b2ac119eb13e01c02a0b40145c7d.filez b/repo/objects/9c/45b3af0ab1ab0c7bf80ac27b33a1263f45b2ac119eb13e01c02a0b40145c7d.filez new file mode 100644 index 00000000000..c7eb53522bd Binary files /dev/null and b/repo/objects/9c/45b3af0ab1ab0c7bf80ac27b33a1263f45b2ac119eb13e01c02a0b40145c7d.filez differ diff --git a/repo/objects/9c/494191056e75043c0c2b253a1a397b0388d3b96b908c9a78632a92619c119a.filez b/repo/objects/9c/494191056e75043c0c2b253a1a397b0388d3b96b908c9a78632a92619c119a.filez new file mode 100644 index 00000000000..6fbacb38906 Binary files /dev/null and b/repo/objects/9c/494191056e75043c0c2b253a1a397b0388d3b96b908c9a78632a92619c119a.filez differ diff --git a/repo/objects/9c/4baf1099cb0c4b4e89009312c99cd89fb945c9b9a46007806469a9b9505fb6.filez b/repo/objects/9c/4baf1099cb0c4b4e89009312c99cd89fb945c9b9a46007806469a9b9505fb6.filez new file mode 100644 index 00000000000..eb185e11313 Binary files /dev/null and b/repo/objects/9c/4baf1099cb0c4b4e89009312c99cd89fb945c9b9a46007806469a9b9505fb6.filez differ diff --git a/repo/objects/9c/5b898b5e7a22db613e853b0586b6a0fca3cbab8c9c0cab66b82daa73b6b519.filez b/repo/objects/9c/5b898b5e7a22db613e853b0586b6a0fca3cbab8c9c0cab66b82daa73b6b519.filez new file mode 100644 index 00000000000..c8dd19c62ae Binary files /dev/null and b/repo/objects/9c/5b898b5e7a22db613e853b0586b6a0fca3cbab8c9c0cab66b82daa73b6b519.filez differ diff --git a/repo/objects/9c/67868cc2e29256502eb586da45e0691f29a15ceb79f0d1c5a3cf56bf122374.filez b/repo/objects/9c/67868cc2e29256502eb586da45e0691f29a15ceb79f0d1c5a3cf56bf122374.filez new file mode 100644 index 00000000000..af3cd167ef1 Binary files /dev/null and b/repo/objects/9c/67868cc2e29256502eb586da45e0691f29a15ceb79f0d1c5a3cf56bf122374.filez differ diff --git a/repo/objects/9c/8895958582b9fa5d40f44a86e988c2562f6936a700ac6fc2ecdc0ffbfbd075.filez b/repo/objects/9c/8895958582b9fa5d40f44a86e988c2562f6936a700ac6fc2ecdc0ffbfbd075.filez new file mode 100644 index 00000000000..1f93b9076b9 Binary files /dev/null and b/repo/objects/9c/8895958582b9fa5d40f44a86e988c2562f6936a700ac6fc2ecdc0ffbfbd075.filez differ diff --git a/repo/objects/9c/8cde611bed6e0ce1b7bb8a8b1c566c2e00b9f0f8b0bdb39f83d33e907fb755.filez b/repo/objects/9c/8cde611bed6e0ce1b7bb8a8b1c566c2e00b9f0f8b0bdb39f83d33e907fb755.filez new file mode 100644 index 00000000000..3205d399cea Binary files /dev/null and b/repo/objects/9c/8cde611bed6e0ce1b7bb8a8b1c566c2e00b9f0f8b0bdb39f83d33e907fb755.filez differ diff --git a/repo/objects/9c/d923dd33b403c2959d17250916d9caabf563d4581dd24ddb0d69feb112213e.filez b/repo/objects/9c/d923dd33b403c2959d17250916d9caabf563d4581dd24ddb0d69feb112213e.filez new file mode 100644 index 00000000000..5dfdc54e2d2 Binary files /dev/null and b/repo/objects/9c/d923dd33b403c2959d17250916d9caabf563d4581dd24ddb0d69feb112213e.filez differ diff --git a/repo/objects/9d/08acaec7ba761f66da2e992e825b7be1e842c09cf9e376f2adf4af600f4374.filez b/repo/objects/9d/08acaec7ba761f66da2e992e825b7be1e842c09cf9e376f2adf4af600f4374.filez new file mode 100644 index 00000000000..327d8ec71f1 Binary files /dev/null and b/repo/objects/9d/08acaec7ba761f66da2e992e825b7be1e842c09cf9e376f2adf4af600f4374.filez differ diff --git a/repo/objects/9d/0a0817917f871398cdc36a7f1c261dbe409ab422de44fe61793caec93a177e.filez b/repo/objects/9d/0a0817917f871398cdc36a7f1c261dbe409ab422de44fe61793caec93a177e.filez new file mode 100644 index 00000000000..e2a6d6f0c50 Binary files /dev/null and b/repo/objects/9d/0a0817917f871398cdc36a7f1c261dbe409ab422de44fe61793caec93a177e.filez differ diff --git a/repo/objects/9d/113a9e8a7beb6b9db8fd5411a664e735898f7fada2b13654a228b22605edad.filez b/repo/objects/9d/113a9e8a7beb6b9db8fd5411a664e735898f7fada2b13654a228b22605edad.filez new file mode 100644 index 00000000000..74283a97fc9 Binary files /dev/null and b/repo/objects/9d/113a9e8a7beb6b9db8fd5411a664e735898f7fada2b13654a228b22605edad.filez differ diff --git a/repo/objects/9d/32503a5ceeee5bcd5df97913ba8dc68c3e40b6cde9e01a0685af356b8a9393.filez b/repo/objects/9d/32503a5ceeee5bcd5df97913ba8dc68c3e40b6cde9e01a0685af356b8a9393.filez new file mode 100644 index 00000000000..046ff4c0f1c Binary files /dev/null and b/repo/objects/9d/32503a5ceeee5bcd5df97913ba8dc68c3e40b6cde9e01a0685af356b8a9393.filez differ diff --git a/repo/objects/9d/383cd948b89062667588b627a82c7636da9935e9c651e5eaaee0a300ca5235.dirtree b/repo/objects/9d/383cd948b89062667588b627a82c7636da9935e9c651e5eaaee0a300ca5235.dirtree new file mode 100644 index 00000000000..6793fb0ab1f Binary files /dev/null and b/repo/objects/9d/383cd948b89062667588b627a82c7636da9935e9c651e5eaaee0a300ca5235.dirtree differ diff --git a/repo/objects/9d/4cb310cd66d910d04366bb2b769085cb7490fb156b85f2d1b5e7405fb075ce.filez b/repo/objects/9d/4cb310cd66d910d04366bb2b769085cb7490fb156b85f2d1b5e7405fb075ce.filez new file mode 100644 index 00000000000..f94e949b7d3 Binary files /dev/null and b/repo/objects/9d/4cb310cd66d910d04366bb2b769085cb7490fb156b85f2d1b5e7405fb075ce.filez differ diff --git a/repo/objects/9d/9db14bbd65116a61a86de5e0e02b3fdfcc8298a0c845afe7cddf45f0c340c6.filez b/repo/objects/9d/9db14bbd65116a61a86de5e0e02b3fdfcc8298a0c845afe7cddf45f0c340c6.filez new file mode 100644 index 00000000000..a8ca3f7ee24 Binary files /dev/null and b/repo/objects/9d/9db14bbd65116a61a86de5e0e02b3fdfcc8298a0c845afe7cddf45f0c340c6.filez differ diff --git a/repo/objects/9d/c3964171e758af758009a2702228678e7d03b0681790ab2d974a6fd9909299.filez b/repo/objects/9d/c3964171e758af758009a2702228678e7d03b0681790ab2d974a6fd9909299.filez new file mode 100644 index 00000000000..c000bc9acfc Binary files /dev/null and b/repo/objects/9d/c3964171e758af758009a2702228678e7d03b0681790ab2d974a6fd9909299.filez differ diff --git a/repo/objects/9d/d9fa7fa37705a06dc4dbb097b02c5f66e8b023b1e54545cecc38b0d4757614.dirtree b/repo/objects/9d/d9fa7fa37705a06dc4dbb097b02c5f66e8b023b1e54545cecc38b0d4757614.dirtree new file mode 100644 index 00000000000..6007d5d5c6d Binary files /dev/null and b/repo/objects/9d/d9fa7fa37705a06dc4dbb097b02c5f66e8b023b1e54545cecc38b0d4757614.dirtree differ diff --git a/repo/objects/9d/f257b5ff9b64ec3cdfc20c54d8daaa5a18652227c2698449482c15ed5a9aec.dirtree b/repo/objects/9d/f257b5ff9b64ec3cdfc20c54d8daaa5a18652227c2698449482c15ed5a9aec.dirtree new file mode 100644 index 00000000000..a5200f6a335 Binary files /dev/null and b/repo/objects/9d/f257b5ff9b64ec3cdfc20c54d8daaa5a18652227c2698449482c15ed5a9aec.dirtree differ diff --git a/repo/objects/9d/f5885679c1c3255d2e93a9e31461c449dfe0e67d770ec6622058c29ff91960.filez b/repo/objects/9d/f5885679c1c3255d2e93a9e31461c449dfe0e67d770ec6622058c29ff91960.filez new file mode 100644 index 00000000000..4e65c16f557 Binary files /dev/null and b/repo/objects/9d/f5885679c1c3255d2e93a9e31461c449dfe0e67d770ec6622058c29ff91960.filez differ diff --git a/repo/objects/9e/283b6a785ea835a2e1307d2e2d446531dd31e5d9badca51813bede15b34722.filez b/repo/objects/9e/283b6a785ea835a2e1307d2e2d446531dd31e5d9badca51813bede15b34722.filez new file mode 100644 index 00000000000..f4ee67f5886 Binary files /dev/null and b/repo/objects/9e/283b6a785ea835a2e1307d2e2d446531dd31e5d9badca51813bede15b34722.filez differ diff --git a/repo/objects/9e/4168505232169ea8611157646fe21976cdca8476785272245e2a2a38b719ba.filez b/repo/objects/9e/4168505232169ea8611157646fe21976cdca8476785272245e2a2a38b719ba.filez new file mode 100644 index 00000000000..47a88e1132a Binary files /dev/null and b/repo/objects/9e/4168505232169ea8611157646fe21976cdca8476785272245e2a2a38b719ba.filez differ diff --git a/repo/objects/9e/4cf71d3c453802470d06cf1de651d7488df5b3a20aa090636f9b44fdd7dcd7.filez b/repo/objects/9e/4cf71d3c453802470d06cf1de651d7488df5b3a20aa090636f9b44fdd7dcd7.filez new file mode 100644 index 00000000000..56181892699 Binary files /dev/null and b/repo/objects/9e/4cf71d3c453802470d06cf1de651d7488df5b3a20aa090636f9b44fdd7dcd7.filez differ diff --git a/repo/objects/9e/6b2e074595aef34eae80b0defbcc83dcc18cfc7e889bab9ed25e995ec1d87c.filez b/repo/objects/9e/6b2e074595aef34eae80b0defbcc83dcc18cfc7e889bab9ed25e995ec1d87c.filez new file mode 100644 index 00000000000..ed3610d5258 Binary files /dev/null and b/repo/objects/9e/6b2e074595aef34eae80b0defbcc83dcc18cfc7e889bab9ed25e995ec1d87c.filez differ diff --git a/repo/objects/9e/6c6dfe6656d7a9d69dc4290bb89c6070e943c6fdd9285acd88ede544314927.dirtree b/repo/objects/9e/6c6dfe6656d7a9d69dc4290bb89c6070e943c6fdd9285acd88ede544314927.dirtree new file mode 100644 index 00000000000..88ddca67662 Binary files /dev/null and b/repo/objects/9e/6c6dfe6656d7a9d69dc4290bb89c6070e943c6fdd9285acd88ede544314927.dirtree differ diff --git a/repo/objects/9e/99b3a8e10a6309720ebd0fb8299f5c3a348926448577c191a2ed7e3ef48f71.filez b/repo/objects/9e/99b3a8e10a6309720ebd0fb8299f5c3a348926448577c191a2ed7e3ef48f71.filez new file mode 100644 index 00000000000..ad13aa7e4f5 Binary files /dev/null and b/repo/objects/9e/99b3a8e10a6309720ebd0fb8299f5c3a348926448577c191a2ed7e3ef48f71.filez differ diff --git a/repo/objects/9e/c0d546606907586e8156f51d929af9d9f13dbd35a1f4fcf7ffd34a9d8ade1b.filez b/repo/objects/9e/c0d546606907586e8156f51d929af9d9f13dbd35a1f4fcf7ffd34a9d8ade1b.filez new file mode 100644 index 00000000000..5516dcb2672 Binary files /dev/null and b/repo/objects/9e/c0d546606907586e8156f51d929af9d9f13dbd35a1f4fcf7ffd34a9d8ade1b.filez differ diff --git a/repo/objects/9e/c92847fa35e6d614049e5d49dad6752eb2724155d9ff1acb365fa5b4682383.filez b/repo/objects/9e/c92847fa35e6d614049e5d49dad6752eb2724155d9ff1acb365fa5b4682383.filez new file mode 100644 index 00000000000..fc5539c3885 Binary files /dev/null and b/repo/objects/9e/c92847fa35e6d614049e5d49dad6752eb2724155d9ff1acb365fa5b4682383.filez differ diff --git a/repo/objects/9e/fff34ed0aa567a8d21116073ba1cc7ccf12f0d9c6efb00b97f8941699c3b7e.filez b/repo/objects/9e/fff34ed0aa567a8d21116073ba1cc7ccf12f0d9c6efb00b97f8941699c3b7e.filez new file mode 100644 index 00000000000..48b0ffb647a Binary files /dev/null and b/repo/objects/9e/fff34ed0aa567a8d21116073ba1cc7ccf12f0d9c6efb00b97f8941699c3b7e.filez differ diff --git a/repo/objects/9f/237eab86edd1be35ee1498e556d41469ba6ce163947c57afd4f178c809b1c2.filez b/repo/objects/9f/237eab86edd1be35ee1498e556d41469ba6ce163947c57afd4f178c809b1c2.filez new file mode 100644 index 00000000000..660542cf248 Binary files /dev/null and b/repo/objects/9f/237eab86edd1be35ee1498e556d41469ba6ce163947c57afd4f178c809b1c2.filez differ diff --git a/repo/objects/9f/2e36985915abe061928f758f12ee8e5f7a5f97dd0a4d37d5fa3f0e8c6c95a2.dirtree b/repo/objects/9f/2e36985915abe061928f758f12ee8e5f7a5f97dd0a4d37d5fa3f0e8c6c95a2.dirtree new file mode 100644 index 00000000000..8afff2ec986 Binary files /dev/null and b/repo/objects/9f/2e36985915abe061928f758f12ee8e5f7a5f97dd0a4d37d5fa3f0e8c6c95a2.dirtree differ diff --git a/repo/objects/9f/3a33aef6e5260e54f0272869cdcd5a9c00ba136e53736496958609b990c9ff.dirtree b/repo/objects/9f/3a33aef6e5260e54f0272869cdcd5a9c00ba136e53736496958609b990c9ff.dirtree new file mode 100644 index 00000000000..bac2bc1e5b0 Binary files /dev/null and b/repo/objects/9f/3a33aef6e5260e54f0272869cdcd5a9c00ba136e53736496958609b990c9ff.dirtree differ diff --git a/repo/objects/9f/54239950733c4bc06b979e55e1f9f7e3943918061c24ce88a5d0465fbfb97b.filez b/repo/objects/9f/54239950733c4bc06b979e55e1f9f7e3943918061c24ce88a5d0465fbfb97b.filez new file mode 100644 index 00000000000..c5072ee6830 Binary files /dev/null and b/repo/objects/9f/54239950733c4bc06b979e55e1f9f7e3943918061c24ce88a5d0465fbfb97b.filez differ diff --git a/repo/objects/9f/5d92925acdb13d0e1531c52bb4bc01391c4f83f29ec17587b351a35bb99b2f.filez b/repo/objects/9f/5d92925acdb13d0e1531c52bb4bc01391c4f83f29ec17587b351a35bb99b2f.filez new file mode 100644 index 00000000000..3b1cfa87bb8 Binary files /dev/null and b/repo/objects/9f/5d92925acdb13d0e1531c52bb4bc01391c4f83f29ec17587b351a35bb99b2f.filez differ diff --git a/repo/objects/9f/68979f9b4941f774942cd9a5369f465599d59b9eed255261d00e9107d74b4e.dirtree b/repo/objects/9f/68979f9b4941f774942cd9a5369f465599d59b9eed255261d00e9107d74b4e.dirtree new file mode 100644 index 00000000000..13685ed2766 Binary files /dev/null and b/repo/objects/9f/68979f9b4941f774942cd9a5369f465599d59b9eed255261d00e9107d74b4e.dirtree differ diff --git a/repo/objects/9f/901c624af773371f00e490526608b2b7543f901a9f3162390c5893987328a3.filez b/repo/objects/9f/901c624af773371f00e490526608b2b7543f901a9f3162390c5893987328a3.filez new file mode 100644 index 00000000000..072eeaea055 Binary files /dev/null and b/repo/objects/9f/901c624af773371f00e490526608b2b7543f901a9f3162390c5893987328a3.filez differ diff --git a/repo/objects/9f/9b02b1d5dec07a13b50d4b9361b9c9aecb9fc540fe62af604ad3001968c125.filez b/repo/objects/9f/9b02b1d5dec07a13b50d4b9361b9c9aecb9fc540fe62af604ad3001968c125.filez new file mode 100644 index 00000000000..215b43c25a0 Binary files /dev/null and b/repo/objects/9f/9b02b1d5dec07a13b50d4b9361b9c9aecb9fc540fe62af604ad3001968c125.filez differ diff --git a/repo/objects/9f/c8907c5d7009c811aadd3c079fcf9c45f5c5b150e5f26a7e69f11473993cec.filez b/repo/objects/9f/c8907c5d7009c811aadd3c079fcf9c45f5c5b150e5f26a7e69f11473993cec.filez new file mode 100644 index 00000000000..4ab92cbcf26 Binary files /dev/null and b/repo/objects/9f/c8907c5d7009c811aadd3c079fcf9c45f5c5b150e5f26a7e69f11473993cec.filez differ diff --git a/repo/objects/9f/db7c5422f8ec0f721da0bc85ae6748379db65193cf295c1feb0e5cb8851a87.filez b/repo/objects/9f/db7c5422f8ec0f721da0bc85ae6748379db65193cf295c1feb0e5cb8851a87.filez new file mode 100644 index 00000000000..b725bcc1712 Binary files /dev/null and b/repo/objects/9f/db7c5422f8ec0f721da0bc85ae6748379db65193cf295c1feb0e5cb8851a87.filez differ diff --git a/repo/objects/9f/ea2421a6e74980b6a92698319e46b88ec76e84fb6650b39d868c80b3737179.filez b/repo/objects/9f/ea2421a6e74980b6a92698319e46b88ec76e84fb6650b39d868c80b3737179.filez new file mode 100644 index 00000000000..bde3a0adf57 Binary files /dev/null and b/repo/objects/9f/ea2421a6e74980b6a92698319e46b88ec76e84fb6650b39d868c80b3737179.filez differ diff --git a/repo/objects/a0/0a106a93d20357886fc9a3bae767107cb2090a120131d005a8ae9c86f18461.filez b/repo/objects/a0/0a106a93d20357886fc9a3bae767107cb2090a120131d005a8ae9c86f18461.filez new file mode 100644 index 00000000000..a9459ef6658 Binary files /dev/null and b/repo/objects/a0/0a106a93d20357886fc9a3bae767107cb2090a120131d005a8ae9c86f18461.filez differ diff --git a/repo/objects/a0/195f9d09c8b6fc698189f52ce26409fe9079251c84a93d5a927799b2ae9a16.filez b/repo/objects/a0/195f9d09c8b6fc698189f52ce26409fe9079251c84a93d5a927799b2ae9a16.filez new file mode 100644 index 00000000000..f7228562018 Binary files /dev/null and b/repo/objects/a0/195f9d09c8b6fc698189f52ce26409fe9079251c84a93d5a927799b2ae9a16.filez differ diff --git a/repo/objects/a0/38370b938362dde068c70898d31ba018257d434667ee599a4848d9fdcca672.filez b/repo/objects/a0/38370b938362dde068c70898d31ba018257d434667ee599a4848d9fdcca672.filez new file mode 100644 index 00000000000..e0a017616fe Binary files /dev/null and b/repo/objects/a0/38370b938362dde068c70898d31ba018257d434667ee599a4848d9fdcca672.filez differ diff --git a/repo/objects/a0/49c74271276503c328ccc69ee5e501bffe15404443d8c45e79a5c8788f1cde.filez b/repo/objects/a0/49c74271276503c328ccc69ee5e501bffe15404443d8c45e79a5c8788f1cde.filez new file mode 100644 index 00000000000..d7fc933f698 Binary files /dev/null and b/repo/objects/a0/49c74271276503c328ccc69ee5e501bffe15404443d8c45e79a5c8788f1cde.filez differ diff --git a/repo/objects/a0/64416ba5cccde54474337d61d7789f6b15d6c3245474045cff459cb49a0351.filez b/repo/objects/a0/64416ba5cccde54474337d61d7789f6b15d6c3245474045cff459cb49a0351.filez new file mode 100644 index 00000000000..50cc61ced16 Binary files /dev/null and b/repo/objects/a0/64416ba5cccde54474337d61d7789f6b15d6c3245474045cff459cb49a0351.filez differ diff --git a/repo/objects/a0/6aeaab46c714051b7f355c06bc8dbfa0936adafe8f09e471648a40afa79728.filez b/repo/objects/a0/6aeaab46c714051b7f355c06bc8dbfa0936adafe8f09e471648a40afa79728.filez new file mode 100644 index 00000000000..e938e552cc2 Binary files /dev/null and b/repo/objects/a0/6aeaab46c714051b7f355c06bc8dbfa0936adafe8f09e471648a40afa79728.filez differ diff --git a/repo/objects/a0/70ff56c11de22e7b1471d308e93e70f6c4ac374753f87221948ae4f56b0932.dirtree b/repo/objects/a0/70ff56c11de22e7b1471d308e93e70f6c4ac374753f87221948ae4f56b0932.dirtree new file mode 100644 index 00000000000..6bef794be9b Binary files /dev/null and b/repo/objects/a0/70ff56c11de22e7b1471d308e93e70f6c4ac374753f87221948ae4f56b0932.dirtree differ diff --git a/repo/objects/a0/744ac1af8d4024d8b15434c6e7d4b743714a483cbd5be0dd3131de10bd64db.dirtree b/repo/objects/a0/744ac1af8d4024d8b15434c6e7d4b743714a483cbd5be0dd3131de10bd64db.dirtree new file mode 100644 index 00000000000..3906ee13062 Binary files /dev/null and b/repo/objects/a0/744ac1af8d4024d8b15434c6e7d4b743714a483cbd5be0dd3131de10bd64db.dirtree differ diff --git a/repo/objects/a0/8fae4214fbc5323076e99ad14586a9d6c3fea75f040076af25b4b531cde39e.dirtree b/repo/objects/a0/8fae4214fbc5323076e99ad14586a9d6c3fea75f040076af25b4b531cde39e.dirtree new file mode 100644 index 00000000000..4e68a1fbbae Binary files /dev/null and b/repo/objects/a0/8fae4214fbc5323076e99ad14586a9d6c3fea75f040076af25b4b531cde39e.dirtree differ diff --git a/repo/objects/a0/e73ee0af2c9b74585ebc7a1a0182b6806bb7a7912706500b108897fc0afa37.dirtree b/repo/objects/a0/e73ee0af2c9b74585ebc7a1a0182b6806bb7a7912706500b108897fc0afa37.dirtree new file mode 100644 index 00000000000..2102a4cb598 Binary files /dev/null and b/repo/objects/a0/e73ee0af2c9b74585ebc7a1a0182b6806bb7a7912706500b108897fc0afa37.dirtree differ diff --git a/repo/objects/a0/eec4331714f9201e1363b9611e96be5576db594ae8770d6afbb5ba4c8a9669.filez b/repo/objects/a0/eec4331714f9201e1363b9611e96be5576db594ae8770d6afbb5ba4c8a9669.filez new file mode 100644 index 00000000000..7083012c863 Binary files /dev/null and b/repo/objects/a0/eec4331714f9201e1363b9611e96be5576db594ae8770d6afbb5ba4c8a9669.filez differ diff --git a/repo/objects/a0/f02c8228d3ed6f02bc82e390a56f9242f850aa42a884ab60ecba7f9c3e3996.dirtree b/repo/objects/a0/f02c8228d3ed6f02bc82e390a56f9242f850aa42a884ab60ecba7f9c3e3996.dirtree new file mode 100644 index 00000000000..d54ac529927 Binary files /dev/null and b/repo/objects/a0/f02c8228d3ed6f02bc82e390a56f9242f850aa42a884ab60ecba7f9c3e3996.dirtree differ diff --git a/repo/objects/a1/2a7107b372f917ce6934ccdb672cb5a881a35c896c6e1df87cedc0967b0679.filez b/repo/objects/a1/2a7107b372f917ce6934ccdb672cb5a881a35c896c6e1df87cedc0967b0679.filez new file mode 100644 index 00000000000..b92205c98d4 Binary files /dev/null and b/repo/objects/a1/2a7107b372f917ce6934ccdb672cb5a881a35c896c6e1df87cedc0967b0679.filez differ diff --git a/repo/objects/a1/701eaed0d6a4a751d86125b8dd9d45d49e3f171a1851a61836006a4e1b4e61.filez b/repo/objects/a1/701eaed0d6a4a751d86125b8dd9d45d49e3f171a1851a61836006a4e1b4e61.filez new file mode 100644 index 00000000000..b1a5e52f771 Binary files /dev/null and b/repo/objects/a1/701eaed0d6a4a751d86125b8dd9d45d49e3f171a1851a61836006a4e1b4e61.filez differ diff --git a/repo/objects/a1/7948b888ffbb25549b37996c466c902c1f9d51383a1d9b7d5d081f13f2fcc4.filez b/repo/objects/a1/7948b888ffbb25549b37996c466c902c1f9d51383a1d9b7d5d081f13f2fcc4.filez new file mode 100644 index 00000000000..7885f3e60de Binary files /dev/null and b/repo/objects/a1/7948b888ffbb25549b37996c466c902c1f9d51383a1d9b7d5d081f13f2fcc4.filez differ diff --git a/repo/objects/a1/830c0b8d9cf5f136961e57dd07200712e7ed1874cb3816edc706b5e3d82973.filez b/repo/objects/a1/830c0b8d9cf5f136961e57dd07200712e7ed1874cb3816edc706b5e3d82973.filez new file mode 100644 index 00000000000..c81ba6db994 Binary files /dev/null and b/repo/objects/a1/830c0b8d9cf5f136961e57dd07200712e7ed1874cb3816edc706b5e3d82973.filez differ diff --git a/repo/objects/a1/dad6c9c22025c352a625337c6e8d2be3ddefffbbe0e1b34250ee397fea5c6c.filez b/repo/objects/a1/dad6c9c22025c352a625337c6e8d2be3ddefffbbe0e1b34250ee397fea5c6c.filez new file mode 100644 index 00000000000..93a5aa603e5 Binary files /dev/null and b/repo/objects/a1/dad6c9c22025c352a625337c6e8d2be3ddefffbbe0e1b34250ee397fea5c6c.filez differ diff --git a/repo/objects/a1/e3f7c486cf51b891790813360dceef8aa3f66b2b177c486ec90112a893b4cf.filez b/repo/objects/a1/e3f7c486cf51b891790813360dceef8aa3f66b2b177c486ec90112a893b4cf.filez new file mode 100644 index 00000000000..5cd6eaf7f69 Binary files /dev/null and b/repo/objects/a1/e3f7c486cf51b891790813360dceef8aa3f66b2b177c486ec90112a893b4cf.filez differ diff --git a/repo/objects/a1/f20afd2351ffc75bcc927998f8561a3f67f41363859264b810c7f42124122a.filez b/repo/objects/a1/f20afd2351ffc75bcc927998f8561a3f67f41363859264b810c7f42124122a.filez new file mode 100644 index 00000000000..e23ab58b883 Binary files /dev/null and b/repo/objects/a1/f20afd2351ffc75bcc927998f8561a3f67f41363859264b810c7f42124122a.filez differ diff --git a/repo/objects/a1/fc7f8a5b0099658b5a67602e500754515bbf490ca4e1579598b4509d1bd2b7.filez b/repo/objects/a1/fc7f8a5b0099658b5a67602e500754515bbf490ca4e1579598b4509d1bd2b7.filez new file mode 100644 index 00000000000..caf73e9a551 Binary files /dev/null and b/repo/objects/a1/fc7f8a5b0099658b5a67602e500754515bbf490ca4e1579598b4509d1bd2b7.filez differ diff --git a/repo/objects/a2/2008047738ad8477e4c0ddcbce8d3fbc836c9b72d0c33ef9abcb8f75548733.filez b/repo/objects/a2/2008047738ad8477e4c0ddcbce8d3fbc836c9b72d0c33ef9abcb8f75548733.filez new file mode 100644 index 00000000000..675b47fa102 Binary files /dev/null and b/repo/objects/a2/2008047738ad8477e4c0ddcbce8d3fbc836c9b72d0c33ef9abcb8f75548733.filez differ diff --git a/repo/objects/a2/346c7f8c9f40f8dafa3ede590f573dbe8422004edfaffa9b65d5b35d7e5540.filez b/repo/objects/a2/346c7f8c9f40f8dafa3ede590f573dbe8422004edfaffa9b65d5b35d7e5540.filez new file mode 100644 index 00000000000..8d645502e17 Binary files /dev/null and b/repo/objects/a2/346c7f8c9f40f8dafa3ede590f573dbe8422004edfaffa9b65d5b35d7e5540.filez differ diff --git a/repo/objects/a2/72f65409786608490d1df1c623f59113b45f5ffb92f20194e04075347c3add.filez b/repo/objects/a2/72f65409786608490d1df1c623f59113b45f5ffb92f20194e04075347c3add.filez new file mode 100644 index 00000000000..cf55eea8177 Binary files /dev/null and b/repo/objects/a2/72f65409786608490d1df1c623f59113b45f5ffb92f20194e04075347c3add.filez differ diff --git a/repo/objects/a2/a7e5f6565925211d6595bfb798e07f414747cf7e1872959b15b40aef76b6b2.filez b/repo/objects/a2/a7e5f6565925211d6595bfb798e07f414747cf7e1872959b15b40aef76b6b2.filez new file mode 100644 index 00000000000..4e8695ae1c9 Binary files /dev/null and b/repo/objects/a2/a7e5f6565925211d6595bfb798e07f414747cf7e1872959b15b40aef76b6b2.filez differ diff --git a/repo/objects/a3/1526f534ed6c3b7bf9f459d477b2e59c6859ae1c8a6c4ae381a4ca3609cb08.dirtree b/repo/objects/a3/1526f534ed6c3b7bf9f459d477b2e59c6859ae1c8a6c4ae381a4ca3609cb08.dirtree new file mode 100644 index 00000000000..65576103380 Binary files /dev/null and b/repo/objects/a3/1526f534ed6c3b7bf9f459d477b2e59c6859ae1c8a6c4ae381a4ca3609cb08.dirtree differ diff --git a/repo/objects/a3/1d56fcffad0b2d50aad61cede774c67174b665b2264704b63ee7aafe4803ac.filez b/repo/objects/a3/1d56fcffad0b2d50aad61cede774c67174b665b2264704b63ee7aafe4803ac.filez new file mode 100644 index 00000000000..d3b6b846343 Binary files /dev/null and b/repo/objects/a3/1d56fcffad0b2d50aad61cede774c67174b665b2264704b63ee7aafe4803ac.filez differ diff --git a/repo/objects/a3/271b6384382976df3e0ddd5c8975cfa657945ec5d821ae9ff7f0a8241ed425.filez b/repo/objects/a3/271b6384382976df3e0ddd5c8975cfa657945ec5d821ae9ff7f0a8241ed425.filez new file mode 100644 index 00000000000..0ca961ba71f Binary files /dev/null and b/repo/objects/a3/271b6384382976df3e0ddd5c8975cfa657945ec5d821ae9ff7f0a8241ed425.filez differ diff --git a/repo/objects/a3/3715a604a86259e326bd9147af60a1f24b4bc7155180bace7d9f42bf2c41db.filez b/repo/objects/a3/3715a604a86259e326bd9147af60a1f24b4bc7155180bace7d9f42bf2c41db.filez new file mode 100644 index 00000000000..d190e86e05c Binary files /dev/null and b/repo/objects/a3/3715a604a86259e326bd9147af60a1f24b4bc7155180bace7d9f42bf2c41db.filez differ diff --git a/repo/objects/a3/396f4409e9d0ee2e81b4a5885e7de9273a768068216c21886313cc36f33075.filez b/repo/objects/a3/396f4409e9d0ee2e81b4a5885e7de9273a768068216c21886313cc36f33075.filez new file mode 100644 index 00000000000..2848d9e9e21 Binary files /dev/null and b/repo/objects/a3/396f4409e9d0ee2e81b4a5885e7de9273a768068216c21886313cc36f33075.filez differ diff --git a/repo/objects/a3/4c8f659c2e979ed9c59dedbdd53cabf3727947fe1223dbc222ac8038db9374.filez b/repo/objects/a3/4c8f659c2e979ed9c59dedbdd53cabf3727947fe1223dbc222ac8038db9374.filez new file mode 100644 index 00000000000..c07f3a1d849 Binary files /dev/null and b/repo/objects/a3/4c8f659c2e979ed9c59dedbdd53cabf3727947fe1223dbc222ac8038db9374.filez differ diff --git a/repo/objects/a3/6bbf84ba4f3fe2965a4a2e1cd1b37db5f4e304b17dfcd6af244e8780fc8645.dirtree b/repo/objects/a3/6bbf84ba4f3fe2965a4a2e1cd1b37db5f4e304b17dfcd6af244e8780fc8645.dirtree new file mode 100644 index 00000000000..103a4a50f76 Binary files /dev/null and b/repo/objects/a3/6bbf84ba4f3fe2965a4a2e1cd1b37db5f4e304b17dfcd6af244e8780fc8645.dirtree differ diff --git a/repo/objects/a3/74df63733cc2eec14f3e78da76f0644782062cfdfa7c45c33e2e307f73398e.filez b/repo/objects/a3/74df63733cc2eec14f3e78da76f0644782062cfdfa7c45c33e2e307f73398e.filez new file mode 100644 index 00000000000..e9a088933fc Binary files /dev/null and b/repo/objects/a3/74df63733cc2eec14f3e78da76f0644782062cfdfa7c45c33e2e307f73398e.filez differ diff --git a/repo/objects/a3/812b2073c8bff90d22467ec8685437a285e676c29b0d95fd0ee9fdd2d24ad8.dirtree b/repo/objects/a3/812b2073c8bff90d22467ec8685437a285e676c29b0d95fd0ee9fdd2d24ad8.dirtree new file mode 100644 index 00000000000..636b51b5944 Binary files /dev/null and b/repo/objects/a3/812b2073c8bff90d22467ec8685437a285e676c29b0d95fd0ee9fdd2d24ad8.dirtree differ diff --git a/repo/objects/a3/9e6df0405f92687df74863114849e5d15ba81d82f02f86d91eceba23403c54.filez b/repo/objects/a3/9e6df0405f92687df74863114849e5d15ba81d82f02f86d91eceba23403c54.filez new file mode 100644 index 00000000000..a93d9b2ba52 Binary files /dev/null and b/repo/objects/a3/9e6df0405f92687df74863114849e5d15ba81d82f02f86d91eceba23403c54.filez differ diff --git a/repo/objects/a3/a91ec38ce683fada99c5119c032bb551929d5f5d0c26455e9a705fe70fdf9d.filez b/repo/objects/a3/a91ec38ce683fada99c5119c032bb551929d5f5d0c26455e9a705fe70fdf9d.filez new file mode 100644 index 00000000000..629a424c502 Binary files /dev/null and b/repo/objects/a3/a91ec38ce683fada99c5119c032bb551929d5f5d0c26455e9a705fe70fdf9d.filez differ diff --git a/repo/objects/a3/dab2491d057dabdf28d98e8aab2243f35ef0c461427111148f0da7af671599.filez b/repo/objects/a3/dab2491d057dabdf28d98e8aab2243f35ef0c461427111148f0da7af671599.filez new file mode 100644 index 00000000000..10c085adeb9 Binary files /dev/null and b/repo/objects/a3/dab2491d057dabdf28d98e8aab2243f35ef0c461427111148f0da7af671599.filez differ diff --git a/repo/objects/a3/db0134f00403067b70b0801bc0262830c88ae2c0e05451a725998104094aee.dirtree b/repo/objects/a3/db0134f00403067b70b0801bc0262830c88ae2c0e05451a725998104094aee.dirtree new file mode 100644 index 00000000000..4541a9e04eb Binary files /dev/null and b/repo/objects/a3/db0134f00403067b70b0801bc0262830c88ae2c0e05451a725998104094aee.dirtree differ diff --git a/repo/objects/a3/f60caeb952f990bd6b7615fbecf4ea3a21af2d6700f0d34f0cf9bfb8f78a39.filez b/repo/objects/a3/f60caeb952f990bd6b7615fbecf4ea3a21af2d6700f0d34f0cf9bfb8f78a39.filez new file mode 100644 index 00000000000..5a2c0687ca0 Binary files /dev/null and b/repo/objects/a3/f60caeb952f990bd6b7615fbecf4ea3a21af2d6700f0d34f0cf9bfb8f78a39.filez differ diff --git a/repo/objects/a4/0cea31f8c8c699383ea22277f523203c92150efa63dd40f06d2d34cb5f4f38.filez b/repo/objects/a4/0cea31f8c8c699383ea22277f523203c92150efa63dd40f06d2d34cb5f4f38.filez new file mode 100644 index 00000000000..b39c3b8e1b6 Binary files /dev/null and b/repo/objects/a4/0cea31f8c8c699383ea22277f523203c92150efa63dd40f06d2d34cb5f4f38.filez differ diff --git a/repo/objects/a4/43781da51bc1284d0eb150794def5395357dc2578c7618f0010e2e0c74ab34.filez b/repo/objects/a4/43781da51bc1284d0eb150794def5395357dc2578c7618f0010e2e0c74ab34.filez new file mode 100644 index 00000000000..fc2e7afe239 Binary files /dev/null and b/repo/objects/a4/43781da51bc1284d0eb150794def5395357dc2578c7618f0010e2e0c74ab34.filez differ diff --git a/repo/objects/a4/58486a17cdc6caa5ae844b84b1f10c0c48d26122936a603b6a521f6bca640f.filez b/repo/objects/a4/58486a17cdc6caa5ae844b84b1f10c0c48d26122936a603b6a521f6bca640f.filez new file mode 100644 index 00000000000..80078712e68 Binary files /dev/null and b/repo/objects/a4/58486a17cdc6caa5ae844b84b1f10c0c48d26122936a603b6a521f6bca640f.filez differ diff --git a/repo/objects/a4/64ec2a9825c0b1d38f811b99d05c9f72bb603eaf6edf083eb00685379b61bd.dirtree b/repo/objects/a4/64ec2a9825c0b1d38f811b99d05c9f72bb603eaf6edf083eb00685379b61bd.dirtree new file mode 100644 index 00000000000..7434f4ca62a Binary files /dev/null and b/repo/objects/a4/64ec2a9825c0b1d38f811b99d05c9f72bb603eaf6edf083eb00685379b61bd.dirtree differ diff --git a/repo/objects/a4/a2102ed54e3925df2fb0ebeda5f0ec0516b6f36c3265e2f961df7a73f33537.filez b/repo/objects/a4/a2102ed54e3925df2fb0ebeda5f0ec0516b6f36c3265e2f961df7a73f33537.filez new file mode 100644 index 00000000000..1831f27a4c0 Binary files /dev/null and b/repo/objects/a4/a2102ed54e3925df2fb0ebeda5f0ec0516b6f36c3265e2f961df7a73f33537.filez differ diff --git a/repo/objects/a4/a25f6cf442e27cfa8989933da3621fb03d49f552c0436d0e4ad789f722cf2c.filez b/repo/objects/a4/a25f6cf442e27cfa8989933da3621fb03d49f552c0436d0e4ad789f722cf2c.filez new file mode 100644 index 00000000000..d2b46fdafdd Binary files /dev/null and b/repo/objects/a4/a25f6cf442e27cfa8989933da3621fb03d49f552c0436d0e4ad789f722cf2c.filez differ diff --git a/repo/objects/a4/b4f30c7818ab57d2cdba74db7384b316a398216ca5c9e7f780b2f58a0d7919.filez b/repo/objects/a4/b4f30c7818ab57d2cdba74db7384b316a398216ca5c9e7f780b2f58a0d7919.filez new file mode 100644 index 00000000000..6576dc60c8d Binary files /dev/null and b/repo/objects/a4/b4f30c7818ab57d2cdba74db7384b316a398216ca5c9e7f780b2f58a0d7919.filez differ diff --git a/repo/objects/a4/fa1769295d82238834983092fba31e6e6d2f8084e2a7e7992e0e9f2f80a031.filez b/repo/objects/a4/fa1769295d82238834983092fba31e6e6d2f8084e2a7e7992e0e9f2f80a031.filez new file mode 100644 index 00000000000..11a9568eb3c Binary files /dev/null and b/repo/objects/a4/fa1769295d82238834983092fba31e6e6d2f8084e2a7e7992e0e9f2f80a031.filez differ diff --git a/repo/objects/a5/0e01c423b0015a24f5bf7adf2744cb87e063e983f20cb884965534ffe983ff.filez b/repo/objects/a5/0e01c423b0015a24f5bf7adf2744cb87e063e983f20cb884965534ffe983ff.filez new file mode 100644 index 00000000000..e1c48d7463f Binary files /dev/null and b/repo/objects/a5/0e01c423b0015a24f5bf7adf2744cb87e063e983f20cb884965534ffe983ff.filez differ diff --git a/repo/objects/a5/1e0cc063750cbe17c7c8700edbf2707bc00c720c2a11e83f883eaba215dbe7.filez b/repo/objects/a5/1e0cc063750cbe17c7c8700edbf2707bc00c720c2a11e83f883eaba215dbe7.filez new file mode 100644 index 00000000000..5037223fff4 Binary files /dev/null and b/repo/objects/a5/1e0cc063750cbe17c7c8700edbf2707bc00c720c2a11e83f883eaba215dbe7.filez differ diff --git a/repo/objects/a5/2a0dd2dcb2f02956962652b19cdd10c775855e76a18ee1b0e79fa5a5a11f0b.filez b/repo/objects/a5/2a0dd2dcb2f02956962652b19cdd10c775855e76a18ee1b0e79fa5a5a11f0b.filez new file mode 100644 index 00000000000..cf6ca9c5587 Binary files /dev/null and b/repo/objects/a5/2a0dd2dcb2f02956962652b19cdd10c775855e76a18ee1b0e79fa5a5a11f0b.filez differ diff --git a/repo/objects/a5/44104c7d02f35fbaad36a202f54e721322d8bf47b7ff3039870f7f0ec1f71a.filez b/repo/objects/a5/44104c7d02f35fbaad36a202f54e721322d8bf47b7ff3039870f7f0ec1f71a.filez new file mode 100644 index 00000000000..8e4024bb450 Binary files /dev/null and b/repo/objects/a5/44104c7d02f35fbaad36a202f54e721322d8bf47b7ff3039870f7f0ec1f71a.filez differ diff --git a/repo/objects/a5/760b0811ee8722725ff51e91021e248c2632fc82c67f0431ba225fb0e8a54a.filez b/repo/objects/a5/760b0811ee8722725ff51e91021e248c2632fc82c67f0431ba225fb0e8a54a.filez new file mode 100644 index 00000000000..8572bb0b90e Binary files /dev/null and b/repo/objects/a5/760b0811ee8722725ff51e91021e248c2632fc82c67f0431ba225fb0e8a54a.filez differ diff --git a/repo/objects/a5/837705fc3f53d596d9059f40b505993b5807b79f982da9d7e53f6fb82e563c.filez b/repo/objects/a5/837705fc3f53d596d9059f40b505993b5807b79f982da9d7e53f6fb82e563c.filez new file mode 100644 index 00000000000..b1894aa27b1 Binary files /dev/null and b/repo/objects/a5/837705fc3f53d596d9059f40b505993b5807b79f982da9d7e53f6fb82e563c.filez differ diff --git a/repo/objects/a5/a4e008bd8957414b3f31c682bd2717c61a959db458000a7b129cc535a7278b.filez b/repo/objects/a5/a4e008bd8957414b3f31c682bd2717c61a959db458000a7b129cc535a7278b.filez new file mode 100644 index 00000000000..1d7a0b26858 Binary files /dev/null and b/repo/objects/a5/a4e008bd8957414b3f31c682bd2717c61a959db458000a7b129cc535a7278b.filez differ diff --git a/repo/objects/a5/ba21a5b114eee3d1fce9725d3e66e7b97a1cbab80e656a94c3032fa7671c2e.filez b/repo/objects/a5/ba21a5b114eee3d1fce9725d3e66e7b97a1cbab80e656a94c3032fa7671c2e.filez new file mode 100644 index 00000000000..42ab5c93d87 Binary files /dev/null and b/repo/objects/a5/ba21a5b114eee3d1fce9725d3e66e7b97a1cbab80e656a94c3032fa7671c2e.filez differ diff --git a/repo/objects/a5/c8d9ca3aa2b0999ba691c4cfb10b4b83e5f0c225ff4cabab7afb31e9e68e1e.filez b/repo/objects/a5/c8d9ca3aa2b0999ba691c4cfb10b4b83e5f0c225ff4cabab7afb31e9e68e1e.filez new file mode 100644 index 00000000000..9aed99a0c5d Binary files /dev/null and b/repo/objects/a5/c8d9ca3aa2b0999ba691c4cfb10b4b83e5f0c225ff4cabab7afb31e9e68e1e.filez differ diff --git a/repo/objects/a5/d11eea953d42d68bcc2133aa5e8ae1c222aa5bad2df9c4612ce24f48ea7a26.filez b/repo/objects/a5/d11eea953d42d68bcc2133aa5e8ae1c222aa5bad2df9c4612ce24f48ea7a26.filez new file mode 100644 index 00000000000..a517e513ade Binary files /dev/null and b/repo/objects/a5/d11eea953d42d68bcc2133aa5e8ae1c222aa5bad2df9c4612ce24f48ea7a26.filez differ diff --git a/repo/objects/a5/d185487719ab4c5df4a205bb173205cfd9e83456f1dee90a81ecaf989dc275.dirtree b/repo/objects/a5/d185487719ab4c5df4a205bb173205cfd9e83456f1dee90a81ecaf989dc275.dirtree new file mode 100644 index 00000000000..ff4a12d35e0 Binary files /dev/null and b/repo/objects/a5/d185487719ab4c5df4a205bb173205cfd9e83456f1dee90a81ecaf989dc275.dirtree differ diff --git a/repo/objects/a5/d2e99372c147a1386936086f67163aa977c7ab5aa21d416dbb2f055f36deb3.dirtree b/repo/objects/a5/d2e99372c147a1386936086f67163aa977c7ab5aa21d416dbb2f055f36deb3.dirtree new file mode 100644 index 00000000000..1b3c0e74391 Binary files /dev/null and b/repo/objects/a5/d2e99372c147a1386936086f67163aa977c7ab5aa21d416dbb2f055f36deb3.dirtree differ diff --git a/repo/objects/a5/dd279cfd36c4e20c433e5a54ffd37639b5356305189cfdabb6ff4cea95628a.dirtree b/repo/objects/a5/dd279cfd36c4e20c433e5a54ffd37639b5356305189cfdabb6ff4cea95628a.dirtree new file mode 100644 index 00000000000..49ba9083183 Binary files /dev/null and b/repo/objects/a5/dd279cfd36c4e20c433e5a54ffd37639b5356305189cfdabb6ff4cea95628a.dirtree differ diff --git a/repo/objects/a5/fad29751563e7f15c9c4db3bd5c865f1ea1ec88d8662ddb8fa99c66d3e440a.filez b/repo/objects/a5/fad29751563e7f15c9c4db3bd5c865f1ea1ec88d8662ddb8fa99c66d3e440a.filez new file mode 100644 index 00000000000..75bea84c247 Binary files /dev/null and b/repo/objects/a5/fad29751563e7f15c9c4db3bd5c865f1ea1ec88d8662ddb8fa99c66d3e440a.filez differ diff --git a/repo/objects/a6/11785950c8423991452bb4b09df022e4f2075585fac1de947828fe266fb33c.filez b/repo/objects/a6/11785950c8423991452bb4b09df022e4f2075585fac1de947828fe266fb33c.filez new file mode 100644 index 00000000000..90dfd7e9a82 Binary files /dev/null and b/repo/objects/a6/11785950c8423991452bb4b09df022e4f2075585fac1de947828fe266fb33c.filez differ diff --git a/repo/objects/a6/127d5395b0dec2994cb5e752d3c963516ffde6791633b9d139932e5c57920f.filez b/repo/objects/a6/127d5395b0dec2994cb5e752d3c963516ffde6791633b9d139932e5c57920f.filez new file mode 100644 index 00000000000..efc67eb6be8 Binary files /dev/null and b/repo/objects/a6/127d5395b0dec2994cb5e752d3c963516ffde6791633b9d139932e5c57920f.filez differ diff --git a/repo/objects/a6/241597fc27361e6b36cbbba1d63d4bfb858bae73a717c6ed67e1a5bb91dc54.filez b/repo/objects/a6/241597fc27361e6b36cbbba1d63d4bfb858bae73a717c6ed67e1a5bb91dc54.filez new file mode 100644 index 00000000000..6e3e004acac Binary files /dev/null and b/repo/objects/a6/241597fc27361e6b36cbbba1d63d4bfb858bae73a717c6ed67e1a5bb91dc54.filez differ diff --git a/repo/objects/a6/259818ed94be8a3d25c29817c1da730e940bd1ec287135df1927ae70da4137.filez b/repo/objects/a6/259818ed94be8a3d25c29817c1da730e940bd1ec287135df1927ae70da4137.filez new file mode 100644 index 00000000000..93825040d92 Binary files /dev/null and b/repo/objects/a6/259818ed94be8a3d25c29817c1da730e940bd1ec287135df1927ae70da4137.filez differ diff --git a/repo/objects/a6/491d5dc0642763d819b5031d1808991e851bb36c187466cf38ad4e392104f9.filez b/repo/objects/a6/491d5dc0642763d819b5031d1808991e851bb36c187466cf38ad4e392104f9.filez new file mode 100644 index 00000000000..613bb04a583 Binary files /dev/null and b/repo/objects/a6/491d5dc0642763d819b5031d1808991e851bb36c187466cf38ad4e392104f9.filez differ diff --git a/repo/objects/a6/67ddd6adf3307344e242b99dfbac7036b1c9b79e44ce38afc04d715f81dddc.filez b/repo/objects/a6/67ddd6adf3307344e242b99dfbac7036b1c9b79e44ce38afc04d715f81dddc.filez new file mode 100644 index 00000000000..0754cbfc03e Binary files /dev/null and b/repo/objects/a6/67ddd6adf3307344e242b99dfbac7036b1c9b79e44ce38afc04d715f81dddc.filez differ diff --git a/repo/objects/a6/6e05964a49e043a0fd6f4d669ab9af32d2f4b29de4a436f47a56dd0126586d.filez b/repo/objects/a6/6e05964a49e043a0fd6f4d669ab9af32d2f4b29de4a436f47a56dd0126586d.filez new file mode 100644 index 00000000000..0b95151a815 Binary files /dev/null and b/repo/objects/a6/6e05964a49e043a0fd6f4d669ab9af32d2f4b29de4a436f47a56dd0126586d.filez differ diff --git a/repo/objects/a6/8a33360c92a3956b43f1b48686d9765edab03ba7c112dbfe368103ef9a06d0.filez b/repo/objects/a6/8a33360c92a3956b43f1b48686d9765edab03ba7c112dbfe368103ef9a06d0.filez new file mode 100644 index 00000000000..c500a4c7cbe Binary files /dev/null and b/repo/objects/a6/8a33360c92a3956b43f1b48686d9765edab03ba7c112dbfe368103ef9a06d0.filez differ diff --git a/repo/objects/a6/ad0892d925e247c7184e161e9ae93bed2f6a2f1061244e5c098ec510a27460.filez b/repo/objects/a6/ad0892d925e247c7184e161e9ae93bed2f6a2f1061244e5c098ec510a27460.filez new file mode 100644 index 00000000000..eebe1890ace Binary files /dev/null and b/repo/objects/a6/ad0892d925e247c7184e161e9ae93bed2f6a2f1061244e5c098ec510a27460.filez differ diff --git a/repo/objects/a6/c2d9ac07e50b983d4273143fe10fb3dad37d941cc3aecdc91222dedc9d0db7.filez b/repo/objects/a6/c2d9ac07e50b983d4273143fe10fb3dad37d941cc3aecdc91222dedc9d0db7.filez new file mode 100644 index 00000000000..e7a24e67e96 Binary files /dev/null and b/repo/objects/a6/c2d9ac07e50b983d4273143fe10fb3dad37d941cc3aecdc91222dedc9d0db7.filez differ diff --git a/repo/objects/a6/d60c9b92697a54fdb392910b43cf483ca80052fd4e3dd636acecd210479b8d.filez b/repo/objects/a6/d60c9b92697a54fdb392910b43cf483ca80052fd4e3dd636acecd210479b8d.filez new file mode 100644 index 00000000000..ef82a7f377e Binary files /dev/null and b/repo/objects/a6/d60c9b92697a54fdb392910b43cf483ca80052fd4e3dd636acecd210479b8d.filez differ diff --git a/repo/objects/a6/fbf92a8b2ba523a773303e7f9334903d9c7ed0e2c7c94c3acee79ef7341def.dirtree b/repo/objects/a6/fbf92a8b2ba523a773303e7f9334903d9c7ed0e2c7c94c3acee79ef7341def.dirtree new file mode 100644 index 00000000000..a201c119a4b Binary files /dev/null and b/repo/objects/a6/fbf92a8b2ba523a773303e7f9334903d9c7ed0e2c7c94c3acee79ef7341def.dirtree differ diff --git a/repo/objects/a7/913603527867c677c6fe0eb6555482aabba8a08c9d46dceddcf07851eb7130.filez b/repo/objects/a7/913603527867c677c6fe0eb6555482aabba8a08c9d46dceddcf07851eb7130.filez new file mode 100644 index 00000000000..d8c38ca7654 Binary files /dev/null and b/repo/objects/a7/913603527867c677c6fe0eb6555482aabba8a08c9d46dceddcf07851eb7130.filez differ diff --git a/repo/objects/a7/b845945775f3dd3a856aededd107be2e998afd6c14d452054bb81ab081348b.filez b/repo/objects/a7/b845945775f3dd3a856aededd107be2e998afd6c14d452054bb81ab081348b.filez new file mode 100644 index 00000000000..049d0db6647 Binary files /dev/null and b/repo/objects/a7/b845945775f3dd3a856aededd107be2e998afd6c14d452054bb81ab081348b.filez differ diff --git a/repo/objects/a8/2518749db60b6181fe0424eb1f17db66eddf95ab9a7839874814f479438e32.filez b/repo/objects/a8/2518749db60b6181fe0424eb1f17db66eddf95ab9a7839874814f479438e32.filez new file mode 100644 index 00000000000..b7a6ffeb665 Binary files /dev/null and b/repo/objects/a8/2518749db60b6181fe0424eb1f17db66eddf95ab9a7839874814f479438e32.filez differ diff --git a/repo/objects/a8/384a1e1fd24666a4efd23a756473b8d8aae867227a846ebf8c0db35ed180a1.filez b/repo/objects/a8/384a1e1fd24666a4efd23a756473b8d8aae867227a846ebf8c0db35ed180a1.filez new file mode 100644 index 00000000000..109634d6073 Binary files /dev/null and b/repo/objects/a8/384a1e1fd24666a4efd23a756473b8d8aae867227a846ebf8c0db35ed180a1.filez differ diff --git a/repo/objects/a8/465c65e35b068015692d1b04ef683a8d1729b4e3da5429710a8cd0f4277b71.filez b/repo/objects/a8/465c65e35b068015692d1b04ef683a8d1729b4e3da5429710a8cd0f4277b71.filez new file mode 100644 index 00000000000..0963a4b2dd7 Binary files /dev/null and b/repo/objects/a8/465c65e35b068015692d1b04ef683a8d1729b4e3da5429710a8cd0f4277b71.filez differ diff --git a/repo/objects/a8/491ef6f86076e200afeb65726ebfae749492b2a83dc4d700ea1d7f87458969.filez b/repo/objects/a8/491ef6f86076e200afeb65726ebfae749492b2a83dc4d700ea1d7f87458969.filez new file mode 100644 index 00000000000..99d6f55108f Binary files /dev/null and b/repo/objects/a8/491ef6f86076e200afeb65726ebfae749492b2a83dc4d700ea1d7f87458969.filez differ diff --git a/repo/objects/a8/4c87803499708f26be386caeb9d5e2a5de7daa58e0aebec080524f26133bae.filez b/repo/objects/a8/4c87803499708f26be386caeb9d5e2a5de7daa58e0aebec080524f26133bae.filez new file mode 100644 index 00000000000..93131f0ace5 Binary files /dev/null and b/repo/objects/a8/4c87803499708f26be386caeb9d5e2a5de7daa58e0aebec080524f26133bae.filez differ diff --git a/repo/objects/a8/9367882268842c817687338f2d0d0cc76e9430bdee8e1080bf395df210291e.filez b/repo/objects/a8/9367882268842c817687338f2d0d0cc76e9430bdee8e1080bf395df210291e.filez new file mode 100644 index 00000000000..8347eecc1fb Binary files /dev/null and b/repo/objects/a8/9367882268842c817687338f2d0d0cc76e9430bdee8e1080bf395df210291e.filez differ diff --git a/repo/objects/a8/b59a7e26c97f49cb7921e3fc4125cd5bd8b47261999ab37059e4cddb26bb99.filez b/repo/objects/a8/b59a7e26c97f49cb7921e3fc4125cd5bd8b47261999ab37059e4cddb26bb99.filez new file mode 100644 index 00000000000..4595bb44e5c Binary files /dev/null and b/repo/objects/a8/b59a7e26c97f49cb7921e3fc4125cd5bd8b47261999ab37059e4cddb26bb99.filez differ diff --git a/repo/objects/a8/b9b98cc431d280e5886b16767fa7503c24a0c5f73ed533d264a2537007323c.dirtree b/repo/objects/a8/b9b98cc431d280e5886b16767fa7503c24a0c5f73ed533d264a2537007323c.dirtree new file mode 100644 index 00000000000..48922a514a1 Binary files /dev/null and b/repo/objects/a8/b9b98cc431d280e5886b16767fa7503c24a0c5f73ed533d264a2537007323c.dirtree differ diff --git a/repo/objects/a8/d1475ec33f75833678119667eb55aecaf25fa82958631a7ffb29a11093c245.filez b/repo/objects/a8/d1475ec33f75833678119667eb55aecaf25fa82958631a7ffb29a11093c245.filez new file mode 100644 index 00000000000..518e38747ae Binary files /dev/null and b/repo/objects/a8/d1475ec33f75833678119667eb55aecaf25fa82958631a7ffb29a11093c245.filez differ diff --git a/repo/objects/a9/025b13566b9d416fe186ac645bce0fb817d251438396aa8bff680f9bb18d19.filez b/repo/objects/a9/025b13566b9d416fe186ac645bce0fb817d251438396aa8bff680f9bb18d19.filez new file mode 100644 index 00000000000..8d3678d671a Binary files /dev/null and b/repo/objects/a9/025b13566b9d416fe186ac645bce0fb817d251438396aa8bff680f9bb18d19.filez differ diff --git a/repo/objects/a9/3617449bfae5c5b0a86cbbc76be5d79c27d50a0b7dea0749be28a231c8dcd2.filez b/repo/objects/a9/3617449bfae5c5b0a86cbbc76be5d79c27d50a0b7dea0749be28a231c8dcd2.filez new file mode 100644 index 00000000000..6f47348fe6d Binary files /dev/null and b/repo/objects/a9/3617449bfae5c5b0a86cbbc76be5d79c27d50a0b7dea0749be28a231c8dcd2.filez differ diff --git a/repo/objects/a9/712b06bf0e7b441dcb97b5e4f3e5f75101b6b1f21f6dbc88239162ec28b5e2.filez b/repo/objects/a9/712b06bf0e7b441dcb97b5e4f3e5f75101b6b1f21f6dbc88239162ec28b5e2.filez new file mode 100644 index 00000000000..0c91373e47e Binary files /dev/null and b/repo/objects/a9/712b06bf0e7b441dcb97b5e4f3e5f75101b6b1f21f6dbc88239162ec28b5e2.filez differ diff --git a/repo/objects/a9/a6d22961ef1f78474caed5fcadacfd1858c210033499db5e90266891f1a891.filez b/repo/objects/a9/a6d22961ef1f78474caed5fcadacfd1858c210033499db5e90266891f1a891.filez new file mode 100644 index 00000000000..df097a861ac Binary files /dev/null and b/repo/objects/a9/a6d22961ef1f78474caed5fcadacfd1858c210033499db5e90266891f1a891.filez differ diff --git a/repo/objects/a9/a91de11cc807b6199b453a43fa038fd4d9a8c1257da4b6d28202f80e2fdc8b.filez b/repo/objects/a9/a91de11cc807b6199b453a43fa038fd4d9a8c1257da4b6d28202f80e2fdc8b.filez new file mode 100644 index 00000000000..d6ee5d1c2dd Binary files /dev/null and b/repo/objects/a9/a91de11cc807b6199b453a43fa038fd4d9a8c1257da4b6d28202f80e2fdc8b.filez differ diff --git a/repo/objects/a9/b4207d0390e72a04113e8b90dc506b43a315afab5355f5ae9d8a81193ca2d7.filez b/repo/objects/a9/b4207d0390e72a04113e8b90dc506b43a315afab5355f5ae9d8a81193ca2d7.filez new file mode 100644 index 00000000000..0adeb42785f Binary files /dev/null and b/repo/objects/a9/b4207d0390e72a04113e8b90dc506b43a315afab5355f5ae9d8a81193ca2d7.filez differ diff --git a/repo/objects/a9/cd611b2a9107125088b83d6f454799e562cff28559654c9110500801b90855.filez b/repo/objects/a9/cd611b2a9107125088b83d6f454799e562cff28559654c9110500801b90855.filez new file mode 100644 index 00000000000..03ce083d6d6 Binary files /dev/null and b/repo/objects/a9/cd611b2a9107125088b83d6f454799e562cff28559654c9110500801b90855.filez differ diff --git a/repo/objects/a9/eba47dbdc1c803e14f08f86538aba83ead5e976a88d449e371c3eaedbc71f4.filez b/repo/objects/a9/eba47dbdc1c803e14f08f86538aba83ead5e976a88d449e371c3eaedbc71f4.filez new file mode 100644 index 00000000000..86cbe12adae Binary files /dev/null and b/repo/objects/a9/eba47dbdc1c803e14f08f86538aba83ead5e976a88d449e371c3eaedbc71f4.filez differ diff --git a/repo/objects/aa/02b8655b4eadcf7e97a2e0bdb21f79caddcc7d8b41ea73bc39e4c761eec4dc.dirtree b/repo/objects/aa/02b8655b4eadcf7e97a2e0bdb21f79caddcc7d8b41ea73bc39e4c761eec4dc.dirtree new file mode 100644 index 00000000000..81bec71bee9 Binary files /dev/null and b/repo/objects/aa/02b8655b4eadcf7e97a2e0bdb21f79caddcc7d8b41ea73bc39e4c761eec4dc.dirtree differ diff --git a/repo/objects/aa/100936cc5176037ceb39a0d28bd7f15cb31dcaf9563f9561e53123c0467ba3.filez b/repo/objects/aa/100936cc5176037ceb39a0d28bd7f15cb31dcaf9563f9561e53123c0467ba3.filez new file mode 100644 index 00000000000..1c4adb79f49 Binary files /dev/null and b/repo/objects/aa/100936cc5176037ceb39a0d28bd7f15cb31dcaf9563f9561e53123c0467ba3.filez differ diff --git a/repo/objects/aa/2f663675ba2861fa3d4bf698e3f35289dc10772da76ca647c6e74ff5be21ab.filez b/repo/objects/aa/2f663675ba2861fa3d4bf698e3f35289dc10772da76ca647c6e74ff5be21ab.filez new file mode 100644 index 00000000000..3dd4a623aeb Binary files /dev/null and b/repo/objects/aa/2f663675ba2861fa3d4bf698e3f35289dc10772da76ca647c6e74ff5be21ab.filez differ diff --git a/repo/objects/aa/30703aeea0cbd89a20b9dba5b8e3910a7c274c2ead5936f13d1c9f217ff2f6.filez b/repo/objects/aa/30703aeea0cbd89a20b9dba5b8e3910a7c274c2ead5936f13d1c9f217ff2f6.filez new file mode 100644 index 00000000000..9448c5b5346 Binary files /dev/null and b/repo/objects/aa/30703aeea0cbd89a20b9dba5b8e3910a7c274c2ead5936f13d1c9f217ff2f6.filez differ diff --git a/repo/objects/aa/3e4a179fc628febabc0abc496a2dec0ed087da857a4c04772ca77736ac9230.filez b/repo/objects/aa/3e4a179fc628febabc0abc496a2dec0ed087da857a4c04772ca77736ac9230.filez new file mode 100644 index 00000000000..35ef2a8f034 Binary files /dev/null and b/repo/objects/aa/3e4a179fc628febabc0abc496a2dec0ed087da857a4c04772ca77736ac9230.filez differ diff --git a/repo/objects/aa/4158bc03334caddc88fcfb93829000a840f46be2a548345db693b835730b7b.filez b/repo/objects/aa/4158bc03334caddc88fcfb93829000a840f46be2a548345db693b835730b7b.filez new file mode 100644 index 00000000000..2dcd70fd88c Binary files /dev/null and b/repo/objects/aa/4158bc03334caddc88fcfb93829000a840f46be2a548345db693b835730b7b.filez differ diff --git a/repo/objects/aa/5cc87f6ce4e7247fee1e916e8653d0c0fe50ff39b60b02add151e2686c6e0c.filez b/repo/objects/aa/5cc87f6ce4e7247fee1e916e8653d0c0fe50ff39b60b02add151e2686c6e0c.filez new file mode 100644 index 00000000000..ad5139b0dd9 Binary files /dev/null and b/repo/objects/aa/5cc87f6ce4e7247fee1e916e8653d0c0fe50ff39b60b02add151e2686c6e0c.filez differ diff --git a/repo/objects/aa/8a0fffe882b96342d33712a71a849217236613e82532c4f3bbd1513c575bad.filez b/repo/objects/aa/8a0fffe882b96342d33712a71a849217236613e82532c4f3bbd1513c575bad.filez new file mode 100644 index 00000000000..6cb89b77fa2 Binary files /dev/null and b/repo/objects/aa/8a0fffe882b96342d33712a71a849217236613e82532c4f3bbd1513c575bad.filez differ diff --git a/repo/objects/aa/9b693da36e5b12802627396dc81915768deb3851f75ab7cbf2e7cdf0e89ce7.filez b/repo/objects/aa/9b693da36e5b12802627396dc81915768deb3851f75ab7cbf2e7cdf0e89ce7.filez new file mode 100644 index 00000000000..35c56840bd9 Binary files /dev/null and b/repo/objects/aa/9b693da36e5b12802627396dc81915768deb3851f75ab7cbf2e7cdf0e89ce7.filez differ diff --git a/repo/objects/aa/adfefc86a6b9ed5dd698c43e9fe66eb48cac86a2b4a06fb32cd37b1ffe888d.filez b/repo/objects/aa/adfefc86a6b9ed5dd698c43e9fe66eb48cac86a2b4a06fb32cd37b1ffe888d.filez new file mode 100644 index 00000000000..7d5975c0931 Binary files /dev/null and b/repo/objects/aa/adfefc86a6b9ed5dd698c43e9fe66eb48cac86a2b4a06fb32cd37b1ffe888d.filez differ diff --git a/repo/objects/aa/ae9af5138c96413e032e7c9bd5da1fd9315468beb26ef84f511e3e980be5e3.dirtree b/repo/objects/aa/ae9af5138c96413e032e7c9bd5da1fd9315468beb26ef84f511e3e980be5e3.dirtree new file mode 100644 index 00000000000..8d3889fa270 Binary files /dev/null and b/repo/objects/aa/ae9af5138c96413e032e7c9bd5da1fd9315468beb26ef84f511e3e980be5e3.dirtree differ diff --git a/repo/objects/aa/b1d03bc54a00834870b8f8cbc9d0e0d00cff5fde9da5beaf8d718ffabbf363.filez b/repo/objects/aa/b1d03bc54a00834870b8f8cbc9d0e0d00cff5fde9da5beaf8d718ffabbf363.filez new file mode 100644 index 00000000000..4069ba401c2 Binary files /dev/null and b/repo/objects/aa/b1d03bc54a00834870b8f8cbc9d0e0d00cff5fde9da5beaf8d718ffabbf363.filez differ diff --git a/repo/objects/aa/bdaa928d525cd09cb9bd290087bbc0dcb9a881ab5980ebb3b0a819028b6b19.filez b/repo/objects/aa/bdaa928d525cd09cb9bd290087bbc0dcb9a881ab5980ebb3b0a819028b6b19.filez new file mode 100644 index 00000000000..65c7a30ee65 Binary files /dev/null and b/repo/objects/aa/bdaa928d525cd09cb9bd290087bbc0dcb9a881ab5980ebb3b0a819028b6b19.filez differ diff --git a/repo/objects/aa/c7d14427d4efc04ce865b6c7da113c336f5aa468647d85e1e7bb0fd8e206e5.filez b/repo/objects/aa/c7d14427d4efc04ce865b6c7da113c336f5aa468647d85e1e7bb0fd8e206e5.filez new file mode 100644 index 00000000000..9fb6627b9fc Binary files /dev/null and b/repo/objects/aa/c7d14427d4efc04ce865b6c7da113c336f5aa468647d85e1e7bb0fd8e206e5.filez differ diff --git a/repo/objects/ab/312956385a4e63139c057f5a68a4e4040565ad760afb8585d00488238fca39.dirtree b/repo/objects/ab/312956385a4e63139c057f5a68a4e4040565ad760afb8585d00488238fca39.dirtree new file mode 100644 index 00000000000..5a664049f93 Binary files /dev/null and b/repo/objects/ab/312956385a4e63139c057f5a68a4e4040565ad760afb8585d00488238fca39.dirtree differ diff --git a/repo/objects/ab/726f0e244139731848cfa317327e84267d1339a358b4f66ad30e3efea6db25.dirtree b/repo/objects/ab/726f0e244139731848cfa317327e84267d1339a358b4f66ad30e3efea6db25.dirtree new file mode 100644 index 00000000000..89073fdf6fa Binary files /dev/null and b/repo/objects/ab/726f0e244139731848cfa317327e84267d1339a358b4f66ad30e3efea6db25.dirtree differ diff --git a/repo/objects/ab/89e5cdafd689a14b6fdcce6f7e73ebf4fbfd54a924ee9b422169d0af365c3b.dirtree b/repo/objects/ab/89e5cdafd689a14b6fdcce6f7e73ebf4fbfd54a924ee9b422169d0af365c3b.dirtree new file mode 100644 index 00000000000..b9cc1a3f781 Binary files /dev/null and b/repo/objects/ab/89e5cdafd689a14b6fdcce6f7e73ebf4fbfd54a924ee9b422169d0af365c3b.dirtree differ diff --git a/repo/objects/ab/89f27a0de100b65b72aeab49fa4d890754f38d5c4133610f375590d8a1a9a8.filez b/repo/objects/ab/89f27a0de100b65b72aeab49fa4d890754f38d5c4133610f375590d8a1a9a8.filez new file mode 100644 index 00000000000..4b5768518c4 Binary files /dev/null and b/repo/objects/ab/89f27a0de100b65b72aeab49fa4d890754f38d5c4133610f375590d8a1a9a8.filez differ diff --git a/repo/objects/ab/af5ed21d87d6ede72e63f9f0c426450ab34c56546ba635e70eb88d2d7398ca.dirtree b/repo/objects/ab/af5ed21d87d6ede72e63f9f0c426450ab34c56546ba635e70eb88d2d7398ca.dirtree new file mode 100644 index 00000000000..996208b65ff Binary files /dev/null and b/repo/objects/ab/af5ed21d87d6ede72e63f9f0c426450ab34c56546ba635e70eb88d2d7398ca.dirtree differ diff --git a/repo/objects/ab/cbe190520e8ed728c7eb5dd0f31a3bba95a2fc42aa297f477ff256cb416541.filez b/repo/objects/ab/cbe190520e8ed728c7eb5dd0f31a3bba95a2fc42aa297f477ff256cb416541.filez new file mode 100644 index 00000000000..2f2625051d8 Binary files /dev/null and b/repo/objects/ab/cbe190520e8ed728c7eb5dd0f31a3bba95a2fc42aa297f477ff256cb416541.filez differ diff --git a/repo/objects/ab/ce8236ba5a46d6746999ef7d328b1179933c0fd540cfcc0a6ac33d1b74df2e.filez b/repo/objects/ab/ce8236ba5a46d6746999ef7d328b1179933c0fd540cfcc0a6ac33d1b74df2e.filez new file mode 100644 index 00000000000..7ebd43fb9c7 Binary files /dev/null and b/repo/objects/ab/ce8236ba5a46d6746999ef7d328b1179933c0fd540cfcc0a6ac33d1b74df2e.filez differ diff --git a/repo/objects/ab/de4410d618735782930b0b2d526cfbc8b0ecd310160ebd8f3b1268a3603f00.filez b/repo/objects/ab/de4410d618735782930b0b2d526cfbc8b0ecd310160ebd8f3b1268a3603f00.filez new file mode 100644 index 00000000000..42dd5b185f5 Binary files /dev/null and b/repo/objects/ab/de4410d618735782930b0b2d526cfbc8b0ecd310160ebd8f3b1268a3603f00.filez differ diff --git a/repo/objects/ac/25cde85c8964189b60fe1fae23f42cfbd40ca2e2f8dac572a7385427a69e07.filez b/repo/objects/ac/25cde85c8964189b60fe1fae23f42cfbd40ca2e2f8dac572a7385427a69e07.filez new file mode 100644 index 00000000000..35067f7ade0 Binary files /dev/null and b/repo/objects/ac/25cde85c8964189b60fe1fae23f42cfbd40ca2e2f8dac572a7385427a69e07.filez differ diff --git a/repo/objects/ac/32f770fdf58ff4ca50e06237e628ade455923c914118512b247bfa4f8ac14f.filez b/repo/objects/ac/32f770fdf58ff4ca50e06237e628ade455923c914118512b247bfa4f8ac14f.filez new file mode 100644 index 00000000000..34f94ac92d0 Binary files /dev/null and b/repo/objects/ac/32f770fdf58ff4ca50e06237e628ade455923c914118512b247bfa4f8ac14f.filez differ diff --git a/repo/objects/ac/38e7d203f10e7d2b025e60a36a1c2734f84269b476a269ad1cf94155742a0c.filez b/repo/objects/ac/38e7d203f10e7d2b025e60a36a1c2734f84269b476a269ad1cf94155742a0c.filez new file mode 100644 index 00000000000..37f6ad8ad03 Binary files /dev/null and b/repo/objects/ac/38e7d203f10e7d2b025e60a36a1c2734f84269b476a269ad1cf94155742a0c.filez differ diff --git a/repo/objects/ac/5292b1ae69a88d047dda2a2fcedf7b51ac1ace08a811b5c1a71efdddacd834.filez b/repo/objects/ac/5292b1ae69a88d047dda2a2fcedf7b51ac1ace08a811b5c1a71efdddacd834.filez new file mode 100644 index 00000000000..5e201ca8562 Binary files /dev/null and b/repo/objects/ac/5292b1ae69a88d047dda2a2fcedf7b51ac1ace08a811b5c1a71efdddacd834.filez differ diff --git a/repo/objects/ac/790922446464d31ad5fb463776c85baf4d57cf22579d678d5977cb41d05bcc.filez b/repo/objects/ac/790922446464d31ad5fb463776c85baf4d57cf22579d678d5977cb41d05bcc.filez new file mode 100644 index 00000000000..9a5c5498000 Binary files /dev/null and b/repo/objects/ac/790922446464d31ad5fb463776c85baf4d57cf22579d678d5977cb41d05bcc.filez differ diff --git a/repo/objects/ac/8c0b89ed9462f0b7c73348cf7b701f531a62e1765d906bb009fb18ff6ede62.filez b/repo/objects/ac/8c0b89ed9462f0b7c73348cf7b701f531a62e1765d906bb009fb18ff6ede62.filez new file mode 100644 index 00000000000..f38de2118c5 Binary files /dev/null and b/repo/objects/ac/8c0b89ed9462f0b7c73348cf7b701f531a62e1765d906bb009fb18ff6ede62.filez differ diff --git a/repo/objects/ac/90e674e74ac794a1bc59b54f8c4096321b02c13ddff0d37ef58544def822f2.filez b/repo/objects/ac/90e674e74ac794a1bc59b54f8c4096321b02c13ddff0d37ef58544def822f2.filez new file mode 100644 index 00000000000..2569a5ae74c Binary files /dev/null and b/repo/objects/ac/90e674e74ac794a1bc59b54f8c4096321b02c13ddff0d37ef58544def822f2.filez differ diff --git a/repo/objects/ac/a20d284320f88cbf216f11b1ab13b691cef5e55cd4cfc3dc7c85c518cf0ecb.dirtree b/repo/objects/ac/a20d284320f88cbf216f11b1ab13b691cef5e55cd4cfc3dc7c85c518cf0ecb.dirtree new file mode 100644 index 00000000000..ddc01398dc0 Binary files /dev/null and b/repo/objects/ac/a20d284320f88cbf216f11b1ab13b691cef5e55cd4cfc3dc7c85c518cf0ecb.dirtree differ diff --git a/repo/objects/ac/a37318859e76fee302dd786ef35b370f806baa0f5c7781740bf0704ad9c700.filez b/repo/objects/ac/a37318859e76fee302dd786ef35b370f806baa0f5c7781740bf0704ad9c700.filez new file mode 100644 index 00000000000..c1a0e934595 Binary files /dev/null and b/repo/objects/ac/a37318859e76fee302dd786ef35b370f806baa0f5c7781740bf0704ad9c700.filez differ diff --git a/repo/objects/ac/a91a74f2306d4abb0755eb6ab4ba1e74fafe6a4ab8c2b68e9fce584779668a.dirtree b/repo/objects/ac/a91a74f2306d4abb0755eb6ab4ba1e74fafe6a4ab8c2b68e9fce584779668a.dirtree new file mode 100644 index 00000000000..c3a3544be32 Binary files /dev/null and b/repo/objects/ac/a91a74f2306d4abb0755eb6ab4ba1e74fafe6a4ab8c2b68e9fce584779668a.dirtree differ diff --git a/repo/objects/ac/a997512326085227e3255511e04670dff5a8a52f2f06138908461a88e27264.filez b/repo/objects/ac/a997512326085227e3255511e04670dff5a8a52f2f06138908461a88e27264.filez new file mode 100644 index 00000000000..08802a62ca9 Binary files /dev/null and b/repo/objects/ac/a997512326085227e3255511e04670dff5a8a52f2f06138908461a88e27264.filez differ diff --git a/repo/objects/ac/ead4d3a06dd16fe735543f3335ee083f1035fcd7bb0456a07cedd1d14bb37c.dirtree b/repo/objects/ac/ead4d3a06dd16fe735543f3335ee083f1035fcd7bb0456a07cedd1d14bb37c.dirtree new file mode 100644 index 00000000000..bb82fcd61a5 Binary files /dev/null and b/repo/objects/ac/ead4d3a06dd16fe735543f3335ee083f1035fcd7bb0456a07cedd1d14bb37c.dirtree differ diff --git a/repo/objects/ad/0d4c226511e2eefb613efab4579355e8ef43b3c9918cd808442c7988cd8af3.filez b/repo/objects/ad/0d4c226511e2eefb613efab4579355e8ef43b3c9918cd808442c7988cd8af3.filez new file mode 100644 index 00000000000..c8f48893425 Binary files /dev/null and b/repo/objects/ad/0d4c226511e2eefb613efab4579355e8ef43b3c9918cd808442c7988cd8af3.filez differ diff --git a/repo/objects/ad/1ec18dde10ec7f041b57ce78f396e28793257ea1c3008a17cc3dd3194b05df.filez b/repo/objects/ad/1ec18dde10ec7f041b57ce78f396e28793257ea1c3008a17cc3dd3194b05df.filez new file mode 100644 index 00000000000..b915b8cd37a Binary files /dev/null and b/repo/objects/ad/1ec18dde10ec7f041b57ce78f396e28793257ea1c3008a17cc3dd3194b05df.filez differ diff --git a/repo/objects/ad/3e742060412c7a8d0485b1ceb94ba8ba809c92d32c867b027ff49025b31c9f.filez b/repo/objects/ad/3e742060412c7a8d0485b1ceb94ba8ba809c92d32c867b027ff49025b31c9f.filez new file mode 100644 index 00000000000..33d276576ff Binary files /dev/null and b/repo/objects/ad/3e742060412c7a8d0485b1ceb94ba8ba809c92d32c867b027ff49025b31c9f.filez differ diff --git a/repo/objects/ad/48ccbd15ed4e68b63dcb7875283d1b1be7c0239ae0256e104b2d0191870913.filez b/repo/objects/ad/48ccbd15ed4e68b63dcb7875283d1b1be7c0239ae0256e104b2d0191870913.filez new file mode 100644 index 00000000000..a17efb421d8 Binary files /dev/null and b/repo/objects/ad/48ccbd15ed4e68b63dcb7875283d1b1be7c0239ae0256e104b2d0191870913.filez differ diff --git a/repo/objects/ad/575e2af624b760f70dac87fca26ee609f2e60e752f2032d4abb85c992e3b52.filez b/repo/objects/ad/575e2af624b760f70dac87fca26ee609f2e60e752f2032d4abb85c992e3b52.filez new file mode 100644 index 00000000000..fbd03bce305 Binary files /dev/null and b/repo/objects/ad/575e2af624b760f70dac87fca26ee609f2e60e752f2032d4abb85c992e3b52.filez differ diff --git a/repo/objects/ad/5f9cbb5c607a511e607d3944bffe73b270e53bf58ade7e8ad683752e309553.filez b/repo/objects/ad/5f9cbb5c607a511e607d3944bffe73b270e53bf58ade7e8ad683752e309553.filez new file mode 100644 index 00000000000..42755688708 Binary files /dev/null and b/repo/objects/ad/5f9cbb5c607a511e607d3944bffe73b270e53bf58ade7e8ad683752e309553.filez differ diff --git a/repo/objects/ad/5fdf131d498925bb808a911b42d0b99df8ddf6f106e62787afaaa6ebe07ad4.dirtree b/repo/objects/ad/5fdf131d498925bb808a911b42d0b99df8ddf6f106e62787afaaa6ebe07ad4.dirtree new file mode 100644 index 00000000000..252fb506b38 Binary files /dev/null and b/repo/objects/ad/5fdf131d498925bb808a911b42d0b99df8ddf6f106e62787afaaa6ebe07ad4.dirtree differ diff --git a/repo/objects/ad/a73a27a36f6d801eb0147cabddccbc9c4a7bf602c8027f497040a18d4ffac8.dirtree b/repo/objects/ad/a73a27a36f6d801eb0147cabddccbc9c4a7bf602c8027f497040a18d4ffac8.dirtree new file mode 100644 index 00000000000..12b78c8a80a Binary files /dev/null and b/repo/objects/ad/a73a27a36f6d801eb0147cabddccbc9c4a7bf602c8027f497040a18d4ffac8.dirtree differ diff --git a/repo/objects/ad/beead943ad8f64d2655177c0cbdf81f23d27652c860b945a8fb56b7da229fb.filez b/repo/objects/ad/beead943ad8f64d2655177c0cbdf81f23d27652c860b945a8fb56b7da229fb.filez new file mode 100644 index 00000000000..b7a3cf85dab Binary files /dev/null and b/repo/objects/ad/beead943ad8f64d2655177c0cbdf81f23d27652c860b945a8fb56b7da229fb.filez differ diff --git a/repo/objects/ad/ed0112b8a32534a2757409a99ea12cddae28832693ff3b1312cc738fb45c59.filez b/repo/objects/ad/ed0112b8a32534a2757409a99ea12cddae28832693ff3b1312cc738fb45c59.filez new file mode 100644 index 00000000000..0e5d26bf5b8 Binary files /dev/null and b/repo/objects/ad/ed0112b8a32534a2757409a99ea12cddae28832693ff3b1312cc738fb45c59.filez differ diff --git a/repo/objects/ae/24834e2e36a1338e9242ee488a2033d4b1af5bfe88bfe4c19f149e14b8fd6d.filez b/repo/objects/ae/24834e2e36a1338e9242ee488a2033d4b1af5bfe88bfe4c19f149e14b8fd6d.filez new file mode 100644 index 00000000000..a36ccc8a0a6 Binary files /dev/null and b/repo/objects/ae/24834e2e36a1338e9242ee488a2033d4b1af5bfe88bfe4c19f149e14b8fd6d.filez differ diff --git a/repo/objects/ae/55c5492bfb4715ea0fa8ad3570e965a886cc5dae472c97dc999fde771a3550.dirtree b/repo/objects/ae/55c5492bfb4715ea0fa8ad3570e965a886cc5dae472c97dc999fde771a3550.dirtree new file mode 100644 index 00000000000..f27440a7ae5 Binary files /dev/null and b/repo/objects/ae/55c5492bfb4715ea0fa8ad3570e965a886cc5dae472c97dc999fde771a3550.dirtree differ diff --git a/repo/objects/ae/911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036.commit b/repo/objects/ae/911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036.commit new file mode 100644 index 00000000000..5f92c810499 Binary files /dev/null and b/repo/objects/ae/911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036.commit differ diff --git a/repo/objects/ae/911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036.commitmeta b/repo/objects/ae/911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036.commitmeta new file mode 100644 index 00000000000..475ef082486 Binary files /dev/null and b/repo/objects/ae/911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036.commitmeta differ diff --git a/repo/objects/ae/a3f3292d73617a9a3478669f3ea14f639ac382e479d16d2658546133041534.filez b/repo/objects/ae/a3f3292d73617a9a3478669f3ea14f639ac382e479d16d2658546133041534.filez new file mode 100644 index 00000000000..b904df8b9d5 Binary files /dev/null and b/repo/objects/ae/a3f3292d73617a9a3478669f3ea14f639ac382e479d16d2658546133041534.filez differ diff --git a/repo/objects/ae/c1c8e99e1c0b0fc37242ba6e69e66290d7a9ece48a172e3f4631395100765c.filez b/repo/objects/ae/c1c8e99e1c0b0fc37242ba6e69e66290d7a9ece48a172e3f4631395100765c.filez new file mode 100644 index 00000000000..4c13c0f8235 Binary files /dev/null and b/repo/objects/ae/c1c8e99e1c0b0fc37242ba6e69e66290d7a9ece48a172e3f4631395100765c.filez differ diff --git a/repo/objects/ae/cd8329bff09d1c506e2946f2844dfe004a2e5ca21f0b2f17935f714266be6b.filez b/repo/objects/ae/cd8329bff09d1c506e2946f2844dfe004a2e5ca21f0b2f17935f714266be6b.filez new file mode 100644 index 00000000000..8f07cc0f37f Binary files /dev/null and b/repo/objects/ae/cd8329bff09d1c506e2946f2844dfe004a2e5ca21f0b2f17935f714266be6b.filez differ diff --git a/repo/objects/ae/dd276f9b83168847bf307556ba4b67328f0d0b4a80e2be5899a1dcc62b959d.dirtree b/repo/objects/ae/dd276f9b83168847bf307556ba4b67328f0d0b4a80e2be5899a1dcc62b959d.dirtree new file mode 100644 index 00000000000..deaead735c9 Binary files /dev/null and b/repo/objects/ae/dd276f9b83168847bf307556ba4b67328f0d0b4a80e2be5899a1dcc62b959d.dirtree differ diff --git a/repo/objects/ae/f9bd6d9aee14da5f6477af84b788f191836d2f3e3034b6f7771b12d057cbf6.dirtree b/repo/objects/ae/f9bd6d9aee14da5f6477af84b788f191836d2f3e3034b6f7771b12d057cbf6.dirtree new file mode 100644 index 00000000000..5e111a610b4 Binary files /dev/null and b/repo/objects/ae/f9bd6d9aee14da5f6477af84b788f191836d2f3e3034b6f7771b12d057cbf6.dirtree differ diff --git a/repo/objects/ae/fad5f10c7046f9162d4331467e18a3ef5f3638c319652ef6bd72526021f924.filez b/repo/objects/ae/fad5f10c7046f9162d4331467e18a3ef5f3638c319652ef6bd72526021f924.filez new file mode 100644 index 00000000000..d62c5834704 Binary files /dev/null and b/repo/objects/ae/fad5f10c7046f9162d4331467e18a3ef5f3638c319652ef6bd72526021f924.filez differ diff --git a/repo/objects/af/4bc5aaa321e6ef521cf167253575694d526813497c7402809caf79fd48a4ec.filez b/repo/objects/af/4bc5aaa321e6ef521cf167253575694d526813497c7402809caf79fd48a4ec.filez new file mode 100644 index 00000000000..d09e30c6842 Binary files /dev/null and b/repo/objects/af/4bc5aaa321e6ef521cf167253575694d526813497c7402809caf79fd48a4ec.filez differ diff --git a/repo/objects/af/5e3c223e521e3cbf73e7d1493b5a5bc99931b6b1fae903ae77eadf05a799e5.filez b/repo/objects/af/5e3c223e521e3cbf73e7d1493b5a5bc99931b6b1fae903ae77eadf05a799e5.filez new file mode 100644 index 00000000000..d637dbd0ede Binary files /dev/null and b/repo/objects/af/5e3c223e521e3cbf73e7d1493b5a5bc99931b6b1fae903ae77eadf05a799e5.filez differ diff --git a/repo/objects/af/913f7a155a1ffa2e2bbf782fe413c5af9e624b6c68a259cc515afe96314efb.filez b/repo/objects/af/913f7a155a1ffa2e2bbf782fe413c5af9e624b6c68a259cc515afe96314efb.filez new file mode 100644 index 00000000000..84f9d5cd40b Binary files /dev/null and b/repo/objects/af/913f7a155a1ffa2e2bbf782fe413c5af9e624b6c68a259cc515afe96314efb.filez differ diff --git a/repo/objects/af/bd14706858c4eb71f98b278e52b6d71704efc64010d1267cdc6ccb2cc1ff85.filez b/repo/objects/af/bd14706858c4eb71f98b278e52b6d71704efc64010d1267cdc6ccb2cc1ff85.filez new file mode 100644 index 00000000000..96ef407d24e Binary files /dev/null and b/repo/objects/af/bd14706858c4eb71f98b278e52b6d71704efc64010d1267cdc6ccb2cc1ff85.filez differ diff --git a/repo/objects/af/c7cff35ee0bac1acd1e550b0edf401603f7467604e82f1e77067e21b840b68.filez b/repo/objects/af/c7cff35ee0bac1acd1e550b0edf401603f7467604e82f1e77067e21b840b68.filez new file mode 100644 index 00000000000..3fd446f685e Binary files /dev/null and b/repo/objects/af/c7cff35ee0bac1acd1e550b0edf401603f7467604e82f1e77067e21b840b68.filez differ diff --git a/repo/objects/b0/1c0343521311d0031c5740394aad0bfa3236e3c4ef48f428e0076778ed52c9.filez b/repo/objects/b0/1c0343521311d0031c5740394aad0bfa3236e3c4ef48f428e0076778ed52c9.filez new file mode 100644 index 00000000000..e55c863c37f Binary files /dev/null and b/repo/objects/b0/1c0343521311d0031c5740394aad0bfa3236e3c4ef48f428e0076778ed52c9.filez differ diff --git a/repo/objects/b0/1ebf6db519c45f8f03cc477f2150c599829cfd5efd1553cac93c7f165fac5f.filez b/repo/objects/b0/1ebf6db519c45f8f03cc477f2150c599829cfd5efd1553cac93c7f165fac5f.filez new file mode 100644 index 00000000000..0789a58dd0e Binary files /dev/null and b/repo/objects/b0/1ebf6db519c45f8f03cc477f2150c599829cfd5efd1553cac93c7f165fac5f.filez differ diff --git a/repo/objects/b0/2809e41df5aa223903a852c7af8894a5e363d767f3ae39569aa79ca30546c5.dirtree b/repo/objects/b0/2809e41df5aa223903a852c7af8894a5e363d767f3ae39569aa79ca30546c5.dirtree new file mode 100644 index 00000000000..3c9e80da86c Binary files /dev/null and b/repo/objects/b0/2809e41df5aa223903a852c7af8894a5e363d767f3ae39569aa79ca30546c5.dirtree differ diff --git a/repo/objects/b0/99864adcdd45cb472ab986da681220c4c0c0b48d68fe0ab99bee81b337766c.dirtree b/repo/objects/b0/99864adcdd45cb472ab986da681220c4c0c0b48d68fe0ab99bee81b337766c.dirtree new file mode 100644 index 00000000000..1201d7b6596 Binary files /dev/null and b/repo/objects/b0/99864adcdd45cb472ab986da681220c4c0c0b48d68fe0ab99bee81b337766c.dirtree differ diff --git a/repo/objects/b0/e3dab1fcdb818ebdcda0d1d39c54b102939d7cb01c9d911017a4213524e686.filez b/repo/objects/b0/e3dab1fcdb818ebdcda0d1d39c54b102939d7cb01c9d911017a4213524e686.filez new file mode 100644 index 00000000000..2055943f497 Binary files /dev/null and b/repo/objects/b0/e3dab1fcdb818ebdcda0d1d39c54b102939d7cb01c9d911017a4213524e686.filez differ diff --git a/repo/objects/b1/04a2c888450502872da2ceec32b6f35d8c51f52a9f86959fd8eac8b067a6a2.filez b/repo/objects/b1/04a2c888450502872da2ceec32b6f35d8c51f52a9f86959fd8eac8b067a6a2.filez new file mode 100644 index 00000000000..9ed60a923a5 Binary files /dev/null and b/repo/objects/b1/04a2c888450502872da2ceec32b6f35d8c51f52a9f86959fd8eac8b067a6a2.filez differ diff --git a/repo/objects/b1/0b0d75722812c597c7cc91d3b83a6d6c6137878d7162dd52c60db59a3e01af.dirtree b/repo/objects/b1/0b0d75722812c597c7cc91d3b83a6d6c6137878d7162dd52c60db59a3e01af.dirtree new file mode 100644 index 00000000000..6124cdc2505 Binary files /dev/null and b/repo/objects/b1/0b0d75722812c597c7cc91d3b83a6d6c6137878d7162dd52c60db59a3e01af.dirtree differ diff --git a/repo/objects/b1/5706a1b167711094b151a138552eaf2db1b55cf815b75860ea49a582fb9c97.dirtree b/repo/objects/b1/5706a1b167711094b151a138552eaf2db1b55cf815b75860ea49a582fb9c97.dirtree new file mode 100644 index 00000000000..59efac2bce1 Binary files /dev/null and b/repo/objects/b1/5706a1b167711094b151a138552eaf2db1b55cf815b75860ea49a582fb9c97.dirtree differ diff --git a/repo/objects/b1/57a61381f03447ccab8b07335479b92bd7ebb6336008647ff93a4684ff1e02.filez b/repo/objects/b1/57a61381f03447ccab8b07335479b92bd7ebb6336008647ff93a4684ff1e02.filez new file mode 100644 index 00000000000..48ab942987f Binary files /dev/null and b/repo/objects/b1/57a61381f03447ccab8b07335479b92bd7ebb6336008647ff93a4684ff1e02.filez differ diff --git a/repo/objects/b1/5f86ba1551f742a3af984f36e22e64bc3475171ef5335c9f7ab6aa5e0eee9b.dirtree b/repo/objects/b1/5f86ba1551f742a3af984f36e22e64bc3475171ef5335c9f7ab6aa5e0eee9b.dirtree new file mode 100644 index 00000000000..e637e28a456 Binary files /dev/null and b/repo/objects/b1/5f86ba1551f742a3af984f36e22e64bc3475171ef5335c9f7ab6aa5e0eee9b.dirtree differ diff --git a/repo/objects/b1/8932090e9e5a1158fb5e1787df80b4ac98db2595326ea0d28bd3f331abc9a1.dirtree b/repo/objects/b1/8932090e9e5a1158fb5e1787df80b4ac98db2595326ea0d28bd3f331abc9a1.dirtree new file mode 100644 index 00000000000..6c00e950d2f Binary files /dev/null and b/repo/objects/b1/8932090e9e5a1158fb5e1787df80b4ac98db2595326ea0d28bd3f331abc9a1.dirtree differ diff --git a/repo/objects/b1/a4ac672164bdaee244347fda889c5fa1040cba2d04cf6118256d4ceab8d627.filez b/repo/objects/b1/a4ac672164bdaee244347fda889c5fa1040cba2d04cf6118256d4ceab8d627.filez new file mode 100644 index 00000000000..4ae561d0d2b Binary files /dev/null and b/repo/objects/b1/a4ac672164bdaee244347fda889c5fa1040cba2d04cf6118256d4ceab8d627.filez differ diff --git a/repo/objects/b1/af6c5d83d367f6972b031e664582ac481e9e0bf2ac3450cac0e5ec91f69ae2.filez b/repo/objects/b1/af6c5d83d367f6972b031e664582ac481e9e0bf2ac3450cac0e5ec91f69ae2.filez new file mode 100644 index 00000000000..75515952ad4 Binary files /dev/null and b/repo/objects/b1/af6c5d83d367f6972b031e664582ac481e9e0bf2ac3450cac0e5ec91f69ae2.filez differ diff --git a/repo/objects/b1/b64c2e8e3c756321a79bf2e94163cb9bde7667ee61ea6fbabc1200b7d59985.filez b/repo/objects/b1/b64c2e8e3c756321a79bf2e94163cb9bde7667ee61ea6fbabc1200b7d59985.filez new file mode 100644 index 00000000000..06d629c05e1 Binary files /dev/null and b/repo/objects/b1/b64c2e8e3c756321a79bf2e94163cb9bde7667ee61ea6fbabc1200b7d59985.filez differ diff --git a/repo/objects/b1/fa907d8c552e34f7343a6037793d4c5c73e03f23c456d99c32b05b805d1128.filez b/repo/objects/b1/fa907d8c552e34f7343a6037793d4c5c73e03f23c456d99c32b05b805d1128.filez new file mode 100644 index 00000000000..c711b66c058 Binary files /dev/null and b/repo/objects/b1/fa907d8c552e34f7343a6037793d4c5c73e03f23c456d99c32b05b805d1128.filez differ diff --git a/repo/objects/b2/067d7d5900fc21cb8f08812215467da24de3105bf07ae54987328cdeef980b.filez b/repo/objects/b2/067d7d5900fc21cb8f08812215467da24de3105bf07ae54987328cdeef980b.filez new file mode 100644 index 00000000000..4d9e91c1b8b Binary files /dev/null and b/repo/objects/b2/067d7d5900fc21cb8f08812215467da24de3105bf07ae54987328cdeef980b.filez differ diff --git a/repo/objects/b2/0a97c3312351500d73d06dc6f84047b6affc721aac7dcbe77055b4e4dd91f6.filez b/repo/objects/b2/0a97c3312351500d73d06dc6f84047b6affc721aac7dcbe77055b4e4dd91f6.filez new file mode 100644 index 00000000000..6260a47cb4a Binary files /dev/null and b/repo/objects/b2/0a97c3312351500d73d06dc6f84047b6affc721aac7dcbe77055b4e4dd91f6.filez differ diff --git a/repo/objects/b2/198500cc815e255af02370751e63bfc3f09f09871550185bae89ae30100eb1.filez b/repo/objects/b2/198500cc815e255af02370751e63bfc3f09f09871550185bae89ae30100eb1.filez new file mode 100644 index 00000000000..57a6faad928 Binary files /dev/null and b/repo/objects/b2/198500cc815e255af02370751e63bfc3f09f09871550185bae89ae30100eb1.filez differ diff --git a/repo/objects/b2/24ceae474729d1710560e56a8e024b784180842d2edb6b7be64c1c3fc0ee0d.dirtree b/repo/objects/b2/24ceae474729d1710560e56a8e024b784180842d2edb6b7be64c1c3fc0ee0d.dirtree new file mode 100644 index 00000000000..f7ae292725d Binary files /dev/null and b/repo/objects/b2/24ceae474729d1710560e56a8e024b784180842d2edb6b7be64c1c3fc0ee0d.dirtree differ diff --git a/repo/objects/b2/4403528b2e89a33ddf0f2323be6f5487db8df0dbe11e1f47124fdc3b9e85c7.filez b/repo/objects/b2/4403528b2e89a33ddf0f2323be6f5487db8df0dbe11e1f47124fdc3b9e85c7.filez new file mode 100644 index 00000000000..0698a937e7f Binary files /dev/null and b/repo/objects/b2/4403528b2e89a33ddf0f2323be6f5487db8df0dbe11e1f47124fdc3b9e85c7.filez differ diff --git a/repo/objects/b2/513cbcec18b9f7544066d59b5685c9eb10896c33324097006a3e0618d66d8b.dirtree b/repo/objects/b2/513cbcec18b9f7544066d59b5685c9eb10896c33324097006a3e0618d66d8b.dirtree new file mode 100644 index 00000000000..1133c0275f3 Binary files /dev/null and b/repo/objects/b2/513cbcec18b9f7544066d59b5685c9eb10896c33324097006a3e0618d66d8b.dirtree differ diff --git a/repo/objects/b2/5a87e0cef514ee84decd58b5588d9f83505f24516f6e43836ca86af63c58b9.filez b/repo/objects/b2/5a87e0cef514ee84decd58b5588d9f83505f24516f6e43836ca86af63c58b9.filez new file mode 100644 index 00000000000..e96e40a56e5 Binary files /dev/null and b/repo/objects/b2/5a87e0cef514ee84decd58b5588d9f83505f24516f6e43836ca86af63c58b9.filez differ diff --git a/repo/objects/b2/74b4d999d00653500b188666f0ecbcd4e51ebbaa242c6456a97bd8b926ce8a.filez b/repo/objects/b2/74b4d999d00653500b188666f0ecbcd4e51ebbaa242c6456a97bd8b926ce8a.filez new file mode 100644 index 00000000000..2097b595f54 Binary files /dev/null and b/repo/objects/b2/74b4d999d00653500b188666f0ecbcd4e51ebbaa242c6456a97bd8b926ce8a.filez differ diff --git a/repo/objects/b2/7c3883fe874b5bff648ad22f14a373f350a430159bbf153282557877aad085.dirtree b/repo/objects/b2/7c3883fe874b5bff648ad22f14a373f350a430159bbf153282557877aad085.dirtree new file mode 100644 index 00000000000..8601edba270 Binary files /dev/null and b/repo/objects/b2/7c3883fe874b5bff648ad22f14a373f350a430159bbf153282557877aad085.dirtree differ diff --git a/repo/objects/b2/95b1d86d34591e01bd71c6e5dbdab7bb8af4b8f8a5ecb23a498f98f44eb724.filez b/repo/objects/b2/95b1d86d34591e01bd71c6e5dbdab7bb8af4b8f8a5ecb23a498f98f44eb724.filez new file mode 100644 index 00000000000..3d39f9bd38d Binary files /dev/null and b/repo/objects/b2/95b1d86d34591e01bd71c6e5dbdab7bb8af4b8f8a5ecb23a498f98f44eb724.filez differ diff --git a/repo/objects/b2/ce8f3dd435ad1794b83079498916f99a0198ddf1ff0cec2602d4846371fd68.dirtree b/repo/objects/b2/ce8f3dd435ad1794b83079498916f99a0198ddf1ff0cec2602d4846371fd68.dirtree new file mode 100644 index 00000000000..a4fac1e475e Binary files /dev/null and b/repo/objects/b2/ce8f3dd435ad1794b83079498916f99a0198ddf1ff0cec2602d4846371fd68.dirtree differ diff --git a/repo/objects/b2/d086261aa2382b225b10a0962bc3af64cbdbd2f9940a5f57390b62bacb7098.filez b/repo/objects/b2/d086261aa2382b225b10a0962bc3af64cbdbd2f9940a5f57390b62bacb7098.filez new file mode 100644 index 00000000000..431200db2b9 Binary files /dev/null and b/repo/objects/b2/d086261aa2382b225b10a0962bc3af64cbdbd2f9940a5f57390b62bacb7098.filez differ diff --git a/repo/objects/b2/d19d31ae1523ef58af1947c07cfda4f7a4566fc96cafbf85d62d7864d662e8.filez b/repo/objects/b2/d19d31ae1523ef58af1947c07cfda4f7a4566fc96cafbf85d62d7864d662e8.filez new file mode 100644 index 00000000000..42c6b012ecf Binary files /dev/null and b/repo/objects/b2/d19d31ae1523ef58af1947c07cfda4f7a4566fc96cafbf85d62d7864d662e8.filez differ diff --git a/repo/objects/b2/ed0503c73358471e1664530f4a14ce55d006818bd4fd03016c9f26dd78d47d.filez b/repo/objects/b2/ed0503c73358471e1664530f4a14ce55d006818bd4fd03016c9f26dd78d47d.filez new file mode 100644 index 00000000000..1a2ec4057b9 Binary files /dev/null and b/repo/objects/b2/ed0503c73358471e1664530f4a14ce55d006818bd4fd03016c9f26dd78d47d.filez differ diff --git a/repo/objects/b2/ff033c4507054fae2a41c65d0e8c921c69f318a7a192e924dd156b1144dec9.filez b/repo/objects/b2/ff033c4507054fae2a41c65d0e8c921c69f318a7a192e924dd156b1144dec9.filez new file mode 100644 index 00000000000..8e9df92fadb Binary files /dev/null and b/repo/objects/b2/ff033c4507054fae2a41c65d0e8c921c69f318a7a192e924dd156b1144dec9.filez differ diff --git a/repo/objects/b3/002e38564918f9293d480a6adcd53dcb50c5a35f8f9399e6a300e1975a4e92.filez b/repo/objects/b3/002e38564918f9293d480a6adcd53dcb50c5a35f8f9399e6a300e1975a4e92.filez new file mode 100644 index 00000000000..75e96d85a6c Binary files /dev/null and b/repo/objects/b3/002e38564918f9293d480a6adcd53dcb50c5a35f8f9399e6a300e1975a4e92.filez differ diff --git a/repo/objects/b3/50960ed7ae939b860de3f4f4e6bd494a00918fac6e54ef43974f6b563b88a0.filez b/repo/objects/b3/50960ed7ae939b860de3f4f4e6bd494a00918fac6e54ef43974f6b563b88a0.filez new file mode 100644 index 00000000000..0240eafcbab Binary files /dev/null and b/repo/objects/b3/50960ed7ae939b860de3f4f4e6bd494a00918fac6e54ef43974f6b563b88a0.filez differ diff --git a/repo/objects/b3/697b253efd3ceee00ae9fecf38eb21f744d5cfbcfd02b647401ff28ccd814c.filez b/repo/objects/b3/697b253efd3ceee00ae9fecf38eb21f744d5cfbcfd02b647401ff28ccd814c.filez new file mode 100644 index 00000000000..874991b6601 Binary files /dev/null and b/repo/objects/b3/697b253efd3ceee00ae9fecf38eb21f744d5cfbcfd02b647401ff28ccd814c.filez differ diff --git a/repo/objects/b3/8671359727278f6a7e6e969bc74fca7a62f7bc01f356af8a069fbc4774347b.filez b/repo/objects/b3/8671359727278f6a7e6e969bc74fca7a62f7bc01f356af8a069fbc4774347b.filez new file mode 100644 index 00000000000..bd344db5b22 Binary files /dev/null and b/repo/objects/b3/8671359727278f6a7e6e969bc74fca7a62f7bc01f356af8a069fbc4774347b.filez differ diff --git a/repo/objects/b3/8da8b3d5293284a72d7edf4772efbe11a415d2c483d860c01c9a612b67cd76.filez b/repo/objects/b3/8da8b3d5293284a72d7edf4772efbe11a415d2c483d860c01c9a612b67cd76.filez new file mode 100644 index 00000000000..34a509a3aa6 Binary files /dev/null and b/repo/objects/b3/8da8b3d5293284a72d7edf4772efbe11a415d2c483d860c01c9a612b67cd76.filez differ diff --git a/repo/objects/b3/95e677c6efbc29e88ba1d1066711354eae6d3561b38604f58984d318aae8f5.filez b/repo/objects/b3/95e677c6efbc29e88ba1d1066711354eae6d3561b38604f58984d318aae8f5.filez new file mode 100644 index 00000000000..2c4395689a3 Binary files /dev/null and b/repo/objects/b3/95e677c6efbc29e88ba1d1066711354eae6d3561b38604f58984d318aae8f5.filez differ diff --git a/repo/objects/b3/b294b377be41dfafd567c701b8c3a6bb3e945d91d72a414b170bf1b420413b.filez b/repo/objects/b3/b294b377be41dfafd567c701b8c3a6bb3e945d91d72a414b170bf1b420413b.filez new file mode 100644 index 00000000000..7fff663bcd1 Binary files /dev/null and b/repo/objects/b3/b294b377be41dfafd567c701b8c3a6bb3e945d91d72a414b170bf1b420413b.filez differ diff --git a/repo/objects/b3/c4c64375b16836d0843df9cd1aa6a7f2f56c732e9838016458f73ba2b65877.dirtree b/repo/objects/b3/c4c64375b16836d0843df9cd1aa6a7f2f56c732e9838016458f73ba2b65877.dirtree new file mode 100644 index 00000000000..0e1fffd0270 Binary files /dev/null and b/repo/objects/b3/c4c64375b16836d0843df9cd1aa6a7f2f56c732e9838016458f73ba2b65877.dirtree differ diff --git a/repo/objects/b4/0037b39e417659cf11220ec475a71afe2116889b1edc17df641ed44ccb639c.filez b/repo/objects/b4/0037b39e417659cf11220ec475a71afe2116889b1edc17df641ed44ccb639c.filez new file mode 100644 index 00000000000..d703278e743 Binary files /dev/null and b/repo/objects/b4/0037b39e417659cf11220ec475a71afe2116889b1edc17df641ed44ccb639c.filez differ diff --git a/repo/objects/b4/364db6eb447bc5f34a04bb99b3fd00818e51f7f1a68883c3c6901cdf9813a9.dirtree b/repo/objects/b4/364db6eb447bc5f34a04bb99b3fd00818e51f7f1a68883c3c6901cdf9813a9.dirtree new file mode 100644 index 00000000000..60f26f4db1e Binary files /dev/null and b/repo/objects/b4/364db6eb447bc5f34a04bb99b3fd00818e51f7f1a68883c3c6901cdf9813a9.dirtree differ diff --git a/repo/objects/b4/5b29a3aa1c8430d2cacb860a2c7d1a605c10a3c7402de47e94091610e4c7dd.dirtree b/repo/objects/b4/5b29a3aa1c8430d2cacb860a2c7d1a605c10a3c7402de47e94091610e4c7dd.dirtree new file mode 100644 index 00000000000..45e3db54641 Binary files /dev/null and b/repo/objects/b4/5b29a3aa1c8430d2cacb860a2c7d1a605c10a3c7402de47e94091610e4c7dd.dirtree differ diff --git a/repo/objects/b4/6455831c63c1b6bd91b77d02fe239f780883803f3edd1c76acafa4a0c90b94.filez b/repo/objects/b4/6455831c63c1b6bd91b77d02fe239f780883803f3edd1c76acafa4a0c90b94.filez new file mode 100644 index 00000000000..232e41e3ece Binary files /dev/null and b/repo/objects/b4/6455831c63c1b6bd91b77d02fe239f780883803f3edd1c76acafa4a0c90b94.filez differ diff --git a/repo/objects/b4/645a354b6ffd88b40d800ef09a88124ba8c691a3b5cd762bf1a70c4c210f96.filez b/repo/objects/b4/645a354b6ffd88b40d800ef09a88124ba8c691a3b5cd762bf1a70c4c210f96.filez new file mode 100644 index 00000000000..976c3558a91 Binary files /dev/null and b/repo/objects/b4/645a354b6ffd88b40d800ef09a88124ba8c691a3b5cd762bf1a70c4c210f96.filez differ diff --git a/repo/objects/b4/72b57ab6383ea39884d4aac66fae1f93d94b5a4ccc4e37cbf9be690153b8d5.filez b/repo/objects/b4/72b57ab6383ea39884d4aac66fae1f93d94b5a4ccc4e37cbf9be690153b8d5.filez new file mode 100644 index 00000000000..8317f1fcca2 Binary files /dev/null and b/repo/objects/b4/72b57ab6383ea39884d4aac66fae1f93d94b5a4ccc4e37cbf9be690153b8d5.filez differ diff --git a/repo/objects/b4/bd69e3a4532d24882bc750144ab6a02e414cd08472227958a82241e53ba0f0.dirtree b/repo/objects/b4/bd69e3a4532d24882bc750144ab6a02e414cd08472227958a82241e53ba0f0.dirtree new file mode 100644 index 00000000000..3920d84229c Binary files /dev/null and b/repo/objects/b4/bd69e3a4532d24882bc750144ab6a02e414cd08472227958a82241e53ba0f0.dirtree differ diff --git a/repo/objects/b5/04a1619129f345e96eb3348e1cebf844fee5cc2d74f908ed356ca5743eac12.filez b/repo/objects/b5/04a1619129f345e96eb3348e1cebf844fee5cc2d74f908ed356ca5743eac12.filez new file mode 100644 index 00000000000..ac44ad6caea Binary files /dev/null and b/repo/objects/b5/04a1619129f345e96eb3348e1cebf844fee5cc2d74f908ed356ca5743eac12.filez differ diff --git a/repo/objects/b5/0aee0aa609ecd278426d3bad1225ddd40fb1fd86bcf6db87f40a984f7432df.filez b/repo/objects/b5/0aee0aa609ecd278426d3bad1225ddd40fb1fd86bcf6db87f40a984f7432df.filez new file mode 100644 index 00000000000..1b1c1f2271e Binary files /dev/null and b/repo/objects/b5/0aee0aa609ecd278426d3bad1225ddd40fb1fd86bcf6db87f40a984f7432df.filez differ diff --git a/repo/objects/b5/22beaef59e376ca55c4c19600d7a7ed5c63a17a78a9a342dd28dcecf3d69be.filez b/repo/objects/b5/22beaef59e376ca55c4c19600d7a7ed5c63a17a78a9a342dd28dcecf3d69be.filez new file mode 100644 index 00000000000..57be1e0ea29 Binary files /dev/null and b/repo/objects/b5/22beaef59e376ca55c4c19600d7a7ed5c63a17a78a9a342dd28dcecf3d69be.filez differ diff --git a/repo/objects/b5/2fa252be993163d4447c51beed5c0054133662c63ce3faa405cc9036efeef8.filez b/repo/objects/b5/2fa252be993163d4447c51beed5c0054133662c63ce3faa405cc9036efeef8.filez new file mode 100644 index 00000000000..c13c2e7c4fa Binary files /dev/null and b/repo/objects/b5/2fa252be993163d4447c51beed5c0054133662c63ce3faa405cc9036efeef8.filez differ diff --git a/repo/objects/b5/703c0d67194e4849ae07921645ef13d8bda19c4b39accaf6ebedd87e2e2e6b.filez b/repo/objects/b5/703c0d67194e4849ae07921645ef13d8bda19c4b39accaf6ebedd87e2e2e6b.filez new file mode 100644 index 00000000000..f65929cfd49 Binary files /dev/null and b/repo/objects/b5/703c0d67194e4849ae07921645ef13d8bda19c4b39accaf6ebedd87e2e2e6b.filez differ diff --git a/repo/objects/b5/70d13361fd57344a3b8023bad8ff60bfa41a5cfe4954bf7f56bcfc5c098086.filez b/repo/objects/b5/70d13361fd57344a3b8023bad8ff60bfa41a5cfe4954bf7f56bcfc5c098086.filez new file mode 100644 index 00000000000..16a089ef890 Binary files /dev/null and b/repo/objects/b5/70d13361fd57344a3b8023bad8ff60bfa41a5cfe4954bf7f56bcfc5c098086.filez differ diff --git a/repo/objects/b5/7c7bcddc0d6fd2689cb12b1db760b3be73e9c291a723cfdc48ac67eb3710e3.dirtree b/repo/objects/b5/7c7bcddc0d6fd2689cb12b1db760b3be73e9c291a723cfdc48ac67eb3710e3.dirtree new file mode 100644 index 00000000000..480aee16e73 Binary files /dev/null and b/repo/objects/b5/7c7bcddc0d6fd2689cb12b1db760b3be73e9c291a723cfdc48ac67eb3710e3.dirtree differ diff --git a/repo/objects/b5/ad7cd38f706824adca0ecc2e8927aa3097f84be3cbc556cc2ad7f92510b1d3.filez b/repo/objects/b5/ad7cd38f706824adca0ecc2e8927aa3097f84be3cbc556cc2ad7f92510b1d3.filez new file mode 100644 index 00000000000..4fd7b741ca3 Binary files /dev/null and b/repo/objects/b5/ad7cd38f706824adca0ecc2e8927aa3097f84be3cbc556cc2ad7f92510b1d3.filez differ diff --git a/repo/objects/b5/c661ec74d647e6722037a426bf7b15be4be8aa704eb38ec0199889ec2b3144.filez b/repo/objects/b5/c661ec74d647e6722037a426bf7b15be4be8aa704eb38ec0199889ec2b3144.filez new file mode 100644 index 00000000000..c05d59e1e37 Binary files /dev/null and b/repo/objects/b5/c661ec74d647e6722037a426bf7b15be4be8aa704eb38ec0199889ec2b3144.filez differ diff --git a/repo/objects/b5/c93617d08b15831b1ccc124393a470c4f2c1044b3ace4065eb4af4ec075c1b.filez b/repo/objects/b5/c93617d08b15831b1ccc124393a470c4f2c1044b3ace4065eb4af4ec075c1b.filez new file mode 100644 index 00000000000..d14a3e429c1 Binary files /dev/null and b/repo/objects/b5/c93617d08b15831b1ccc124393a470c4f2c1044b3ace4065eb4af4ec075c1b.filez differ diff --git a/repo/objects/b5/ecc0abae0d86706af10e41e5ef0b6327f55f614f52eb5ce22bf205b979badf.filez b/repo/objects/b5/ecc0abae0d86706af10e41e5ef0b6327f55f614f52eb5ce22bf205b979badf.filez new file mode 100644 index 00000000000..b5f4e7d2cd7 Binary files /dev/null and b/repo/objects/b5/ecc0abae0d86706af10e41e5ef0b6327f55f614f52eb5ce22bf205b979badf.filez differ diff --git a/repo/objects/b5/eec356821dca74bf26b1e4f756a04bf21cf8ad4325c999ec2152140b669e75.dirtree b/repo/objects/b5/eec356821dca74bf26b1e4f756a04bf21cf8ad4325c999ec2152140b669e75.dirtree new file mode 100644 index 00000000000..3240bb7987b Binary files /dev/null and b/repo/objects/b5/eec356821dca74bf26b1e4f756a04bf21cf8ad4325c999ec2152140b669e75.dirtree differ diff --git a/repo/objects/b5/f9ddaee6bdb378926b70806420588ae6822342dc8980bf32062c086286702e.filez b/repo/objects/b5/f9ddaee6bdb378926b70806420588ae6822342dc8980bf32062c086286702e.filez new file mode 100644 index 00000000000..de0b79c8198 Binary files /dev/null and b/repo/objects/b5/f9ddaee6bdb378926b70806420588ae6822342dc8980bf32062c086286702e.filez differ diff --git a/repo/objects/b6/18fb7ee156358bf2ceaf6f7ab9487fa3a2037341db3a16ee90710ade4e4cb0.filez b/repo/objects/b6/18fb7ee156358bf2ceaf6f7ab9487fa3a2037341db3a16ee90710ade4e4cb0.filez new file mode 100644 index 00000000000..9337b3fca36 Binary files /dev/null and b/repo/objects/b6/18fb7ee156358bf2ceaf6f7ab9487fa3a2037341db3a16ee90710ade4e4cb0.filez differ diff --git a/repo/objects/b6/1c80178191447c1160ee6db6c84efa15300dca7d6640a51a143b7fe37364b6.filez b/repo/objects/b6/1c80178191447c1160ee6db6c84efa15300dca7d6640a51a143b7fe37364b6.filez new file mode 100644 index 00000000000..4d420de3721 Binary files /dev/null and b/repo/objects/b6/1c80178191447c1160ee6db6c84efa15300dca7d6640a51a143b7fe37364b6.filez differ diff --git a/repo/objects/b6/25ef5a8d3df8a31e3d82b56d56ef3a22abc107fac48a18d860b707b4496682.filez b/repo/objects/b6/25ef5a8d3df8a31e3d82b56d56ef3a22abc107fac48a18d860b707b4496682.filez new file mode 100644 index 00000000000..916a0e9a80f Binary files /dev/null and b/repo/objects/b6/25ef5a8d3df8a31e3d82b56d56ef3a22abc107fac48a18d860b707b4496682.filez differ diff --git a/repo/objects/b6/471e82b9f4a3d30c622955d64dfb237e1a406b860e78d5fa47da778a573bc5.filez b/repo/objects/b6/471e82b9f4a3d30c622955d64dfb237e1a406b860e78d5fa47da778a573bc5.filez new file mode 100644 index 00000000000..23e6ed4d1a4 Binary files /dev/null and b/repo/objects/b6/471e82b9f4a3d30c622955d64dfb237e1a406b860e78d5fa47da778a573bc5.filez differ diff --git a/repo/objects/b6/60da490344e677b331f815200a791c557388c0471e576acb29f29a63da15c3.filez b/repo/objects/b6/60da490344e677b331f815200a791c557388c0471e576acb29f29a63da15c3.filez new file mode 100644 index 00000000000..6a50cf40ebe Binary files /dev/null and b/repo/objects/b6/60da490344e677b331f815200a791c557388c0471e576acb29f29a63da15c3.filez differ diff --git a/repo/objects/b6/6450ccb67f193e26a3a531caa563eb60360eb7786890b06607693f46e1d33f.filez b/repo/objects/b6/6450ccb67f193e26a3a531caa563eb60360eb7786890b06607693f46e1d33f.filez new file mode 100644 index 00000000000..4aaad8761f5 Binary files /dev/null and b/repo/objects/b6/6450ccb67f193e26a3a531caa563eb60360eb7786890b06607693f46e1d33f.filez differ diff --git a/repo/objects/b6/6c30080f2246ad885798a57ea96589e4cdf741ba414ea6c1f9aa7cff050748.filez b/repo/objects/b6/6c30080f2246ad885798a57ea96589e4cdf741ba414ea6c1f9aa7cff050748.filez new file mode 100644 index 00000000000..06fe372507b Binary files /dev/null and b/repo/objects/b6/6c30080f2246ad885798a57ea96589e4cdf741ba414ea6c1f9aa7cff050748.filez differ diff --git a/repo/objects/b6/8db0c3017356e7b3194ff95dcd0328e055a0fcfa051247746608815726d921.dirtree b/repo/objects/b6/8db0c3017356e7b3194ff95dcd0328e055a0fcfa051247746608815726d921.dirtree new file mode 100644 index 00000000000..8f691c5ff2f Binary files /dev/null and b/repo/objects/b6/8db0c3017356e7b3194ff95dcd0328e055a0fcfa051247746608815726d921.dirtree differ diff --git a/repo/objects/b6/9a31b35e720124ff34dc91dcda8d9847f9d67abbaad3bd960765208bd7bc26.filez b/repo/objects/b6/9a31b35e720124ff34dc91dcda8d9847f9d67abbaad3bd960765208bd7bc26.filez new file mode 100644 index 00000000000..4d5908d2a16 Binary files /dev/null and b/repo/objects/b6/9a31b35e720124ff34dc91dcda8d9847f9d67abbaad3bd960765208bd7bc26.filez differ diff --git a/repo/objects/b6/a8187b8786f54b47c448c03be6f2c67bf4b1925d394de1b1c231caf5839166.filez b/repo/objects/b6/a8187b8786f54b47c448c03be6f2c67bf4b1925d394de1b1c231caf5839166.filez new file mode 100644 index 00000000000..f549353a846 Binary files /dev/null and b/repo/objects/b6/a8187b8786f54b47c448c03be6f2c67bf4b1925d394de1b1c231caf5839166.filez differ diff --git a/repo/objects/b6/b8dd6054e0307919f0c77e7c53ac738669441393cf1c66c93b939a1bc5d29e.filez b/repo/objects/b6/b8dd6054e0307919f0c77e7c53ac738669441393cf1c66c93b939a1bc5d29e.filez new file mode 100644 index 00000000000..01f3a2a66e9 Binary files /dev/null and b/repo/objects/b6/b8dd6054e0307919f0c77e7c53ac738669441393cf1c66c93b939a1bc5d29e.filez differ diff --git a/repo/objects/b6/b9a9b130ea91b5716476f29bd65e8400a4037fd842f3002daa13c2724694aa.dirtree b/repo/objects/b6/b9a9b130ea91b5716476f29bd65e8400a4037fd842f3002daa13c2724694aa.dirtree new file mode 100644 index 00000000000..684929548fa Binary files /dev/null and b/repo/objects/b6/b9a9b130ea91b5716476f29bd65e8400a4037fd842f3002daa13c2724694aa.dirtree differ diff --git a/repo/objects/b6/bbd50e0383c52e2e63a5bffe3c5b3e38b3cb41d98397a5f6e88c289b59b017.filez b/repo/objects/b6/bbd50e0383c52e2e63a5bffe3c5b3e38b3cb41d98397a5f6e88c289b59b017.filez new file mode 100644 index 00000000000..785e4f857c0 Binary files /dev/null and b/repo/objects/b6/bbd50e0383c52e2e63a5bffe3c5b3e38b3cb41d98397a5f6e88c289b59b017.filez differ diff --git a/repo/objects/b6/c974554c1fb9ea53457a0767bc2d43e3ac826ef4d2df151e2cf1dce0814285.dirtree b/repo/objects/b6/c974554c1fb9ea53457a0767bc2d43e3ac826ef4d2df151e2cf1dce0814285.dirtree new file mode 100644 index 00000000000..42c49cfed07 Binary files /dev/null and b/repo/objects/b6/c974554c1fb9ea53457a0767bc2d43e3ac826ef4d2df151e2cf1dce0814285.dirtree differ diff --git a/repo/objects/b6/dcd73f76a97fd96ea1c01b8e61c5717209911c05f0098e8381c0864a872500.filez b/repo/objects/b6/dcd73f76a97fd96ea1c01b8e61c5717209911c05f0098e8381c0864a872500.filez new file mode 100644 index 00000000000..d37e92ad638 Binary files /dev/null and b/repo/objects/b6/dcd73f76a97fd96ea1c01b8e61c5717209911c05f0098e8381c0864a872500.filez differ diff --git a/repo/objects/b6/ea16f8100a3695938d10629810ab4c3f74cb0048dd93c7f6dc26d573b5d973.filez b/repo/objects/b6/ea16f8100a3695938d10629810ab4c3f74cb0048dd93c7f6dc26d573b5d973.filez new file mode 100644 index 00000000000..71b1fe028c3 Binary files /dev/null and b/repo/objects/b6/ea16f8100a3695938d10629810ab4c3f74cb0048dd93c7f6dc26d573b5d973.filez differ diff --git a/repo/objects/b7/11c72ba75ced6687bcc4775846fb78eb5e8cfdb2d6d6aa2e763a481420b779.filez b/repo/objects/b7/11c72ba75ced6687bcc4775846fb78eb5e8cfdb2d6d6aa2e763a481420b779.filez new file mode 100644 index 00000000000..9515f6f2b98 Binary files /dev/null and b/repo/objects/b7/11c72ba75ced6687bcc4775846fb78eb5e8cfdb2d6d6aa2e763a481420b779.filez differ diff --git a/repo/objects/b7/13a4c0bd08a21c8a1d9cd0ceebbda5e08b70b794585ce4490fedb2b228c22a.filez b/repo/objects/b7/13a4c0bd08a21c8a1d9cd0ceebbda5e08b70b794585ce4490fedb2b228c22a.filez new file mode 100644 index 00000000000..1d327b04d55 Binary files /dev/null and b/repo/objects/b7/13a4c0bd08a21c8a1d9cd0ceebbda5e08b70b794585ce4490fedb2b228c22a.filez differ diff --git a/repo/objects/b7/195cad8d3ef19d335c16f7743efaeefbd7ce9de0e40dce76dd4a52ea8cc2f8.dirtree b/repo/objects/b7/195cad8d3ef19d335c16f7743efaeefbd7ce9de0e40dce76dd4a52ea8cc2f8.dirtree new file mode 100644 index 00000000000..d4854c55091 Binary files /dev/null and b/repo/objects/b7/195cad8d3ef19d335c16f7743efaeefbd7ce9de0e40dce76dd4a52ea8cc2f8.dirtree differ diff --git a/repo/objects/b7/1cfd8246d050a76628fae13922158e7d5e84c2b77a31a92f2b7e9b5d256e02.dirtree b/repo/objects/b7/1cfd8246d050a76628fae13922158e7d5e84c2b77a31a92f2b7e9b5d256e02.dirtree new file mode 100644 index 00000000000..5709038d44e Binary files /dev/null and b/repo/objects/b7/1cfd8246d050a76628fae13922158e7d5e84c2b77a31a92f2b7e9b5d256e02.dirtree differ diff --git a/repo/objects/b7/4d93d4be9b19559c729ac8c235ab306b4724b54cc353e42adb162d64e2659b.filez b/repo/objects/b7/4d93d4be9b19559c729ac8c235ab306b4724b54cc353e42adb162d64e2659b.filez new file mode 100644 index 00000000000..560031a083d Binary files /dev/null and b/repo/objects/b7/4d93d4be9b19559c729ac8c235ab306b4724b54cc353e42adb162d64e2659b.filez differ diff --git a/repo/objects/b7/52e6e7f289132e4be6aee03198435ae0cde57ddf32b3ccce8b8b58ece70f80.filez b/repo/objects/b7/52e6e7f289132e4be6aee03198435ae0cde57ddf32b3ccce8b8b58ece70f80.filez new file mode 100644 index 00000000000..ee3c92f7c07 Binary files /dev/null and b/repo/objects/b7/52e6e7f289132e4be6aee03198435ae0cde57ddf32b3ccce8b8b58ece70f80.filez differ diff --git a/repo/objects/b7/64a8d7105546c16beeb8bc8fcc850a1219034ead74fe8793e93bb120688580.filez b/repo/objects/b7/64a8d7105546c16beeb8bc8fcc850a1219034ead74fe8793e93bb120688580.filez new file mode 100644 index 00000000000..93f0277dee1 Binary files /dev/null and b/repo/objects/b7/64a8d7105546c16beeb8bc8fcc850a1219034ead74fe8793e93bb120688580.filez differ diff --git a/repo/objects/b7/9b4b6c649f83d861b56f827baf9dde77294c2aa5d75f37bed71d01ead45ada.filez b/repo/objects/b7/9b4b6c649f83d861b56f827baf9dde77294c2aa5d75f37bed71d01ead45ada.filez new file mode 100644 index 00000000000..ff4058b15ca Binary files /dev/null and b/repo/objects/b7/9b4b6c649f83d861b56f827baf9dde77294c2aa5d75f37bed71d01ead45ada.filez differ diff --git a/repo/objects/b7/a60021dfdf427f20679cefdbf85a8fa5aeb3a42d08d40ee19d2ab1cc406287.filez b/repo/objects/b7/a60021dfdf427f20679cefdbf85a8fa5aeb3a42d08d40ee19d2ab1cc406287.filez new file mode 100644 index 00000000000..1516aedc80a Binary files /dev/null and b/repo/objects/b7/a60021dfdf427f20679cefdbf85a8fa5aeb3a42d08d40ee19d2ab1cc406287.filez differ diff --git a/repo/objects/b7/ccf14d7165069780fdc5e3cb5eb8799617689d6d1a00f320bbbccbc75ee720.filez b/repo/objects/b7/ccf14d7165069780fdc5e3cb5eb8799617689d6d1a00f320bbbccbc75ee720.filez new file mode 100644 index 00000000000..33e7b45aef4 Binary files /dev/null and b/repo/objects/b7/ccf14d7165069780fdc5e3cb5eb8799617689d6d1a00f320bbbccbc75ee720.filez differ diff --git a/repo/objects/b7/d1af6b36106fad38da8e2eb2d6d06758de1039f82b9d1141b0090119b11a93.dirtree b/repo/objects/b7/d1af6b36106fad38da8e2eb2d6d06758de1039f82b9d1141b0090119b11a93.dirtree new file mode 100644 index 00000000000..684847dddee Binary files /dev/null and b/repo/objects/b7/d1af6b36106fad38da8e2eb2d6d06758de1039f82b9d1141b0090119b11a93.dirtree differ diff --git a/repo/objects/b7/ddeaf031ba8144cd7406a7b38c28ea1524b3e3af7ebd1b59d8197e2b6ec771.dirtree b/repo/objects/b7/ddeaf031ba8144cd7406a7b38c28ea1524b3e3af7ebd1b59d8197e2b6ec771.dirtree new file mode 100644 index 00000000000..faba190ee15 Binary files /dev/null and b/repo/objects/b7/ddeaf031ba8144cd7406a7b38c28ea1524b3e3af7ebd1b59d8197e2b6ec771.dirtree differ diff --git a/repo/objects/b7/df0ee8ccc51fc960fa195bfcb4561cb90304eaef3cc98f7cb52d20586b234f.filez b/repo/objects/b7/df0ee8ccc51fc960fa195bfcb4561cb90304eaef3cc98f7cb52d20586b234f.filez new file mode 100644 index 00000000000..338b6bdd6dc Binary files /dev/null and b/repo/objects/b7/df0ee8ccc51fc960fa195bfcb4561cb90304eaef3cc98f7cb52d20586b234f.filez differ diff --git a/repo/objects/b7/f7ccac06616068e2681c339e50316c42f8160745209c12a18cfad18f041150.filez b/repo/objects/b7/f7ccac06616068e2681c339e50316c42f8160745209c12a18cfad18f041150.filez new file mode 100644 index 00000000000..49aefe1e14d Binary files /dev/null and b/repo/objects/b7/f7ccac06616068e2681c339e50316c42f8160745209c12a18cfad18f041150.filez differ diff --git a/repo/objects/b8/0fdb9bf9281b98ebe82123ed155b83d715b27f059b00980adf1ae03c5401bf.dirtree b/repo/objects/b8/0fdb9bf9281b98ebe82123ed155b83d715b27f059b00980adf1ae03c5401bf.dirtree new file mode 100644 index 00000000000..91fedac6669 Binary files /dev/null and b/repo/objects/b8/0fdb9bf9281b98ebe82123ed155b83d715b27f059b00980adf1ae03c5401bf.dirtree differ diff --git a/repo/objects/b8/144e8fef9488c395f0d279c38d4c1415399b2260a1bb1c9b7749fe20894fa1.filez b/repo/objects/b8/144e8fef9488c395f0d279c38d4c1415399b2260a1bb1c9b7749fe20894fa1.filez new file mode 100644 index 00000000000..a7ba7ff4cfc Binary files /dev/null and b/repo/objects/b8/144e8fef9488c395f0d279c38d4c1415399b2260a1bb1c9b7749fe20894fa1.filez differ diff --git a/repo/objects/b8/20964574bbcb377aee3bf44031fb172b55668244782fbc384909b1ae22999e.dirtree b/repo/objects/b8/20964574bbcb377aee3bf44031fb172b55668244782fbc384909b1ae22999e.dirtree new file mode 100644 index 00000000000..6df1e74d444 Binary files /dev/null and b/repo/objects/b8/20964574bbcb377aee3bf44031fb172b55668244782fbc384909b1ae22999e.dirtree differ diff --git a/repo/objects/b8/3a9f56493b7b6735c1a699fdb0f9c851b0eccdd70305f9729c8ce7eb612355.filez b/repo/objects/b8/3a9f56493b7b6735c1a699fdb0f9c851b0eccdd70305f9729c8ce7eb612355.filez new file mode 100644 index 00000000000..d5af7c659f2 Binary files /dev/null and b/repo/objects/b8/3a9f56493b7b6735c1a699fdb0f9c851b0eccdd70305f9729c8ce7eb612355.filez differ diff --git a/repo/objects/b8/569312e7b5672c7fccf9fd181d62dee6f308b36c80059b280dd8ab9296e8c4.filez b/repo/objects/b8/569312e7b5672c7fccf9fd181d62dee6f308b36c80059b280dd8ab9296e8c4.filez new file mode 100644 index 00000000000..b8388d90ad1 Binary files /dev/null and b/repo/objects/b8/569312e7b5672c7fccf9fd181d62dee6f308b36c80059b280dd8ab9296e8c4.filez differ diff --git a/repo/objects/b8/70a6757997871f4ebc2365d1e4811e0ed21bb8559a1b0ff0940a5d06db166d.filez b/repo/objects/b8/70a6757997871f4ebc2365d1e4811e0ed21bb8559a1b0ff0940a5d06db166d.filez new file mode 100644 index 00000000000..2a116e06538 Binary files /dev/null and b/repo/objects/b8/70a6757997871f4ebc2365d1e4811e0ed21bb8559a1b0ff0940a5d06db166d.filez differ diff --git a/repo/objects/b8/852697da12514d91e16c2a1eb2ed3f8aeef72485e72438aa1b41b4920475f3.filez b/repo/objects/b8/852697da12514d91e16c2a1eb2ed3f8aeef72485e72438aa1b41b4920475f3.filez new file mode 100644 index 00000000000..c4be7627e10 Binary files /dev/null and b/repo/objects/b8/852697da12514d91e16c2a1eb2ed3f8aeef72485e72438aa1b41b4920475f3.filez differ diff --git a/repo/objects/b8/c35d327ff2d1866201a15638c545c917d758ef2d2a65f8595f4eb4112ac861.filez b/repo/objects/b8/c35d327ff2d1866201a15638c545c917d758ef2d2a65f8595f4eb4112ac861.filez new file mode 100644 index 00000000000..f301fb8df51 Binary files /dev/null and b/repo/objects/b8/c35d327ff2d1866201a15638c545c917d758ef2d2a65f8595f4eb4112ac861.filez differ diff --git a/repo/objects/b8/d66ce93542ad7dc53f3fa7335bb4514a3db8d226ff8f8909cd699a315c495d.filez b/repo/objects/b8/d66ce93542ad7dc53f3fa7335bb4514a3db8d226ff8f8909cd699a315c495d.filez new file mode 100644 index 00000000000..7f21f819e13 Binary files /dev/null and b/repo/objects/b8/d66ce93542ad7dc53f3fa7335bb4514a3db8d226ff8f8909cd699a315c495d.filez differ diff --git a/repo/objects/b9/01cd7600c50d6cffa283391c7ecb6dbcb28f77fa282f57330642e914ba7cfb.filez b/repo/objects/b9/01cd7600c50d6cffa283391c7ecb6dbcb28f77fa282f57330642e914ba7cfb.filez new file mode 100644 index 00000000000..fac3b2da3a5 Binary files /dev/null and b/repo/objects/b9/01cd7600c50d6cffa283391c7ecb6dbcb28f77fa282f57330642e914ba7cfb.filez differ diff --git a/repo/objects/b9/2caacfc14f58f4289b9ff4c56e4ca0b4bd5a6f41907419a4ec33f2c319733b.dirtree b/repo/objects/b9/2caacfc14f58f4289b9ff4c56e4ca0b4bd5a6f41907419a4ec33f2c319733b.dirtree new file mode 100644 index 00000000000..deb506fed81 Binary files /dev/null and b/repo/objects/b9/2caacfc14f58f4289b9ff4c56e4ca0b4bd5a6f41907419a4ec33f2c319733b.dirtree differ diff --git a/repo/objects/b9/2df48bfb00a23f51f9c2455c0d4eb9d9dabf18566eb6806b8a57f08c6ceb08.filez b/repo/objects/b9/2df48bfb00a23f51f9c2455c0d4eb9d9dabf18566eb6806b8a57f08c6ceb08.filez new file mode 100644 index 00000000000..e43cd09d094 Binary files /dev/null and b/repo/objects/b9/2df48bfb00a23f51f9c2455c0d4eb9d9dabf18566eb6806b8a57f08c6ceb08.filez differ diff --git a/repo/objects/b9/3a6ab764bec678567032adcfaa011eb4a8a1b51e23e4ae5231b09df1e92c1d.filez b/repo/objects/b9/3a6ab764bec678567032adcfaa011eb4a8a1b51e23e4ae5231b09df1e92c1d.filez new file mode 100644 index 00000000000..1772f88dbfb Binary files /dev/null and b/repo/objects/b9/3a6ab764bec678567032adcfaa011eb4a8a1b51e23e4ae5231b09df1e92c1d.filez differ diff --git a/repo/objects/b9/58739981327458cb78dc8f31bd60e3f86be5b5980e9e26ea2ec1aa8e40ce0e.filez b/repo/objects/b9/58739981327458cb78dc8f31bd60e3f86be5b5980e9e26ea2ec1aa8e40ce0e.filez new file mode 100644 index 00000000000..71b81967af4 Binary files /dev/null and b/repo/objects/b9/58739981327458cb78dc8f31bd60e3f86be5b5980e9e26ea2ec1aa8e40ce0e.filez differ diff --git a/repo/objects/b9/76f11881d58e30333373c634ceb6934373c6fdec4ed283a86bc63003fe5770.filez b/repo/objects/b9/76f11881d58e30333373c634ceb6934373c6fdec4ed283a86bc63003fe5770.filez new file mode 100644 index 00000000000..fac8424cc75 Binary files /dev/null and b/repo/objects/b9/76f11881d58e30333373c634ceb6934373c6fdec4ed283a86bc63003fe5770.filez differ diff --git a/repo/objects/b9/7d45b544f2931ed4f89c13b8aa46b4e45bfea3ef15d2d728ea814521c5e945.filez b/repo/objects/b9/7d45b544f2931ed4f89c13b8aa46b4e45bfea3ef15d2d728ea814521c5e945.filez new file mode 100644 index 00000000000..f0e6208df44 Binary files /dev/null and b/repo/objects/b9/7d45b544f2931ed4f89c13b8aa46b4e45bfea3ef15d2d728ea814521c5e945.filez differ diff --git a/repo/objects/b9/8b141ac27318b9ca79c5b4d190e50ffffcdc709ed565c7c5fb57f723f83632.filez b/repo/objects/b9/8b141ac27318b9ca79c5b4d190e50ffffcdc709ed565c7c5fb57f723f83632.filez new file mode 100644 index 00000000000..6ddb113dc5d Binary files /dev/null and b/repo/objects/b9/8b141ac27318b9ca79c5b4d190e50ffffcdc709ed565c7c5fb57f723f83632.filez differ diff --git a/repo/objects/b9/d9fa9d15f8a8ab1e0e5342c2e5c00af85b8b41d53c9b6476362437d67cdbf3.filez b/repo/objects/b9/d9fa9d15f8a8ab1e0e5342c2e5c00af85b8b41d53c9b6476362437d67cdbf3.filez new file mode 100644 index 00000000000..b2d4ee445ab Binary files /dev/null and b/repo/objects/b9/d9fa9d15f8a8ab1e0e5342c2e5c00af85b8b41d53c9b6476362437d67cdbf3.filez differ diff --git a/repo/objects/b9/fc64a9e540d70e763479488aa9d3efb88333d888f2481208c68e2f30f3da9a.filez b/repo/objects/b9/fc64a9e540d70e763479488aa9d3efb88333d888f2481208c68e2f30f3da9a.filez new file mode 100644 index 00000000000..844e9b6e3fe Binary files /dev/null and b/repo/objects/b9/fc64a9e540d70e763479488aa9d3efb88333d888f2481208c68e2f30f3da9a.filez differ diff --git a/repo/objects/ba/3c7c55f03d4eabc0c4e96c690d00abd5800823a726962850ab67b5b62686a6.filez b/repo/objects/ba/3c7c55f03d4eabc0c4e96c690d00abd5800823a726962850ab67b5b62686a6.filez new file mode 100644 index 00000000000..288690de031 Binary files /dev/null and b/repo/objects/ba/3c7c55f03d4eabc0c4e96c690d00abd5800823a726962850ab67b5b62686a6.filez differ diff --git a/repo/objects/ba/4978986185a0eb4929b8ba1e67b5ef7f7bc521ac7b6f48d1ffafb0a15c11b3.filez b/repo/objects/ba/4978986185a0eb4929b8ba1e67b5ef7f7bc521ac7b6f48d1ffafb0a15c11b3.filez new file mode 100644 index 00000000000..80f755256bd Binary files /dev/null and b/repo/objects/ba/4978986185a0eb4929b8ba1e67b5ef7f7bc521ac7b6f48d1ffafb0a15c11b3.filez differ diff --git a/repo/objects/ba/60e21032f9ca017088df8fd9e4e1cda7dccb5b27b1d0d0c7f2bed7dbb6b2ab.filez b/repo/objects/ba/60e21032f9ca017088df8fd9e4e1cda7dccb5b27b1d0d0c7f2bed7dbb6b2ab.filez new file mode 100644 index 00000000000..eba8a1936d9 Binary files /dev/null and b/repo/objects/ba/60e21032f9ca017088df8fd9e4e1cda7dccb5b27b1d0d0c7f2bed7dbb6b2ab.filez differ diff --git a/repo/objects/ba/680e6bb80f482eb6e645ba893ffa016a24cd32eb4417a243d6da264a63d0ad.filez b/repo/objects/ba/680e6bb80f482eb6e645ba893ffa016a24cd32eb4417a243d6da264a63d0ad.filez new file mode 100644 index 00000000000..f10b83e93ab Binary files /dev/null and b/repo/objects/ba/680e6bb80f482eb6e645ba893ffa016a24cd32eb4417a243d6da264a63d0ad.filez differ diff --git a/repo/objects/ba/7a4a96124e463c4e18bc6777280d2688f9f9eb199ac5c0354492c340849fb5.dirtree b/repo/objects/ba/7a4a96124e463c4e18bc6777280d2688f9f9eb199ac5c0354492c340849fb5.dirtree new file mode 100644 index 00000000000..215547ed098 Binary files /dev/null and b/repo/objects/ba/7a4a96124e463c4e18bc6777280d2688f9f9eb199ac5c0354492c340849fb5.dirtree differ diff --git a/repo/objects/ba/8fa1d0cbb9979743ce08c55cdc85b30f38af93c190942df080afb36c0850b3.filez b/repo/objects/ba/8fa1d0cbb9979743ce08c55cdc85b30f38af93c190942df080afb36c0850b3.filez new file mode 100644 index 00000000000..c87ed3c91db Binary files /dev/null and b/repo/objects/ba/8fa1d0cbb9979743ce08c55cdc85b30f38af93c190942df080afb36c0850b3.filez differ diff --git a/repo/objects/ba/919d313fa53c77b3229f7fc233b39bb1605fe93216e2433fb4b8955ed95c75.dirtree b/repo/objects/ba/919d313fa53c77b3229f7fc233b39bb1605fe93216e2433fb4b8955ed95c75.dirtree new file mode 100644 index 00000000000..ad311861392 Binary files /dev/null and b/repo/objects/ba/919d313fa53c77b3229f7fc233b39bb1605fe93216e2433fb4b8955ed95c75.dirtree differ diff --git a/repo/objects/ba/abcdea3258402f9c1e7b2493c0034ef9eb9845526027974683bcd9554c2cf7.filez b/repo/objects/ba/abcdea3258402f9c1e7b2493c0034ef9eb9845526027974683bcd9554c2cf7.filez new file mode 100644 index 00000000000..f919d57c490 Binary files /dev/null and b/repo/objects/ba/abcdea3258402f9c1e7b2493c0034ef9eb9845526027974683bcd9554c2cf7.filez differ diff --git a/repo/objects/ba/b23d31116bf2e81948368db3b51c06400e5d57a45fe6edd1fc60c1986c5435.dirtree b/repo/objects/ba/b23d31116bf2e81948368db3b51c06400e5d57a45fe6edd1fc60c1986c5435.dirtree new file mode 100644 index 00000000000..cbcaf9ea8ff Binary files /dev/null and b/repo/objects/ba/b23d31116bf2e81948368db3b51c06400e5d57a45fe6edd1fc60c1986c5435.dirtree differ diff --git a/repo/objects/ba/dcf948a2f2f9937c2395de5739a90ef76ab3cef8b7a09fe74d0b6c51c1ef80.filez b/repo/objects/ba/dcf948a2f2f9937c2395de5739a90ef76ab3cef8b7a09fe74d0b6c51c1ef80.filez new file mode 100644 index 00000000000..05c0136c779 Binary files /dev/null and b/repo/objects/ba/dcf948a2f2f9937c2395de5739a90ef76ab3cef8b7a09fe74d0b6c51c1ef80.filez differ diff --git a/repo/objects/ba/f7daa388d6f1dcf6356c8f446a5a1a46588b3a066bfa4ba13027cb4a763eb4.dirtree b/repo/objects/ba/f7daa388d6f1dcf6356c8f446a5a1a46588b3a066bfa4ba13027cb4a763eb4.dirtree new file mode 100644 index 00000000000..3b4a84370c7 Binary files /dev/null and b/repo/objects/ba/f7daa388d6f1dcf6356c8f446a5a1a46588b3a066bfa4ba13027cb4a763eb4.dirtree differ diff --git a/repo/objects/bb/10b260743d36ce3f821871aa79c53c1e8274204a3edacce5010b905fbacf63.filez b/repo/objects/bb/10b260743d36ce3f821871aa79c53c1e8274204a3edacce5010b905fbacf63.filez new file mode 100644 index 00000000000..f4d9ca95218 Binary files /dev/null and b/repo/objects/bb/10b260743d36ce3f821871aa79c53c1e8274204a3edacce5010b905fbacf63.filez differ diff --git a/repo/objects/bb/3b1863026fc1b516f01739d7f47fbfa6715ac564c59f6adf7be37bc1db89df.filez b/repo/objects/bb/3b1863026fc1b516f01739d7f47fbfa6715ac564c59f6adf7be37bc1db89df.filez new file mode 100644 index 00000000000..3492150c86b Binary files /dev/null and b/repo/objects/bb/3b1863026fc1b516f01739d7f47fbfa6715ac564c59f6adf7be37bc1db89df.filez differ diff --git a/repo/objects/bb/4756d18a025be3539fad65f18a783732047fc263ed0378a1e8636a5e84bbee.dirtree b/repo/objects/bb/4756d18a025be3539fad65f18a783732047fc263ed0378a1e8636a5e84bbee.dirtree new file mode 100644 index 00000000000..0f9066f73a1 Binary files /dev/null and b/repo/objects/bb/4756d18a025be3539fad65f18a783732047fc263ed0378a1e8636a5e84bbee.dirtree differ diff --git a/repo/objects/bb/5a7b0d5fc70ff77a03c02be932e20ddadae599e618ccc2c60883675f3027b2.dirtree b/repo/objects/bb/5a7b0d5fc70ff77a03c02be932e20ddadae599e618ccc2c60883675f3027b2.dirtree new file mode 100644 index 00000000000..9ccd7bdcea6 Binary files /dev/null and b/repo/objects/bb/5a7b0d5fc70ff77a03c02be932e20ddadae599e618ccc2c60883675f3027b2.dirtree differ diff --git a/repo/objects/bb/6e7ecdf4d94c131bbb86c2edc304a116a7ca25b011d7dfe137a716cd60bee4.dirtree b/repo/objects/bb/6e7ecdf4d94c131bbb86c2edc304a116a7ca25b011d7dfe137a716cd60bee4.dirtree new file mode 100644 index 00000000000..321c66cf797 Binary files /dev/null and b/repo/objects/bb/6e7ecdf4d94c131bbb86c2edc304a116a7ca25b011d7dfe137a716cd60bee4.dirtree differ diff --git a/repo/objects/bb/7edd7696b399527d54da89ddd4265c76947ee33ebf4f8f27f2cb25f97cb31d.filez b/repo/objects/bb/7edd7696b399527d54da89ddd4265c76947ee33ebf4f8f27f2cb25f97cb31d.filez new file mode 100644 index 00000000000..e736ad3b794 Binary files /dev/null and b/repo/objects/bb/7edd7696b399527d54da89ddd4265c76947ee33ebf4f8f27f2cb25f97cb31d.filez differ diff --git a/repo/objects/bb/8babb55b1adf9765e6002f063d555047269e482ca960163002b5e019d05fc0.filez b/repo/objects/bb/8babb55b1adf9765e6002f063d555047269e482ca960163002b5e019d05fc0.filez new file mode 100644 index 00000000000..e709177be7b Binary files /dev/null and b/repo/objects/bb/8babb55b1adf9765e6002f063d555047269e482ca960163002b5e019d05fc0.filez differ diff --git a/repo/objects/bb/994f9371cdd72ae8457eb5ce5f912c55dc5914267362e8d5397be64bd66382.filez b/repo/objects/bb/994f9371cdd72ae8457eb5ce5f912c55dc5914267362e8d5397be64bd66382.filez new file mode 100644 index 00000000000..8f9b150b3d6 Binary files /dev/null and b/repo/objects/bb/994f9371cdd72ae8457eb5ce5f912c55dc5914267362e8d5397be64bd66382.filez differ diff --git a/repo/objects/bb/9ea921831067bd2679d2f2aef17bf52476e07af24cec4b15b7dd6d0d74a568.filez b/repo/objects/bb/9ea921831067bd2679d2f2aef17bf52476e07af24cec4b15b7dd6d0d74a568.filez new file mode 100644 index 00000000000..8df979c5943 Binary files /dev/null and b/repo/objects/bb/9ea921831067bd2679d2f2aef17bf52476e07af24cec4b15b7dd6d0d74a568.filez differ diff --git a/repo/objects/bb/a00632e83fbeee4253f38b3e55a8b011993433d327760accb899fa43adc44b.filez b/repo/objects/bb/a00632e83fbeee4253f38b3e55a8b011993433d327760accb899fa43adc44b.filez new file mode 100644 index 00000000000..630b52f5ee9 Binary files /dev/null and b/repo/objects/bb/a00632e83fbeee4253f38b3e55a8b011993433d327760accb899fa43adc44b.filez differ diff --git a/repo/objects/bb/b59833249d8abd66c40cc08edb907989f55ef269d5afb7628b067f0f1b900b.filez b/repo/objects/bb/b59833249d8abd66c40cc08edb907989f55ef269d5afb7628b067f0f1b900b.filez new file mode 100644 index 00000000000..777a3c37226 Binary files /dev/null and b/repo/objects/bb/b59833249d8abd66c40cc08edb907989f55ef269d5afb7628b067f0f1b900b.filez differ diff --git a/repo/objects/bb/d9e04ffbf5abc2084109368b8a0353e5b34559e66c87d372651841821f18e6.dirtree b/repo/objects/bb/d9e04ffbf5abc2084109368b8a0353e5b34559e66c87d372651841821f18e6.dirtree new file mode 100644 index 00000000000..967e736efe2 Binary files /dev/null and b/repo/objects/bb/d9e04ffbf5abc2084109368b8a0353e5b34559e66c87d372651841821f18e6.dirtree differ diff --git a/repo/objects/bb/eddfdcec3f3f102dc25e56db0d7e0cab043ad17aa48007360bc3f8a842a7c0.filez b/repo/objects/bb/eddfdcec3f3f102dc25e56db0d7e0cab043ad17aa48007360bc3f8a842a7c0.filez new file mode 100644 index 00000000000..8ed9ea1f34e Binary files /dev/null and b/repo/objects/bb/eddfdcec3f3f102dc25e56db0d7e0cab043ad17aa48007360bc3f8a842a7c0.filez differ diff --git a/repo/objects/bc/1b946124c3fa5b702179b56d592311de08b6e8b677967b14f41513c4aa71b0.dirtree b/repo/objects/bc/1b946124c3fa5b702179b56d592311de08b6e8b677967b14f41513c4aa71b0.dirtree new file mode 100644 index 00000000000..03e0d1244dc Binary files /dev/null and b/repo/objects/bc/1b946124c3fa5b702179b56d592311de08b6e8b677967b14f41513c4aa71b0.dirtree differ diff --git a/repo/objects/bc/42349cc9ef398f5bc6703f1a396b07e18afd6333dd892a4880f0ac4ccdbe39.filez b/repo/objects/bc/42349cc9ef398f5bc6703f1a396b07e18afd6333dd892a4880f0ac4ccdbe39.filez new file mode 100644 index 00000000000..35908ccc28c Binary files /dev/null and b/repo/objects/bc/42349cc9ef398f5bc6703f1a396b07e18afd6333dd892a4880f0ac4ccdbe39.filez differ diff --git a/repo/objects/bc/5d72b132dd9120df71036a3f2a1c62a7649ea0ee3ae8758daf67949523dc16.filez b/repo/objects/bc/5d72b132dd9120df71036a3f2a1c62a7649ea0ee3ae8758daf67949523dc16.filez new file mode 100644 index 00000000000..fa652f86803 Binary files /dev/null and b/repo/objects/bc/5d72b132dd9120df71036a3f2a1c62a7649ea0ee3ae8758daf67949523dc16.filez differ diff --git a/repo/objects/bc/72e3dd413d07395d3ed05980937f7cf8f1316c153ee4603e6eaa94b5cd750d.filez b/repo/objects/bc/72e3dd413d07395d3ed05980937f7cf8f1316c153ee4603e6eaa94b5cd750d.filez new file mode 100644 index 00000000000..77e75fe35d6 Binary files /dev/null and b/repo/objects/bc/72e3dd413d07395d3ed05980937f7cf8f1316c153ee4603e6eaa94b5cd750d.filez differ diff --git a/repo/objects/bc/745b96ba965a1a1ea6ca6bef0dc345e1450b1c93340db04bd3defe45e4dd90.filez b/repo/objects/bc/745b96ba965a1a1ea6ca6bef0dc345e1450b1c93340db04bd3defe45e4dd90.filez new file mode 100644 index 00000000000..94f196bd085 Binary files /dev/null and b/repo/objects/bc/745b96ba965a1a1ea6ca6bef0dc345e1450b1c93340db04bd3defe45e4dd90.filez differ diff --git a/repo/objects/bc/90a0367466179990eccbd3101e2f20a573c449b450a04736950844ba654e06.filez b/repo/objects/bc/90a0367466179990eccbd3101e2f20a573c449b450a04736950844ba654e06.filez new file mode 100644 index 00000000000..04900dbf041 Binary files /dev/null and b/repo/objects/bc/90a0367466179990eccbd3101e2f20a573c449b450a04736950844ba654e06.filez differ diff --git a/repo/objects/bc/91b572588e18c71442d8f6da3d5d1a78dd48c06207905fcd2c7c43d27aa856.filez b/repo/objects/bc/91b572588e18c71442d8f6da3d5d1a78dd48c06207905fcd2c7c43d27aa856.filez new file mode 100644 index 00000000000..7715a141f35 Binary files /dev/null and b/repo/objects/bc/91b572588e18c71442d8f6da3d5d1a78dd48c06207905fcd2c7c43d27aa856.filez differ diff --git a/repo/objects/bc/abd01788166758059c39791bb673641dd15f0694ac8ce325bff24337ade495.dirtree b/repo/objects/bc/abd01788166758059c39791bb673641dd15f0694ac8ce325bff24337ade495.dirtree new file mode 100644 index 00000000000..ac79f90c1d0 Binary files /dev/null and b/repo/objects/bc/abd01788166758059c39791bb673641dd15f0694ac8ce325bff24337ade495.dirtree differ diff --git a/repo/objects/bc/bcfcaaed0dbc07437492061dede94d3f6346e97431942b6ecb4c33a4a67a71.filez b/repo/objects/bc/bcfcaaed0dbc07437492061dede94d3f6346e97431942b6ecb4c33a4a67a71.filez new file mode 100644 index 00000000000..27534b85251 Binary files /dev/null and b/repo/objects/bc/bcfcaaed0dbc07437492061dede94d3f6346e97431942b6ecb4c33a4a67a71.filez differ diff --git a/repo/objects/bc/d27ec1364c286be3a58bee36b6db4f17e38b993d0fd284136a53d95ca6507f.dirtree b/repo/objects/bc/d27ec1364c286be3a58bee36b6db4f17e38b993d0fd284136a53d95ca6507f.dirtree new file mode 100644 index 00000000000..f4e445a6d4b Binary files /dev/null and b/repo/objects/bc/d27ec1364c286be3a58bee36b6db4f17e38b993d0fd284136a53d95ca6507f.dirtree differ diff --git a/repo/objects/bc/d98709abe14ec6dbdede30f1ac9aeb8e318ecfa22c787485233f71f05fe28f.filez b/repo/objects/bc/d98709abe14ec6dbdede30f1ac9aeb8e318ecfa22c787485233f71f05fe28f.filez new file mode 100644 index 00000000000..d9ccf9668d8 Binary files /dev/null and b/repo/objects/bc/d98709abe14ec6dbdede30f1ac9aeb8e318ecfa22c787485233f71f05fe28f.filez differ diff --git a/repo/objects/bc/f90b8514db2bb3a3454b26a1b483d6e13dd7a84f86e8de537064ccda316aa1.filez b/repo/objects/bc/f90b8514db2bb3a3454b26a1b483d6e13dd7a84f86e8de537064ccda316aa1.filez new file mode 100644 index 00000000000..3eb5f9b09c6 Binary files /dev/null and b/repo/objects/bc/f90b8514db2bb3a3454b26a1b483d6e13dd7a84f86e8de537064ccda316aa1.filez differ diff --git a/repo/objects/bd/2956bf582d6b3f58ba86ce9ebb280b3a5ad40d4dbfaa5faf423caeb0d494cc.filez b/repo/objects/bd/2956bf582d6b3f58ba86ce9ebb280b3a5ad40d4dbfaa5faf423caeb0d494cc.filez new file mode 100644 index 00000000000..81a74d98934 Binary files /dev/null and b/repo/objects/bd/2956bf582d6b3f58ba86ce9ebb280b3a5ad40d4dbfaa5faf423caeb0d494cc.filez differ diff --git a/repo/objects/bd/2a8c94a2be5ac1e26edee18deee68a043c3cceae5b7790524629cc2cc25f87.filez b/repo/objects/bd/2a8c94a2be5ac1e26edee18deee68a043c3cceae5b7790524629cc2cc25f87.filez new file mode 100644 index 00000000000..dff32c0dd5f Binary files /dev/null and b/repo/objects/bd/2a8c94a2be5ac1e26edee18deee68a043c3cceae5b7790524629cc2cc25f87.filez differ diff --git a/repo/objects/bd/61c016a35b5a7932aff61554353ced6a12393ae7b8eef5b72000a7c0948745.dirtree b/repo/objects/bd/61c016a35b5a7932aff61554353ced6a12393ae7b8eef5b72000a7c0948745.dirtree new file mode 100644 index 00000000000..3d7cb54a348 Binary files /dev/null and b/repo/objects/bd/61c016a35b5a7932aff61554353ced6a12393ae7b8eef5b72000a7c0948745.dirtree differ diff --git a/repo/objects/bd/67d58893f22339d8e5f913c66f4fd450cc1619abb4ce98226e56917ea52c89.filez b/repo/objects/bd/67d58893f22339d8e5f913c66f4fd450cc1619abb4ce98226e56917ea52c89.filez new file mode 100644 index 00000000000..c66b6688775 Binary files /dev/null and b/repo/objects/bd/67d58893f22339d8e5f913c66f4fd450cc1619abb4ce98226e56917ea52c89.filez differ diff --git a/repo/objects/bd/6cb04d6ab6949383f15e9526af87246dbaab7d7fcf8b664bff932aa89b7474.dirtree b/repo/objects/bd/6cb04d6ab6949383f15e9526af87246dbaab7d7fcf8b664bff932aa89b7474.dirtree new file mode 100644 index 00000000000..806088470ab Binary files /dev/null and b/repo/objects/bd/6cb04d6ab6949383f15e9526af87246dbaab7d7fcf8b664bff932aa89b7474.dirtree differ diff --git a/repo/objects/bd/76c1deb2f87f8955101927b7b0947001e0ee7531d08057753c0cd34d7e64a3.filez b/repo/objects/bd/76c1deb2f87f8955101927b7b0947001e0ee7531d08057753c0cd34d7e64a3.filez new file mode 100644 index 00000000000..8930e0afe40 Binary files /dev/null and b/repo/objects/bd/76c1deb2f87f8955101927b7b0947001e0ee7531d08057753c0cd34d7e64a3.filez differ diff --git a/repo/objects/bd/877f5b229d71f0b270651993967b6ce9652240aa38408cec5f9437c65a3e60.dirtree b/repo/objects/bd/877f5b229d71f0b270651993967b6ce9652240aa38408cec5f9437c65a3e60.dirtree new file mode 100644 index 00000000000..81897c0ee7e Binary files /dev/null and b/repo/objects/bd/877f5b229d71f0b270651993967b6ce9652240aa38408cec5f9437c65a3e60.dirtree differ diff --git a/repo/objects/bd/9854780f09d47351f7e111d12b5279c27d8bab2aab9b355e6284c880f69678.filez b/repo/objects/bd/9854780f09d47351f7e111d12b5279c27d8bab2aab9b355e6284c880f69678.filez new file mode 100644 index 00000000000..a9640d3424c Binary files /dev/null and b/repo/objects/bd/9854780f09d47351f7e111d12b5279c27d8bab2aab9b355e6284c880f69678.filez differ diff --git a/repo/objects/bd/acb53f5c2851c5baca7ca865e360e8c8a96eef8c2b435fa29a6fa998a21ec6.filez b/repo/objects/bd/acb53f5c2851c5baca7ca865e360e8c8a96eef8c2b435fa29a6fa998a21ec6.filez new file mode 100644 index 00000000000..8d91466765e Binary files /dev/null and b/repo/objects/bd/acb53f5c2851c5baca7ca865e360e8c8a96eef8c2b435fa29a6fa998a21ec6.filez differ diff --git a/repo/objects/bd/cd651276e2a2b06dbcab30f76c49bcfe927dd2710be203ea50e76889e6b7a9.dirtree b/repo/objects/bd/cd651276e2a2b06dbcab30f76c49bcfe927dd2710be203ea50e76889e6b7a9.dirtree new file mode 100644 index 00000000000..206f8e39d19 Binary files /dev/null and b/repo/objects/bd/cd651276e2a2b06dbcab30f76c49bcfe927dd2710be203ea50e76889e6b7a9.dirtree differ diff --git a/repo/objects/bd/f1543c2d75ea9066c920fd7b3ad41eff4f077142383da61d4a478ba527d435.filez b/repo/objects/bd/f1543c2d75ea9066c920fd7b3ad41eff4f077142383da61d4a478ba527d435.filez new file mode 100644 index 00000000000..3c17e26fb2c Binary files /dev/null and b/repo/objects/bd/f1543c2d75ea9066c920fd7b3ad41eff4f077142383da61d4a478ba527d435.filez differ diff --git a/repo/objects/bd/f24e1fab3781c36f2f2823191f888277da15c58bfed8beae4a1a47ac2f738c.filez b/repo/objects/bd/f24e1fab3781c36f2f2823191f888277da15c58bfed8beae4a1a47ac2f738c.filez new file mode 100644 index 00000000000..67a7bf00f9d Binary files /dev/null and b/repo/objects/bd/f24e1fab3781c36f2f2823191f888277da15c58bfed8beae4a1a47ac2f738c.filez differ diff --git a/repo/objects/bd/f8edac908464e223c8b695bb812bae0ad742d8f5125ecc57838d599afa5931.dirtree b/repo/objects/bd/f8edac908464e223c8b695bb812bae0ad742d8f5125ecc57838d599afa5931.dirtree new file mode 100644 index 00000000000..31351f05d21 Binary files /dev/null and b/repo/objects/bd/f8edac908464e223c8b695bb812bae0ad742d8f5125ecc57838d599afa5931.dirtree differ diff --git a/repo/objects/be/056eed442b08a212c50eda5cc9eca47100fdb8f1f068c38697eb949526bece.filez b/repo/objects/be/056eed442b08a212c50eda5cc9eca47100fdb8f1f068c38697eb949526bece.filez new file mode 100644 index 00000000000..c5a1807370d Binary files /dev/null and b/repo/objects/be/056eed442b08a212c50eda5cc9eca47100fdb8f1f068c38697eb949526bece.filez differ diff --git a/repo/objects/be/0c7b787d9e1a6573ba10c9ca05a925a75230560cc039d80efb10260f0b6da7.filez b/repo/objects/be/0c7b787d9e1a6573ba10c9ca05a925a75230560cc039d80efb10260f0b6da7.filez new file mode 100644 index 00000000000..75bc285be42 Binary files /dev/null and b/repo/objects/be/0c7b787d9e1a6573ba10c9ca05a925a75230560cc039d80efb10260f0b6da7.filez differ diff --git a/repo/objects/be/0eaa1e000c1e04d30d58278ac79fd1f25da3f1ff2327a86073edb88b266d5f.filez b/repo/objects/be/0eaa1e000c1e04d30d58278ac79fd1f25da3f1ff2327a86073edb88b266d5f.filez new file mode 100644 index 00000000000..7ac1b235d31 Binary files /dev/null and b/repo/objects/be/0eaa1e000c1e04d30d58278ac79fd1f25da3f1ff2327a86073edb88b266d5f.filez differ diff --git a/repo/objects/be/11d0202dadca3bd8dfb3de7a40686c16f363ee2cd913048602e8ab49666569.filez b/repo/objects/be/11d0202dadca3bd8dfb3de7a40686c16f363ee2cd913048602e8ab49666569.filez new file mode 100644 index 00000000000..cf6314c05ba Binary files /dev/null and b/repo/objects/be/11d0202dadca3bd8dfb3de7a40686c16f363ee2cd913048602e8ab49666569.filez differ diff --git a/repo/objects/be/12ef5641d62c45b620c6358e0b8ec4ec52ea7e10a7b0b005490226928ae36b.filez b/repo/objects/be/12ef5641d62c45b620c6358e0b8ec4ec52ea7e10a7b0b005490226928ae36b.filez new file mode 100644 index 00000000000..0c09ac85c5f Binary files /dev/null and b/repo/objects/be/12ef5641d62c45b620c6358e0b8ec4ec52ea7e10a7b0b005490226928ae36b.filez differ diff --git a/repo/objects/be/2446976479153b133f6e705831ebcbe619366097f6d183b563e3e1625967ce.filez b/repo/objects/be/2446976479153b133f6e705831ebcbe619366097f6d183b563e3e1625967ce.filez new file mode 100644 index 00000000000..f48201239a3 Binary files /dev/null and b/repo/objects/be/2446976479153b133f6e705831ebcbe619366097f6d183b563e3e1625967ce.filez differ diff --git a/repo/objects/be/30d5e9362c2467c8b35b5968b5e09c35aaeb66bfe7c0a4f2b976b5e0868977.filez b/repo/objects/be/30d5e9362c2467c8b35b5968b5e09c35aaeb66bfe7c0a4f2b976b5e0868977.filez new file mode 100644 index 00000000000..ab488e64cee Binary files /dev/null and b/repo/objects/be/30d5e9362c2467c8b35b5968b5e09c35aaeb66bfe7c0a4f2b976b5e0868977.filez differ diff --git a/repo/objects/be/3a26ccd37168307b8a930a99f67dc25d2dc4c9692aa0281db5bb98db637187.filez b/repo/objects/be/3a26ccd37168307b8a930a99f67dc25d2dc4c9692aa0281db5bb98db637187.filez new file mode 100644 index 00000000000..48e62d473c8 Binary files /dev/null and b/repo/objects/be/3a26ccd37168307b8a930a99f67dc25d2dc4c9692aa0281db5bb98db637187.filez differ diff --git a/repo/objects/be/4fe2750420872c9382819b2170634300305da56cce903bdb46055cb3a6e021.filez b/repo/objects/be/4fe2750420872c9382819b2170634300305da56cce903bdb46055cb3a6e021.filez new file mode 100644 index 00000000000..69f75132d70 Binary files /dev/null and b/repo/objects/be/4fe2750420872c9382819b2170634300305da56cce903bdb46055cb3a6e021.filez differ diff --git a/repo/objects/be/608026ecfae9306b345effa2598cb8ebd9356bd033a4b45a4d27ba5a3e041b.filez b/repo/objects/be/608026ecfae9306b345effa2598cb8ebd9356bd033a4b45a4d27ba5a3e041b.filez new file mode 100644 index 00000000000..437cc64ae33 Binary files /dev/null and b/repo/objects/be/608026ecfae9306b345effa2598cb8ebd9356bd033a4b45a4d27ba5a3e041b.filez differ diff --git a/repo/objects/be/7066665d37f1af0f648aad99df493b91fac5d2cd99b5b8381762a72e195665.filez b/repo/objects/be/7066665d37f1af0f648aad99df493b91fac5d2cd99b5b8381762a72e195665.filez new file mode 100644 index 00000000000..7c3a3656990 Binary files /dev/null and b/repo/objects/be/7066665d37f1af0f648aad99df493b91fac5d2cd99b5b8381762a72e195665.filez differ diff --git a/repo/objects/be/9bab8c72c945504eee2015ab489214a57f9206a3c4c453c41c543947f403e6.dirtree b/repo/objects/be/9bab8c72c945504eee2015ab489214a57f9206a3c4c453c41c543947f403e6.dirtree new file mode 100644 index 00000000000..1ef6500247c Binary files /dev/null and b/repo/objects/be/9bab8c72c945504eee2015ab489214a57f9206a3c4c453c41c543947f403e6.dirtree differ diff --git a/repo/objects/be/9d7ba24634da384155ee0b7e291f4f9b99ab5054a1dd830abfde17a07c4011.filez b/repo/objects/be/9d7ba24634da384155ee0b7e291f4f9b99ab5054a1dd830abfde17a07c4011.filez new file mode 100644 index 00000000000..5456dc25413 Binary files /dev/null and b/repo/objects/be/9d7ba24634da384155ee0b7e291f4f9b99ab5054a1dd830abfde17a07c4011.filez differ diff --git a/repo/objects/be/e3a31629635d9822254d0a79fd6367e575b9f1b628bfa9a18493cd93a46123.filez b/repo/objects/be/e3a31629635d9822254d0a79fd6367e575b9f1b628bfa9a18493cd93a46123.filez new file mode 100644 index 00000000000..b6ee203d8c1 Binary files /dev/null and b/repo/objects/be/e3a31629635d9822254d0a79fd6367e575b9f1b628bfa9a18493cd93a46123.filez differ diff --git a/repo/objects/bf/2dff8146b394c971d946c5e20e008edbcfb55a96f018ab2617a8a833d761e6.dirtree b/repo/objects/bf/2dff8146b394c971d946c5e20e008edbcfb55a96f018ab2617a8a833d761e6.dirtree new file mode 100644 index 00000000000..08408417861 Binary files /dev/null and b/repo/objects/bf/2dff8146b394c971d946c5e20e008edbcfb55a96f018ab2617a8a833d761e6.dirtree differ diff --git a/repo/objects/bf/60e9b7d2383d1fd05dfcaabcdb7697dccabbb9bbd77457c982331f796b6c31.filez b/repo/objects/bf/60e9b7d2383d1fd05dfcaabcdb7697dccabbb9bbd77457c982331f796b6c31.filez new file mode 100644 index 00000000000..96dc8f0dce1 Binary files /dev/null and b/repo/objects/bf/60e9b7d2383d1fd05dfcaabcdb7697dccabbb9bbd77457c982331f796b6c31.filez differ diff --git a/repo/objects/bf/9c5520d6ea5c23e68b60889bca06016559e4514a7b49c47317ed28a1b7bdc7.filez b/repo/objects/bf/9c5520d6ea5c23e68b60889bca06016559e4514a7b49c47317ed28a1b7bdc7.filez new file mode 100644 index 00000000000..c4a10d48fb6 Binary files /dev/null and b/repo/objects/bf/9c5520d6ea5c23e68b60889bca06016559e4514a7b49c47317ed28a1b7bdc7.filez differ diff --git a/repo/objects/c0/07c4b5074770ea06e4b2e9cba592cf21d8ce9283e9e669fddd0694bad2d10f.filez b/repo/objects/c0/07c4b5074770ea06e4b2e9cba592cf21d8ce9283e9e669fddd0694bad2d10f.filez new file mode 100644 index 00000000000..2ac44cb8a94 Binary files /dev/null and b/repo/objects/c0/07c4b5074770ea06e4b2e9cba592cf21d8ce9283e9e669fddd0694bad2d10f.filez differ diff --git a/repo/objects/c0/177830f2794465ccb80d837e62c36440a99cb52cad79ff3bf307b84a7802e7.dirtree b/repo/objects/c0/177830f2794465ccb80d837e62c36440a99cb52cad79ff3bf307b84a7802e7.dirtree new file mode 100644 index 00000000000..54d9bbfcdc1 Binary files /dev/null and b/repo/objects/c0/177830f2794465ccb80d837e62c36440a99cb52cad79ff3bf307b84a7802e7.dirtree differ diff --git a/repo/objects/c0/24bb181284a85e1b488ac30f584782161da0c54cbaf30591ac26fe37cb5549.filez b/repo/objects/c0/24bb181284a85e1b488ac30f584782161da0c54cbaf30591ac26fe37cb5549.filez new file mode 100644 index 00000000000..1f3af51e602 Binary files /dev/null and b/repo/objects/c0/24bb181284a85e1b488ac30f584782161da0c54cbaf30591ac26fe37cb5549.filez differ diff --git a/repo/objects/c0/40a218efddcfa2e8d570307ee12a368be7a1f9436207fdc909eb54bb18f8ce.filez b/repo/objects/c0/40a218efddcfa2e8d570307ee12a368be7a1f9436207fdc909eb54bb18f8ce.filez new file mode 100644 index 00000000000..f889f082e16 Binary files /dev/null and b/repo/objects/c0/40a218efddcfa2e8d570307ee12a368be7a1f9436207fdc909eb54bb18f8ce.filez differ diff --git a/repo/objects/c0/45ad8fd0f848d9952d8b3d2dde351c4e8bc6bb93d003980f62807d2334b0fa.dirtree b/repo/objects/c0/45ad8fd0f848d9952d8b3d2dde351c4e8bc6bb93d003980f62807d2334b0fa.dirtree new file mode 100644 index 00000000000..cb793a18bd9 Binary files /dev/null and b/repo/objects/c0/45ad8fd0f848d9952d8b3d2dde351c4e8bc6bb93d003980f62807d2334b0fa.dirtree differ diff --git a/repo/objects/c0/572a9db3fdaf92a0d07279bb836e2cb6d2c549c5db8e364a8bc7253f9c8ea7.filez b/repo/objects/c0/572a9db3fdaf92a0d07279bb836e2cb6d2c549c5db8e364a8bc7253f9c8ea7.filez new file mode 100644 index 00000000000..954f6896691 Binary files /dev/null and b/repo/objects/c0/572a9db3fdaf92a0d07279bb836e2cb6d2c549c5db8e364a8bc7253f9c8ea7.filez differ diff --git a/repo/objects/c0/6c718afb707e4e0a46de3042949f8ed329061a922613acb360e43152589984.filez b/repo/objects/c0/6c718afb707e4e0a46de3042949f8ed329061a922613acb360e43152589984.filez new file mode 100644 index 00000000000..d859ff3c3b5 Binary files /dev/null and b/repo/objects/c0/6c718afb707e4e0a46de3042949f8ed329061a922613acb360e43152589984.filez differ diff --git a/repo/objects/c0/a61f5f71edc430a9bf58d29135aaad2cea525a2cc81c7223b4c1c0c8543db3.filez b/repo/objects/c0/a61f5f71edc430a9bf58d29135aaad2cea525a2cc81c7223b4c1c0c8543db3.filez new file mode 100644 index 00000000000..a258fef3cb5 Binary files /dev/null and b/repo/objects/c0/a61f5f71edc430a9bf58d29135aaad2cea525a2cc81c7223b4c1c0c8543db3.filez differ diff --git a/repo/objects/c0/d1a367ac10ce94c16fea918cf7b4ad93d05c6fc793128014ba3ffd8b48e963.filez b/repo/objects/c0/d1a367ac10ce94c16fea918cf7b4ad93d05c6fc793128014ba3ffd8b48e963.filez new file mode 100644 index 00000000000..eccdd3232c6 Binary files /dev/null and b/repo/objects/c0/d1a367ac10ce94c16fea918cf7b4ad93d05c6fc793128014ba3ffd8b48e963.filez differ diff --git a/repo/objects/c0/d9c7b2b2b523f7a5af42690eccaa64f06a6ca2fa8bb63bcb6ae6e7127028a0.filez b/repo/objects/c0/d9c7b2b2b523f7a5af42690eccaa64f06a6ca2fa8bb63bcb6ae6e7127028a0.filez new file mode 100644 index 00000000000..62b55d967a7 Binary files /dev/null and b/repo/objects/c0/d9c7b2b2b523f7a5af42690eccaa64f06a6ca2fa8bb63bcb6ae6e7127028a0.filez differ diff --git a/repo/objects/c1/20d90662da0fdf007e42d007044545d77554a88ad357b11898cef703a7f029.filez b/repo/objects/c1/20d90662da0fdf007e42d007044545d77554a88ad357b11898cef703a7f029.filez new file mode 100644 index 00000000000..11ac09e94df Binary files /dev/null and b/repo/objects/c1/20d90662da0fdf007e42d007044545d77554a88ad357b11898cef703a7f029.filez differ diff --git a/repo/objects/c1/2cb3758c716cdbe04263afc6b1759946e36454551485946b156acf2d8b572b.dirtree b/repo/objects/c1/2cb3758c716cdbe04263afc6b1759946e36454551485946b156acf2d8b572b.dirtree new file mode 100644 index 00000000000..5212f67c900 Binary files /dev/null and b/repo/objects/c1/2cb3758c716cdbe04263afc6b1759946e36454551485946b156acf2d8b572b.dirtree differ diff --git a/repo/objects/c1/2cdfa3c1d5e3714699ab928bfc16490e3700b0098379104913988f6e3d6ed2.filez b/repo/objects/c1/2cdfa3c1d5e3714699ab928bfc16490e3700b0098379104913988f6e3d6ed2.filez new file mode 100644 index 00000000000..f68a7ffb4f1 Binary files /dev/null and b/repo/objects/c1/2cdfa3c1d5e3714699ab928bfc16490e3700b0098379104913988f6e3d6ed2.filez differ diff --git a/repo/objects/c1/2df846ba17ecd8b418fa3a5d839b1e6ac37974f03dc89ca21f6dcee854e8f7.filez b/repo/objects/c1/2df846ba17ecd8b418fa3a5d839b1e6ac37974f03dc89ca21f6dcee854e8f7.filez new file mode 100644 index 00000000000..863249bcbdd Binary files /dev/null and b/repo/objects/c1/2df846ba17ecd8b418fa3a5d839b1e6ac37974f03dc89ca21f6dcee854e8f7.filez differ diff --git a/repo/objects/c1/31a015b5d29ba67de097a5dd8aec10090be29f11e1c00da6946ecb309c9bfd.filez b/repo/objects/c1/31a015b5d29ba67de097a5dd8aec10090be29f11e1c00da6946ecb309c9bfd.filez new file mode 100644 index 00000000000..1635d4bdcfd Binary files /dev/null and b/repo/objects/c1/31a015b5d29ba67de097a5dd8aec10090be29f11e1c00da6946ecb309c9bfd.filez differ diff --git a/repo/objects/c1/44787d4c877e35f13d53b2d2e110f6e6417fc367feb90a62415a7e3fe1fd0a.filez b/repo/objects/c1/44787d4c877e35f13d53b2d2e110f6e6417fc367feb90a62415a7e3fe1fd0a.filez new file mode 100644 index 00000000000..5203809a589 Binary files /dev/null and b/repo/objects/c1/44787d4c877e35f13d53b2d2e110f6e6417fc367feb90a62415a7e3fe1fd0a.filez differ diff --git a/repo/objects/c1/5c2647bd6748622e2be6a4afd1bbca15b617df65db67c091793f32e8b1f71c.dirtree b/repo/objects/c1/5c2647bd6748622e2be6a4afd1bbca15b617df65db67c091793f32e8b1f71c.dirtree new file mode 100644 index 00000000000..60f06e64706 Binary files /dev/null and b/repo/objects/c1/5c2647bd6748622e2be6a4afd1bbca15b617df65db67c091793f32e8b1f71c.dirtree differ diff --git a/repo/objects/c1/60ba33177469e22865a1e09dccd7ac042428919a1ceda7a17992d56a816f5b.filez b/repo/objects/c1/60ba33177469e22865a1e09dccd7ac042428919a1ceda7a17992d56a816f5b.filez new file mode 100644 index 00000000000..a7077270bc5 Binary files /dev/null and b/repo/objects/c1/60ba33177469e22865a1e09dccd7ac042428919a1ceda7a17992d56a816f5b.filez differ diff --git a/repo/objects/c1/856ff938ae0ebf374a6ecdabafbf9a9d6126d4f287f99afbbd4c74ab389fe2.dirtree b/repo/objects/c1/856ff938ae0ebf374a6ecdabafbf9a9d6126d4f287f99afbbd4c74ab389fe2.dirtree new file mode 100644 index 00000000000..3e5990edebd Binary files /dev/null and b/repo/objects/c1/856ff938ae0ebf374a6ecdabafbf9a9d6126d4f287f99afbbd4c74ab389fe2.dirtree differ diff --git a/repo/objects/c1/85b0c7f6d3a054f32d3114829f5f818c3440c13256ea194ff57bb97ada9dd7.filez b/repo/objects/c1/85b0c7f6d3a054f32d3114829f5f818c3440c13256ea194ff57bb97ada9dd7.filez new file mode 100644 index 00000000000..4e46fa13cab Binary files /dev/null and b/repo/objects/c1/85b0c7f6d3a054f32d3114829f5f818c3440c13256ea194ff57bb97ada9dd7.filez differ diff --git a/repo/objects/c1/957d6b4812c09a91b3456f065c1dbcc53b7f8f6e2c10608a509e024ac92c0c.filez b/repo/objects/c1/957d6b4812c09a91b3456f065c1dbcc53b7f8f6e2c10608a509e024ac92c0c.filez new file mode 100644 index 00000000000..ae197909c2d Binary files /dev/null and b/repo/objects/c1/957d6b4812c09a91b3456f065c1dbcc53b7f8f6e2c10608a509e024ac92c0c.filez differ diff --git a/repo/objects/c1/9d0d297f587e22f3af380aee0168752b863ba8b1342ee357bbf8794892ad90.filez b/repo/objects/c1/9d0d297f587e22f3af380aee0168752b863ba8b1342ee357bbf8794892ad90.filez new file mode 100644 index 00000000000..1b67f790045 Binary files /dev/null and b/repo/objects/c1/9d0d297f587e22f3af380aee0168752b863ba8b1342ee357bbf8794892ad90.filez differ diff --git a/repo/objects/c1/a9405068fa919014f5c794a9588ec801a20e21ddc31c9006d64c2c9943b322.filez b/repo/objects/c1/a9405068fa919014f5c794a9588ec801a20e21ddc31c9006d64c2c9943b322.filez new file mode 100644 index 00000000000..5fca122d3d2 Binary files /dev/null and b/repo/objects/c1/a9405068fa919014f5c794a9588ec801a20e21ddc31c9006d64c2c9943b322.filez differ diff --git a/repo/objects/c1/cea33b7c9ba5bdc11af988ec827e9e790df84fe8e38a2eb8bf0c5717a330d1.filez b/repo/objects/c1/cea33b7c9ba5bdc11af988ec827e9e790df84fe8e38a2eb8bf0c5717a330d1.filez new file mode 100644 index 00000000000..d61bbe81855 Binary files /dev/null and b/repo/objects/c1/cea33b7c9ba5bdc11af988ec827e9e790df84fe8e38a2eb8bf0c5717a330d1.filez differ diff --git a/repo/objects/c1/da7dcf0a047cb770e1f39160fcc3efedc25a134f1ab3157e57124af83285f7.dirtree b/repo/objects/c1/da7dcf0a047cb770e1f39160fcc3efedc25a134f1ab3157e57124af83285f7.dirtree new file mode 100644 index 00000000000..0e4f4a1a69f Binary files /dev/null and b/repo/objects/c1/da7dcf0a047cb770e1f39160fcc3efedc25a134f1ab3157e57124af83285f7.dirtree differ diff --git a/repo/objects/c2/0b9e4f88ffdbfca8328eb36200f6f126820601fbf7e9efa607187e3b299e85.filez b/repo/objects/c2/0b9e4f88ffdbfca8328eb36200f6f126820601fbf7e9efa607187e3b299e85.filez new file mode 100644 index 00000000000..8a4023ad1e9 Binary files /dev/null and b/repo/objects/c2/0b9e4f88ffdbfca8328eb36200f6f126820601fbf7e9efa607187e3b299e85.filez differ diff --git a/repo/objects/c2/1593870e16e607ba9aa7862d36596f48c8c8eddb460a1efaf5a0d76c099b6e.dirtree b/repo/objects/c2/1593870e16e607ba9aa7862d36596f48c8c8eddb460a1efaf5a0d76c099b6e.dirtree new file mode 100644 index 00000000000..1c0ab04a40d Binary files /dev/null and b/repo/objects/c2/1593870e16e607ba9aa7862d36596f48c8c8eddb460a1efaf5a0d76c099b6e.dirtree differ diff --git a/repo/objects/c2/21096a09d8d8acddfc4cf5354eabda90b1809b137076a24b18d4c782699382.filez b/repo/objects/c2/21096a09d8d8acddfc4cf5354eabda90b1809b137076a24b18d4c782699382.filez new file mode 100644 index 00000000000..273c0121798 Binary files /dev/null and b/repo/objects/c2/21096a09d8d8acddfc4cf5354eabda90b1809b137076a24b18d4c782699382.filez differ diff --git a/repo/objects/c2/227094011b1ad062d16570161d2665ea0c238d53a2de81e8241a74f5cf7971.filez b/repo/objects/c2/227094011b1ad062d16570161d2665ea0c238d53a2de81e8241a74f5cf7971.filez new file mode 100644 index 00000000000..73f56908700 Binary files /dev/null and b/repo/objects/c2/227094011b1ad062d16570161d2665ea0c238d53a2de81e8241a74f5cf7971.filez differ diff --git a/repo/objects/c2/26d226a993198ead651abebd0342e6ade360a87ac5fa679e3d08bfa5e63a83.filez b/repo/objects/c2/26d226a993198ead651abebd0342e6ade360a87ac5fa679e3d08bfa5e63a83.filez new file mode 100644 index 00000000000..f6565aca564 Binary files /dev/null and b/repo/objects/c2/26d226a993198ead651abebd0342e6ade360a87ac5fa679e3d08bfa5e63a83.filez differ diff --git a/repo/objects/c2/29d92f6cf61963da3bf7c442a93a9850cd28c03cc6a51518a566037b97230b.dirtree b/repo/objects/c2/29d92f6cf61963da3bf7c442a93a9850cd28c03cc6a51518a566037b97230b.dirtree new file mode 100644 index 00000000000..52ac953f8b2 Binary files /dev/null and b/repo/objects/c2/29d92f6cf61963da3bf7c442a93a9850cd28c03cc6a51518a566037b97230b.dirtree differ diff --git a/repo/objects/c2/2aecf23059597da238aa6ea29e4313d863fa5df2cebf51889fdcaf8d18633e.filez b/repo/objects/c2/2aecf23059597da238aa6ea29e4313d863fa5df2cebf51889fdcaf8d18633e.filez new file mode 100644 index 00000000000..92174164de3 Binary files /dev/null and b/repo/objects/c2/2aecf23059597da238aa6ea29e4313d863fa5df2cebf51889fdcaf8d18633e.filez differ diff --git a/repo/objects/c2/3893da099fc6b29ff107214a099f34c2a218ad251c7167d63e7c47b8e29ca8.filez b/repo/objects/c2/3893da099fc6b29ff107214a099f34c2a218ad251c7167d63e7c47b8e29ca8.filez new file mode 100644 index 00000000000..fc13b4ac65a Binary files /dev/null and b/repo/objects/c2/3893da099fc6b29ff107214a099f34c2a218ad251c7167d63e7c47b8e29ca8.filez differ diff --git a/repo/objects/c2/38e767d09438498cb6633414696138f441ac0f037b1d4eecc32a4597254e89.filez b/repo/objects/c2/38e767d09438498cb6633414696138f441ac0f037b1d4eecc32a4597254e89.filez new file mode 100644 index 00000000000..e951332245a Binary files /dev/null and b/repo/objects/c2/38e767d09438498cb6633414696138f441ac0f037b1d4eecc32a4597254e89.filez differ diff --git a/repo/objects/c2/40499977d74e55dfbecb556c20e4757ed9a11acb25e2478a4e80039a6901d3.dirtree b/repo/objects/c2/40499977d74e55dfbecb556c20e4757ed9a11acb25e2478a4e80039a6901d3.dirtree new file mode 100644 index 00000000000..fcf4d38f167 Binary files /dev/null and b/repo/objects/c2/40499977d74e55dfbecb556c20e4757ed9a11acb25e2478a4e80039a6901d3.dirtree differ diff --git a/repo/objects/c2/42a75a0f104b8628a25b538311241983424fcaf2cb03275540d052a23cbb1b.dirtree b/repo/objects/c2/42a75a0f104b8628a25b538311241983424fcaf2cb03275540d052a23cbb1b.dirtree new file mode 100644 index 00000000000..a81f62ef206 Binary files /dev/null and b/repo/objects/c2/42a75a0f104b8628a25b538311241983424fcaf2cb03275540d052a23cbb1b.dirtree differ diff --git a/repo/objects/c2/491452741813fd6bb2802346e8cbe1dfd543e3c4478e13141139ea156ab552.filez b/repo/objects/c2/491452741813fd6bb2802346e8cbe1dfd543e3c4478e13141139ea156ab552.filez new file mode 100644 index 00000000000..2d631fb1047 Binary files /dev/null and b/repo/objects/c2/491452741813fd6bb2802346e8cbe1dfd543e3c4478e13141139ea156ab552.filez differ diff --git a/repo/objects/c2/51668efc6c0862bfaacaf44683f2a5afb60d4053abcb994204a5fb7376ae51.filez b/repo/objects/c2/51668efc6c0862bfaacaf44683f2a5afb60d4053abcb994204a5fb7376ae51.filez new file mode 100644 index 00000000000..ec61515bba3 Binary files /dev/null and b/repo/objects/c2/51668efc6c0862bfaacaf44683f2a5afb60d4053abcb994204a5fb7376ae51.filez differ diff --git a/repo/objects/c2/59fa3e2002811a559d14199b1bdf28aa9eeafb5722726ff6c66b42c03a3521.dirtree b/repo/objects/c2/59fa3e2002811a559d14199b1bdf28aa9eeafb5722726ff6c66b42c03a3521.dirtree new file mode 100644 index 00000000000..0c432c8faea Binary files /dev/null and b/repo/objects/c2/59fa3e2002811a559d14199b1bdf28aa9eeafb5722726ff6c66b42c03a3521.dirtree differ diff --git a/repo/objects/c2/6621a5e6746436ba6f175ba2778698cc3c8cdded14b38988a0ea6d87932b72.filez b/repo/objects/c2/6621a5e6746436ba6f175ba2778698cc3c8cdded14b38988a0ea6d87932b72.filez new file mode 100644 index 00000000000..a2c487bfe76 Binary files /dev/null and b/repo/objects/c2/6621a5e6746436ba6f175ba2778698cc3c8cdded14b38988a0ea6d87932b72.filez differ diff --git a/repo/objects/c2/7392792f9fa7a69eac841dba89d3a1f69c35240938517ba7a55414a7e9dcce.filez b/repo/objects/c2/7392792f9fa7a69eac841dba89d3a1f69c35240938517ba7a55414a7e9dcce.filez new file mode 100644 index 00000000000..c3ded7338a1 Binary files /dev/null and b/repo/objects/c2/7392792f9fa7a69eac841dba89d3a1f69c35240938517ba7a55414a7e9dcce.filez differ diff --git a/repo/objects/c2/840bd037397e500eb9ba2e44972f3641c61b7f23d84aaf83186fdf0521aa0f.filez b/repo/objects/c2/840bd037397e500eb9ba2e44972f3641c61b7f23d84aaf83186fdf0521aa0f.filez new file mode 100644 index 00000000000..6e340fa825b Binary files /dev/null and b/repo/objects/c2/840bd037397e500eb9ba2e44972f3641c61b7f23d84aaf83186fdf0521aa0f.filez differ diff --git a/repo/objects/c2/857701bdda49f6fde5b761fefc0af91419469a2a142ee55a8646dc0624fb93.filez b/repo/objects/c2/857701bdda49f6fde5b761fefc0af91419469a2a142ee55a8646dc0624fb93.filez new file mode 100644 index 00000000000..2da7d59e213 Binary files /dev/null and b/repo/objects/c2/857701bdda49f6fde5b761fefc0af91419469a2a142ee55a8646dc0624fb93.filez differ diff --git a/repo/objects/c2/8f9f0972d46a17179d938ec0dc43ea44e2c9fb1a68d643fdbc737b57ef3f30.filez b/repo/objects/c2/8f9f0972d46a17179d938ec0dc43ea44e2c9fb1a68d643fdbc737b57ef3f30.filez new file mode 100644 index 00000000000..19dcd03be38 Binary files /dev/null and b/repo/objects/c2/8f9f0972d46a17179d938ec0dc43ea44e2c9fb1a68d643fdbc737b57ef3f30.filez differ diff --git a/repo/objects/c2/95964985108542615f44548693d4eca6e6ca65dfd95f0fad565790240a8061.filez b/repo/objects/c2/95964985108542615f44548693d4eca6e6ca65dfd95f0fad565790240a8061.filez new file mode 100644 index 00000000000..52216f289bf Binary files /dev/null and b/repo/objects/c2/95964985108542615f44548693d4eca6e6ca65dfd95f0fad565790240a8061.filez differ diff --git a/repo/objects/c2/a18ca5b7cd043326d8b9752789b331e852ee6d7b5d2cbe7810439b620d44c7.dirtree b/repo/objects/c2/a18ca5b7cd043326d8b9752789b331e852ee6d7b5d2cbe7810439b620d44c7.dirtree new file mode 100644 index 00000000000..118fccbc2e3 Binary files /dev/null and b/repo/objects/c2/a18ca5b7cd043326d8b9752789b331e852ee6d7b5d2cbe7810439b620d44c7.dirtree differ diff --git a/repo/objects/c2/bed84ca1f0a552381f7b04c8c5ab6100c58ba5c024e58b5419228a86b72dca.filez b/repo/objects/c2/bed84ca1f0a552381f7b04c8c5ab6100c58ba5c024e58b5419228a86b72dca.filez new file mode 100644 index 00000000000..34556d0a791 Binary files /dev/null and b/repo/objects/c2/bed84ca1f0a552381f7b04c8c5ab6100c58ba5c024e58b5419228a86b72dca.filez differ diff --git a/repo/objects/c2/f0c4b388911c56aac59e5e55da416ef2286d943c3ced5789c87f325b22c8b0.filez b/repo/objects/c2/f0c4b388911c56aac59e5e55da416ef2286d943c3ced5789c87f325b22c8b0.filez new file mode 100644 index 00000000000..d23ceab8e73 Binary files /dev/null and b/repo/objects/c2/f0c4b388911c56aac59e5e55da416ef2286d943c3ced5789c87f325b22c8b0.filez differ diff --git a/repo/objects/c3/26d947beded281b39df900cb2504d9f2f53f695fc30802c7f1513b5ab32fea.dirtree b/repo/objects/c3/26d947beded281b39df900cb2504d9f2f53f695fc30802c7f1513b5ab32fea.dirtree new file mode 100644 index 00000000000..35b641a79b1 Binary files /dev/null and b/repo/objects/c3/26d947beded281b39df900cb2504d9f2f53f695fc30802c7f1513b5ab32fea.dirtree differ diff --git a/repo/objects/c3/5edf45d88471dccd8e414747f267e3a6d7ec5302c48d7dd56ce5b4a94dfa6a.filez b/repo/objects/c3/5edf45d88471dccd8e414747f267e3a6d7ec5302c48d7dd56ce5b4a94dfa6a.filez new file mode 100644 index 00000000000..87e22eb6ebf Binary files /dev/null and b/repo/objects/c3/5edf45d88471dccd8e414747f267e3a6d7ec5302c48d7dd56ce5b4a94dfa6a.filez differ diff --git a/repo/objects/c3/6f34797df99445d3a59d7ef9dde7281cf658acd9ce7f65fa849aad2b4fea1f.filez b/repo/objects/c3/6f34797df99445d3a59d7ef9dde7281cf658acd9ce7f65fa849aad2b4fea1f.filez new file mode 100644 index 00000000000..c459d1cb66c Binary files /dev/null and b/repo/objects/c3/6f34797df99445d3a59d7ef9dde7281cf658acd9ce7f65fa849aad2b4fea1f.filez differ diff --git a/repo/objects/c3/90d75fb7f5f8912d2661c6c34e92c33f4c73f38438be47a6fe3ca20bb672e4.filez b/repo/objects/c3/90d75fb7f5f8912d2661c6c34e92c33f4c73f38438be47a6fe3ca20bb672e4.filez new file mode 100644 index 00000000000..d244313dba1 Binary files /dev/null and b/repo/objects/c3/90d75fb7f5f8912d2661c6c34e92c33f4c73f38438be47a6fe3ca20bb672e4.filez differ diff --git a/repo/objects/c3/90e8392eb13fda28ddc4e3d3fc89be4a7b489cb1933bbeff1a0cbf961a0761.filez b/repo/objects/c3/90e8392eb13fda28ddc4e3d3fc89be4a7b489cb1933bbeff1a0cbf961a0761.filez new file mode 100644 index 00000000000..9d370898bda Binary files /dev/null and b/repo/objects/c3/90e8392eb13fda28ddc4e3d3fc89be4a7b489cb1933bbeff1a0cbf961a0761.filez differ diff --git a/repo/objects/c3/99bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028.commit b/repo/objects/c3/99bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028.commit new file mode 100644 index 00000000000..faeca12164b Binary files /dev/null and b/repo/objects/c3/99bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028.commit differ diff --git a/repo/objects/c3/99bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028.commitmeta b/repo/objects/c3/99bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028.commitmeta new file mode 100644 index 00000000000..0c0965f047a Binary files /dev/null and b/repo/objects/c3/99bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028.commitmeta differ diff --git a/repo/objects/c3/c1270f093f9b223e89cd5dae6ca866975b3000f77acba3e2226868152136b2.filez b/repo/objects/c3/c1270f093f9b223e89cd5dae6ca866975b3000f77acba3e2226868152136b2.filez new file mode 100644 index 00000000000..b494f98dcc5 Binary files /dev/null and b/repo/objects/c3/c1270f093f9b223e89cd5dae6ca866975b3000f77acba3e2226868152136b2.filez differ diff --git a/repo/objects/c3/d028f93e792086f103cd2161efd23fbb283c112eb499199408d112bee2393d.filez b/repo/objects/c3/d028f93e792086f103cd2161efd23fbb283c112eb499199408d112bee2393d.filez new file mode 100644 index 00000000000..1b1ef02f307 Binary files /dev/null and b/repo/objects/c3/d028f93e792086f103cd2161efd23fbb283c112eb499199408d112bee2393d.filez differ diff --git a/repo/objects/c3/d8e6cfdb2e3a0a044ee2cbdfd3961523f5efcc9d60f72753342e2a11fa184a.filez b/repo/objects/c3/d8e6cfdb2e3a0a044ee2cbdfd3961523f5efcc9d60f72753342e2a11fa184a.filez new file mode 100644 index 00000000000..87f302fa07f Binary files /dev/null and b/repo/objects/c3/d8e6cfdb2e3a0a044ee2cbdfd3961523f5efcc9d60f72753342e2a11fa184a.filez differ diff --git a/repo/objects/c3/ed4ed2327e95086e9914271a116dd3d63f13dc8e5c6e8274f4f65def610949.filez b/repo/objects/c3/ed4ed2327e95086e9914271a116dd3d63f13dc8e5c6e8274f4f65def610949.filez new file mode 100644 index 00000000000..2ce3039e55c Binary files /dev/null and b/repo/objects/c3/ed4ed2327e95086e9914271a116dd3d63f13dc8e5c6e8274f4f65def610949.filez differ diff --git a/repo/objects/c3/f41b5239e870f26b4db649ac32fb24992416175bf7fbd0df39fa77ef12cfa6.filez b/repo/objects/c3/f41b5239e870f26b4db649ac32fb24992416175bf7fbd0df39fa77ef12cfa6.filez new file mode 100644 index 00000000000..c2f549be1d2 Binary files /dev/null and b/repo/objects/c3/f41b5239e870f26b4db649ac32fb24992416175bf7fbd0df39fa77ef12cfa6.filez differ diff --git a/repo/objects/c3/f4a8222d90af080155d21eec60aa68a63b91b78b2375d2638918fb38add4d0.filez b/repo/objects/c3/f4a8222d90af080155d21eec60aa68a63b91b78b2375d2638918fb38add4d0.filez new file mode 100644 index 00000000000..c8d083572c5 Binary files /dev/null and b/repo/objects/c3/f4a8222d90af080155d21eec60aa68a63b91b78b2375d2638918fb38add4d0.filez differ diff --git a/repo/objects/c4/0fd8a10e963dabd8eb101c9fd17779fd607630bee74a34f46ae8e0655cecca.dirtree b/repo/objects/c4/0fd8a10e963dabd8eb101c9fd17779fd607630bee74a34f46ae8e0655cecca.dirtree new file mode 100644 index 00000000000..4ccbf7a848c Binary files /dev/null and b/repo/objects/c4/0fd8a10e963dabd8eb101c9fd17779fd607630bee74a34f46ae8e0655cecca.dirtree differ diff --git a/repo/objects/c4/315c6dc3ebc20a95491f87e644ff89d5578a54457b8f164fc7513772c80cbe.filez b/repo/objects/c4/315c6dc3ebc20a95491f87e644ff89d5578a54457b8f164fc7513772c80cbe.filez new file mode 100644 index 00000000000..12c2884a66d Binary files /dev/null and b/repo/objects/c4/315c6dc3ebc20a95491f87e644ff89d5578a54457b8f164fc7513772c80cbe.filez differ diff --git a/repo/objects/c4/8069e05d4f77813d01e2a8274971ebae5999443a30dba2676195ed51a3c7e8.dirtree b/repo/objects/c4/8069e05d4f77813d01e2a8274971ebae5999443a30dba2676195ed51a3c7e8.dirtree new file mode 100644 index 00000000000..8803a3fa632 Binary files /dev/null and b/repo/objects/c4/8069e05d4f77813d01e2a8274971ebae5999443a30dba2676195ed51a3c7e8.dirtree differ diff --git a/repo/objects/c4/e559e523ddd5a7d29689544c0e96c1961fa64785ca03041609d303efba5244.filez b/repo/objects/c4/e559e523ddd5a7d29689544c0e96c1961fa64785ca03041609d303efba5244.filez new file mode 100644 index 00000000000..173d1ab0057 Binary files /dev/null and b/repo/objects/c4/e559e523ddd5a7d29689544c0e96c1961fa64785ca03041609d303efba5244.filez differ diff --git a/repo/objects/c5/2c547820a1fdb4e05a88e33568f17300eea165ad031ff2ec43302774158f9f.filez b/repo/objects/c5/2c547820a1fdb4e05a88e33568f17300eea165ad031ff2ec43302774158f9f.filez new file mode 100644 index 00000000000..9c436d7bb2b Binary files /dev/null and b/repo/objects/c5/2c547820a1fdb4e05a88e33568f17300eea165ad031ff2ec43302774158f9f.filez differ diff --git a/repo/objects/c5/2df093db324f8cc9afc62f84f667f532ca29f90497925e81bc38f9b75a5acc.filez b/repo/objects/c5/2df093db324f8cc9afc62f84f667f532ca29f90497925e81bc38f9b75a5acc.filez new file mode 100644 index 00000000000..eca02aa75a0 Binary files /dev/null and b/repo/objects/c5/2df093db324f8cc9afc62f84f667f532ca29f90497925e81bc38f9b75a5acc.filez differ diff --git a/repo/objects/c5/464919d7fb4d1ef90e15c8617ecc7cfdd22529231c3494456410df86582f91.dirtree b/repo/objects/c5/464919d7fb4d1ef90e15c8617ecc7cfdd22529231c3494456410df86582f91.dirtree new file mode 100644 index 00000000000..2a71716bc54 Binary files /dev/null and b/repo/objects/c5/464919d7fb4d1ef90e15c8617ecc7cfdd22529231c3494456410df86582f91.dirtree differ diff --git a/repo/objects/c5/56e58160a1eedac54471784582328345b5a341dec05e421d6eecf8a4560f7b.filez b/repo/objects/c5/56e58160a1eedac54471784582328345b5a341dec05e421d6eecf8a4560f7b.filez new file mode 100644 index 00000000000..a272a7d664d Binary files /dev/null and b/repo/objects/c5/56e58160a1eedac54471784582328345b5a341dec05e421d6eecf8a4560f7b.filez differ diff --git a/repo/objects/c5/5b5285fca79c0e737c4f5946ac7209dbf987e087af6d50332eb3212cd34dc0.filez b/repo/objects/c5/5b5285fca79c0e737c4f5946ac7209dbf987e087af6d50332eb3212cd34dc0.filez new file mode 100644 index 00000000000..cb5c00f5698 Binary files /dev/null and b/repo/objects/c5/5b5285fca79c0e737c4f5946ac7209dbf987e087af6d50332eb3212cd34dc0.filez differ diff --git a/repo/objects/c5/5e2592cc77127d607791dc917a39b29e9226c5f4c1007d67f8ca1ac73ec0e2.filez b/repo/objects/c5/5e2592cc77127d607791dc917a39b29e9226c5f4c1007d67f8ca1ac73ec0e2.filez new file mode 100644 index 00000000000..676d6171f09 Binary files /dev/null and b/repo/objects/c5/5e2592cc77127d607791dc917a39b29e9226c5f4c1007d67f8ca1ac73ec0e2.filez differ diff --git a/repo/objects/c5/b88ff8ecf6002bd09c69519eb1711e5a8849a18be9d1a78e4227b72be04845.filez b/repo/objects/c5/b88ff8ecf6002bd09c69519eb1711e5a8849a18be9d1a78e4227b72be04845.filez new file mode 100644 index 00000000000..84e663ae38b Binary files /dev/null and b/repo/objects/c5/b88ff8ecf6002bd09c69519eb1711e5a8849a18be9d1a78e4227b72be04845.filez differ diff --git a/repo/objects/c5/d01aa1abc45535d9593ce91760c240aeb1ce0ba8019e4b3d8b2f5f35a82940.filez b/repo/objects/c5/d01aa1abc45535d9593ce91760c240aeb1ce0ba8019e4b3d8b2f5f35a82940.filez new file mode 100644 index 00000000000..09bebf59c88 Binary files /dev/null and b/repo/objects/c5/d01aa1abc45535d9593ce91760c240aeb1ce0ba8019e4b3d8b2f5f35a82940.filez differ diff --git a/repo/objects/c5/d02b165721812c4442e9db62d3f6e9886e74dcb556dd24ff212f4edff19955.filez b/repo/objects/c5/d02b165721812c4442e9db62d3f6e9886e74dcb556dd24ff212f4edff19955.filez new file mode 100644 index 00000000000..9d23b92d7c7 Binary files /dev/null and b/repo/objects/c5/d02b165721812c4442e9db62d3f6e9886e74dcb556dd24ff212f4edff19955.filez differ diff --git a/repo/objects/c5/db460ada724d91a8bad767fa15b834374c677c16edb3c442bc531bcddc4faa.filez b/repo/objects/c5/db460ada724d91a8bad767fa15b834374c677c16edb3c442bc531bcddc4faa.filez new file mode 100644 index 00000000000..cb3f2e36149 Binary files /dev/null and b/repo/objects/c5/db460ada724d91a8bad767fa15b834374c677c16edb3c442bc531bcddc4faa.filez differ diff --git a/repo/objects/c5/de99005ea0e44adb6c541eebebd48a88d1e67fff4e3adf9ec4a6bd70957e0e.dirtree b/repo/objects/c5/de99005ea0e44adb6c541eebebd48a88d1e67fff4e3adf9ec4a6bd70957e0e.dirtree new file mode 100644 index 00000000000..7774fc128a4 Binary files /dev/null and b/repo/objects/c5/de99005ea0e44adb6c541eebebd48a88d1e67fff4e3adf9ec4a6bd70957e0e.dirtree differ diff --git a/repo/objects/c5/f90880e5f508dae601d6760b65c090686fd7cb3711e4dee1a7f08b9b853bdd.dirtree b/repo/objects/c5/f90880e5f508dae601d6760b65c090686fd7cb3711e4dee1a7f08b9b853bdd.dirtree new file mode 100644 index 00000000000..5ead4514952 Binary files /dev/null and b/repo/objects/c5/f90880e5f508dae601d6760b65c090686fd7cb3711e4dee1a7f08b9b853bdd.dirtree differ diff --git a/repo/objects/c6/1a57f66f6a25a6c3a4543841ac4c8c8fa3658d67f9ecc477bb85374dadbd36.filez b/repo/objects/c6/1a57f66f6a25a6c3a4543841ac4c8c8fa3658d67f9ecc477bb85374dadbd36.filez new file mode 100644 index 00000000000..47e27675b09 Binary files /dev/null and b/repo/objects/c6/1a57f66f6a25a6c3a4543841ac4c8c8fa3658d67f9ecc477bb85374dadbd36.filez differ diff --git a/repo/objects/c6/37123afc39685699b5c4afc22314580db296b9fd4e725490e3f23a0009dffe.filez b/repo/objects/c6/37123afc39685699b5c4afc22314580db296b9fd4e725490e3f23a0009dffe.filez new file mode 100644 index 00000000000..3988f5b7110 Binary files /dev/null and b/repo/objects/c6/37123afc39685699b5c4afc22314580db296b9fd4e725490e3f23a0009dffe.filez differ diff --git a/repo/objects/c6/37304290fe1f030b582d687326e503e71cf8939cbc2e4548c392670cf0ab2a.filez b/repo/objects/c6/37304290fe1f030b582d687326e503e71cf8939cbc2e4548c392670cf0ab2a.filez new file mode 100644 index 00000000000..cc87e8add0f Binary files /dev/null and b/repo/objects/c6/37304290fe1f030b582d687326e503e71cf8939cbc2e4548c392670cf0ab2a.filez differ diff --git a/repo/objects/c6/488fb324d73a6d8e72ce7d72c4c76d0a9c3dc7e52a3a768be0bd27b1462c56.filez b/repo/objects/c6/488fb324d73a6d8e72ce7d72c4c76d0a9c3dc7e52a3a768be0bd27b1462c56.filez new file mode 100644 index 00000000000..f4ed02fcd19 Binary files /dev/null and b/repo/objects/c6/488fb324d73a6d8e72ce7d72c4c76d0a9c3dc7e52a3a768be0bd27b1462c56.filez differ diff --git a/repo/objects/c6/5630054f6e18e5a3741016bb72d128bffcd28195a94d2d768373f9cf8ad4ce.filez b/repo/objects/c6/5630054f6e18e5a3741016bb72d128bffcd28195a94d2d768373f9cf8ad4ce.filez new file mode 100644 index 00000000000..16a1be9dbec Binary files /dev/null and b/repo/objects/c6/5630054f6e18e5a3741016bb72d128bffcd28195a94d2d768373f9cf8ad4ce.filez differ diff --git a/repo/objects/c6/65e606b4a83ef7d4a3763cdbf0e099ce8204bb941b07a5c27409f95ca5a52d.filez b/repo/objects/c6/65e606b4a83ef7d4a3763cdbf0e099ce8204bb941b07a5c27409f95ca5a52d.filez new file mode 100644 index 00000000000..05c33d5728d Binary files /dev/null and b/repo/objects/c6/65e606b4a83ef7d4a3763cdbf0e099ce8204bb941b07a5c27409f95ca5a52d.filez differ diff --git a/repo/objects/c6/8d467c878c696fdbcd1eebcce4ad426bd53c6ad332af322fcdc51ba0b5ea6d.filez b/repo/objects/c6/8d467c878c696fdbcd1eebcce4ad426bd53c6ad332af322fcdc51ba0b5ea6d.filez new file mode 100644 index 00000000000..c6958de0f02 Binary files /dev/null and b/repo/objects/c6/8d467c878c696fdbcd1eebcce4ad426bd53c6ad332af322fcdc51ba0b5ea6d.filez differ diff --git a/repo/objects/c6/908d417546f3012a7762ca5f8d6594ff4e29e30785aff3ca9af70f7335bdcb.filez b/repo/objects/c6/908d417546f3012a7762ca5f8d6594ff4e29e30785aff3ca9af70f7335bdcb.filez new file mode 100644 index 00000000000..14f80054d62 Binary files /dev/null and b/repo/objects/c6/908d417546f3012a7762ca5f8d6594ff4e29e30785aff3ca9af70f7335bdcb.filez differ diff --git a/repo/objects/c6/c4d7a0bbd88685f65fdfd145ba65164896f6d1142230d6e9312ee0a8fe8f69.dirtree b/repo/objects/c6/c4d7a0bbd88685f65fdfd145ba65164896f6d1142230d6e9312ee0a8fe8f69.dirtree new file mode 100644 index 00000000000..3097478b5b3 Binary files /dev/null and b/repo/objects/c6/c4d7a0bbd88685f65fdfd145ba65164896f6d1142230d6e9312ee0a8fe8f69.dirtree differ diff --git a/repo/objects/c6/c7dcc7fd331bf1662338a6057c5faba355bcf78fff73d28886315bfd917eb7.filez b/repo/objects/c6/c7dcc7fd331bf1662338a6057c5faba355bcf78fff73d28886315bfd917eb7.filez new file mode 100644 index 00000000000..02577475351 Binary files /dev/null and b/repo/objects/c6/c7dcc7fd331bf1662338a6057c5faba355bcf78fff73d28886315bfd917eb7.filez differ diff --git a/repo/objects/c6/e8727adb2dfe7fd1abd22d1df55caef9b4030f7ebd72810fae245c08dbf104.dirtree b/repo/objects/c6/e8727adb2dfe7fd1abd22d1df55caef9b4030f7ebd72810fae245c08dbf104.dirtree new file mode 100644 index 00000000000..3eaedeb08fd Binary files /dev/null and b/repo/objects/c6/e8727adb2dfe7fd1abd22d1df55caef9b4030f7ebd72810fae245c08dbf104.dirtree differ diff --git a/repo/objects/c6/ea574b489feaf56a8782ef5cd927d9e75bf384537843f8bbe73836b79f5cbc.filez b/repo/objects/c6/ea574b489feaf56a8782ef5cd927d9e75bf384537843f8bbe73836b79f5cbc.filez new file mode 100644 index 00000000000..99d6d273cdd Binary files /dev/null and b/repo/objects/c6/ea574b489feaf56a8782ef5cd927d9e75bf384537843f8bbe73836b79f5cbc.filez differ diff --git a/repo/objects/c7/0db9739245cf46247169d17b146cfa166a301b0f4dc6ba4775e34aba3266a8.filez b/repo/objects/c7/0db9739245cf46247169d17b146cfa166a301b0f4dc6ba4775e34aba3266a8.filez new file mode 100644 index 00000000000..69d590672a9 Binary files /dev/null and b/repo/objects/c7/0db9739245cf46247169d17b146cfa166a301b0f4dc6ba4775e34aba3266a8.filez differ diff --git a/repo/objects/c7/295a4384b78e619a456dde781fdb7ee326c7f114064fa3d51695ee9c4cd099.filez b/repo/objects/c7/295a4384b78e619a456dde781fdb7ee326c7f114064fa3d51695ee9c4cd099.filez new file mode 100644 index 00000000000..1023bbe2ae8 Binary files /dev/null and b/repo/objects/c7/295a4384b78e619a456dde781fdb7ee326c7f114064fa3d51695ee9c4cd099.filez differ diff --git a/repo/objects/c7/31a5b3702a11584612cb2c2b4494e12d1c126678c7a05ad5549b366a5b732a.filez b/repo/objects/c7/31a5b3702a11584612cb2c2b4494e12d1c126678c7a05ad5549b366a5b732a.filez new file mode 100644 index 00000000000..9cc22e98cba Binary files /dev/null and b/repo/objects/c7/31a5b3702a11584612cb2c2b4494e12d1c126678c7a05ad5549b366a5b732a.filez differ diff --git a/repo/objects/c7/32f0f1770ab2acaf40f42373fbef0c6f3216da8dadf9a948476ed11ab75f42.dirtree b/repo/objects/c7/32f0f1770ab2acaf40f42373fbef0c6f3216da8dadf9a948476ed11ab75f42.dirtree new file mode 100644 index 00000000000..7bb118868a6 Binary files /dev/null and b/repo/objects/c7/32f0f1770ab2acaf40f42373fbef0c6f3216da8dadf9a948476ed11ab75f42.dirtree differ diff --git a/repo/objects/c7/4743cb7f6ffe94ec455b90f5c69507bf201a86d8a535b2d28b90bd724bd75c.filez b/repo/objects/c7/4743cb7f6ffe94ec455b90f5c69507bf201a86d8a535b2d28b90bd724bd75c.filez new file mode 100644 index 00000000000..0f69c25e26b Binary files /dev/null and b/repo/objects/c7/4743cb7f6ffe94ec455b90f5c69507bf201a86d8a535b2d28b90bd724bd75c.filez differ diff --git a/repo/objects/c7/6a8d19066da86ad0409594c2e1a406489afbae2a7e6d08805f244347ed94f2.filez b/repo/objects/c7/6a8d19066da86ad0409594c2e1a406489afbae2a7e6d08805f244347ed94f2.filez new file mode 100644 index 00000000000..e3c88626c07 Binary files /dev/null and b/repo/objects/c7/6a8d19066da86ad0409594c2e1a406489afbae2a7e6d08805f244347ed94f2.filez differ diff --git a/repo/objects/c7/7b55d278692abc6b4cfa14e4840aa2f1f011cfa4ee076f8c3dd804508a2b51.filez b/repo/objects/c7/7b55d278692abc6b4cfa14e4840aa2f1f011cfa4ee076f8c3dd804508a2b51.filez new file mode 100644 index 00000000000..83747897de8 Binary files /dev/null and b/repo/objects/c7/7b55d278692abc6b4cfa14e4840aa2f1f011cfa4ee076f8c3dd804508a2b51.filez differ diff --git a/repo/objects/c7/7e14b36382d45c28c64f68fcbbfd561bb013e325fbf07b227cb6ea65bd3262.dirtree b/repo/objects/c7/7e14b36382d45c28c64f68fcbbfd561bb013e325fbf07b227cb6ea65bd3262.dirtree new file mode 100644 index 00000000000..c8500602506 Binary files /dev/null and b/repo/objects/c7/7e14b36382d45c28c64f68fcbbfd561bb013e325fbf07b227cb6ea65bd3262.dirtree differ diff --git a/repo/objects/c7/a86d893e204ae99f6f7eeaecb7227fa11848284f8b4d13ad5cc3d815c363c5.dirtree b/repo/objects/c7/a86d893e204ae99f6f7eeaecb7227fa11848284f8b4d13ad5cc3d815c363c5.dirtree new file mode 100644 index 00000000000..dec94849bc4 Binary files /dev/null and b/repo/objects/c7/a86d893e204ae99f6f7eeaecb7227fa11848284f8b4d13ad5cc3d815c363c5.dirtree differ diff --git a/repo/objects/c7/b74570a782ea645a72db1fc4188987383ecdc53ad77ed47f8b627cb2b6ddc7.filez b/repo/objects/c7/b74570a782ea645a72db1fc4188987383ecdc53ad77ed47f8b627cb2b6ddc7.filez new file mode 100644 index 00000000000..bfd15faaa7b Binary files /dev/null and b/repo/objects/c7/b74570a782ea645a72db1fc4188987383ecdc53ad77ed47f8b627cb2b6ddc7.filez differ diff --git a/repo/objects/c7/c3626a599b0f11ecbc48070252b6e03e09c5824de814d66ec4c37201e0b03f.filez b/repo/objects/c7/c3626a599b0f11ecbc48070252b6e03e09c5824de814d66ec4c37201e0b03f.filez new file mode 100644 index 00000000000..cf5ccf0edb3 Binary files /dev/null and b/repo/objects/c7/c3626a599b0f11ecbc48070252b6e03e09c5824de814d66ec4c37201e0b03f.filez differ diff --git a/repo/objects/c7/eb8cfe95b040d0f8f06a66cc9a36623f7ed928e0fb2b7c6ae9e9a05250473a.filez b/repo/objects/c7/eb8cfe95b040d0f8f06a66cc9a36623f7ed928e0fb2b7c6ae9e9a05250473a.filez new file mode 100644 index 00000000000..2a18b841e2e Binary files /dev/null and b/repo/objects/c7/eb8cfe95b040d0f8f06a66cc9a36623f7ed928e0fb2b7c6ae9e9a05250473a.filez differ diff --git a/repo/objects/c7/ec6b7ea2c109064b1e1896a13dd3d0dbc355678169ba299ffb0e98e43c1daa.filez b/repo/objects/c7/ec6b7ea2c109064b1e1896a13dd3d0dbc355678169ba299ffb0e98e43c1daa.filez new file mode 100644 index 00000000000..82e82d56be9 Binary files /dev/null and b/repo/objects/c7/ec6b7ea2c109064b1e1896a13dd3d0dbc355678169ba299ffb0e98e43c1daa.filez differ diff --git a/repo/objects/c8/1d22486f9c73b2487499abd7f83b4664e5bc4bcb0c7364300e1e12924ff3d5.filez b/repo/objects/c8/1d22486f9c73b2487499abd7f83b4664e5bc4bcb0c7364300e1e12924ff3d5.filez new file mode 100644 index 00000000000..a288af40971 Binary files /dev/null and b/repo/objects/c8/1d22486f9c73b2487499abd7f83b4664e5bc4bcb0c7364300e1e12924ff3d5.filez differ diff --git a/repo/objects/c8/2e887228fde6de694ef131d3bc3621cbbc7404a885cc68c97172db8cf6606d.dirtree b/repo/objects/c8/2e887228fde6de694ef131d3bc3621cbbc7404a885cc68c97172db8cf6606d.dirtree new file mode 100644 index 00000000000..16bed7ff463 Binary files /dev/null and b/repo/objects/c8/2e887228fde6de694ef131d3bc3621cbbc7404a885cc68c97172db8cf6606d.dirtree differ diff --git a/repo/objects/c8/3007623677ef21bc28ad24709f296030ca705331666e8eedac4365d0511cbe.dirtree b/repo/objects/c8/3007623677ef21bc28ad24709f296030ca705331666e8eedac4365d0511cbe.dirtree new file mode 100644 index 00000000000..15393cf6396 Binary files /dev/null and b/repo/objects/c8/3007623677ef21bc28ad24709f296030ca705331666e8eedac4365d0511cbe.dirtree differ diff --git a/repo/objects/c8/30744c5135491ad539a0dfd9c43ac5c01770df555fff954042aa702f160401.dirtree b/repo/objects/c8/30744c5135491ad539a0dfd9c43ac5c01770df555fff954042aa702f160401.dirtree new file mode 100644 index 00000000000..088049364db Binary files /dev/null and b/repo/objects/c8/30744c5135491ad539a0dfd9c43ac5c01770df555fff954042aa702f160401.dirtree differ diff --git a/repo/objects/c8/3ce1040c98a71e5c4bd29a90dd35e2f860ff592316395bd44031184dea39b1.filez b/repo/objects/c8/3ce1040c98a71e5c4bd29a90dd35e2f860ff592316395bd44031184dea39b1.filez new file mode 100644 index 00000000000..e0f5063b5e2 Binary files /dev/null and b/repo/objects/c8/3ce1040c98a71e5c4bd29a90dd35e2f860ff592316395bd44031184dea39b1.filez differ diff --git a/repo/objects/c8/48ffd17c796617d1d2d3896c728cbea57eb0c74263fa413de213b89a60dfe2.filez b/repo/objects/c8/48ffd17c796617d1d2d3896c728cbea57eb0c74263fa413de213b89a60dfe2.filez new file mode 100644 index 00000000000..654b56fd3f8 Binary files /dev/null and b/repo/objects/c8/48ffd17c796617d1d2d3896c728cbea57eb0c74263fa413de213b89a60dfe2.filez differ diff --git a/repo/objects/c8/5224b57fd059b7e73dc3af2e59beefeaafa600fd441cb64be5f17084339371.dirtree b/repo/objects/c8/5224b57fd059b7e73dc3af2e59beefeaafa600fd441cb64be5f17084339371.dirtree new file mode 100644 index 00000000000..e1146249e22 Binary files /dev/null and b/repo/objects/c8/5224b57fd059b7e73dc3af2e59beefeaafa600fd441cb64be5f17084339371.dirtree differ diff --git a/repo/objects/c8/5a8019d53ff144725802a2c7a63b30d9a597c0cb1ef2e7780eeefae72697d2.filez b/repo/objects/c8/5a8019d53ff144725802a2c7a63b30d9a597c0cb1ef2e7780eeefae72697d2.filez new file mode 100644 index 00000000000..336be5277c2 Binary files /dev/null and b/repo/objects/c8/5a8019d53ff144725802a2c7a63b30d9a597c0cb1ef2e7780eeefae72697d2.filez differ diff --git a/repo/objects/c8/69def466e3ec5da6ca762eeb9fe91f1679e2a0915d80171be86a296c7d3d04.filez b/repo/objects/c8/69def466e3ec5da6ca762eeb9fe91f1679e2a0915d80171be86a296c7d3d04.filez new file mode 100644 index 00000000000..a9daf28a02b Binary files /dev/null and b/repo/objects/c8/69def466e3ec5da6ca762eeb9fe91f1679e2a0915d80171be86a296c7d3d04.filez differ diff --git a/repo/objects/c8/6e88113ac6b476d6dabc2f11dcb35cd6d6b731d3400e857cf1b117497bf3f9.filez b/repo/objects/c8/6e88113ac6b476d6dabc2f11dcb35cd6d6b731d3400e857cf1b117497bf3f9.filez new file mode 100644 index 00000000000..b17fb79d8cd Binary files /dev/null and b/repo/objects/c8/6e88113ac6b476d6dabc2f11dcb35cd6d6b731d3400e857cf1b117497bf3f9.filez differ diff --git a/repo/objects/c8/7176a75a89e56c0a7ed90165315361a2b4a9f40ea9deef2f6af6937a6d8ed2.dirtree b/repo/objects/c8/7176a75a89e56c0a7ed90165315361a2b4a9f40ea9deef2f6af6937a6d8ed2.dirtree new file mode 100644 index 00000000000..34524516bcb Binary files /dev/null and b/repo/objects/c8/7176a75a89e56c0a7ed90165315361a2b4a9f40ea9deef2f6af6937a6d8ed2.dirtree differ diff --git a/repo/objects/c8/8455b779b41964d0347b8249ed8e4dbe13613f2f529c6cef5c86a293d076f7.filez b/repo/objects/c8/8455b779b41964d0347b8249ed8e4dbe13613f2f529c6cef5c86a293d076f7.filez new file mode 100644 index 00000000000..d9441896707 Binary files /dev/null and b/repo/objects/c8/8455b779b41964d0347b8249ed8e4dbe13613f2f529c6cef5c86a293d076f7.filez differ diff --git a/repo/objects/c8/a2bdd5d813fea0663512607ef1540fde0d163eaf3b1bd4656d777314b3076e.filez b/repo/objects/c8/a2bdd5d813fea0663512607ef1540fde0d163eaf3b1bd4656d777314b3076e.filez new file mode 100644 index 00000000000..b58b5a5a1a2 Binary files /dev/null and b/repo/objects/c8/a2bdd5d813fea0663512607ef1540fde0d163eaf3b1bd4656d777314b3076e.filez differ diff --git a/repo/objects/c8/b46a7e618063c9b9b41867781bbf480a4981fb71f55c968ab0895edef124ba.filez b/repo/objects/c8/b46a7e618063c9b9b41867781bbf480a4981fb71f55c968ab0895edef124ba.filez new file mode 100644 index 00000000000..7f367cb4655 Binary files /dev/null and b/repo/objects/c8/b46a7e618063c9b9b41867781bbf480a4981fb71f55c968ab0895edef124ba.filez differ diff --git a/repo/objects/c8/b4834cf3507ef47cbe40a343605acb823ed63e5c88c4cc0e4561db504e2611.filez b/repo/objects/c8/b4834cf3507ef47cbe40a343605acb823ed63e5c88c4cc0e4561db504e2611.filez new file mode 100644 index 00000000000..a969df45546 Binary files /dev/null and b/repo/objects/c8/b4834cf3507ef47cbe40a343605acb823ed63e5c88c4cc0e4561db504e2611.filez differ diff --git a/repo/objects/c8/d414e4bdfa56f7b091a602ea5971c94cc1abf7e1a8b8f4f3730fd1220d99ec.filez b/repo/objects/c8/d414e4bdfa56f7b091a602ea5971c94cc1abf7e1a8b8f4f3730fd1220d99ec.filez new file mode 100644 index 00000000000..2f1f033d728 Binary files /dev/null and b/repo/objects/c8/d414e4bdfa56f7b091a602ea5971c94cc1abf7e1a8b8f4f3730fd1220d99ec.filez differ diff --git a/repo/objects/c8/e5c3ceac48d82e5634f8f184c6934b567b439e9caea9e790cac0a098e83c15.dirtree b/repo/objects/c8/e5c3ceac48d82e5634f8f184c6934b567b439e9caea9e790cac0a098e83c15.dirtree new file mode 100644 index 00000000000..3448bc7365d Binary files /dev/null and b/repo/objects/c8/e5c3ceac48d82e5634f8f184c6934b567b439e9caea9e790cac0a098e83c15.dirtree differ diff --git a/repo/objects/c9/036f4642635953ad36d6144a58493d8faa6590f5d1990e159b6ae002f862aa.filez b/repo/objects/c9/036f4642635953ad36d6144a58493d8faa6590f5d1990e159b6ae002f862aa.filez new file mode 100644 index 00000000000..e60481a0d0d Binary files /dev/null and b/repo/objects/c9/036f4642635953ad36d6144a58493d8faa6590f5d1990e159b6ae002f862aa.filez differ diff --git a/repo/objects/c9/07db25f879e1411a6f382d89e3f703f019756471910c59ca3f6cabf5135ecd.dirtree b/repo/objects/c9/07db25f879e1411a6f382d89e3f703f019756471910c59ca3f6cabf5135ecd.dirtree new file mode 100644 index 00000000000..3aa5617732e Binary files /dev/null and b/repo/objects/c9/07db25f879e1411a6f382d89e3f703f019756471910c59ca3f6cabf5135ecd.dirtree differ diff --git a/repo/objects/c9/0f539327f9e3718afa69f4b41075c1256128b019bbe002330c1a08e5dddbe1.filez b/repo/objects/c9/0f539327f9e3718afa69f4b41075c1256128b019bbe002330c1a08e5dddbe1.filez new file mode 100644 index 00000000000..e5bce3d8076 Binary files /dev/null and b/repo/objects/c9/0f539327f9e3718afa69f4b41075c1256128b019bbe002330c1a08e5dddbe1.filez differ diff --git a/repo/objects/c9/393760f2a9eb23e1a4c216a460605f4fc44fb6d653db882c093a481b0ffe4e.filez b/repo/objects/c9/393760f2a9eb23e1a4c216a460605f4fc44fb6d653db882c093a481b0ffe4e.filez new file mode 100644 index 00000000000..65a39095ad9 Binary files /dev/null and b/repo/objects/c9/393760f2a9eb23e1a4c216a460605f4fc44fb6d653db882c093a481b0ffe4e.filez differ diff --git a/repo/objects/c9/768361a18f4d964214128959a063f99f6a0045500342bfe6450e887ebe351a.filez b/repo/objects/c9/768361a18f4d964214128959a063f99f6a0045500342bfe6450e887ebe351a.filez new file mode 100644 index 00000000000..1ae65499720 Binary files /dev/null and b/repo/objects/c9/768361a18f4d964214128959a063f99f6a0045500342bfe6450e887ebe351a.filez differ diff --git a/repo/objects/c9/bbd682a1d3d32c21021c68149efff7854ec9d7c94c2d4d31faf8ff928d092c.filez b/repo/objects/c9/bbd682a1d3d32c21021c68149efff7854ec9d7c94c2d4d31faf8ff928d092c.filez new file mode 100644 index 00000000000..4cb890290ed Binary files /dev/null and b/repo/objects/c9/bbd682a1d3d32c21021c68149efff7854ec9d7c94c2d4d31faf8ff928d092c.filez differ diff --git a/repo/objects/c9/bc620115aa4b51b85ac2efc8a91980bd0c28a5e2497011558764727b5d9d72.dirtree b/repo/objects/c9/bc620115aa4b51b85ac2efc8a91980bd0c28a5e2497011558764727b5d9d72.dirtree new file mode 100644 index 00000000000..46d1bc84730 Binary files /dev/null and b/repo/objects/c9/bc620115aa4b51b85ac2efc8a91980bd0c28a5e2497011558764727b5d9d72.dirtree differ diff --git a/repo/objects/c9/c0adcbb684a45dcbb2a5e6fc19c9ec1c1dd78626ffdf6036fc1391485e77a7.filez b/repo/objects/c9/c0adcbb684a45dcbb2a5e6fc19c9ec1c1dd78626ffdf6036fc1391485e77a7.filez new file mode 100644 index 00000000000..ac797d704c7 Binary files /dev/null and b/repo/objects/c9/c0adcbb684a45dcbb2a5e6fc19c9ec1c1dd78626ffdf6036fc1391485e77a7.filez differ diff --git a/repo/objects/c9/cad9906baf21f8601641f3a0a97a15592bad3291fb9a114b234833816b2a0b.dirtree b/repo/objects/c9/cad9906baf21f8601641f3a0a97a15592bad3291fb9a114b234833816b2a0b.dirtree new file mode 100644 index 00000000000..94713bebe39 Binary files /dev/null and b/repo/objects/c9/cad9906baf21f8601641f3a0a97a15592bad3291fb9a114b234833816b2a0b.dirtree differ diff --git a/repo/objects/c9/fd2f8898d355547eff48d88c8de39ecd4fba99b4181021e2bd582b8d29adb1.filez b/repo/objects/c9/fd2f8898d355547eff48d88c8de39ecd4fba99b4181021e2bd582b8d29adb1.filez new file mode 100644 index 00000000000..eb26ceb1493 Binary files /dev/null and b/repo/objects/c9/fd2f8898d355547eff48d88c8de39ecd4fba99b4181021e2bd582b8d29adb1.filez differ diff --git a/repo/objects/c9/feea647b170933a4164447708e13ec5630a1cf8ede3099fe8f58b72a9110db.dirtree b/repo/objects/c9/feea647b170933a4164447708e13ec5630a1cf8ede3099fe8f58b72a9110db.dirtree new file mode 100644 index 00000000000..ad6bb0bf405 Binary files /dev/null and b/repo/objects/c9/feea647b170933a4164447708e13ec5630a1cf8ede3099fe8f58b72a9110db.dirtree differ diff --git a/repo/objects/ca/31f09fde892d7c9fc6b1d6062e50aaf946263f1ed5e1d08eaef4d67461691e.dirtree b/repo/objects/ca/31f09fde892d7c9fc6b1d6062e50aaf946263f1ed5e1d08eaef4d67461691e.dirtree new file mode 100644 index 00000000000..928e65c1319 Binary files /dev/null and b/repo/objects/ca/31f09fde892d7c9fc6b1d6062e50aaf946263f1ed5e1d08eaef4d67461691e.dirtree differ diff --git a/repo/objects/ca/33f61f973db144728d5d2ed7954cda84f83e36f3243dc33928aaa81f89d902.filez b/repo/objects/ca/33f61f973db144728d5d2ed7954cda84f83e36f3243dc33928aaa81f89d902.filez new file mode 100644 index 00000000000..e4c851855c5 Binary files /dev/null and b/repo/objects/ca/33f61f973db144728d5d2ed7954cda84f83e36f3243dc33928aaa81f89d902.filez differ diff --git a/repo/objects/ca/3a7cd331abb72abc069fb05a50526f9022beadc6cdf17f8fc0dff42d40225f.filez b/repo/objects/ca/3a7cd331abb72abc069fb05a50526f9022beadc6cdf17f8fc0dff42d40225f.filez new file mode 100644 index 00000000000..7cf60cf3248 Binary files /dev/null and b/repo/objects/ca/3a7cd331abb72abc069fb05a50526f9022beadc6cdf17f8fc0dff42d40225f.filez differ diff --git a/repo/objects/ca/53372038795f9c61b01f5acd035d264f963bdcfb1d8dadbd048b824157451a.filez b/repo/objects/ca/53372038795f9c61b01f5acd035d264f963bdcfb1d8dadbd048b824157451a.filez new file mode 100644 index 00000000000..7742860b981 Binary files /dev/null and b/repo/objects/ca/53372038795f9c61b01f5acd035d264f963bdcfb1d8dadbd048b824157451a.filez differ diff --git a/repo/objects/ca/62077ad2596a5f096e528cfacffdadc55b4b46778277b753b0208bb2ab769b.filez b/repo/objects/ca/62077ad2596a5f096e528cfacffdadc55b4b46778277b753b0208bb2ab769b.filez new file mode 100644 index 00000000000..78d1799c355 Binary files /dev/null and b/repo/objects/ca/62077ad2596a5f096e528cfacffdadc55b4b46778277b753b0208bb2ab769b.filez differ diff --git a/repo/objects/ca/6f3b8bc6ec3c048565d89fe6872f4c4d736145f8e31b8f7fd9dd0acd982a60.filez b/repo/objects/ca/6f3b8bc6ec3c048565d89fe6872f4c4d736145f8e31b8f7fd9dd0acd982a60.filez new file mode 100644 index 00000000000..f9976166202 Binary files /dev/null and b/repo/objects/ca/6f3b8bc6ec3c048565d89fe6872f4c4d736145f8e31b8f7fd9dd0acd982a60.filez differ diff --git a/repo/objects/ca/8d669a8eb9996e0d8da5b6118168344d8799fc0101e34951e0669711920815.filez b/repo/objects/ca/8d669a8eb9996e0d8da5b6118168344d8799fc0101e34951e0669711920815.filez new file mode 100644 index 00000000000..8fc71ba35d1 Binary files /dev/null and b/repo/objects/ca/8d669a8eb9996e0d8da5b6118168344d8799fc0101e34951e0669711920815.filez differ diff --git a/repo/objects/ca/d2b1d3f4b40f7b1d95ba8199dc84dc91c746b130cbf5e66333546be62c619d.filez b/repo/objects/ca/d2b1d3f4b40f7b1d95ba8199dc84dc91c746b130cbf5e66333546be62c619d.filez new file mode 100644 index 00000000000..f262afeec7f Binary files /dev/null and b/repo/objects/ca/d2b1d3f4b40f7b1d95ba8199dc84dc91c746b130cbf5e66333546be62c619d.filez differ diff --git a/repo/objects/cb/4123b7844519f9b6ff3838973b2457c9728d8ac55e0302b9e4a11ab816b4aa.filez b/repo/objects/cb/4123b7844519f9b6ff3838973b2457c9728d8ac55e0302b9e4a11ab816b4aa.filez new file mode 100644 index 00000000000..1afbefb7461 Binary files /dev/null and b/repo/objects/cb/4123b7844519f9b6ff3838973b2457c9728d8ac55e0302b9e4a11ab816b4aa.filez differ diff --git a/repo/objects/cb/428817fdd614fcb12fc208ed73a9e11b2bfb960a1158b6382e5b02dd14a80b.filez b/repo/objects/cb/428817fdd614fcb12fc208ed73a9e11b2bfb960a1158b6382e5b02dd14a80b.filez new file mode 100644 index 00000000000..ae6bc7a0450 Binary files /dev/null and b/repo/objects/cb/428817fdd614fcb12fc208ed73a9e11b2bfb960a1158b6382e5b02dd14a80b.filez differ diff --git a/repo/objects/cb/62c812256614b3d0f44165cefc2dc56fe281a0aead6e9e1aee1059cf929f0e.filez b/repo/objects/cb/62c812256614b3d0f44165cefc2dc56fe281a0aead6e9e1aee1059cf929f0e.filez new file mode 100644 index 00000000000..ca1531bd7bc Binary files /dev/null and b/repo/objects/cb/62c812256614b3d0f44165cefc2dc56fe281a0aead6e9e1aee1059cf929f0e.filez differ diff --git a/repo/objects/cb/632747dff966c64d1e082fa316a9e9c0b36e5805436a5382eea91e85336317.filez b/repo/objects/cb/632747dff966c64d1e082fa316a9e9c0b36e5805436a5382eea91e85336317.filez new file mode 100644 index 00000000000..8f9fabf5be1 Binary files /dev/null and b/repo/objects/cb/632747dff966c64d1e082fa316a9e9c0b36e5805436a5382eea91e85336317.filez differ diff --git a/repo/objects/cb/679d93e01ff1d6bb564d3f812e7be35b7d44c5d302c340c50ed7be68653838.filez b/repo/objects/cb/679d93e01ff1d6bb564d3f812e7be35b7d44c5d302c340c50ed7be68653838.filez new file mode 100644 index 00000000000..659b1be110b Binary files /dev/null and b/repo/objects/cb/679d93e01ff1d6bb564d3f812e7be35b7d44c5d302c340c50ed7be68653838.filez differ diff --git a/repo/objects/cb/6825cdd3a28fb3a66dcae5094122426c5c6ba3a158f69ed993553582b51f37.filez b/repo/objects/cb/6825cdd3a28fb3a66dcae5094122426c5c6ba3a158f69ed993553582b51f37.filez new file mode 100644 index 00000000000..d9cc9e044d7 Binary files /dev/null and b/repo/objects/cb/6825cdd3a28fb3a66dcae5094122426c5c6ba3a158f69ed993553582b51f37.filez differ diff --git a/repo/objects/cb/94854ba3bad639daa6ad450909b31cc886db67e81b6b2ecb07fce5f022fb5b.dirtree b/repo/objects/cb/94854ba3bad639daa6ad450909b31cc886db67e81b6b2ecb07fce5f022fb5b.dirtree new file mode 100644 index 00000000000..7427f752e60 Binary files /dev/null and b/repo/objects/cb/94854ba3bad639daa6ad450909b31cc886db67e81b6b2ecb07fce5f022fb5b.dirtree differ diff --git a/repo/objects/cb/971cd5a0bcea89121eb8e7ca42f55e258cad257ed635e6c8b49e8f3a427548.filez b/repo/objects/cb/971cd5a0bcea89121eb8e7ca42f55e258cad257ed635e6c8b49e8f3a427548.filez new file mode 100644 index 00000000000..3d5dcff025c Binary files /dev/null and b/repo/objects/cb/971cd5a0bcea89121eb8e7ca42f55e258cad257ed635e6c8b49e8f3a427548.filez differ diff --git a/repo/objects/cb/a0e496f18667b608792209031bb35c8aff3d8664c04531734ff54026dab64f.dirtree b/repo/objects/cb/a0e496f18667b608792209031bb35c8aff3d8664c04531734ff54026dab64f.dirtree new file mode 100644 index 00000000000..4dbcc1a46b5 Binary files /dev/null and b/repo/objects/cb/a0e496f18667b608792209031bb35c8aff3d8664c04531734ff54026dab64f.dirtree differ diff --git a/repo/objects/cb/a290181a4cf32ea82e6372ba9f5c9f30283484e270afafeb66c526346d8cbe.filez b/repo/objects/cb/a290181a4cf32ea82e6372ba9f5c9f30283484e270afafeb66c526346d8cbe.filez new file mode 100644 index 00000000000..b6604ec56f4 Binary files /dev/null and b/repo/objects/cb/a290181a4cf32ea82e6372ba9f5c9f30283484e270afafeb66c526346d8cbe.filez differ diff --git a/repo/objects/cb/a9aded581235e5889735bbbf4a0d118648b7f149783a3538ec3416957dd4f4.filez b/repo/objects/cb/a9aded581235e5889735bbbf4a0d118648b7f149783a3538ec3416957dd4f4.filez new file mode 100644 index 00000000000..06b185ef890 Binary files /dev/null and b/repo/objects/cb/a9aded581235e5889735bbbf4a0d118648b7f149783a3538ec3416957dd4f4.filez differ diff --git a/repo/objects/cb/b9eefb78d79e1ec3d48e70711a0dfc976e7a79decdd4be275156976feaa3d2.filez b/repo/objects/cb/b9eefb78d79e1ec3d48e70711a0dfc976e7a79decdd4be275156976feaa3d2.filez new file mode 100644 index 00000000000..9172a42397e Binary files /dev/null and b/repo/objects/cb/b9eefb78d79e1ec3d48e70711a0dfc976e7a79decdd4be275156976feaa3d2.filez differ diff --git a/repo/objects/cb/e56418103a7379e4d4095466d15ba73a767d8491d3fc43f41480740ec04c02.filez b/repo/objects/cb/e56418103a7379e4d4095466d15ba73a767d8491d3fc43f41480740ec04c02.filez new file mode 100644 index 00000000000..219c1ec0f6b Binary files /dev/null and b/repo/objects/cb/e56418103a7379e4d4095466d15ba73a767d8491d3fc43f41480740ec04c02.filez differ diff --git a/repo/objects/cb/f425e0b1719fda31b288366366f9d6baf4f80180867013718f6625baddbead.filez b/repo/objects/cb/f425e0b1719fda31b288366366f9d6baf4f80180867013718f6625baddbead.filez new file mode 100644 index 00000000000..32969bd6813 Binary files /dev/null and b/repo/objects/cb/f425e0b1719fda31b288366366f9d6baf4f80180867013718f6625baddbead.filez differ diff --git a/repo/objects/cc/0507d3a7dc8c814e25e813d2e4f0d4563422c2b2cd48bbc2f1a6e28a845cda.dirtree b/repo/objects/cc/0507d3a7dc8c814e25e813d2e4f0d4563422c2b2cd48bbc2f1a6e28a845cda.dirtree new file mode 100644 index 00000000000..14a32a6c4a3 Binary files /dev/null and b/repo/objects/cc/0507d3a7dc8c814e25e813d2e4f0d4563422c2b2cd48bbc2f1a6e28a845cda.dirtree differ diff --git a/repo/objects/cc/0bbb0dc90a655c59a1d29b1bc6072a91eecdde536391f805696f5da70e7bbc.filez b/repo/objects/cc/0bbb0dc90a655c59a1d29b1bc6072a91eecdde536391f805696f5da70e7bbc.filez new file mode 100644 index 00000000000..de8fb640014 Binary files /dev/null and b/repo/objects/cc/0bbb0dc90a655c59a1d29b1bc6072a91eecdde536391f805696f5da70e7bbc.filez differ diff --git a/repo/objects/cc/1a6d89e08891b26f33ff1028d040c699228835722612ce3efe431f8bcfaca3.filez b/repo/objects/cc/1a6d89e08891b26f33ff1028d040c699228835722612ce3efe431f8bcfaca3.filez new file mode 100644 index 00000000000..0c436b8e295 Binary files /dev/null and b/repo/objects/cc/1a6d89e08891b26f33ff1028d040c699228835722612ce3efe431f8bcfaca3.filez differ diff --git a/repo/objects/cc/36440fa273c5537ffc34f265608c4b255c6de434c277be80a0f7702e3fe217.filez b/repo/objects/cc/36440fa273c5537ffc34f265608c4b255c6de434c277be80a0f7702e3fe217.filez new file mode 100644 index 00000000000..f531bfeb9a4 Binary files /dev/null and b/repo/objects/cc/36440fa273c5537ffc34f265608c4b255c6de434c277be80a0f7702e3fe217.filez differ diff --git a/repo/objects/cc/387c1e1ae9852a09bd8fbe59c98f8c475598a8ccaa7ee73196c736e763e9a8.filez b/repo/objects/cc/387c1e1ae9852a09bd8fbe59c98f8c475598a8ccaa7ee73196c736e763e9a8.filez new file mode 100644 index 00000000000..f1891f51bdc Binary files /dev/null and b/repo/objects/cc/387c1e1ae9852a09bd8fbe59c98f8c475598a8ccaa7ee73196c736e763e9a8.filez differ diff --git a/repo/objects/cc/3a5170a95998fe73b49d2e44837da31329a2a8b2abbb85c95b6e5e15b35bd4.dirtree b/repo/objects/cc/3a5170a95998fe73b49d2e44837da31329a2a8b2abbb85c95b6e5e15b35bd4.dirtree new file mode 100644 index 00000000000..2aba7311655 Binary files /dev/null and b/repo/objects/cc/3a5170a95998fe73b49d2e44837da31329a2a8b2abbb85c95b6e5e15b35bd4.dirtree differ diff --git a/repo/objects/cc/445f7284c8624372228fdf5b5a89388ff53934f38b1843b9efd2a6cc3b2909.filez b/repo/objects/cc/445f7284c8624372228fdf5b5a89388ff53934f38b1843b9efd2a6cc3b2909.filez new file mode 100644 index 00000000000..f537563b6ed Binary files /dev/null and b/repo/objects/cc/445f7284c8624372228fdf5b5a89388ff53934f38b1843b9efd2a6cc3b2909.filez differ diff --git a/repo/objects/cc/4478b94a02854ca1bf86588154f182e3324d033627dbd27c87278eadf47ed5.filez b/repo/objects/cc/4478b94a02854ca1bf86588154f182e3324d033627dbd27c87278eadf47ed5.filez new file mode 100644 index 00000000000..463ddc4172e Binary files /dev/null and b/repo/objects/cc/4478b94a02854ca1bf86588154f182e3324d033627dbd27c87278eadf47ed5.filez differ diff --git a/repo/objects/cc/4ad6549277040ab0a4ed6fc2a3bbbbbaa1f85973013752559c11b27789049d.filez b/repo/objects/cc/4ad6549277040ab0a4ed6fc2a3bbbbbaa1f85973013752559c11b27789049d.filez new file mode 100644 index 00000000000..30c513b449f Binary files /dev/null and b/repo/objects/cc/4ad6549277040ab0a4ed6fc2a3bbbbbaa1f85973013752559c11b27789049d.filez differ diff --git a/repo/objects/cc/c0ab0ffcc3b8daf00d6aae25eefce9e87c2e940eda8dd84d5c071af6171e0a.filez b/repo/objects/cc/c0ab0ffcc3b8daf00d6aae25eefce9e87c2e940eda8dd84d5c071af6171e0a.filez new file mode 100644 index 00000000000..744668e0991 Binary files /dev/null and b/repo/objects/cc/c0ab0ffcc3b8daf00d6aae25eefce9e87c2e940eda8dd84d5c071af6171e0a.filez differ diff --git a/repo/objects/cd/3310da3ed381dc5c8a15df67b255f49e00a0ec12aa19a497a128da16e60a31.filez b/repo/objects/cd/3310da3ed381dc5c8a15df67b255f49e00a0ec12aa19a497a128da16e60a31.filez new file mode 100644 index 00000000000..01f2cfd4ff5 Binary files /dev/null and b/repo/objects/cd/3310da3ed381dc5c8a15df67b255f49e00a0ec12aa19a497a128da16e60a31.filez differ diff --git a/repo/objects/cd/34bd32b1d47db3af69fb7c81360b5120d4f3bf3b657e2ce78f34759105d15b.filez b/repo/objects/cd/34bd32b1d47db3af69fb7c81360b5120d4f3bf3b657e2ce78f34759105d15b.filez new file mode 100644 index 00000000000..7793c4e9dcd Binary files /dev/null and b/repo/objects/cd/34bd32b1d47db3af69fb7c81360b5120d4f3bf3b657e2ce78f34759105d15b.filez differ diff --git a/repo/objects/cd/36572ac7e9d1dc150838026aef342fef72322e55aa9a05a72a836be79342da.filez b/repo/objects/cd/36572ac7e9d1dc150838026aef342fef72322e55aa9a05a72a836be79342da.filez new file mode 100644 index 00000000000..a0de06cd24c Binary files /dev/null and b/repo/objects/cd/36572ac7e9d1dc150838026aef342fef72322e55aa9a05a72a836be79342da.filez differ diff --git a/repo/objects/cd/39eb3e369e1828834d4949bb8f61174f88d95cc7759bb8335ebd1ab552b0a2.dirtree b/repo/objects/cd/39eb3e369e1828834d4949bb8f61174f88d95cc7759bb8335ebd1ab552b0a2.dirtree new file mode 100644 index 00000000000..3da924f9c8f Binary files /dev/null and b/repo/objects/cd/39eb3e369e1828834d4949bb8f61174f88d95cc7759bb8335ebd1ab552b0a2.dirtree differ diff --git a/repo/objects/cd/4b02931b360240a74d6e62e6b4ae75702629c67e5ec0fe4287f6bebd12be5c.filez b/repo/objects/cd/4b02931b360240a74d6e62e6b4ae75702629c67e5ec0fe4287f6bebd12be5c.filez new file mode 100644 index 00000000000..5e02c18eb8e Binary files /dev/null and b/repo/objects/cd/4b02931b360240a74d6e62e6b4ae75702629c67e5ec0fe4287f6bebd12be5c.filez differ diff --git a/repo/objects/cd/5f5bff9c105230c98b424000938e77e19ce50e20680c5487e7eea06cd2d716.filez b/repo/objects/cd/5f5bff9c105230c98b424000938e77e19ce50e20680c5487e7eea06cd2d716.filez new file mode 100644 index 00000000000..9e9fe04762f Binary files /dev/null and b/repo/objects/cd/5f5bff9c105230c98b424000938e77e19ce50e20680c5487e7eea06cd2d716.filez differ diff --git a/repo/objects/cd/9415dc80387d023e1de163f1b369568c053f9fb743372f22fb76d4da41f3f0.filez b/repo/objects/cd/9415dc80387d023e1de163f1b369568c053f9fb743372f22fb76d4da41f3f0.filez new file mode 100644 index 00000000000..e644ce5bae5 Binary files /dev/null and b/repo/objects/cd/9415dc80387d023e1de163f1b369568c053f9fb743372f22fb76d4da41f3f0.filez differ diff --git a/repo/objects/cd/e0d019c578b18dc89b3f222cb7c39fdde54ca1ba0ae334a393eb1125c0c951.filez b/repo/objects/cd/e0d019c578b18dc89b3f222cb7c39fdde54ca1ba0ae334a393eb1125c0c951.filez new file mode 100644 index 00000000000..fd79c657130 Binary files /dev/null and b/repo/objects/cd/e0d019c578b18dc89b3f222cb7c39fdde54ca1ba0ae334a393eb1125c0c951.filez differ diff --git a/repo/objects/cd/ea4e7cee946180b2d3cbe3a0c5f48ec1e8764fea0d669408d7ea1de7212865.dirtree b/repo/objects/cd/ea4e7cee946180b2d3cbe3a0c5f48ec1e8764fea0d669408d7ea1de7212865.dirtree new file mode 100644 index 00000000000..b4009940311 Binary files /dev/null and b/repo/objects/cd/ea4e7cee946180b2d3cbe3a0c5f48ec1e8764fea0d669408d7ea1de7212865.dirtree differ diff --git a/repo/objects/cd/f8763728744db276e7b793c41698ecd44077e6a76a6c9962806c2152c85301.filez b/repo/objects/cd/f8763728744db276e7b793c41698ecd44077e6a76a6c9962806c2152c85301.filez new file mode 100644 index 00000000000..c5c99ded1a2 Binary files /dev/null and b/repo/objects/cd/f8763728744db276e7b793c41698ecd44077e6a76a6c9962806c2152c85301.filez differ diff --git a/repo/objects/ce/1a9f1dee8f6c9d72338fd40389f41c875af83f81e754c74abd04f7ae6b0a43.dirtree b/repo/objects/ce/1a9f1dee8f6c9d72338fd40389f41c875af83f81e754c74abd04f7ae6b0a43.dirtree new file mode 100644 index 00000000000..119b8b0cb6b Binary files /dev/null and b/repo/objects/ce/1a9f1dee8f6c9d72338fd40389f41c875af83f81e754c74abd04f7ae6b0a43.dirtree differ diff --git a/repo/objects/ce/75949e33940ce312e7fec28e417328bfb3cc602a618d54cc043e46f014d706.filez b/repo/objects/ce/75949e33940ce312e7fec28e417328bfb3cc602a618d54cc043e46f014d706.filez new file mode 100644 index 00000000000..bdc97e93abe Binary files /dev/null and b/repo/objects/ce/75949e33940ce312e7fec28e417328bfb3cc602a618d54cc043e46f014d706.filez differ diff --git a/repo/objects/ce/8d9273e8d44797d3dc6d6ccff8d4b80a9c29533f7412258371abd68619fd7f.filez b/repo/objects/ce/8d9273e8d44797d3dc6d6ccff8d4b80a9c29533f7412258371abd68619fd7f.filez new file mode 100644 index 00000000000..6f76517fcc6 Binary files /dev/null and b/repo/objects/ce/8d9273e8d44797d3dc6d6ccff8d4b80a9c29533f7412258371abd68619fd7f.filez differ diff --git a/repo/objects/ce/a36b4e443400c02829d48b75eaf6ff14df375f4a8b02ef268a4140790473d2.dirtree b/repo/objects/ce/a36b4e443400c02829d48b75eaf6ff14df375f4a8b02ef268a4140790473d2.dirtree new file mode 100644 index 00000000000..890f103aac7 Binary files /dev/null and b/repo/objects/ce/a36b4e443400c02829d48b75eaf6ff14df375f4a8b02ef268a4140790473d2.dirtree differ diff --git a/repo/objects/ce/ade0601ea6ad29eb428507e450c3f84d3332cb0e25493544839959e80fa6ce.filez b/repo/objects/ce/ade0601ea6ad29eb428507e450c3f84d3332cb0e25493544839959e80fa6ce.filez new file mode 100644 index 00000000000..d841ee8bbbe Binary files /dev/null and b/repo/objects/ce/ade0601ea6ad29eb428507e450c3f84d3332cb0e25493544839959e80fa6ce.filez differ diff --git a/repo/objects/ce/f40640f12a30c64b3992b4df9de54c2ab10e473b088fb1e94a25f5be2c4684.dirtree b/repo/objects/ce/f40640f12a30c64b3992b4df9de54c2ab10e473b088fb1e94a25f5be2c4684.dirtree new file mode 100644 index 00000000000..91ec152b17b Binary files /dev/null and b/repo/objects/ce/f40640f12a30c64b3992b4df9de54c2ab10e473b088fb1e94a25f5be2c4684.dirtree differ diff --git a/repo/objects/ce/ffda837cb47eaffbf1728e712854b0d58e6805fb3ab03e9da819fc9899475f.filez b/repo/objects/ce/ffda837cb47eaffbf1728e712854b0d58e6805fb3ab03e9da819fc9899475f.filez new file mode 100644 index 00000000000..c5d7f64b05c Binary files /dev/null and b/repo/objects/ce/ffda837cb47eaffbf1728e712854b0d58e6805fb3ab03e9da819fc9899475f.filez differ diff --git a/repo/objects/cf/13d07bffbd3186938c330e66fedf683b6b03d726e7c554a70ab1b9c7af679f.dirtree b/repo/objects/cf/13d07bffbd3186938c330e66fedf683b6b03d726e7c554a70ab1b9c7af679f.dirtree new file mode 100644 index 00000000000..d7d812e26f3 Binary files /dev/null and b/repo/objects/cf/13d07bffbd3186938c330e66fedf683b6b03d726e7c554a70ab1b9c7af679f.dirtree differ diff --git a/repo/objects/cf/39b83e519a1926e69def0bdf9b54fc337e7e54105ee25679ae33a6dcc06dcf.filez b/repo/objects/cf/39b83e519a1926e69def0bdf9b54fc337e7e54105ee25679ae33a6dcc06dcf.filez new file mode 100644 index 00000000000..6ae7d3750fb Binary files /dev/null and b/repo/objects/cf/39b83e519a1926e69def0bdf9b54fc337e7e54105ee25679ae33a6dcc06dcf.filez differ diff --git a/repo/objects/cf/3d7596ec66da24fd0b1d086e872030f370a125e6c484a36671d51af5a0988e.filez b/repo/objects/cf/3d7596ec66da24fd0b1d086e872030f370a125e6c484a36671d51af5a0988e.filez new file mode 100644 index 00000000000..497699c0c13 Binary files /dev/null and b/repo/objects/cf/3d7596ec66da24fd0b1d086e872030f370a125e6c484a36671d51af5a0988e.filez differ diff --git a/repo/objects/cf/4bb90e9fb06871ed46c032b691a2827b1216cd7e63ab7786d548cc5540cda6.filez b/repo/objects/cf/4bb90e9fb06871ed46c032b691a2827b1216cd7e63ab7786d548cc5540cda6.filez new file mode 100644 index 00000000000..1939284c044 Binary files /dev/null and b/repo/objects/cf/4bb90e9fb06871ed46c032b691a2827b1216cd7e63ab7786d548cc5540cda6.filez differ diff --git a/repo/objects/cf/578669d9e5d5a842c4aaddcefdebcb3ff05baa53f4c1eb462ced0ef233372e.filez b/repo/objects/cf/578669d9e5d5a842c4aaddcefdebcb3ff05baa53f4c1eb462ced0ef233372e.filez new file mode 100644 index 00000000000..9fc519ee099 Binary files /dev/null and b/repo/objects/cf/578669d9e5d5a842c4aaddcefdebcb3ff05baa53f4c1eb462ced0ef233372e.filez differ diff --git a/repo/objects/cf/5f717f7fd0df890daf5ac3fdbb8c5b88c69a94b18fae418b2afc63335fbe24.filez b/repo/objects/cf/5f717f7fd0df890daf5ac3fdbb8c5b88c69a94b18fae418b2afc63335fbe24.filez new file mode 100644 index 00000000000..ee298e04bd9 Binary files /dev/null and b/repo/objects/cf/5f717f7fd0df890daf5ac3fdbb8c5b88c69a94b18fae418b2afc63335fbe24.filez differ diff --git a/repo/objects/cf/846815217e173b51b93b549903f9f4ff02276fae4bbe42c716c9ffb27fc660.dirtree b/repo/objects/cf/846815217e173b51b93b549903f9f4ff02276fae4bbe42c716c9ffb27fc660.dirtree new file mode 100644 index 00000000000..9e97a893df2 Binary files /dev/null and b/repo/objects/cf/846815217e173b51b93b549903f9f4ff02276fae4bbe42c716c9ffb27fc660.dirtree differ diff --git a/repo/objects/cf/89175bc76445cef53edc6b36f3bf3376771c868413f474a84cd1858501af6e.filez b/repo/objects/cf/89175bc76445cef53edc6b36f3bf3376771c868413f474a84cd1858501af6e.filez new file mode 100644 index 00000000000..bd9532bb723 Binary files /dev/null and b/repo/objects/cf/89175bc76445cef53edc6b36f3bf3376771c868413f474a84cd1858501af6e.filez differ diff --git a/repo/objects/cf/8c8b833e3b3669da73e79c3ccd6d24ebfdbbcb510a551377abd77d8763c4b1.filez b/repo/objects/cf/8c8b833e3b3669da73e79c3ccd6d24ebfdbbcb510a551377abd77d8763c4b1.filez new file mode 100644 index 00000000000..b424d21932f Binary files /dev/null and b/repo/objects/cf/8c8b833e3b3669da73e79c3ccd6d24ebfdbbcb510a551377abd77d8763c4b1.filez differ diff --git a/repo/objects/cf/e8fb755b01312e7b7c472016a36874ad4dc2104cfc67a6761a9dceda4362c7.dirtree b/repo/objects/cf/e8fb755b01312e7b7c472016a36874ad4dc2104cfc67a6761a9dceda4362c7.dirtree new file mode 100644 index 00000000000..9443f56d6fa Binary files /dev/null and b/repo/objects/cf/e8fb755b01312e7b7c472016a36874ad4dc2104cfc67a6761a9dceda4362c7.dirtree differ diff --git a/repo/objects/cf/f1dc4993d05f735a0a52d78511f198db2e6d0412b0a2c4aaa7d96917dafa7a.filez b/repo/objects/cf/f1dc4993d05f735a0a52d78511f198db2e6d0412b0a2c4aaa7d96917dafa7a.filez new file mode 100644 index 00000000000..02cee3f89ad Binary files /dev/null and b/repo/objects/cf/f1dc4993d05f735a0a52d78511f198db2e6d0412b0a2c4aaa7d96917dafa7a.filez differ diff --git a/repo/objects/d0/021574b65b2e042e1b81cb6808b550c5f98d847f30391ac2908ff6923b61f2.filez b/repo/objects/d0/021574b65b2e042e1b81cb6808b550c5f98d847f30391ac2908ff6923b61f2.filez new file mode 100644 index 00000000000..4c453caae9e Binary files /dev/null and b/repo/objects/d0/021574b65b2e042e1b81cb6808b550c5f98d847f30391ac2908ff6923b61f2.filez differ diff --git a/repo/objects/d0/160d1fbac53524d1ff64a7229305371ce4bcef6ff93885c987b8d17763e1a9.filez b/repo/objects/d0/160d1fbac53524d1ff64a7229305371ce4bcef6ff93885c987b8d17763e1a9.filez new file mode 100644 index 00000000000..964413ce0e3 Binary files /dev/null and b/repo/objects/d0/160d1fbac53524d1ff64a7229305371ce4bcef6ff93885c987b8d17763e1a9.filez differ diff --git a/repo/objects/d0/38ce244c7f38e9440001cb6639499d6a86d799003ac6c6104e8a41594a1695.filez b/repo/objects/d0/38ce244c7f38e9440001cb6639499d6a86d799003ac6c6104e8a41594a1695.filez new file mode 100644 index 00000000000..e4371f2bddd Binary files /dev/null and b/repo/objects/d0/38ce244c7f38e9440001cb6639499d6a86d799003ac6c6104e8a41594a1695.filez differ diff --git a/repo/objects/d0/56d1262af1aa3f1b644226e5b338a5ff462a1df8a65895cd4cfb38ec058453.dirtree b/repo/objects/d0/56d1262af1aa3f1b644226e5b338a5ff462a1df8a65895cd4cfb38ec058453.dirtree new file mode 100644 index 00000000000..ff3f569214d Binary files /dev/null and b/repo/objects/d0/56d1262af1aa3f1b644226e5b338a5ff462a1df8a65895cd4cfb38ec058453.dirtree differ diff --git a/repo/objects/d0/5716426391fe56290dcafbe90a33d0fb22d2718f1869b59c100783b623e030.dirtree b/repo/objects/d0/5716426391fe56290dcafbe90a33d0fb22d2718f1869b59c100783b623e030.dirtree new file mode 100644 index 00000000000..ee2e6c1c9a9 Binary files /dev/null and b/repo/objects/d0/5716426391fe56290dcafbe90a33d0fb22d2718f1869b59c100783b623e030.dirtree differ diff --git a/repo/objects/d0/63a6105481e1d60d5a469d68506eddff849f6c26d44cf18fc9df589721de84.dirtree b/repo/objects/d0/63a6105481e1d60d5a469d68506eddff849f6c26d44cf18fc9df589721de84.dirtree new file mode 100644 index 00000000000..f899cce4e52 Binary files /dev/null and b/repo/objects/d0/63a6105481e1d60d5a469d68506eddff849f6c26d44cf18fc9df589721de84.dirtree differ diff --git a/repo/objects/d0/940747f05e91e4b9fe7a4e181bb907e7f91e0dbe6d5c927c29ecbb0e4f4cb6.filez b/repo/objects/d0/940747f05e91e4b9fe7a4e181bb907e7f91e0dbe6d5c927c29ecbb0e4f4cb6.filez new file mode 100644 index 00000000000..15bcfe428a8 Binary files /dev/null and b/repo/objects/d0/940747f05e91e4b9fe7a4e181bb907e7f91e0dbe6d5c927c29ecbb0e4f4cb6.filez differ diff --git a/repo/objects/d0/9450a1b49812c4b2e75e4b7b28b283c1f687bd61bda9eb41041caf22a0eee8.filez b/repo/objects/d0/9450a1b49812c4b2e75e4b7b28b283c1f687bd61bda9eb41041caf22a0eee8.filez new file mode 100644 index 00000000000..33767290bb9 Binary files /dev/null and b/repo/objects/d0/9450a1b49812c4b2e75e4b7b28b283c1f687bd61bda9eb41041caf22a0eee8.filez differ diff --git a/repo/objects/d0/99247d9857fc5bd5155cb10a19c641194426ecef96a0aae417208e01fdcaea.filez b/repo/objects/d0/99247d9857fc5bd5155cb10a19c641194426ecef96a0aae417208e01fdcaea.filez new file mode 100644 index 00000000000..ba82c3b6986 Binary files /dev/null and b/repo/objects/d0/99247d9857fc5bd5155cb10a19c641194426ecef96a0aae417208e01fdcaea.filez differ diff --git a/repo/objects/d0/b4be6f53c233d768b2acb6c1b7fc1c6b7a2a2f1dff736f8a5a63a252b1a481.filez b/repo/objects/d0/b4be6f53c233d768b2acb6c1b7fc1c6b7a2a2f1dff736f8a5a63a252b1a481.filez new file mode 100644 index 00000000000..d23eed2b588 Binary files /dev/null and b/repo/objects/d0/b4be6f53c233d768b2acb6c1b7fc1c6b7a2a2f1dff736f8a5a63a252b1a481.filez differ diff --git a/repo/objects/d1/18ff6aae4a62cc0c11132a9914b1b3d6eb43888cd690fde3c0e9a1cbfc8312.dirtree b/repo/objects/d1/18ff6aae4a62cc0c11132a9914b1b3d6eb43888cd690fde3c0e9a1cbfc8312.dirtree new file mode 100644 index 00000000000..9758ada961b Binary files /dev/null and b/repo/objects/d1/18ff6aae4a62cc0c11132a9914b1b3d6eb43888cd690fde3c0e9a1cbfc8312.dirtree differ diff --git a/repo/objects/d1/35cf2199bd8990ba339bc084f7c635f3b462669e2e48350c898234e09e118d.filez b/repo/objects/d1/35cf2199bd8990ba339bc084f7c635f3b462669e2e48350c898234e09e118d.filez new file mode 100644 index 00000000000..92d550f85b7 Binary files /dev/null and b/repo/objects/d1/35cf2199bd8990ba339bc084f7c635f3b462669e2e48350c898234e09e118d.filez differ diff --git a/repo/objects/d1/72c709929a86ce827679e068923801494e163bfc86361dea5c3848b3d7bde1.filez b/repo/objects/d1/72c709929a86ce827679e068923801494e163bfc86361dea5c3848b3d7bde1.filez new file mode 100644 index 00000000000..ebba6d89984 Binary files /dev/null and b/repo/objects/d1/72c709929a86ce827679e068923801494e163bfc86361dea5c3848b3d7bde1.filez differ diff --git a/repo/objects/d1/7f83a0c50ab2401990e55acb1b7e39ce715389e0404da8633dcdf86d81ba34.dirtree b/repo/objects/d1/7f83a0c50ab2401990e55acb1b7e39ce715389e0404da8633dcdf86d81ba34.dirtree new file mode 100644 index 00000000000..e3f36d405f0 Binary files /dev/null and b/repo/objects/d1/7f83a0c50ab2401990e55acb1b7e39ce715389e0404da8633dcdf86d81ba34.dirtree differ diff --git a/repo/objects/d1/8b667a05ba0960147359546e64a35cbb481df0ac45b9c823fdeb385e52e41f.filez b/repo/objects/d1/8b667a05ba0960147359546e64a35cbb481df0ac45b9c823fdeb385e52e41f.filez new file mode 100644 index 00000000000..191ea07bb94 Binary files /dev/null and b/repo/objects/d1/8b667a05ba0960147359546e64a35cbb481df0ac45b9c823fdeb385e52e41f.filez differ diff --git a/repo/objects/d1/ad13b028bdf25d0b52ef31b07a933847388471d3228d16c394abb3b07f90d5.filez b/repo/objects/d1/ad13b028bdf25d0b52ef31b07a933847388471d3228d16c394abb3b07f90d5.filez new file mode 100644 index 00000000000..be05aa4a8f7 Binary files /dev/null and b/repo/objects/d1/ad13b028bdf25d0b52ef31b07a933847388471d3228d16c394abb3b07f90d5.filez differ diff --git a/repo/objects/d1/b79fbf0f5a3a10e2c7e15ad20f7f0423401de0106d9394a5aa799a1fb0334b.dirtree b/repo/objects/d1/b79fbf0f5a3a10e2c7e15ad20f7f0423401de0106d9394a5aa799a1fb0334b.dirtree new file mode 100644 index 00000000000..770a2cae536 Binary files /dev/null and b/repo/objects/d1/b79fbf0f5a3a10e2c7e15ad20f7f0423401de0106d9394a5aa799a1fb0334b.dirtree differ diff --git a/repo/objects/d1/dd472c4d1a006895ffeea141ae5450804f084fcbdf73931254ea5a5d2b956d.filez b/repo/objects/d1/dd472c4d1a006895ffeea141ae5450804f084fcbdf73931254ea5a5d2b956d.filez new file mode 100644 index 00000000000..3e64ab17aac Binary files /dev/null and b/repo/objects/d1/dd472c4d1a006895ffeea141ae5450804f084fcbdf73931254ea5a5d2b956d.filez differ diff --git a/repo/objects/d1/e3a35902454afc4ecf5da07836b98d9b81dadaef2bcd414ec2811a6333c151.filez b/repo/objects/d1/e3a35902454afc4ecf5da07836b98d9b81dadaef2bcd414ec2811a6333c151.filez new file mode 100644 index 00000000000..4091832cc99 Binary files /dev/null and b/repo/objects/d1/e3a35902454afc4ecf5da07836b98d9b81dadaef2bcd414ec2811a6333c151.filez differ diff --git a/repo/objects/d2/0011e51944cdd49006b25d42c264d79f9b9cc6818a072ab1d411036711f711.filez b/repo/objects/d2/0011e51944cdd49006b25d42c264d79f9b9cc6818a072ab1d411036711f711.filez new file mode 100644 index 00000000000..1f9589fe980 Binary files /dev/null and b/repo/objects/d2/0011e51944cdd49006b25d42c264d79f9b9cc6818a072ab1d411036711f711.filez differ diff --git a/repo/objects/d2/0a784f475ab740bcbb140539f62ec5788741dd31379e7ba6bdb5df93d042f3.dirtree b/repo/objects/d2/0a784f475ab740bcbb140539f62ec5788741dd31379e7ba6bdb5df93d042f3.dirtree new file mode 100644 index 00000000000..9cf9af18775 Binary files /dev/null and b/repo/objects/d2/0a784f475ab740bcbb140539f62ec5788741dd31379e7ba6bdb5df93d042f3.dirtree differ diff --git a/repo/objects/d2/1fc753f1919c3f64d84a3e7dd220ec935b471282d74214edda91351bf27214.filez b/repo/objects/d2/1fc753f1919c3f64d84a3e7dd220ec935b471282d74214edda91351bf27214.filez new file mode 100644 index 00000000000..82b95a7b90a Binary files /dev/null and b/repo/objects/d2/1fc753f1919c3f64d84a3e7dd220ec935b471282d74214edda91351bf27214.filez differ diff --git a/repo/objects/d2/644adfbe72951e1067efade9ffe53882bc3f1eea7ab96851a7c3256b38264e.filez b/repo/objects/d2/644adfbe72951e1067efade9ffe53882bc3f1eea7ab96851a7c3256b38264e.filez new file mode 100644 index 00000000000..ffab63f9b30 Binary files /dev/null and b/repo/objects/d2/644adfbe72951e1067efade9ffe53882bc3f1eea7ab96851a7c3256b38264e.filez differ diff --git a/repo/objects/d2/704dc123340357766a2668c2da05fcb15d3364258e0d1503547cd0aaf9e5c6.dirtree b/repo/objects/d2/704dc123340357766a2668c2da05fcb15d3364258e0d1503547cd0aaf9e5c6.dirtree new file mode 100644 index 00000000000..904992343c9 Binary files /dev/null and b/repo/objects/d2/704dc123340357766a2668c2da05fcb15d3364258e0d1503547cd0aaf9e5c6.dirtree differ diff --git a/repo/objects/d2/769241541c3c701414b5475297c48eb0b099ade1a0cfb6efae42d1de286117.filez b/repo/objects/d2/769241541c3c701414b5475297c48eb0b099ade1a0cfb6efae42d1de286117.filez new file mode 100644 index 00000000000..fde2afe7552 Binary files /dev/null and b/repo/objects/d2/769241541c3c701414b5475297c48eb0b099ade1a0cfb6efae42d1de286117.filez differ diff --git a/repo/objects/d2/79bfb9d2db2f83b0abb77eee3f7faadfd3935b09035d72f00afc4c79f65bee.dirtree b/repo/objects/d2/79bfb9d2db2f83b0abb77eee3f7faadfd3935b09035d72f00afc4c79f65bee.dirtree new file mode 100644 index 00000000000..f4895b14711 Binary files /dev/null and b/repo/objects/d2/79bfb9d2db2f83b0abb77eee3f7faadfd3935b09035d72f00afc4c79f65bee.dirtree differ diff --git a/repo/objects/d2/7e20d1047025dad49e40db432ae293689f753aee3025498e63403d451c2bac.filez b/repo/objects/d2/7e20d1047025dad49e40db432ae293689f753aee3025498e63403d451c2bac.filez new file mode 100644 index 00000000000..614a2dc24bd Binary files /dev/null and b/repo/objects/d2/7e20d1047025dad49e40db432ae293689f753aee3025498e63403d451c2bac.filez differ diff --git a/repo/objects/d2/8375d85852dfb138cfd3b71380d5c7cdd84eb5ead5b906ff18db6a9a382fc9.filez b/repo/objects/d2/8375d85852dfb138cfd3b71380d5c7cdd84eb5ead5b906ff18db6a9a382fc9.filez new file mode 100644 index 00000000000..698a840bb56 Binary files /dev/null and b/repo/objects/d2/8375d85852dfb138cfd3b71380d5c7cdd84eb5ead5b906ff18db6a9a382fc9.filez differ diff --git a/repo/objects/d2/b8ac9c925a2436d242629902dd74c02ff570ab647c2dae2dd93e4342fbd717.filez b/repo/objects/d2/b8ac9c925a2436d242629902dd74c02ff570ab647c2dae2dd93e4342fbd717.filez new file mode 100644 index 00000000000..904393c8e7b Binary files /dev/null and b/repo/objects/d2/b8ac9c925a2436d242629902dd74c02ff570ab647c2dae2dd93e4342fbd717.filez differ diff --git a/repo/objects/d2/f9d04ad643d25d1f3fed5a5683e1563d1a84d87fc7ca4970b5776b29bfcf82.dirtree b/repo/objects/d2/f9d04ad643d25d1f3fed5a5683e1563d1a84d87fc7ca4970b5776b29bfcf82.dirtree new file mode 100644 index 00000000000..13b36166e15 Binary files /dev/null and b/repo/objects/d2/f9d04ad643d25d1f3fed5a5683e1563d1a84d87fc7ca4970b5776b29bfcf82.dirtree differ diff --git a/repo/objects/d3/11642a1705b2c90be24004191d19df53d5129ce352afe33c505da69f11e9ef.dirtree b/repo/objects/d3/11642a1705b2c90be24004191d19df53d5129ce352afe33c505da69f11e9ef.dirtree new file mode 100644 index 00000000000..a19ec789542 Binary files /dev/null and b/repo/objects/d3/11642a1705b2c90be24004191d19df53d5129ce352afe33c505da69f11e9ef.dirtree differ diff --git a/repo/objects/d3/20289b8654840f147257b2c27568be3bb4bf249199fed5ef6bffb4540961af.filez b/repo/objects/d3/20289b8654840f147257b2c27568be3bb4bf249199fed5ef6bffb4540961af.filez new file mode 100644 index 00000000000..53a2fbb05f6 Binary files /dev/null and b/repo/objects/d3/20289b8654840f147257b2c27568be3bb4bf249199fed5ef6bffb4540961af.filez differ diff --git a/repo/objects/d3/336d5565bef48042eccda515fdf0b5ea3d510737dd53531783eb3506c59301.filez b/repo/objects/d3/336d5565bef48042eccda515fdf0b5ea3d510737dd53531783eb3506c59301.filez new file mode 100644 index 00000000000..cc0bb343519 Binary files /dev/null and b/repo/objects/d3/336d5565bef48042eccda515fdf0b5ea3d510737dd53531783eb3506c59301.filez differ diff --git a/repo/objects/d3/4ad2b2f43f3f1175b160b95908d6312b01229fd2caf2b34ace0eb28a339a68.dirtree b/repo/objects/d3/4ad2b2f43f3f1175b160b95908d6312b01229fd2caf2b34ace0eb28a339a68.dirtree new file mode 100644 index 00000000000..2e76eb2891a Binary files /dev/null and b/repo/objects/d3/4ad2b2f43f3f1175b160b95908d6312b01229fd2caf2b34ace0eb28a339a68.dirtree differ diff --git a/repo/objects/d3/566258ed7dc12c2e8bf0077d35010cb84b163b3057d3cda95a59f9c10b24ff.filez b/repo/objects/d3/566258ed7dc12c2e8bf0077d35010cb84b163b3057d3cda95a59f9c10b24ff.filez new file mode 100644 index 00000000000..e68e2285c8e Binary files /dev/null and b/repo/objects/d3/566258ed7dc12c2e8bf0077d35010cb84b163b3057d3cda95a59f9c10b24ff.filez differ diff --git a/repo/objects/d3/66e0c602a191c72fa7e09e4db2f8818f79b9da63597ff7839cd360c9115bc0.filez b/repo/objects/d3/66e0c602a191c72fa7e09e4db2f8818f79b9da63597ff7839cd360c9115bc0.filez new file mode 100644 index 00000000000..ff942fa7f5b Binary files /dev/null and b/repo/objects/d3/66e0c602a191c72fa7e09e4db2f8818f79b9da63597ff7839cd360c9115bc0.filez differ diff --git a/repo/objects/d3/7fcb744ee36d45a0b3e2e627bcc3cf4493a281eef527238525602f339c4030.filez b/repo/objects/d3/7fcb744ee36d45a0b3e2e627bcc3cf4493a281eef527238525602f339c4030.filez new file mode 100644 index 00000000000..87eb213e5e2 Binary files /dev/null and b/repo/objects/d3/7fcb744ee36d45a0b3e2e627bcc3cf4493a281eef527238525602f339c4030.filez differ diff --git a/repo/objects/d3/8c838520b848e651ef62cb705b9c07f093a3b83751590c4c6054e1b6657007.filez b/repo/objects/d3/8c838520b848e651ef62cb705b9c07f093a3b83751590c4c6054e1b6657007.filez new file mode 100644 index 00000000000..44ec30078d6 Binary files /dev/null and b/repo/objects/d3/8c838520b848e651ef62cb705b9c07f093a3b83751590c4c6054e1b6657007.filez differ diff --git a/repo/objects/d3/d9257d866c4bbcaa23e9c0261c5bc6b1ec77a8bde8d996d19cfe1601b8f199.filez b/repo/objects/d3/d9257d866c4bbcaa23e9c0261c5bc6b1ec77a8bde8d996d19cfe1601b8f199.filez new file mode 100644 index 00000000000..bbd931e2189 Binary files /dev/null and b/repo/objects/d3/d9257d866c4bbcaa23e9c0261c5bc6b1ec77a8bde8d996d19cfe1601b8f199.filez differ diff --git a/repo/objects/d3/d94afe072f0c62c8bbda0c569d257e9ae56642918b4d9c23e815095feaff0d.dirtree b/repo/objects/d3/d94afe072f0c62c8bbda0c569d257e9ae56642918b4d9c23e815095feaff0d.dirtree new file mode 100644 index 00000000000..5c591ded769 Binary files /dev/null and b/repo/objects/d3/d94afe072f0c62c8bbda0c569d257e9ae56642918b4d9c23e815095feaff0d.dirtree differ diff --git a/repo/objects/d3/e2cec2c20d9129225dec57791ef2896e3fd2c5f4626d0698abd7a1c51a38b6.filez b/repo/objects/d3/e2cec2c20d9129225dec57791ef2896e3fd2c5f4626d0698abd7a1c51a38b6.filez new file mode 100644 index 00000000000..b830c77ceae Binary files /dev/null and b/repo/objects/d3/e2cec2c20d9129225dec57791ef2896e3fd2c5f4626d0698abd7a1c51a38b6.filez differ diff --git a/repo/objects/d4/10c3cc8418a64ffc918cf362d2e0f2c97292a1d95752b5c65c3d39c5e86d22.dirtree b/repo/objects/d4/10c3cc8418a64ffc918cf362d2e0f2c97292a1d95752b5c65c3d39c5e86d22.dirtree new file mode 100644 index 00000000000..42e0fc09bf8 Binary files /dev/null and b/repo/objects/d4/10c3cc8418a64ffc918cf362d2e0f2c97292a1d95752b5c65c3d39c5e86d22.dirtree differ diff --git a/repo/objects/d4/115ae3c1a070e93fd5b1eea76a53537f0d37fae384ec1c5849b7f75feece10.filez b/repo/objects/d4/115ae3c1a070e93fd5b1eea76a53537f0d37fae384ec1c5849b7f75feece10.filez new file mode 100644 index 00000000000..5066818ec9a Binary files /dev/null and b/repo/objects/d4/115ae3c1a070e93fd5b1eea76a53537f0d37fae384ec1c5849b7f75feece10.filez differ diff --git a/repo/objects/d4/24b63e305625869eb9d1823bffbd03567119859f244512fd9e075d6cd82e17.filez b/repo/objects/d4/24b63e305625869eb9d1823bffbd03567119859f244512fd9e075d6cd82e17.filez new file mode 100644 index 00000000000..46a4a55585e Binary files /dev/null and b/repo/objects/d4/24b63e305625869eb9d1823bffbd03567119859f244512fd9e075d6cd82e17.filez differ diff --git a/repo/objects/d4/484094094464b3150356a5ec8881d9a8627546ce8b22299e56464363a39f56.filez b/repo/objects/d4/484094094464b3150356a5ec8881d9a8627546ce8b22299e56464363a39f56.filez new file mode 100644 index 00000000000..7e0eb3da279 Binary files /dev/null and b/repo/objects/d4/484094094464b3150356a5ec8881d9a8627546ce8b22299e56464363a39f56.filez differ diff --git a/repo/objects/d4/57352b5db7cf6425406a0dacc2dbf08e63a374fe5002da5e550426113b981e.dirtree b/repo/objects/d4/57352b5db7cf6425406a0dacc2dbf08e63a374fe5002da5e550426113b981e.dirtree new file mode 100644 index 00000000000..d5827ef0b78 Binary files /dev/null and b/repo/objects/d4/57352b5db7cf6425406a0dacc2dbf08e63a374fe5002da5e550426113b981e.dirtree differ diff --git a/repo/objects/d4/7c56b80b24beedcc418d26bb3e90209bc112b69f1b2912f756389f0b11053d.dirtree b/repo/objects/d4/7c56b80b24beedcc418d26bb3e90209bc112b69f1b2912f756389f0b11053d.dirtree new file mode 100644 index 00000000000..0db1f906bfc Binary files /dev/null and b/repo/objects/d4/7c56b80b24beedcc418d26bb3e90209bc112b69f1b2912f756389f0b11053d.dirtree differ diff --git a/repo/objects/d4/9410ad4ab7daccede553a4e297e6173192df4b304eee50bd1256cd84690ca2.filez b/repo/objects/d4/9410ad4ab7daccede553a4e297e6173192df4b304eee50bd1256cd84690ca2.filez new file mode 100644 index 00000000000..3350cf06709 Binary files /dev/null and b/repo/objects/d4/9410ad4ab7daccede553a4e297e6173192df4b304eee50bd1256cd84690ca2.filez differ diff --git a/repo/objects/d4/a662c656fda59bfbd1977e8a4432f843962fa001cd9a3545838266d88c1534.dirtree b/repo/objects/d4/a662c656fda59bfbd1977e8a4432f843962fa001cd9a3545838266d88c1534.dirtree new file mode 100644 index 00000000000..9b2c3f3b862 Binary files /dev/null and b/repo/objects/d4/a662c656fda59bfbd1977e8a4432f843962fa001cd9a3545838266d88c1534.dirtree differ diff --git a/repo/objects/d4/c19c411d90258de99182f48c1d1f9a11cbb83848711b5a1d670027f54fa331.filez b/repo/objects/d4/c19c411d90258de99182f48c1d1f9a11cbb83848711b5a1d670027f54fa331.filez new file mode 100644 index 00000000000..555df454558 Binary files /dev/null and b/repo/objects/d4/c19c411d90258de99182f48c1d1f9a11cbb83848711b5a1d670027f54fa331.filez differ diff --git a/repo/objects/d4/ccad785f4a37e25b493dbb7a0ff2484342550563e92770e1d1a18222b54231.filez b/repo/objects/d4/ccad785f4a37e25b493dbb7a0ff2484342550563e92770e1d1a18222b54231.filez new file mode 100644 index 00000000000..afb49071e22 Binary files /dev/null and b/repo/objects/d4/ccad785f4a37e25b493dbb7a0ff2484342550563e92770e1d1a18222b54231.filez differ diff --git a/repo/objects/d4/cf6eafeef0361a6c4816b197c2157a38e2738b3a9b4cf9307ed86f1649c8d2.dirtree b/repo/objects/d4/cf6eafeef0361a6c4816b197c2157a38e2738b3a9b4cf9307ed86f1649c8d2.dirtree new file mode 100644 index 00000000000..e7498cbddf6 Binary files /dev/null and b/repo/objects/d4/cf6eafeef0361a6c4816b197c2157a38e2738b3a9b4cf9307ed86f1649c8d2.dirtree differ diff --git a/repo/objects/d4/d4ad3dee00efe377389831b6b40921993616b322af1b011338f92b2ffbca90.filez b/repo/objects/d4/d4ad3dee00efe377389831b6b40921993616b322af1b011338f92b2ffbca90.filez new file mode 100644 index 00000000000..45f2788f61d Binary files /dev/null and b/repo/objects/d4/d4ad3dee00efe377389831b6b40921993616b322af1b011338f92b2ffbca90.filez differ diff --git a/repo/objects/d4/e3c15db7bec0438fbe8cf50b1f7df14541c379be97d8c57c22e399bcd9452d.filez b/repo/objects/d4/e3c15db7bec0438fbe8cf50b1f7df14541c379be97d8c57c22e399bcd9452d.filez new file mode 100644 index 00000000000..848f8ccd128 Binary files /dev/null and b/repo/objects/d4/e3c15db7bec0438fbe8cf50b1f7df14541c379be97d8c57c22e399bcd9452d.filez differ diff --git a/repo/objects/d4/e5ce131d55a12e8044f9e9b689d3d8b2a8f4c388386ebb838162bd1db66ad4.filez b/repo/objects/d4/e5ce131d55a12e8044f9e9b689d3d8b2a8f4c388386ebb838162bd1db66ad4.filez new file mode 100644 index 00000000000..e3cd3a7c7c3 Binary files /dev/null and b/repo/objects/d4/e5ce131d55a12e8044f9e9b689d3d8b2a8f4c388386ebb838162bd1db66ad4.filez differ diff --git a/repo/objects/d4/f50c43af5d559995870130cffb595f724baf8d88efd1bdb8f6fad39aff2637.filez b/repo/objects/d4/f50c43af5d559995870130cffb595f724baf8d88efd1bdb8f6fad39aff2637.filez new file mode 100644 index 00000000000..8331b6eb2e4 Binary files /dev/null and b/repo/objects/d4/f50c43af5d559995870130cffb595f724baf8d88efd1bdb8f6fad39aff2637.filez differ diff --git a/repo/objects/d5/0786801d7bd475c65ede283be87b4cf6780d28bd49206675b07e53a1378118.filez b/repo/objects/d5/0786801d7bd475c65ede283be87b4cf6780d28bd49206675b07e53a1378118.filez new file mode 100644 index 00000000000..ba301c2009d Binary files /dev/null and b/repo/objects/d5/0786801d7bd475c65ede283be87b4cf6780d28bd49206675b07e53a1378118.filez differ diff --git a/repo/objects/d5/0f533928379a3ded256eaee6c0b998a0d72aff6c4aa99ade1b2fea430c7b33.dirtree b/repo/objects/d5/0f533928379a3ded256eaee6c0b998a0d72aff6c4aa99ade1b2fea430c7b33.dirtree new file mode 100644 index 00000000000..f11dc86b6cf Binary files /dev/null and b/repo/objects/d5/0f533928379a3ded256eaee6c0b998a0d72aff6c4aa99ade1b2fea430c7b33.dirtree differ diff --git a/repo/objects/d5/43823510aa7191ff7e346ed02f39983f8339a82a95706e8fea0f1ee048c407.filez b/repo/objects/d5/43823510aa7191ff7e346ed02f39983f8339a82a95706e8fea0f1ee048c407.filez new file mode 100644 index 00000000000..579c99a3580 Binary files /dev/null and b/repo/objects/d5/43823510aa7191ff7e346ed02f39983f8339a82a95706e8fea0f1ee048c407.filez differ diff --git a/repo/objects/d5/7cf294a12a9910a226387dd431faef81c441783bf08f9f1786f6b0d22321b9.dirtree b/repo/objects/d5/7cf294a12a9910a226387dd431faef81c441783bf08f9f1786f6b0d22321b9.dirtree new file mode 100644 index 00000000000..b655caac98e Binary files /dev/null and b/repo/objects/d5/7cf294a12a9910a226387dd431faef81c441783bf08f9f1786f6b0d22321b9.dirtree differ diff --git a/repo/objects/d5/833c3697a5dbf810376896d8b43863c92cedc9962d285395d8ae2d6110b934.filez b/repo/objects/d5/833c3697a5dbf810376896d8b43863c92cedc9962d285395d8ae2d6110b934.filez new file mode 100644 index 00000000000..12b1b5b8613 Binary files /dev/null and b/repo/objects/d5/833c3697a5dbf810376896d8b43863c92cedc9962d285395d8ae2d6110b934.filez differ diff --git a/repo/objects/d5/adc442638577e965bb26aa750f652c4a32905144b6a63913dfd8a43fdc2e35.filez b/repo/objects/d5/adc442638577e965bb26aa750f652c4a32905144b6a63913dfd8a43fdc2e35.filez new file mode 100644 index 00000000000..1026e715ccc Binary files /dev/null and b/repo/objects/d5/adc442638577e965bb26aa750f652c4a32905144b6a63913dfd8a43fdc2e35.filez differ diff --git a/repo/objects/d5/b052a9e06db6728b43c5a87925afd8d11b7d31578b070c4a266410e960ef53.filez b/repo/objects/d5/b052a9e06db6728b43c5a87925afd8d11b7d31578b070c4a266410e960ef53.filez new file mode 100644 index 00000000000..4f931649a74 Binary files /dev/null and b/repo/objects/d5/b052a9e06db6728b43c5a87925afd8d11b7d31578b070c4a266410e960ef53.filez differ diff --git a/repo/objects/d5/f4f8237c4ad4756ec2d63780cbf0351f18b684c89feb176a2bcdb83f5222f9.filez b/repo/objects/d5/f4f8237c4ad4756ec2d63780cbf0351f18b684c89feb176a2bcdb83f5222f9.filez new file mode 100644 index 00000000000..519b659aab5 Binary files /dev/null and b/repo/objects/d5/f4f8237c4ad4756ec2d63780cbf0351f18b684c89feb176a2bcdb83f5222f9.filez differ diff --git a/repo/objects/d6/01cd24482b6e9248bd4aef1e8af87a65885827825bb78e3836bdcd784d8733.dirtree b/repo/objects/d6/01cd24482b6e9248bd4aef1e8af87a65885827825bb78e3836bdcd784d8733.dirtree new file mode 100644 index 00000000000..9ab10e314ba Binary files /dev/null and b/repo/objects/d6/01cd24482b6e9248bd4aef1e8af87a65885827825bb78e3836bdcd784d8733.dirtree differ diff --git a/repo/objects/d6/2251a5d39d4dc258edfd4de3c3ec30b606facbe90efc2cc6c7e787bb0f6342.filez b/repo/objects/d6/2251a5d39d4dc258edfd4de3c3ec30b606facbe90efc2cc6c7e787bb0f6342.filez new file mode 100644 index 00000000000..483555f15cd Binary files /dev/null and b/repo/objects/d6/2251a5d39d4dc258edfd4de3c3ec30b606facbe90efc2cc6c7e787bb0f6342.filez differ diff --git a/repo/objects/d6/50ce8754589678852b0c408891a3aceb28b68ddbbabd871e30066905e218f5.dirtree b/repo/objects/d6/50ce8754589678852b0c408891a3aceb28b68ddbbabd871e30066905e218f5.dirtree new file mode 100644 index 00000000000..8ca20f8731d Binary files /dev/null and b/repo/objects/d6/50ce8754589678852b0c408891a3aceb28b68ddbbabd871e30066905e218f5.dirtree differ diff --git a/repo/objects/d6/7356e213a525aa9c200bd9b6c45834449b866a0a79308d0cf29f41613dff54.dirtree b/repo/objects/d6/7356e213a525aa9c200bd9b6c45834449b866a0a79308d0cf29f41613dff54.dirtree new file mode 100644 index 00000000000..ac1cd2658e7 Binary files /dev/null and b/repo/objects/d6/7356e213a525aa9c200bd9b6c45834449b866a0a79308d0cf29f41613dff54.dirtree differ diff --git a/repo/objects/d6/76274599e340837f3b929e0da328049371167719309bddbcfa736b35f33e5e.filez b/repo/objects/d6/76274599e340837f3b929e0da328049371167719309bddbcfa736b35f33e5e.filez new file mode 100644 index 00000000000..7cc1c19fb5d Binary files /dev/null and b/repo/objects/d6/76274599e340837f3b929e0da328049371167719309bddbcfa736b35f33e5e.filez differ diff --git a/repo/objects/d7/133691e0a56db331326a9257860bcdc978d227dee1a9117934fdabd5663959.filez b/repo/objects/d7/133691e0a56db331326a9257860bcdc978d227dee1a9117934fdabd5663959.filez new file mode 100644 index 00000000000..e7acedd36be Binary files /dev/null and b/repo/objects/d7/133691e0a56db331326a9257860bcdc978d227dee1a9117934fdabd5663959.filez differ diff --git a/repo/objects/d7/3626b4e4aebe7755827afbfbe2dce2585f4e533ae87aff40392332d35788fe.filez b/repo/objects/d7/3626b4e4aebe7755827afbfbe2dce2585f4e533ae87aff40392332d35788fe.filez new file mode 100644 index 00000000000..b54e54af64a Binary files /dev/null and b/repo/objects/d7/3626b4e4aebe7755827afbfbe2dce2585f4e533ae87aff40392332d35788fe.filez differ diff --git a/repo/objects/d7/3aef29298fbb348b232d23d83b3f15672d46a11f51a36e1427c291f067ae3b.dirtree b/repo/objects/d7/3aef29298fbb348b232d23d83b3f15672d46a11f51a36e1427c291f067ae3b.dirtree new file mode 100644 index 00000000000..e125d3768e9 Binary files /dev/null and b/repo/objects/d7/3aef29298fbb348b232d23d83b3f15672d46a11f51a36e1427c291f067ae3b.dirtree differ diff --git a/repo/objects/d7/556fe55f6a61b81d4f2056192c1a8c66a28846a6a342d63ac8787ddbfbed80.filez b/repo/objects/d7/556fe55f6a61b81d4f2056192c1a8c66a28846a6a342d63ac8787ddbfbed80.filez new file mode 100644 index 00000000000..5b6efd47ff8 Binary files /dev/null and b/repo/objects/d7/556fe55f6a61b81d4f2056192c1a8c66a28846a6a342d63ac8787ddbfbed80.filez differ diff --git a/repo/objects/d7/5cd0b545a0c162c81e21f46c084c0c7096aa29ab8f14b9477a1405ff90852d.filez b/repo/objects/d7/5cd0b545a0c162c81e21f46c084c0c7096aa29ab8f14b9477a1405ff90852d.filez new file mode 100644 index 00000000000..0186ae4fd32 Binary files /dev/null and b/repo/objects/d7/5cd0b545a0c162c81e21f46c084c0c7096aa29ab8f14b9477a1405ff90852d.filez differ diff --git a/repo/objects/d7/6e80215da9cf1df2590581dc727e48281caca4607af24b8fba58755906a914.filez b/repo/objects/d7/6e80215da9cf1df2590581dc727e48281caca4607af24b8fba58755906a914.filez new file mode 100644 index 00000000000..8facd2b965d Binary files /dev/null and b/repo/objects/d7/6e80215da9cf1df2590581dc727e48281caca4607af24b8fba58755906a914.filez differ diff --git a/repo/objects/d7/6f2b9ddcf0085e6fc4d61429ddb39426c760bed3b6a89deb80f79170562d84.filez b/repo/objects/d7/6f2b9ddcf0085e6fc4d61429ddb39426c760bed3b6a89deb80f79170562d84.filez new file mode 100644 index 00000000000..6cc451d52a3 Binary files /dev/null and b/repo/objects/d7/6f2b9ddcf0085e6fc4d61429ddb39426c760bed3b6a89deb80f79170562d84.filez differ diff --git a/repo/objects/d7/943256c778a0df1bfc1d1245f8bd543a406768fa9fa2043af27d95fcc5949a.filez b/repo/objects/d7/943256c778a0df1bfc1d1245f8bd543a406768fa9fa2043af27d95fcc5949a.filez new file mode 100644 index 00000000000..ccc8bb95ead Binary files /dev/null and b/repo/objects/d7/943256c778a0df1bfc1d1245f8bd543a406768fa9fa2043af27d95fcc5949a.filez differ diff --git a/repo/objects/d7/c5d5404d8ec7f5937c53fb74eda29f9089abdda635e2e58fe60c9cc627e22a.filez b/repo/objects/d7/c5d5404d8ec7f5937c53fb74eda29f9089abdda635e2e58fe60c9cc627e22a.filez new file mode 100644 index 00000000000..4d8c7915a5d Binary files /dev/null and b/repo/objects/d7/c5d5404d8ec7f5937c53fb74eda29f9089abdda635e2e58fe60c9cc627e22a.filez differ diff --git a/repo/objects/d7/f36b53c41d2b485ed9888087dc81ea201f1bd40fabd5e34f559673279b18c1.filez b/repo/objects/d7/f36b53c41d2b485ed9888087dc81ea201f1bd40fabd5e34f559673279b18c1.filez new file mode 100644 index 00000000000..b8605e1100d Binary files /dev/null and b/repo/objects/d7/f36b53c41d2b485ed9888087dc81ea201f1bd40fabd5e34f559673279b18c1.filez differ diff --git a/repo/objects/d8/0e8d6e544c3353176e093bfb7162334a42c04bb173cb084a4bd3c8dd95001d.filez b/repo/objects/d8/0e8d6e544c3353176e093bfb7162334a42c04bb173cb084a4bd3c8dd95001d.filez new file mode 100644 index 00000000000..f633296b744 Binary files /dev/null and b/repo/objects/d8/0e8d6e544c3353176e093bfb7162334a42c04bb173cb084a4bd3c8dd95001d.filez differ diff --git a/repo/objects/d8/25af7485d774889b65515f9afb891375b1c9888248396d8df1d0db3d53429d.dirtree b/repo/objects/d8/25af7485d774889b65515f9afb891375b1c9888248396d8df1d0db3d53429d.dirtree new file mode 100644 index 00000000000..bbbf5dd05d3 Binary files /dev/null and b/repo/objects/d8/25af7485d774889b65515f9afb891375b1c9888248396d8df1d0db3d53429d.dirtree differ diff --git a/repo/objects/d8/2d39102f9cf298bfa596da2f2a4559a1051da8d8a29ebfd843e976a9ba2856.dirtree b/repo/objects/d8/2d39102f9cf298bfa596da2f2a4559a1051da8d8a29ebfd843e976a9ba2856.dirtree new file mode 100644 index 00000000000..83600ad3f65 Binary files /dev/null and b/repo/objects/d8/2d39102f9cf298bfa596da2f2a4559a1051da8d8a29ebfd843e976a9ba2856.dirtree differ diff --git a/repo/objects/d8/3d6732248c7ba0485a35b820b6b2704a24967aeaa9b4efc54c6c9ddfde6c22.filez b/repo/objects/d8/3d6732248c7ba0485a35b820b6b2704a24967aeaa9b4efc54c6c9ddfde6c22.filez new file mode 100644 index 00000000000..d18e9574825 Binary files /dev/null and b/repo/objects/d8/3d6732248c7ba0485a35b820b6b2704a24967aeaa9b4efc54c6c9ddfde6c22.filez differ diff --git a/repo/objects/d8/452065e4a887c2255e41f4bd688f7cf80bfe82513f512f9429399ac5aaeda8.filez b/repo/objects/d8/452065e4a887c2255e41f4bd688f7cf80bfe82513f512f9429399ac5aaeda8.filez new file mode 100644 index 00000000000..4bcfa18569c Binary files /dev/null and b/repo/objects/d8/452065e4a887c2255e41f4bd688f7cf80bfe82513f512f9429399ac5aaeda8.filez differ diff --git a/repo/objects/d8/4995c8ca7b9faca460a3ddaf664bc5e9d0af49c10bf2d95f7770a27436cede.dirtree b/repo/objects/d8/4995c8ca7b9faca460a3ddaf664bc5e9d0af49c10bf2d95f7770a27436cede.dirtree new file mode 100644 index 00000000000..20df6ea37b9 Binary files /dev/null and b/repo/objects/d8/4995c8ca7b9faca460a3ddaf664bc5e9d0af49c10bf2d95f7770a27436cede.dirtree differ diff --git a/repo/objects/d8/4fd266109f045dd32ebc1d4c7399c8c091b430e7cf307e7eb0ca226056ccf4.filez b/repo/objects/d8/4fd266109f045dd32ebc1d4c7399c8c091b430e7cf307e7eb0ca226056ccf4.filez new file mode 100644 index 00000000000..c0aa83b168d Binary files /dev/null and b/repo/objects/d8/4fd266109f045dd32ebc1d4c7399c8c091b430e7cf307e7eb0ca226056ccf4.filez differ diff --git a/repo/objects/d8/7c9d2040183afe8b6c7e763731fdec52d608667d6b68248f7e2fd705016a33.filez b/repo/objects/d8/7c9d2040183afe8b6c7e763731fdec52d608667d6b68248f7e2fd705016a33.filez new file mode 100644 index 00000000000..246c1d02536 Binary files /dev/null and b/repo/objects/d8/7c9d2040183afe8b6c7e763731fdec52d608667d6b68248f7e2fd705016a33.filez differ diff --git a/repo/objects/d8/c1a0800cfb91f9f5aa45dc2d699ec8eff88946f857b0a73dd3ee2a25ed38b5.filez b/repo/objects/d8/c1a0800cfb91f9f5aa45dc2d699ec8eff88946f857b0a73dd3ee2a25ed38b5.filez new file mode 100644 index 00000000000..93d74a2fa0d Binary files /dev/null and b/repo/objects/d8/c1a0800cfb91f9f5aa45dc2d699ec8eff88946f857b0a73dd3ee2a25ed38b5.filez differ diff --git a/repo/objects/d9/18a0b0a01f9102184d5b9eaad20bf56741f82f0595a84d5461b936432a0af0.filez b/repo/objects/d9/18a0b0a01f9102184d5b9eaad20bf56741f82f0595a84d5461b936432a0af0.filez new file mode 100644 index 00000000000..f51b069d00d Binary files /dev/null and b/repo/objects/d9/18a0b0a01f9102184d5b9eaad20bf56741f82f0595a84d5461b936432a0af0.filez differ diff --git a/repo/objects/d9/28a36aa838a4f68ca615076d2319c13ab0b7c63dfd8ea591cf622ce200aa58.filez b/repo/objects/d9/28a36aa838a4f68ca615076d2319c13ab0b7c63dfd8ea591cf622ce200aa58.filez new file mode 100644 index 00000000000..9b0a0130a35 Binary files /dev/null and b/repo/objects/d9/28a36aa838a4f68ca615076d2319c13ab0b7c63dfd8ea591cf622ce200aa58.filez differ diff --git a/repo/objects/d9/2a0313ab05e8f64b7259f07004bfab80cd083c1dfc3d5a495c5adfd35199cf.filez b/repo/objects/d9/2a0313ab05e8f64b7259f07004bfab80cd083c1dfc3d5a495c5adfd35199cf.filez new file mode 100644 index 00000000000..882609f93a2 Binary files /dev/null and b/repo/objects/d9/2a0313ab05e8f64b7259f07004bfab80cd083c1dfc3d5a495c5adfd35199cf.filez differ diff --git a/repo/objects/d9/2c765d7f6d49a25796e42ede826211b3055e3f44f1b17e1d4f68ff9e97bbda.filez b/repo/objects/d9/2c765d7f6d49a25796e42ede826211b3055e3f44f1b17e1d4f68ff9e97bbda.filez new file mode 100644 index 00000000000..a67e6c743d9 Binary files /dev/null and b/repo/objects/d9/2c765d7f6d49a25796e42ede826211b3055e3f44f1b17e1d4f68ff9e97bbda.filez differ diff --git a/repo/objects/d9/355fe1d537fff584a920abeb7429096f5f99898ecbea97ed7989885d2b2f44.dirtree b/repo/objects/d9/355fe1d537fff584a920abeb7429096f5f99898ecbea97ed7989885d2b2f44.dirtree new file mode 100644 index 00000000000..497d86d0060 Binary files /dev/null and b/repo/objects/d9/355fe1d537fff584a920abeb7429096f5f99898ecbea97ed7989885d2b2f44.dirtree differ diff --git a/repo/objects/d9/3a6f6a5fac29552958e7c1fb6f8f0bcef7877100728b51ee66fe4e4198388c.filez b/repo/objects/d9/3a6f6a5fac29552958e7c1fb6f8f0bcef7877100728b51ee66fe4e4198388c.filez new file mode 100644 index 00000000000..965ec39cf66 Binary files /dev/null and b/repo/objects/d9/3a6f6a5fac29552958e7c1fb6f8f0bcef7877100728b51ee66fe4e4198388c.filez differ diff --git a/repo/objects/d9/40b8b978b21d73343dd539e0bcd17f7a5d1fe72c03dc07f145eb4573dc6297.filez b/repo/objects/d9/40b8b978b21d73343dd539e0bcd17f7a5d1fe72c03dc07f145eb4573dc6297.filez new file mode 100644 index 00000000000..8c021f845b3 Binary files /dev/null and b/repo/objects/d9/40b8b978b21d73343dd539e0bcd17f7a5d1fe72c03dc07f145eb4573dc6297.filez differ diff --git a/repo/objects/d9/5f01460b6a67e61f0bf4908c059e79347bd0f234ebcf6289326d23596afd8f.filez b/repo/objects/d9/5f01460b6a67e61f0bf4908c059e79347bd0f234ebcf6289326d23596afd8f.filez new file mode 100644 index 00000000000..0c7038428ca Binary files /dev/null and b/repo/objects/d9/5f01460b6a67e61f0bf4908c059e79347bd0f234ebcf6289326d23596afd8f.filez differ diff --git a/repo/objects/d9/6b607d8d4d30ddd1df228cc3a0c6d7ed3ed8fc9edd3684164d0e4e9c6464cf.filez b/repo/objects/d9/6b607d8d4d30ddd1df228cc3a0c6d7ed3ed8fc9edd3684164d0e4e9c6464cf.filez new file mode 100644 index 00000000000..13e3f91a0ab Binary files /dev/null and b/repo/objects/d9/6b607d8d4d30ddd1df228cc3a0c6d7ed3ed8fc9edd3684164d0e4e9c6464cf.filez differ diff --git a/repo/objects/d9/6eb06f62e3ef3b4d5371e4231e9c2ddefd7ab6ae4f1c77cb01893df957d677.filez b/repo/objects/d9/6eb06f62e3ef3b4d5371e4231e9c2ddefd7ab6ae4f1c77cb01893df957d677.filez new file mode 100644 index 00000000000..ad46cab91df Binary files /dev/null and b/repo/objects/d9/6eb06f62e3ef3b4d5371e4231e9c2ddefd7ab6ae4f1c77cb01893df957d677.filez differ diff --git a/repo/objects/d9/86dfbeebdfe38b9f63c91f8b55546eb1638838f7eae877e1be9362ade72fe7.filez b/repo/objects/d9/86dfbeebdfe38b9f63c91f8b55546eb1638838f7eae877e1be9362ade72fe7.filez new file mode 100644 index 00000000000..26abef8182a Binary files /dev/null and b/repo/objects/d9/86dfbeebdfe38b9f63c91f8b55546eb1638838f7eae877e1be9362ade72fe7.filez differ diff --git a/repo/objects/d9/9e9e301192f0b786c7bef3b3fc540cab38926e98efbc884408f7db6de79cbd.filez b/repo/objects/d9/9e9e301192f0b786c7bef3b3fc540cab38926e98efbc884408f7db6de79cbd.filez new file mode 100644 index 00000000000..6eb5c9b1c12 Binary files /dev/null and b/repo/objects/d9/9e9e301192f0b786c7bef3b3fc540cab38926e98efbc884408f7db6de79cbd.filez differ diff --git a/repo/objects/d9/dbac527b45653d27d82b736de836c52d4eac5c83040f0de59bd982ad3ccd60.filez b/repo/objects/d9/dbac527b45653d27d82b736de836c52d4eac5c83040f0de59bd982ad3ccd60.filez new file mode 100644 index 00000000000..340e5cd6232 Binary files /dev/null and b/repo/objects/d9/dbac527b45653d27d82b736de836c52d4eac5c83040f0de59bd982ad3ccd60.filez differ diff --git a/repo/objects/da/52b4f494420c02df38c6f7b51edc536ab1ec0bbff660ec554b014cc6862d0f.filez b/repo/objects/da/52b4f494420c02df38c6f7b51edc536ab1ec0bbff660ec554b014cc6862d0f.filez new file mode 100644 index 00000000000..0811d5beb25 Binary files /dev/null and b/repo/objects/da/52b4f494420c02df38c6f7b51edc536ab1ec0bbff660ec554b014cc6862d0f.filez differ diff --git a/repo/objects/da/68eaf052e426fb30f1945eeb986af1463a0542b319f1e32ab2b038dd537c53.filez b/repo/objects/da/68eaf052e426fb30f1945eeb986af1463a0542b319f1e32ab2b038dd537c53.filez new file mode 100644 index 00000000000..bc921555957 Binary files /dev/null and b/repo/objects/da/68eaf052e426fb30f1945eeb986af1463a0542b319f1e32ab2b038dd537c53.filez differ diff --git a/repo/objects/da/7cc136b0b1ae47d77d080f41d70ba697ccb362f3907714fab2126befd7ac0f.filez b/repo/objects/da/7cc136b0b1ae47d77d080f41d70ba697ccb362f3907714fab2126befd7ac0f.filez new file mode 100644 index 00000000000..2c8edc3fe2a Binary files /dev/null and b/repo/objects/da/7cc136b0b1ae47d77d080f41d70ba697ccb362f3907714fab2126befd7ac0f.filez differ diff --git a/repo/objects/da/7e1df8b6f4be4e4551043535eaa992a1cde4c382da43d36b07c337b783251e.filez b/repo/objects/da/7e1df8b6f4be4e4551043535eaa992a1cde4c382da43d36b07c337b783251e.filez new file mode 100644 index 00000000000..06d2c3cc0e2 Binary files /dev/null and b/repo/objects/da/7e1df8b6f4be4e4551043535eaa992a1cde4c382da43d36b07c337b783251e.filez differ diff --git a/repo/objects/da/8ae9c7c662a810a521e3be632af33752b0e94ac347f523f42d0237d90541ad.dirtree b/repo/objects/da/8ae9c7c662a810a521e3be632af33752b0e94ac347f523f42d0237d90541ad.dirtree new file mode 100644 index 00000000000..85c68a6df7c Binary files /dev/null and b/repo/objects/da/8ae9c7c662a810a521e3be632af33752b0e94ac347f523f42d0237d90541ad.dirtree differ diff --git a/repo/objects/da/a6ea5e785573d412d9e52918993901e91e0563972be110772e7bceed7f68c1.dirtree b/repo/objects/da/a6ea5e785573d412d9e52918993901e91e0563972be110772e7bceed7f68c1.dirtree new file mode 100644 index 00000000000..cb3ed736e10 Binary files /dev/null and b/repo/objects/da/a6ea5e785573d412d9e52918993901e91e0563972be110772e7bceed7f68c1.dirtree differ diff --git a/repo/objects/da/b439c120d059c6f6e426b4a15fa08f0f0af82d576558fa72cffe7ae77dbdac.dirtree b/repo/objects/da/b439c120d059c6f6e426b4a15fa08f0f0af82d576558fa72cffe7ae77dbdac.dirtree new file mode 100644 index 00000000000..875d0e8a814 Binary files /dev/null and b/repo/objects/da/b439c120d059c6f6e426b4a15fa08f0f0af82d576558fa72cffe7ae77dbdac.dirtree differ diff --git a/repo/objects/da/df2785eee559333d39604d6738893f2418ca43fcbd113586b683bef9cf3924.filez b/repo/objects/da/df2785eee559333d39604d6738893f2418ca43fcbd113586b683bef9cf3924.filez new file mode 100644 index 00000000000..de4ade97d52 Binary files /dev/null and b/repo/objects/da/df2785eee559333d39604d6738893f2418ca43fcbd113586b683bef9cf3924.filez differ diff --git a/repo/objects/da/f93376b92637c3ab58bd0660946d261ff2192e2fbbe898b93299a232b508ba.dirtree b/repo/objects/da/f93376b92637c3ab58bd0660946d261ff2192e2fbbe898b93299a232b508ba.dirtree new file mode 100644 index 00000000000..786c5d7fea8 Binary files /dev/null and b/repo/objects/da/f93376b92637c3ab58bd0660946d261ff2192e2fbbe898b93299a232b508ba.dirtree differ diff --git a/repo/objects/db/09752b3251e3b2a781563e17f45517e9c2547442716bacf880273241f7b4a1.filez b/repo/objects/db/09752b3251e3b2a781563e17f45517e9c2547442716bacf880273241f7b4a1.filez new file mode 100644 index 00000000000..543b906f49d Binary files /dev/null and b/repo/objects/db/09752b3251e3b2a781563e17f45517e9c2547442716bacf880273241f7b4a1.filez differ diff --git a/repo/objects/db/296d97d31d8d7bc22602559f7b19f9824ba2a26ce7bee749adc957564fe2b1.filez b/repo/objects/db/296d97d31d8d7bc22602559f7b19f9824ba2a26ce7bee749adc957564fe2b1.filez new file mode 100644 index 00000000000..373dbc68610 Binary files /dev/null and b/repo/objects/db/296d97d31d8d7bc22602559f7b19f9824ba2a26ce7bee749adc957564fe2b1.filez differ diff --git a/repo/objects/db/37d1aee7eddab968df9851e410d6bd54bb3fb91a48916e028a68c33ced8cf6.filez b/repo/objects/db/37d1aee7eddab968df9851e410d6bd54bb3fb91a48916e028a68c33ced8cf6.filez new file mode 100644 index 00000000000..8995d000040 Binary files /dev/null and b/repo/objects/db/37d1aee7eddab968df9851e410d6bd54bb3fb91a48916e028a68c33ced8cf6.filez differ diff --git a/repo/objects/db/84492e0d5e4493498a68fd3c08a9913753f73276e7c5cfff2433c545c5cef6.filez b/repo/objects/db/84492e0d5e4493498a68fd3c08a9913753f73276e7c5cfff2433c545c5cef6.filez new file mode 100644 index 00000000000..e5dd7af54ea Binary files /dev/null and b/repo/objects/db/84492e0d5e4493498a68fd3c08a9913753f73276e7c5cfff2433c545c5cef6.filez differ diff --git a/repo/objects/db/84b51bac6731aa6afc718a6725e85ae757322915225fff54f856e9d460a939.filez b/repo/objects/db/84b51bac6731aa6afc718a6725e85ae757322915225fff54f856e9d460a939.filez new file mode 100644 index 00000000000..66d1eb8c805 Binary files /dev/null and b/repo/objects/db/84b51bac6731aa6afc718a6725e85ae757322915225fff54f856e9d460a939.filez differ diff --git a/repo/objects/db/b9330b5568abde0a7cbca78cf0857bd912d43e8bd7dbd6dedd734c47c0ba9a.dirtree b/repo/objects/db/b9330b5568abde0a7cbca78cf0857bd912d43e8bd7dbd6dedd734c47c0ba9a.dirtree new file mode 100644 index 00000000000..f8f22c1fd8b Binary files /dev/null and b/repo/objects/db/b9330b5568abde0a7cbca78cf0857bd912d43e8bd7dbd6dedd734c47c0ba9a.dirtree differ diff --git a/repo/objects/dc/3b467921a5181620b142c0c45bd74061bcd9f747484843c268a06084dac348.dirtree b/repo/objects/dc/3b467921a5181620b142c0c45bd74061bcd9f747484843c268a06084dac348.dirtree new file mode 100644 index 00000000000..71fd1b21802 Binary files /dev/null and b/repo/objects/dc/3b467921a5181620b142c0c45bd74061bcd9f747484843c268a06084dac348.dirtree differ diff --git a/repo/objects/dc/557024f2e3664b04d856bf079b36fb380632aad422d185e96b1f178fa1c0a2.filez b/repo/objects/dc/557024f2e3664b04d856bf079b36fb380632aad422d185e96b1f178fa1c0a2.filez new file mode 100644 index 00000000000..aa7e7cafa27 Binary files /dev/null and b/repo/objects/dc/557024f2e3664b04d856bf079b36fb380632aad422d185e96b1f178fa1c0a2.filez differ diff --git a/repo/objects/dc/6daf88510875cac47e715255fe7b1758a1cb327eb677421d4be4229897f30d.filez b/repo/objects/dc/6daf88510875cac47e715255fe7b1758a1cb327eb677421d4be4229897f30d.filez new file mode 100644 index 00000000000..baf17639935 Binary files /dev/null and b/repo/objects/dc/6daf88510875cac47e715255fe7b1758a1cb327eb677421d4be4229897f30d.filez differ diff --git a/repo/objects/dc/8f62c8cdc449aef4ea19fc979bff4099b6455a8fd69f81fef02408843a12fb.filez b/repo/objects/dc/8f62c8cdc449aef4ea19fc979bff4099b6455a8fd69f81fef02408843a12fb.filez new file mode 100644 index 00000000000..3464ed6e459 Binary files /dev/null and b/repo/objects/dc/8f62c8cdc449aef4ea19fc979bff4099b6455a8fd69f81fef02408843a12fb.filez differ diff --git a/repo/objects/dc/cccffdb215b686e53bf6d055f14c3f9fb6f02ed0045c58eed3212da5dc7c81.filez b/repo/objects/dc/cccffdb215b686e53bf6d055f14c3f9fb6f02ed0045c58eed3212da5dc7c81.filez new file mode 100644 index 00000000000..7d84c061c3a Binary files /dev/null and b/repo/objects/dc/cccffdb215b686e53bf6d055f14c3f9fb6f02ed0045c58eed3212da5dc7c81.filez differ diff --git a/repo/objects/dc/d8ba9c958a5bc1a7690ef5467d6fde3b2f82b053e9e6f71d50c03e35daf770.filez b/repo/objects/dc/d8ba9c958a5bc1a7690ef5467d6fde3b2f82b053e9e6f71d50c03e35daf770.filez new file mode 100644 index 00000000000..7de6c21122d Binary files /dev/null and b/repo/objects/dc/d8ba9c958a5bc1a7690ef5467d6fde3b2f82b053e9e6f71d50c03e35daf770.filez differ diff --git a/repo/objects/dc/e540a5a19bb78ef40969826b2cd24498ef7628c7ad459f8f6ea44c53fcefca.dirtree b/repo/objects/dc/e540a5a19bb78ef40969826b2cd24498ef7628c7ad459f8f6ea44c53fcefca.dirtree new file mode 100644 index 00000000000..4a1fad92f44 Binary files /dev/null and b/repo/objects/dc/e540a5a19bb78ef40969826b2cd24498ef7628c7ad459f8f6ea44c53fcefca.dirtree differ diff --git a/repo/objects/dc/f191c3431942ec60dbeb390758ea18b5e1ce1ee7ff199000302d641903dc07.filez b/repo/objects/dc/f191c3431942ec60dbeb390758ea18b5e1ce1ee7ff199000302d641903dc07.filez new file mode 100644 index 00000000000..354b5b9c45e Binary files /dev/null and b/repo/objects/dc/f191c3431942ec60dbeb390758ea18b5e1ce1ee7ff199000302d641903dc07.filez differ diff --git a/repo/objects/dd/051afaed5a086290bcc9b72e2a3dcfad146702f0b0355b1a007bfe4980ccbf.filez b/repo/objects/dd/051afaed5a086290bcc9b72e2a3dcfad146702f0b0355b1a007bfe4980ccbf.filez new file mode 100644 index 00000000000..241210f249b Binary files /dev/null and b/repo/objects/dd/051afaed5a086290bcc9b72e2a3dcfad146702f0b0355b1a007bfe4980ccbf.filez differ diff --git a/repo/objects/dd/20fc0cb71e8696952e4d383997a713b539bc2150ebf77391558717b4ae9ddf.filez b/repo/objects/dd/20fc0cb71e8696952e4d383997a713b539bc2150ebf77391558717b4ae9ddf.filez new file mode 100644 index 00000000000..d2f632ee108 Binary files /dev/null and b/repo/objects/dd/20fc0cb71e8696952e4d383997a713b539bc2150ebf77391558717b4ae9ddf.filez differ diff --git a/repo/objects/dd/4e83ce69f80214fa14cbcdc42b6d4cc8b48db774e4ce22987135ba3b119428.filez b/repo/objects/dd/4e83ce69f80214fa14cbcdc42b6d4cc8b48db774e4ce22987135ba3b119428.filez new file mode 100644 index 00000000000..d7771314117 Binary files /dev/null and b/repo/objects/dd/4e83ce69f80214fa14cbcdc42b6d4cc8b48db774e4ce22987135ba3b119428.filez differ diff --git a/repo/objects/dd/53defb8acf0428f4e7a4994067a36a7dd076b2452f677f90d00f201de3c691.filez b/repo/objects/dd/53defb8acf0428f4e7a4994067a36a7dd076b2452f677f90d00f201de3c691.filez new file mode 100644 index 00000000000..599884e4831 Binary files /dev/null and b/repo/objects/dd/53defb8acf0428f4e7a4994067a36a7dd076b2452f677f90d00f201de3c691.filez differ diff --git a/repo/objects/dd/55482a36c9e8b3d95ea123c59628df4d4a3486b5903ffa0fe94ecdd6d50397.filez b/repo/objects/dd/55482a36c9e8b3d95ea123c59628df4d4a3486b5903ffa0fe94ecdd6d50397.filez new file mode 100644 index 00000000000..e7a76478a5b Binary files /dev/null and b/repo/objects/dd/55482a36c9e8b3d95ea123c59628df4d4a3486b5903ffa0fe94ecdd6d50397.filez differ diff --git a/repo/objects/dd/8d9f2dd83436feaa440ee5a5f8b5d1c8d4d36c32183ef00709e16f116c7e35.filez b/repo/objects/dd/8d9f2dd83436feaa440ee5a5f8b5d1c8d4d36c32183ef00709e16f116c7e35.filez new file mode 100644 index 00000000000..10b6d6b0f4f Binary files /dev/null and b/repo/objects/dd/8d9f2dd83436feaa440ee5a5f8b5d1c8d4d36c32183ef00709e16f116c7e35.filez differ diff --git a/repo/objects/dd/d39161c3326341511e7e81cc45bd67abe54a9799f9ab27e1848ddf1dbffd1a.dirtree b/repo/objects/dd/d39161c3326341511e7e81cc45bd67abe54a9799f9ab27e1848ddf1dbffd1a.dirtree new file mode 100644 index 00000000000..9ba01a1da7c Binary files /dev/null and b/repo/objects/dd/d39161c3326341511e7e81cc45bd67abe54a9799f9ab27e1848ddf1dbffd1a.dirtree differ diff --git a/repo/objects/dd/ddee5c405f78d9bd313bc4f96adb3068ebd8b07127da9a890fb763d6f9f804.filez b/repo/objects/dd/ddee5c405f78d9bd313bc4f96adb3068ebd8b07127da9a890fb763d6f9f804.filez new file mode 100644 index 00000000000..f9b4323e580 Binary files /dev/null and b/repo/objects/dd/ddee5c405f78d9bd313bc4f96adb3068ebd8b07127da9a890fb763d6f9f804.filez differ diff --git a/repo/objects/dd/e25d17b5fa910c235ec2081dd30e2cbefbdcc7d453e073b83b26ff1714f6ae.filez b/repo/objects/dd/e25d17b5fa910c235ec2081dd30e2cbefbdcc7d453e073b83b26ff1714f6ae.filez new file mode 100644 index 00000000000..1cc095a2e09 Binary files /dev/null and b/repo/objects/dd/e25d17b5fa910c235ec2081dd30e2cbefbdcc7d453e073b83b26ff1714f6ae.filez differ diff --git a/repo/objects/dd/e7a6970346b23517d3d7c2007eaa5710b64ddc50c2949cc275a030af67016d.filez b/repo/objects/dd/e7a6970346b23517d3d7c2007eaa5710b64ddc50c2949cc275a030af67016d.filez new file mode 100644 index 00000000000..549d763b8da Binary files /dev/null and b/repo/objects/dd/e7a6970346b23517d3d7c2007eaa5710b64ddc50c2949cc275a030af67016d.filez differ diff --git a/repo/objects/dd/f551968f5c4ffec96e839689b01e66cf8f9db79207b39e76522c149004e061.filez b/repo/objects/dd/f551968f5c4ffec96e839689b01e66cf8f9db79207b39e76522c149004e061.filez new file mode 100644 index 00000000000..e00127ed9c1 Binary files /dev/null and b/repo/objects/dd/f551968f5c4ffec96e839689b01e66cf8f9db79207b39e76522c149004e061.filez differ diff --git a/repo/objects/de/09eef3bd6551059ae41e52a5d6119b9c39a8b0589f653ebeef106a10f7f9cb.filez b/repo/objects/de/09eef3bd6551059ae41e52a5d6119b9c39a8b0589f653ebeef106a10f7f9cb.filez new file mode 100644 index 00000000000..35371d7f1d9 Binary files /dev/null and b/repo/objects/de/09eef3bd6551059ae41e52a5d6119b9c39a8b0589f653ebeef106a10f7f9cb.filez differ diff --git a/repo/objects/de/1bffe33191dff9ea51a794cf0c40c83d81afa961007e5743493bb8be363f4e.filez b/repo/objects/de/1bffe33191dff9ea51a794cf0c40c83d81afa961007e5743493bb8be363f4e.filez new file mode 100644 index 00000000000..5e249b456e3 Binary files /dev/null and b/repo/objects/de/1bffe33191dff9ea51a794cf0c40c83d81afa961007e5743493bb8be363f4e.filez differ diff --git a/repo/objects/de/2c5eb15e56feb21123c7c13bdde28b777563a9582dcb14782ac583b34c419d.filez b/repo/objects/de/2c5eb15e56feb21123c7c13bdde28b777563a9582dcb14782ac583b34c419d.filez new file mode 100644 index 00000000000..bab02b754f8 Binary files /dev/null and b/repo/objects/de/2c5eb15e56feb21123c7c13bdde28b777563a9582dcb14782ac583b34c419d.filez differ diff --git a/repo/objects/de/691d1630de05aeca459fc3945a7160da5cf6e005a59a0f0bde81237f43e24e.filez b/repo/objects/de/691d1630de05aeca459fc3945a7160da5cf6e005a59a0f0bde81237f43e24e.filez new file mode 100644 index 00000000000..672399a6e1e Binary files /dev/null and b/repo/objects/de/691d1630de05aeca459fc3945a7160da5cf6e005a59a0f0bde81237f43e24e.filez differ diff --git a/repo/objects/de/693c789210f62a090114976db0df9ec8828071674895aaa8ddeb8c0ee020f5.dirtree b/repo/objects/de/693c789210f62a090114976db0df9ec8828071674895aaa8ddeb8c0ee020f5.dirtree new file mode 100644 index 00000000000..9066c2ebc25 Binary files /dev/null and b/repo/objects/de/693c789210f62a090114976db0df9ec8828071674895aaa8ddeb8c0ee020f5.dirtree differ diff --git a/repo/objects/de/79f58a324e07d6a94c0f6640cb733abbbb8ea1a301ab2429683d910c2f27cb.filez b/repo/objects/de/79f58a324e07d6a94c0f6640cb733abbbb8ea1a301ab2429683d910c2f27cb.filez new file mode 100644 index 00000000000..73a454546ae Binary files /dev/null and b/repo/objects/de/79f58a324e07d6a94c0f6640cb733abbbb8ea1a301ab2429683d910c2f27cb.filez differ diff --git a/repo/objects/de/b0f83f092680cc7464b17807a7bceeb4772e50b3de05f8a76c6d2caf0b20cf.filez b/repo/objects/de/b0f83f092680cc7464b17807a7bceeb4772e50b3de05f8a76c6d2caf0b20cf.filez new file mode 100644 index 00000000000..6f8ae6eb1b5 Binary files /dev/null and b/repo/objects/de/b0f83f092680cc7464b17807a7bceeb4772e50b3de05f8a76c6d2caf0b20cf.filez differ diff --git a/repo/objects/de/b48fabbd6d7b641eb8e94c72cd3d7523d19636d9407edf6ff4a15a4e2e1bd5.filez b/repo/objects/de/b48fabbd6d7b641eb8e94c72cd3d7523d19636d9407edf6ff4a15a4e2e1bd5.filez new file mode 100644 index 00000000000..67f5c2e1e0e Binary files /dev/null and b/repo/objects/de/b48fabbd6d7b641eb8e94c72cd3d7523d19636d9407edf6ff4a15a4e2e1bd5.filez differ diff --git a/repo/objects/de/b8b86c2a48c5820408889f346e01707e79226d635d38b5a8bae3678ccba4d2.filez b/repo/objects/de/b8b86c2a48c5820408889f346e01707e79226d635d38b5a8bae3678ccba4d2.filez new file mode 100644 index 00000000000..266dc214cd3 Binary files /dev/null and b/repo/objects/de/b8b86c2a48c5820408889f346e01707e79226d635d38b5a8bae3678ccba4d2.filez differ diff --git a/repo/objects/de/ba9ed7db7c3787e816ddbbc9c36e3d9549ed8e40498b8ec424f6e8b6256135.filez b/repo/objects/de/ba9ed7db7c3787e816ddbbc9c36e3d9549ed8e40498b8ec424f6e8b6256135.filez new file mode 100644 index 00000000000..b352d60a301 Binary files /dev/null and b/repo/objects/de/ba9ed7db7c3787e816ddbbc9c36e3d9549ed8e40498b8ec424f6e8b6256135.filez differ diff --git a/repo/objects/de/bc4cc408f1fe1b3e06f5ce4c88d11ba164cdc0d940f28aa5f199d4d2adaf88.filez b/repo/objects/de/bc4cc408f1fe1b3e06f5ce4c88d11ba164cdc0d940f28aa5f199d4d2adaf88.filez new file mode 100644 index 00000000000..737c142f52d Binary files /dev/null and b/repo/objects/de/bc4cc408f1fe1b3e06f5ce4c88d11ba164cdc0d940f28aa5f199d4d2adaf88.filez differ diff --git a/repo/objects/de/bea24913c3c1800598f2f86fc127e0046fc7ad163e6f365fa31c7002c413b8.filez b/repo/objects/de/bea24913c3c1800598f2f86fc127e0046fc7ad163e6f365fa31c7002c413b8.filez new file mode 100644 index 00000000000..35e92678a37 Binary files /dev/null and b/repo/objects/de/bea24913c3c1800598f2f86fc127e0046fc7ad163e6f365fa31c7002c413b8.filez differ diff --git a/repo/objects/de/d4df8fe8429776f7c4a814dc365e38ff86fa9cd97e50301beb2db46562bcc5.filez b/repo/objects/de/d4df8fe8429776f7c4a814dc365e38ff86fa9cd97e50301beb2db46562bcc5.filez new file mode 100644 index 00000000000..ced73b18ab8 Binary files /dev/null and b/repo/objects/de/d4df8fe8429776f7c4a814dc365e38ff86fa9cd97e50301beb2db46562bcc5.filez differ diff --git a/repo/objects/de/d660d241e96aa0a9264e70ff10bbcbde97f653e019c059df7d17efaed8d116.filez b/repo/objects/de/d660d241e96aa0a9264e70ff10bbcbde97f653e019c059df7d17efaed8d116.filez new file mode 100644 index 00000000000..bdc46793c21 Binary files /dev/null and b/repo/objects/de/d660d241e96aa0a9264e70ff10bbcbde97f653e019c059df7d17efaed8d116.filez differ diff --git a/repo/objects/de/d7711f8c17b99f35ed7d76237d740ea4b1faceb9dad57b8755fc9495a4cbf7.filez b/repo/objects/de/d7711f8c17b99f35ed7d76237d740ea4b1faceb9dad57b8755fc9495a4cbf7.filez new file mode 100644 index 00000000000..0c68bbdc326 Binary files /dev/null and b/repo/objects/de/d7711f8c17b99f35ed7d76237d740ea4b1faceb9dad57b8755fc9495a4cbf7.filez differ diff --git a/repo/objects/de/dd04a3546d363c717761bb2befb64162d22f054380cc29cb3680e2dba8dccc.filez b/repo/objects/de/dd04a3546d363c717761bb2befb64162d22f054380cc29cb3680e2dba8dccc.filez new file mode 100644 index 00000000000..f17c76172aa Binary files /dev/null and b/repo/objects/de/dd04a3546d363c717761bb2befb64162d22f054380cc29cb3680e2dba8dccc.filez differ diff --git a/repo/objects/de/fc84f43e80b19db980ae5e53ee592765cf02c737e0e7541264b170fa6c7f3b.dirtree b/repo/objects/de/fc84f43e80b19db980ae5e53ee592765cf02c737e0e7541264b170fa6c7f3b.dirtree new file mode 100644 index 00000000000..848a9391a29 Binary files /dev/null and b/repo/objects/de/fc84f43e80b19db980ae5e53ee592765cf02c737e0e7541264b170fa6c7f3b.dirtree differ diff --git a/repo/objects/df/15fd269a28610a33868d8540c2ab6ed95c7d05f6b6e67e3b64f3cec537b3e3.filez b/repo/objects/df/15fd269a28610a33868d8540c2ab6ed95c7d05f6b6e67e3b64f3cec537b3e3.filez new file mode 100644 index 00000000000..ba7827f98fb Binary files /dev/null and b/repo/objects/df/15fd269a28610a33868d8540c2ab6ed95c7d05f6b6e67e3b64f3cec537b3e3.filez differ diff --git a/repo/objects/df/402441a26e2d865fb8d5fa8d879c7584674f1e4d3427da557af5ef2ce1702f.filez b/repo/objects/df/402441a26e2d865fb8d5fa8d879c7584674f1e4d3427da557af5ef2ce1702f.filez new file mode 100644 index 00000000000..0e989914c9b Binary files /dev/null and b/repo/objects/df/402441a26e2d865fb8d5fa8d879c7584674f1e4d3427da557af5ef2ce1702f.filez differ diff --git a/repo/objects/df/4918b1241147470d6fb4e5a95f56407ce0da5d9e2a8d527304d80d7e34b627.filez b/repo/objects/df/4918b1241147470d6fb4e5a95f56407ce0da5d9e2a8d527304d80d7e34b627.filez new file mode 100644 index 00000000000..d5cbabbd8c9 Binary files /dev/null and b/repo/objects/df/4918b1241147470d6fb4e5a95f56407ce0da5d9e2a8d527304d80d7e34b627.filez differ diff --git a/repo/objects/df/5d2380ccde04d025119d2e173a972f1572a5368e01bcee99b5e061d6aa297f.filez b/repo/objects/df/5d2380ccde04d025119d2e173a972f1572a5368e01bcee99b5e061d6aa297f.filez new file mode 100644 index 00000000000..f45c311bf29 Binary files /dev/null and b/repo/objects/df/5d2380ccde04d025119d2e173a972f1572a5368e01bcee99b5e061d6aa297f.filez differ diff --git a/repo/objects/df/7848f76a25f6ac6ebe95571b1507ff88400fe099c788e7d3e50032067f383c.dirtree b/repo/objects/df/7848f76a25f6ac6ebe95571b1507ff88400fe099c788e7d3e50032067f383c.dirtree new file mode 100644 index 00000000000..ca48ccc91c8 Binary files /dev/null and b/repo/objects/df/7848f76a25f6ac6ebe95571b1507ff88400fe099c788e7d3e50032067f383c.dirtree differ diff --git a/repo/objects/df/9dde8c34eea281799a30c663587e7c597f0dd32e9238b01310c9f571d00065.filez b/repo/objects/df/9dde8c34eea281799a30c663587e7c597f0dd32e9238b01310c9f571d00065.filez new file mode 100644 index 00000000000..4070380c9b2 Binary files /dev/null and b/repo/objects/df/9dde8c34eea281799a30c663587e7c597f0dd32e9238b01310c9f571d00065.filez differ diff --git a/repo/objects/df/a66a5722e13e06716e096366fe9eee53b4398cd818768c3b589117eb252e73.filez b/repo/objects/df/a66a5722e13e06716e096366fe9eee53b4398cd818768c3b589117eb252e73.filez new file mode 100644 index 00000000000..6a82bbc72b5 Binary files /dev/null and b/repo/objects/df/a66a5722e13e06716e096366fe9eee53b4398cd818768c3b589117eb252e73.filez differ diff --git a/repo/objects/df/c0c72eee5f5aba5cbbf331fdaf62fe13424ba1ac86ba215ebefcadfd466eef.filez b/repo/objects/df/c0c72eee5f5aba5cbbf331fdaf62fe13424ba1ac86ba215ebefcadfd466eef.filez new file mode 100644 index 00000000000..3520f242e42 Binary files /dev/null and b/repo/objects/df/c0c72eee5f5aba5cbbf331fdaf62fe13424ba1ac86ba215ebefcadfd466eef.filez differ diff --git a/repo/objects/df/ccc3495e4d41fccc6aef939a5096a519b52c493a30c573c19e2a75c59b373f.filez b/repo/objects/df/ccc3495e4d41fccc6aef939a5096a519b52c493a30c573c19e2a75c59b373f.filez new file mode 100644 index 00000000000..701ca462c3f Binary files /dev/null and b/repo/objects/df/ccc3495e4d41fccc6aef939a5096a519b52c493a30c573c19e2a75c59b373f.filez differ diff --git a/repo/objects/df/e088094b54d17852a86cfc013a80784ca639a95507e65bab0da4e92a85c749.filez b/repo/objects/df/e088094b54d17852a86cfc013a80784ca639a95507e65bab0da4e92a85c749.filez new file mode 100644 index 00000000000..b2f7f3f8864 Binary files /dev/null and b/repo/objects/df/e088094b54d17852a86cfc013a80784ca639a95507e65bab0da4e92a85c749.filez differ diff --git a/repo/objects/e0/03c869376c99c09802c00b754a41a34e911293305bba0d6b56ed5276490ce1.filez b/repo/objects/e0/03c869376c99c09802c00b754a41a34e911293305bba0d6b56ed5276490ce1.filez new file mode 100644 index 00000000000..80e9c893583 Binary files /dev/null and b/repo/objects/e0/03c869376c99c09802c00b754a41a34e911293305bba0d6b56ed5276490ce1.filez differ diff --git a/repo/objects/e0/0a700178cb67ed923a18db7d23c306ced04cb4326d8da663cac02d84a3f179.filez b/repo/objects/e0/0a700178cb67ed923a18db7d23c306ced04cb4326d8da663cac02d84a3f179.filez new file mode 100644 index 00000000000..2e1d681dcab Binary files /dev/null and b/repo/objects/e0/0a700178cb67ed923a18db7d23c306ced04cb4326d8da663cac02d84a3f179.filez differ diff --git a/repo/objects/e0/1f3dfe13a6221f38768318133ac80bcc43ef251458f88668e628c6c7ff71f6.filez b/repo/objects/e0/1f3dfe13a6221f38768318133ac80bcc43ef251458f88668e628c6c7ff71f6.filez new file mode 100644 index 00000000000..83bee1e20ff Binary files /dev/null and b/repo/objects/e0/1f3dfe13a6221f38768318133ac80bcc43ef251458f88668e628c6c7ff71f6.filez differ diff --git a/repo/objects/e0/3bdbd8b3e2a0847fb6263dc2e505be10e4a85a69026bba2d1369e8e0cbf769.dirtree b/repo/objects/e0/3bdbd8b3e2a0847fb6263dc2e505be10e4a85a69026bba2d1369e8e0cbf769.dirtree new file mode 100644 index 00000000000..fe2f260fcf2 Binary files /dev/null and b/repo/objects/e0/3bdbd8b3e2a0847fb6263dc2e505be10e4a85a69026bba2d1369e8e0cbf769.dirtree differ diff --git a/repo/objects/e0/439780bf8788b538ef0b0cbd026b4849a7416be1630f3310c82479182fbccf.filez b/repo/objects/e0/439780bf8788b538ef0b0cbd026b4849a7416be1630f3310c82479182fbccf.filez new file mode 100644 index 00000000000..3e7772e07bf Binary files /dev/null and b/repo/objects/e0/439780bf8788b538ef0b0cbd026b4849a7416be1630f3310c82479182fbccf.filez differ diff --git a/repo/objects/e0/5b30881bbcf3041c912337dea41bc92d42be53d61470b2e2def3848f5dccd4.dirtree b/repo/objects/e0/5b30881bbcf3041c912337dea41bc92d42be53d61470b2e2def3848f5dccd4.dirtree new file mode 100644 index 00000000000..2768dea7a82 Binary files /dev/null and b/repo/objects/e0/5b30881bbcf3041c912337dea41bc92d42be53d61470b2e2def3848f5dccd4.dirtree differ diff --git a/repo/objects/e0/620aa2cf41249b4eb10305b36184511e3e344660719941a0c64131760302a6.filez b/repo/objects/e0/620aa2cf41249b4eb10305b36184511e3e344660719941a0c64131760302a6.filez new file mode 100644 index 00000000000..4dbea20808e Binary files /dev/null and b/repo/objects/e0/620aa2cf41249b4eb10305b36184511e3e344660719941a0c64131760302a6.filez differ diff --git a/repo/objects/e0/7b8d5290935f13df314a23377031410cb45965e0a908d72eeb876fd58162f6.filez b/repo/objects/e0/7b8d5290935f13df314a23377031410cb45965e0a908d72eeb876fd58162f6.filez new file mode 100644 index 00000000000..3b14130f9e4 Binary files /dev/null and b/repo/objects/e0/7b8d5290935f13df314a23377031410cb45965e0a908d72eeb876fd58162f6.filez differ diff --git a/repo/objects/e0/86fb9a7258a5a437107f8c5015dd38ad257d8d778ee2d7112ad8ae62c87f04.filez b/repo/objects/e0/86fb9a7258a5a437107f8c5015dd38ad257d8d778ee2d7112ad8ae62c87f04.filez new file mode 100644 index 00000000000..32f4eba6d23 Binary files /dev/null and b/repo/objects/e0/86fb9a7258a5a437107f8c5015dd38ad257d8d778ee2d7112ad8ae62c87f04.filez differ diff --git a/repo/objects/e0/8c486d022388c1bced02552aa48024ab2da4babea36e75381947b44890696b.filez b/repo/objects/e0/8c486d022388c1bced02552aa48024ab2da4babea36e75381947b44890696b.filez new file mode 100644 index 00000000000..c91a151b1a3 Binary files /dev/null and b/repo/objects/e0/8c486d022388c1bced02552aa48024ab2da4babea36e75381947b44890696b.filez differ diff --git a/repo/objects/e0/974535d0998d281e1b4b35b7225c2d49bcaef284c129ed48d8079230d4a7f6.filez b/repo/objects/e0/974535d0998d281e1b4b35b7225c2d49bcaef284c129ed48d8079230d4a7f6.filez new file mode 100644 index 00000000000..d44e8980aa3 Binary files /dev/null and b/repo/objects/e0/974535d0998d281e1b4b35b7225c2d49bcaef284c129ed48d8079230d4a7f6.filez differ diff --git a/repo/objects/e0/ca5e5801fd35549030745e5e73b8d88b0754dd8702b37677d64850d2c63fa7.filez b/repo/objects/e0/ca5e5801fd35549030745e5e73b8d88b0754dd8702b37677d64850d2c63fa7.filez new file mode 100644 index 00000000000..7161c2b492e Binary files /dev/null and b/repo/objects/e0/ca5e5801fd35549030745e5e73b8d88b0754dd8702b37677d64850d2c63fa7.filez differ diff --git a/repo/objects/e0/ce6b03c1ba15807bef83e20e3882b0c886a05e640d2d9ab6f5d447fe9a2c33.filez b/repo/objects/e0/ce6b03c1ba15807bef83e20e3882b0c886a05e640d2d9ab6f5d447fe9a2c33.filez new file mode 100644 index 00000000000..9ec77c13e66 Binary files /dev/null and b/repo/objects/e0/ce6b03c1ba15807bef83e20e3882b0c886a05e640d2d9ab6f5d447fe9a2c33.filez differ diff --git a/repo/objects/e0/d524b19c6b069502e0951df11a5f5f5d7807b3de49e5b24ec39a12df0efb62.dirtree b/repo/objects/e0/d524b19c6b069502e0951df11a5f5f5d7807b3de49e5b24ec39a12df0efb62.dirtree new file mode 100644 index 00000000000..c72dd611060 Binary files /dev/null and b/repo/objects/e0/d524b19c6b069502e0951df11a5f5f5d7807b3de49e5b24ec39a12df0efb62.dirtree differ diff --git a/repo/objects/e1/469b0ec48f835fb86d0d4c592e17892ad3e234264caacf9da81139f9d35914.filez b/repo/objects/e1/469b0ec48f835fb86d0d4c592e17892ad3e234264caacf9da81139f9d35914.filez new file mode 100644 index 00000000000..0dd1e89a5e4 Binary files /dev/null and b/repo/objects/e1/469b0ec48f835fb86d0d4c592e17892ad3e234264caacf9da81139f9d35914.filez differ diff --git a/repo/objects/e1/52b3b9df9d8c3ea9147754158c8c7005a9a012ef8ed09e1cd765c18c837ae6.dirtree b/repo/objects/e1/52b3b9df9d8c3ea9147754158c8c7005a9a012ef8ed09e1cd765c18c837ae6.dirtree new file mode 100644 index 00000000000..10473bfe700 Binary files /dev/null and b/repo/objects/e1/52b3b9df9d8c3ea9147754158c8c7005a9a012ef8ed09e1cd765c18c837ae6.dirtree differ diff --git a/repo/objects/e1/58ef48860e8a9cb3cdb5bfdaf2d072d0f28ed744b4c8595915b4611bfd9a94.filez b/repo/objects/e1/58ef48860e8a9cb3cdb5bfdaf2d072d0f28ed744b4c8595915b4611bfd9a94.filez new file mode 100644 index 00000000000..0e3c5a790e9 Binary files /dev/null and b/repo/objects/e1/58ef48860e8a9cb3cdb5bfdaf2d072d0f28ed744b4c8595915b4611bfd9a94.filez differ diff --git a/repo/objects/e1/b4527f63dc5f1f3efd663131ed1f26d54f2563de2bcdd00e2ffb2960ef6741.filez b/repo/objects/e1/b4527f63dc5f1f3efd663131ed1f26d54f2563de2bcdd00e2ffb2960ef6741.filez new file mode 100644 index 00000000000..0f497fb5df9 Binary files /dev/null and b/repo/objects/e1/b4527f63dc5f1f3efd663131ed1f26d54f2563de2bcdd00e2ffb2960ef6741.filez differ diff --git a/repo/objects/e1/d54597108b8bba14bf641c6a515ae5677ef30b092fd5ff1075da3c4b0a5cc2.filez b/repo/objects/e1/d54597108b8bba14bf641c6a515ae5677ef30b092fd5ff1075da3c4b0a5cc2.filez new file mode 100644 index 00000000000..e7a07773adb Binary files /dev/null and b/repo/objects/e1/d54597108b8bba14bf641c6a515ae5677ef30b092fd5ff1075da3c4b0a5cc2.filez differ diff --git a/repo/objects/e1/d66ea0a48a2388482d47539ba8efe6c09eb95541addd93950f2390dd40b4a8.filez b/repo/objects/e1/d66ea0a48a2388482d47539ba8efe6c09eb95541addd93950f2390dd40b4a8.filez new file mode 100644 index 00000000000..e732dc472fe Binary files /dev/null and b/repo/objects/e1/d66ea0a48a2388482d47539ba8efe6c09eb95541addd93950f2390dd40b4a8.filez differ diff --git a/repo/objects/e2/00d6b033246b62826d2bb7f235e25b5f9dac08a229e2c634ce00aad72e792f.filez b/repo/objects/e2/00d6b033246b62826d2bb7f235e25b5f9dac08a229e2c634ce00aad72e792f.filez new file mode 100644 index 00000000000..82c7bbfccaf Binary files /dev/null and b/repo/objects/e2/00d6b033246b62826d2bb7f235e25b5f9dac08a229e2c634ce00aad72e792f.filez differ diff --git a/repo/objects/e2/1d328c2b8fd7d84d07a656c700d14703502e7cfba5dab95150a82b41db4599.dirtree b/repo/objects/e2/1d328c2b8fd7d84d07a656c700d14703502e7cfba5dab95150a82b41db4599.dirtree new file mode 100644 index 00000000000..1f06f8d7543 Binary files /dev/null and b/repo/objects/e2/1d328c2b8fd7d84d07a656c700d14703502e7cfba5dab95150a82b41db4599.dirtree differ diff --git a/repo/objects/e2/2282ed181f2202317211c0e7c408fb56b84285c07260c316688b115b4bbcbd.filez b/repo/objects/e2/2282ed181f2202317211c0e7c408fb56b84285c07260c316688b115b4bbcbd.filez new file mode 100644 index 00000000000..a6b2dd0d6fa Binary files /dev/null and b/repo/objects/e2/2282ed181f2202317211c0e7c408fb56b84285c07260c316688b115b4bbcbd.filez differ diff --git a/repo/objects/e2/3bbc20913f34f84beb990688356e76c5db37a65647786f105e484a48f8fa96.filez b/repo/objects/e2/3bbc20913f34f84beb990688356e76c5db37a65647786f105e484a48f8fa96.filez new file mode 100644 index 00000000000..5a5e884446d Binary files /dev/null and b/repo/objects/e2/3bbc20913f34f84beb990688356e76c5db37a65647786f105e484a48f8fa96.filez differ diff --git a/repo/objects/e2/7d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2.commit b/repo/objects/e2/7d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2.commit new file mode 100644 index 00000000000..360340ba61f Binary files /dev/null and b/repo/objects/e2/7d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2.commit differ diff --git a/repo/objects/e2/7d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2.commitmeta b/repo/objects/e2/7d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2.commitmeta new file mode 100644 index 00000000000..27b4e936fc1 Binary files /dev/null and b/repo/objects/e2/7d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2.commitmeta differ diff --git a/repo/objects/e2/84417e927dbdb3ab9edd9711c3ba1900958f5358e91a21693eed152eb7d496.dirtree b/repo/objects/e2/84417e927dbdb3ab9edd9711c3ba1900958f5358e91a21693eed152eb7d496.dirtree new file mode 100644 index 00000000000..b676c39595d Binary files /dev/null and b/repo/objects/e2/84417e927dbdb3ab9edd9711c3ba1900958f5358e91a21693eed152eb7d496.dirtree differ diff --git a/repo/objects/e2/8d96a08f46a9d7dccd7e483ef8887864d75096fd081c9c7c8785706880132b.filez b/repo/objects/e2/8d96a08f46a9d7dccd7e483ef8887864d75096fd081c9c7c8785706880132b.filez new file mode 100644 index 00000000000..9b6b554aaab Binary files /dev/null and b/repo/objects/e2/8d96a08f46a9d7dccd7e483ef8887864d75096fd081c9c7c8785706880132b.filez differ diff --git a/repo/objects/e2/94e0f41203b5a64a6474523a0a1f15df0c7a7d1a2eaa784e0c8611ffb3dc32.filez b/repo/objects/e2/94e0f41203b5a64a6474523a0a1f15df0c7a7d1a2eaa784e0c8611ffb3dc32.filez new file mode 100644 index 00000000000..6ee396cd183 Binary files /dev/null and b/repo/objects/e2/94e0f41203b5a64a6474523a0a1f15df0c7a7d1a2eaa784e0c8611ffb3dc32.filez differ diff --git a/repo/objects/e3/11f968313c373dd08ca1d275aa124c15575d707aa32eef63735fc6bb4bb6fc.filez b/repo/objects/e3/11f968313c373dd08ca1d275aa124c15575d707aa32eef63735fc6bb4bb6fc.filez new file mode 100644 index 00000000000..037dc6b5e19 Binary files /dev/null and b/repo/objects/e3/11f968313c373dd08ca1d275aa124c15575d707aa32eef63735fc6bb4bb6fc.filez differ diff --git a/repo/objects/e3/2cb906d115f25c2bd78be5b3cda19485f8a731e136e69be1bf9bf755ab6b70.filez b/repo/objects/e3/2cb906d115f25c2bd78be5b3cda19485f8a731e136e69be1bf9bf755ab6b70.filez new file mode 100644 index 00000000000..142026f3e21 Binary files /dev/null and b/repo/objects/e3/2cb906d115f25c2bd78be5b3cda19485f8a731e136e69be1bf9bf755ab6b70.filez differ diff --git a/repo/objects/e3/2f04357ecca5f6905ef22e99530b2081252e1534fe641ba2df2cadce4ce6a2.filez b/repo/objects/e3/2f04357ecca5f6905ef22e99530b2081252e1534fe641ba2df2cadce4ce6a2.filez new file mode 100644 index 00000000000..4d83716f268 Binary files /dev/null and b/repo/objects/e3/2f04357ecca5f6905ef22e99530b2081252e1534fe641ba2df2cadce4ce6a2.filez differ diff --git a/repo/objects/e3/69795b6a80d1713c01205deceeb54956a7a595e9cb9df46c4d32f485d6f234.dirtree b/repo/objects/e3/69795b6a80d1713c01205deceeb54956a7a595e9cb9df46c4d32f485d6f234.dirtree new file mode 100644 index 00000000000..137b564cda0 Binary files /dev/null and b/repo/objects/e3/69795b6a80d1713c01205deceeb54956a7a595e9cb9df46c4d32f485d6f234.dirtree differ diff --git a/repo/objects/e3/a07df9f7465e57d99be525a1aba71c455eaf7b2e286fa653c878e667ac973c.filez b/repo/objects/e3/a07df9f7465e57d99be525a1aba71c455eaf7b2e286fa653c878e667ac973c.filez new file mode 100644 index 00000000000..fdca5c9838e Binary files /dev/null and b/repo/objects/e3/a07df9f7465e57d99be525a1aba71c455eaf7b2e286fa653c878e667ac973c.filez differ diff --git a/repo/objects/e3/aec8557fe2717582e4b9181ed1b8e0ee4cc943f9316cfd5f384b387043bc18.filez b/repo/objects/e3/aec8557fe2717582e4b9181ed1b8e0ee4cc943f9316cfd5f384b387043bc18.filez new file mode 100644 index 00000000000..cc87fc7a888 Binary files /dev/null and b/repo/objects/e3/aec8557fe2717582e4b9181ed1b8e0ee4cc943f9316cfd5f384b387043bc18.filez differ diff --git a/repo/objects/e4/00ec5311d7c44111bbdaf44a58ff4af78eeba5625508dbe2cd20aa09cee604.filez b/repo/objects/e4/00ec5311d7c44111bbdaf44a58ff4af78eeba5625508dbe2cd20aa09cee604.filez new file mode 100644 index 00000000000..a4bae0083cc Binary files /dev/null and b/repo/objects/e4/00ec5311d7c44111bbdaf44a58ff4af78eeba5625508dbe2cd20aa09cee604.filez differ diff --git a/repo/objects/e4/11ef7ab09b17d650b1e4cc9bdd37fffcb534f944ac6ef9ed655c7a633d5f42.filez b/repo/objects/e4/11ef7ab09b17d650b1e4cc9bdd37fffcb534f944ac6ef9ed655c7a633d5f42.filez new file mode 100644 index 00000000000..958ceb1aa6d Binary files /dev/null and b/repo/objects/e4/11ef7ab09b17d650b1e4cc9bdd37fffcb534f944ac6ef9ed655c7a633d5f42.filez differ diff --git a/repo/objects/e4/1ef5b3813391d0267bf59debeff134338434e96860056f3de8c894328f1803.filez b/repo/objects/e4/1ef5b3813391d0267bf59debeff134338434e96860056f3de8c894328f1803.filez new file mode 100644 index 00000000000..c3ad798b296 Binary files /dev/null and b/repo/objects/e4/1ef5b3813391d0267bf59debeff134338434e96860056f3de8c894328f1803.filez differ diff --git a/repo/objects/e4/2d9b2e9b488892ac4585437e4707bc3bbce994f79806c06b3c770d5377167a.dirtree b/repo/objects/e4/2d9b2e9b488892ac4585437e4707bc3bbce994f79806c06b3c770d5377167a.dirtree new file mode 100644 index 00000000000..98f95b7a093 Binary files /dev/null and b/repo/objects/e4/2d9b2e9b488892ac4585437e4707bc3bbce994f79806c06b3c770d5377167a.dirtree differ diff --git a/repo/objects/e4/34b1ffa8a7b87a0306b4c886aa9a5290f796399d3e5ac88fa0623aa3bf5b5c.dirtree b/repo/objects/e4/34b1ffa8a7b87a0306b4c886aa9a5290f796399d3e5ac88fa0623aa3bf5b5c.dirtree new file mode 100644 index 00000000000..756b66665fd Binary files /dev/null and b/repo/objects/e4/34b1ffa8a7b87a0306b4c886aa9a5290f796399d3e5ac88fa0623aa3bf5b5c.dirtree differ diff --git a/repo/objects/e4/42cb15ae4ed34fbe127ce7f1533888b791df27d4ac304f39068267507e6036.filez b/repo/objects/e4/42cb15ae4ed34fbe127ce7f1533888b791df27d4ac304f39068267507e6036.filez new file mode 100644 index 00000000000..34a41d2a101 Binary files /dev/null and b/repo/objects/e4/42cb15ae4ed34fbe127ce7f1533888b791df27d4ac304f39068267507e6036.filez differ diff --git a/repo/objects/e4/505ed526ce7f88abbc4d5eab059fafab93abf261923bc7624a12abc534c624.dirtree b/repo/objects/e4/505ed526ce7f88abbc4d5eab059fafab93abf261923bc7624a12abc534c624.dirtree new file mode 100644 index 00000000000..0c558790916 Binary files /dev/null and b/repo/objects/e4/505ed526ce7f88abbc4d5eab059fafab93abf261923bc7624a12abc534c624.dirtree differ diff --git a/repo/objects/e4/67783d3d360e054bb497e69b8581ed627577e5fa5e49074ee0f34341c25ed0.filez b/repo/objects/e4/67783d3d360e054bb497e69b8581ed627577e5fa5e49074ee0f34341c25ed0.filez new file mode 100644 index 00000000000..978f4b83bfc Binary files /dev/null and b/repo/objects/e4/67783d3d360e054bb497e69b8581ed627577e5fa5e49074ee0f34341c25ed0.filez differ diff --git a/repo/objects/e4/6e006d742acaf84c68999f213eaffbbf510be5d30672a269de71c372476114.filez b/repo/objects/e4/6e006d742acaf84c68999f213eaffbbf510be5d30672a269de71c372476114.filez new file mode 100644 index 00000000000..e5e9eb627f5 Binary files /dev/null and b/repo/objects/e4/6e006d742acaf84c68999f213eaffbbf510be5d30672a269de71c372476114.filez differ diff --git a/repo/objects/e4/a0d3c1efa18de3b6dd4a78df8559e2715f6272cd4c52322be2a36c3f8a1c48.dirtree b/repo/objects/e4/a0d3c1efa18de3b6dd4a78df8559e2715f6272cd4c52322be2a36c3f8a1c48.dirtree new file mode 100644 index 00000000000..9dcfd4a2f80 Binary files /dev/null and b/repo/objects/e4/a0d3c1efa18de3b6dd4a78df8559e2715f6272cd4c52322be2a36c3f8a1c48.dirtree differ diff --git a/repo/objects/e4/dc2948d133d19b2f5d3d6a021fcac19869aed849b4a71b2ae990a396372de8.filez b/repo/objects/e4/dc2948d133d19b2f5d3d6a021fcac19869aed849b4a71b2ae990a396372de8.filez new file mode 100644 index 00000000000..06c40c076f2 Binary files /dev/null and b/repo/objects/e4/dc2948d133d19b2f5d3d6a021fcac19869aed849b4a71b2ae990a396372de8.filez differ diff --git a/repo/objects/e4/e0276b6645787bab1ab2d0df800e3ff001374649c4e9af1188f25745f04b78.filez b/repo/objects/e4/e0276b6645787bab1ab2d0df800e3ff001374649c4e9af1188f25745f04b78.filez new file mode 100644 index 00000000000..e8d6f89a040 Binary files /dev/null and b/repo/objects/e4/e0276b6645787bab1ab2d0df800e3ff001374649c4e9af1188f25745f04b78.filez differ diff --git a/repo/objects/e4/e9a0fd5b7ef0ceff333503ba6248ce40e553827f758e02ae48edd3fe1e7d28.filez b/repo/objects/e4/e9a0fd5b7ef0ceff333503ba6248ce40e553827f758e02ae48edd3fe1e7d28.filez new file mode 100644 index 00000000000..9a8e3594048 Binary files /dev/null and b/repo/objects/e4/e9a0fd5b7ef0ceff333503ba6248ce40e553827f758e02ae48edd3fe1e7d28.filez differ diff --git a/repo/objects/e5/039288c5134bf16d0c61c875d55a16a7f942eda240de79862849a0cfb82669.dirtree b/repo/objects/e5/039288c5134bf16d0c61c875d55a16a7f942eda240de79862849a0cfb82669.dirtree new file mode 100644 index 00000000000..f60fd7f5f8d Binary files /dev/null and b/repo/objects/e5/039288c5134bf16d0c61c875d55a16a7f942eda240de79862849a0cfb82669.dirtree differ diff --git a/repo/objects/e5/05c614b96eca437a6106773bcf3665d858b7c99e2e1b5259f055aec87eeb66.filez b/repo/objects/e5/05c614b96eca437a6106773bcf3665d858b7c99e2e1b5259f055aec87eeb66.filez new file mode 100644 index 00000000000..afe62d81fc8 Binary files /dev/null and b/repo/objects/e5/05c614b96eca437a6106773bcf3665d858b7c99e2e1b5259f055aec87eeb66.filez differ diff --git a/repo/objects/e5/4622b31fb00005a27b707fa3a9a2c9ddf5d57096626b0ef44420f470d016d6.filez b/repo/objects/e5/4622b31fb00005a27b707fa3a9a2c9ddf5d57096626b0ef44420f470d016d6.filez new file mode 100644 index 00000000000..6d8badad2d0 Binary files /dev/null and b/repo/objects/e5/4622b31fb00005a27b707fa3a9a2c9ddf5d57096626b0ef44420f470d016d6.filez differ diff --git a/repo/objects/e5/675cfa242697b71827fdb2410a432ab339c669dd7a9473e584ca5095684df6.filez b/repo/objects/e5/675cfa242697b71827fdb2410a432ab339c669dd7a9473e584ca5095684df6.filez new file mode 100644 index 00000000000..dc3ef4ce18b Binary files /dev/null and b/repo/objects/e5/675cfa242697b71827fdb2410a432ab339c669dd7a9473e584ca5095684df6.filez differ diff --git a/repo/objects/e5/69293d2ba1787569c1df5364b584d24cfb4f028585640909eb0a9514bffbe5.dirtree b/repo/objects/e5/69293d2ba1787569c1df5364b584d24cfb4f028585640909eb0a9514bffbe5.dirtree new file mode 100644 index 00000000000..68fae69251c Binary files /dev/null and b/repo/objects/e5/69293d2ba1787569c1df5364b584d24cfb4f028585640909eb0a9514bffbe5.dirtree differ diff --git a/repo/objects/e5/965ed9f801a179514f5635f398daf59722f080724526542dcd9919db32143c.filez b/repo/objects/e5/965ed9f801a179514f5635f398daf59722f080724526542dcd9919db32143c.filez new file mode 100644 index 00000000000..d0931326bef Binary files /dev/null and b/repo/objects/e5/965ed9f801a179514f5635f398daf59722f080724526542dcd9919db32143c.filez differ diff --git a/repo/objects/e5/a463fc522f4774d02606d894b5d6897365dead2f60ee03e9848d9fc1b3bbb9.filez b/repo/objects/e5/a463fc522f4774d02606d894b5d6897365dead2f60ee03e9848d9fc1b3bbb9.filez new file mode 100644 index 00000000000..82aa4e91db5 Binary files /dev/null and b/repo/objects/e5/a463fc522f4774d02606d894b5d6897365dead2f60ee03e9848d9fc1b3bbb9.filez differ diff --git a/repo/objects/e5/af585c7a39edb54ec3fd9c130a5d0a3198f5097b9e6215607233c38bfc67f0.filez b/repo/objects/e5/af585c7a39edb54ec3fd9c130a5d0a3198f5097b9e6215607233c38bfc67f0.filez new file mode 100644 index 00000000000..2cf00cbaa42 Binary files /dev/null and b/repo/objects/e5/af585c7a39edb54ec3fd9c130a5d0a3198f5097b9e6215607233c38bfc67f0.filez differ diff --git a/repo/objects/e5/b9b8721be6aad8734182897d89774eafef737431353877966467b0c9939e4f.filez b/repo/objects/e5/b9b8721be6aad8734182897d89774eafef737431353877966467b0c9939e4f.filez new file mode 100644 index 00000000000..c27f21c751a Binary files /dev/null and b/repo/objects/e5/b9b8721be6aad8734182897d89774eafef737431353877966467b0c9939e4f.filez differ diff --git a/repo/objects/e5/f7049b63eb5133efee88ffd01a9bf2e3ab01e15eec71d1d1da590d52ed641f.filez b/repo/objects/e5/f7049b63eb5133efee88ffd01a9bf2e3ab01e15eec71d1d1da590d52ed641f.filez new file mode 100644 index 00000000000..11a3c94e050 Binary files /dev/null and b/repo/objects/e5/f7049b63eb5133efee88ffd01a9bf2e3ab01e15eec71d1d1da590d52ed641f.filez differ diff --git a/repo/objects/e6/0538af9036a85349c9001bdf270d02bd5040c76b6f0fb4885184a0d138cf4b.filez b/repo/objects/e6/0538af9036a85349c9001bdf270d02bd5040c76b6f0fb4885184a0d138cf4b.filez new file mode 100644 index 00000000000..b62a324a8e6 Binary files /dev/null and b/repo/objects/e6/0538af9036a85349c9001bdf270d02bd5040c76b6f0fb4885184a0d138cf4b.filez differ diff --git a/repo/objects/e6/0c3b0fbb23116b43f5036d6219454b8bb512fc5f72ae321db3f1a65783ce72.filez b/repo/objects/e6/0c3b0fbb23116b43f5036d6219454b8bb512fc5f72ae321db3f1a65783ce72.filez new file mode 100644 index 00000000000..deed987845b Binary files /dev/null and b/repo/objects/e6/0c3b0fbb23116b43f5036d6219454b8bb512fc5f72ae321db3f1a65783ce72.filez differ diff --git a/repo/objects/e6/1a6027a24c7c7d26378e2d0584a15739ea2398cd5bfa0f4d5ab3f9f5c1f505.filez b/repo/objects/e6/1a6027a24c7c7d26378e2d0584a15739ea2398cd5bfa0f4d5ab3f9f5c1f505.filez new file mode 100644 index 00000000000..444c377fc7f Binary files /dev/null and b/repo/objects/e6/1a6027a24c7c7d26378e2d0584a15739ea2398cd5bfa0f4d5ab3f9f5c1f505.filez differ diff --git a/repo/objects/e6/20310365e69b4c61c938903853defb10a1338a476a6e98872cb35e855b15b1.filez b/repo/objects/e6/20310365e69b4c61c938903853defb10a1338a476a6e98872cb35e855b15b1.filez new file mode 100644 index 00000000000..376914be868 Binary files /dev/null and b/repo/objects/e6/20310365e69b4c61c938903853defb10a1338a476a6e98872cb35e855b15b1.filez differ diff --git a/repo/objects/e6/324bb470f3aa94626e35864750c50e7b0db803391c86b5dee95194987cebf9.filez b/repo/objects/e6/324bb470f3aa94626e35864750c50e7b0db803391c86b5dee95194987cebf9.filez new file mode 100644 index 00000000000..944f5f0e56a Binary files /dev/null and b/repo/objects/e6/324bb470f3aa94626e35864750c50e7b0db803391c86b5dee95194987cebf9.filez differ diff --git a/repo/objects/e6/45b4d804dcfc92cad42b575d420fc83bd0d7209bf9f7008dff0dccbe92eef3.filez b/repo/objects/e6/45b4d804dcfc92cad42b575d420fc83bd0d7209bf9f7008dff0dccbe92eef3.filez new file mode 100644 index 00000000000..ebe795c0389 Binary files /dev/null and b/repo/objects/e6/45b4d804dcfc92cad42b575d420fc83bd0d7209bf9f7008dff0dccbe92eef3.filez differ diff --git a/repo/objects/e6/48da77e27eca5090e8aa105d9af16f0e65a295f82f5825072508d78be7de97.filez b/repo/objects/e6/48da77e27eca5090e8aa105d9af16f0e65a295f82f5825072508d78be7de97.filez new file mode 100644 index 00000000000..c3103c85d2c Binary files /dev/null and b/repo/objects/e6/48da77e27eca5090e8aa105d9af16f0e65a295f82f5825072508d78be7de97.filez differ diff --git a/repo/objects/e6/e409305ce1def63836426b83ecc6733d4c30cb249ff0e9cdf9b0cc615e92a9.filez b/repo/objects/e6/e409305ce1def63836426b83ecc6733d4c30cb249ff0e9cdf9b0cc615e92a9.filez new file mode 100644 index 00000000000..a1e46b9a50f Binary files /dev/null and b/repo/objects/e6/e409305ce1def63836426b83ecc6733d4c30cb249ff0e9cdf9b0cc615e92a9.filez differ diff --git a/repo/objects/e6/e77f9054e49a0cef15ebb1c762a9e0b2b93ef37ee72657552fc903a7cdff40.dirtree b/repo/objects/e6/e77f9054e49a0cef15ebb1c762a9e0b2b93ef37ee72657552fc903a7cdff40.dirtree new file mode 100644 index 00000000000..0963af41e7a Binary files /dev/null and b/repo/objects/e6/e77f9054e49a0cef15ebb1c762a9e0b2b93ef37ee72657552fc903a7cdff40.dirtree differ diff --git a/repo/objects/e6/ea8f085ad5521b8c537c677bcbc0f74137616f8f2e91c60b7494ab6a6b7ff0.filez b/repo/objects/e6/ea8f085ad5521b8c537c677bcbc0f74137616f8f2e91c60b7494ab6a6b7ff0.filez new file mode 100644 index 00000000000..879849844c6 Binary files /dev/null and b/repo/objects/e6/ea8f085ad5521b8c537c677bcbc0f74137616f8f2e91c60b7494ab6a6b7ff0.filez differ diff --git a/repo/objects/e6/fc4718e794e2703627ed7b30cce7874ed03a27f0376d50d7eec173df235954.filez b/repo/objects/e6/fc4718e794e2703627ed7b30cce7874ed03a27f0376d50d7eec173df235954.filez new file mode 100644 index 00000000000..d8a66c4de3f Binary files /dev/null and b/repo/objects/e6/fc4718e794e2703627ed7b30cce7874ed03a27f0376d50d7eec173df235954.filez differ diff --git a/repo/objects/e7/01901ac0a0e2b417387c8cad0c80051e62a6160294279e8ddf839bc50cb788.filez b/repo/objects/e7/01901ac0a0e2b417387c8cad0c80051e62a6160294279e8ddf839bc50cb788.filez new file mode 100644 index 00000000000..33db1b47b7c Binary files /dev/null and b/repo/objects/e7/01901ac0a0e2b417387c8cad0c80051e62a6160294279e8ddf839bc50cb788.filez differ diff --git a/repo/objects/e7/0bb0ea83a3a0be8d43493330107e657e936eb92d8116579ced577ef45758ac.filez b/repo/objects/e7/0bb0ea83a3a0be8d43493330107e657e936eb92d8116579ced577ef45758ac.filez new file mode 100644 index 00000000000..33ea6dc52d8 Binary files /dev/null and b/repo/objects/e7/0bb0ea83a3a0be8d43493330107e657e936eb92d8116579ced577ef45758ac.filez differ diff --git a/repo/objects/e7/0f0243598273a42785197731f33227fc810833408c7463beebaf4c06658677.filez b/repo/objects/e7/0f0243598273a42785197731f33227fc810833408c7463beebaf4c06658677.filez new file mode 100644 index 00000000000..1682ea70076 Binary files /dev/null and b/repo/objects/e7/0f0243598273a42785197731f33227fc810833408c7463beebaf4c06658677.filez differ diff --git a/repo/objects/e7/12b01b50982cf2bdad56d739dcc6df61e8373f16c16c4626e57c7761d164ea.filez b/repo/objects/e7/12b01b50982cf2bdad56d739dcc6df61e8373f16c16c4626e57c7761d164ea.filez new file mode 100644 index 00000000000..386362bdfb8 Binary files /dev/null and b/repo/objects/e7/12b01b50982cf2bdad56d739dcc6df61e8373f16c16c4626e57c7761d164ea.filez differ diff --git a/repo/objects/e7/42a95acb457fcfb21ca89490018d40830169f439980c01532cfb1cf066ea58.filez b/repo/objects/e7/42a95acb457fcfb21ca89490018d40830169f439980c01532cfb1cf066ea58.filez new file mode 100644 index 00000000000..6dd00da9615 Binary files /dev/null and b/repo/objects/e7/42a95acb457fcfb21ca89490018d40830169f439980c01532cfb1cf066ea58.filez differ diff --git a/repo/objects/e7/541ba0e8fe66d0a2cc0e0c9c6cf885a731a60c32ddc920d4d0c79c28151dd0.filez b/repo/objects/e7/541ba0e8fe66d0a2cc0e0c9c6cf885a731a60c32ddc920d4d0c79c28151dd0.filez new file mode 100644 index 00000000000..ce26a7ca3df Binary files /dev/null and b/repo/objects/e7/541ba0e8fe66d0a2cc0e0c9c6cf885a731a60c32ddc920d4d0c79c28151dd0.filez differ diff --git a/repo/objects/e7/6a1a7899fbe3769a1b9a0a63ccea06af89ee274971c7ddd3f3e1f6e9279632.filez b/repo/objects/e7/6a1a7899fbe3769a1b9a0a63ccea06af89ee274971c7ddd3f3e1f6e9279632.filez new file mode 100644 index 00000000000..926418442cb Binary files /dev/null and b/repo/objects/e7/6a1a7899fbe3769a1b9a0a63ccea06af89ee274971c7ddd3f3e1f6e9279632.filez differ diff --git a/repo/objects/e7/704e07d140efa8d0e16b9b8c8e0d4d9ff2e9fd130f335262417bbae5a9aa82.filez b/repo/objects/e7/704e07d140efa8d0e16b9b8c8e0d4d9ff2e9fd130f335262417bbae5a9aa82.filez new file mode 100644 index 00000000000..f4634f812cf Binary files /dev/null and b/repo/objects/e7/704e07d140efa8d0e16b9b8c8e0d4d9ff2e9fd130f335262417bbae5a9aa82.filez differ diff --git a/repo/objects/e7/72a6cde271ab31462895e0e152f43388b9c0e886d5e5ab783d0bdc530340d1.filez b/repo/objects/e7/72a6cde271ab31462895e0e152f43388b9c0e886d5e5ab783d0bdc530340d1.filez new file mode 100644 index 00000000000..d3ea0b24481 Binary files /dev/null and b/repo/objects/e7/72a6cde271ab31462895e0e152f43388b9c0e886d5e5ab783d0bdc530340d1.filez differ diff --git a/repo/objects/e7/875abd5697c658e33d29267764af10b039498ce1ac51c66a579b5a240e641c.filez b/repo/objects/e7/875abd5697c658e33d29267764af10b039498ce1ac51c66a579b5a240e641c.filez new file mode 100644 index 00000000000..c83f9d7d59b Binary files /dev/null and b/repo/objects/e7/875abd5697c658e33d29267764af10b039498ce1ac51c66a579b5a240e641c.filez differ diff --git a/repo/objects/e7/a0a89c1ce84613dfed43d7f67dd2eb9f50668fa47a0e0cb3927130cf66e6a1.filez b/repo/objects/e7/a0a89c1ce84613dfed43d7f67dd2eb9f50668fa47a0e0cb3927130cf66e6a1.filez new file mode 100644 index 00000000000..f13601d5b9e Binary files /dev/null and b/repo/objects/e7/a0a89c1ce84613dfed43d7f67dd2eb9f50668fa47a0e0cb3927130cf66e6a1.filez differ diff --git a/repo/objects/e7/a8abcbb02840f28ed9260af8a492ec8e1cf6fe901851fe90e466b8f0c90bdd.dirtree b/repo/objects/e7/a8abcbb02840f28ed9260af8a492ec8e1cf6fe901851fe90e466b8f0c90bdd.dirtree new file mode 100644 index 00000000000..7501d50228a Binary files /dev/null and b/repo/objects/e7/a8abcbb02840f28ed9260af8a492ec8e1cf6fe901851fe90e466b8f0c90bdd.dirtree differ diff --git a/repo/objects/e7/ac51d94a172a664f072c440ef28175fae5c55ac83b8eb10f560df3761e25e1.filez b/repo/objects/e7/ac51d94a172a664f072c440ef28175fae5c55ac83b8eb10f560df3761e25e1.filez new file mode 100644 index 00000000000..ea05e28a2c9 Binary files /dev/null and b/repo/objects/e7/ac51d94a172a664f072c440ef28175fae5c55ac83b8eb10f560df3761e25e1.filez differ diff --git a/repo/objects/e7/bd38a74b4f1667b9eeaa5f345a15151c8cee023b90d034dfe781f5da46b29a.filez b/repo/objects/e7/bd38a74b4f1667b9eeaa5f345a15151c8cee023b90d034dfe781f5da46b29a.filez new file mode 100644 index 00000000000..6c9d2576c6e Binary files /dev/null and b/repo/objects/e7/bd38a74b4f1667b9eeaa5f345a15151c8cee023b90d034dfe781f5da46b29a.filez differ diff --git a/repo/objects/e8/1b5e5f8e157b6f069e43c886a934af4745279fc5f027fc3f82d99735d04637.filez b/repo/objects/e8/1b5e5f8e157b6f069e43c886a934af4745279fc5f027fc3f82d99735d04637.filez new file mode 100644 index 00000000000..fa2b2bb6afd Binary files /dev/null and b/repo/objects/e8/1b5e5f8e157b6f069e43c886a934af4745279fc5f027fc3f82d99735d04637.filez differ diff --git a/repo/objects/e8/3523e58213eb524ad1d98a5b2954133401939d9966aa71a13c0b09dac3e637.filez b/repo/objects/e8/3523e58213eb524ad1d98a5b2954133401939d9966aa71a13c0b09dac3e637.filez new file mode 100644 index 00000000000..025cc892eb8 Binary files /dev/null and b/repo/objects/e8/3523e58213eb524ad1d98a5b2954133401939d9966aa71a13c0b09dac3e637.filez differ diff --git a/repo/objects/e8/72338c26a835df13057b77c7d3bf36cc293e062ff8c9a4e1bb0606b1392252.dirtree b/repo/objects/e8/72338c26a835df13057b77c7d3bf36cc293e062ff8c9a4e1bb0606b1392252.dirtree new file mode 100644 index 00000000000..5aac7315afe Binary files /dev/null and b/repo/objects/e8/72338c26a835df13057b77c7d3bf36cc293e062ff8c9a4e1bb0606b1392252.dirtree differ diff --git a/repo/objects/e8/729d59032b529ad81a739f87010a169fd75e2fa6f2aa689f4ca9d8a47eb681.dirtree b/repo/objects/e8/729d59032b529ad81a739f87010a169fd75e2fa6f2aa689f4ca9d8a47eb681.dirtree new file mode 100644 index 00000000000..cc54baf7d69 Binary files /dev/null and b/repo/objects/e8/729d59032b529ad81a739f87010a169fd75e2fa6f2aa689f4ca9d8a47eb681.dirtree differ diff --git a/repo/objects/e8/74a417cf0a184e899779b71bc6e28ba145faf9a8771aa66068912ca3e49941.filez b/repo/objects/e8/74a417cf0a184e899779b71bc6e28ba145faf9a8771aa66068912ca3e49941.filez new file mode 100644 index 00000000000..b918e5a325a Binary files /dev/null and b/repo/objects/e8/74a417cf0a184e899779b71bc6e28ba145faf9a8771aa66068912ca3e49941.filez differ diff --git a/repo/objects/e8/7c25fbaa26e14e5de89c060072cd0215a4f6a81d56c5757fdc4161b8af487c.filez b/repo/objects/e8/7c25fbaa26e14e5de89c060072cd0215a4f6a81d56c5757fdc4161b8af487c.filez new file mode 100644 index 00000000000..ae64b48a815 Binary files /dev/null and b/repo/objects/e8/7c25fbaa26e14e5de89c060072cd0215a4f6a81d56c5757fdc4161b8af487c.filez differ diff --git a/repo/objects/e8/8b17629f7d5b879d3a5c409b4d6f9edd5d86620b030c41d6c5aa562f933ca8.filez b/repo/objects/e8/8b17629f7d5b879d3a5c409b4d6f9edd5d86620b030c41d6c5aa562f933ca8.filez new file mode 100644 index 00000000000..b1a2517385d Binary files /dev/null and b/repo/objects/e8/8b17629f7d5b879d3a5c409b4d6f9edd5d86620b030c41d6c5aa562f933ca8.filez differ diff --git a/repo/objects/e8/8c5786aeaa75bb087aac2f514a99f60726c93bb25fea204d0c3261b2b56ff1.filez b/repo/objects/e8/8c5786aeaa75bb087aac2f514a99f60726c93bb25fea204d0c3261b2b56ff1.filez new file mode 100644 index 00000000000..d9a81b38085 Binary files /dev/null and b/repo/objects/e8/8c5786aeaa75bb087aac2f514a99f60726c93bb25fea204d0c3261b2b56ff1.filez differ diff --git a/repo/objects/e8/b7e430710f31fb08c4481e54e5ebfb7b6653b97414e0bf55f67bea38843de1.dirtree b/repo/objects/e8/b7e430710f31fb08c4481e54e5ebfb7b6653b97414e0bf55f67bea38843de1.dirtree new file mode 100644 index 00000000000..b75ebde544c Binary files /dev/null and b/repo/objects/e8/b7e430710f31fb08c4481e54e5ebfb7b6653b97414e0bf55f67bea38843de1.dirtree differ diff --git a/repo/objects/e8/d2221b1dc767706e6cbd514877250debb7fc46c7c7f98cde584c75823c0472.dirtree b/repo/objects/e8/d2221b1dc767706e6cbd514877250debb7fc46c7c7f98cde584c75823c0472.dirtree new file mode 100644 index 00000000000..c11ffc5dff2 Binary files /dev/null and b/repo/objects/e8/d2221b1dc767706e6cbd514877250debb7fc46c7c7f98cde584c75823c0472.dirtree differ diff --git a/repo/objects/e9/0d7a310698c7eef9df67946c84a0bb6040896f32a25f7b25de7d298bfdfd89.filez b/repo/objects/e9/0d7a310698c7eef9df67946c84a0bb6040896f32a25f7b25de7d298bfdfd89.filez new file mode 100644 index 00000000000..9bdece5cdc3 Binary files /dev/null and b/repo/objects/e9/0d7a310698c7eef9df67946c84a0bb6040896f32a25f7b25de7d298bfdfd89.filez differ diff --git a/repo/objects/e9/2a94dd498d7b0564d9f3c3cefe2e39a100ac66bf710634b33b1045442d979f.filez b/repo/objects/e9/2a94dd498d7b0564d9f3c3cefe2e39a100ac66bf710634b33b1045442d979f.filez new file mode 100644 index 00000000000..21894746b08 Binary files /dev/null and b/repo/objects/e9/2a94dd498d7b0564d9f3c3cefe2e39a100ac66bf710634b33b1045442d979f.filez differ diff --git a/repo/objects/e9/473eba80e0a6f9fe4592ebb400039856acd07c55d799fe896c8ca4fda4b97f.filez b/repo/objects/e9/473eba80e0a6f9fe4592ebb400039856acd07c55d799fe896c8ca4fda4b97f.filez new file mode 100644 index 00000000000..784fd3810a7 Binary files /dev/null and b/repo/objects/e9/473eba80e0a6f9fe4592ebb400039856acd07c55d799fe896c8ca4fda4b97f.filez differ diff --git a/repo/objects/e9/5cbfa4d3fb3a1ad2474d21bc612d13ca3e8baadb6d2d9a83b99792db89e7a9.filez b/repo/objects/e9/5cbfa4d3fb3a1ad2474d21bc612d13ca3e8baadb6d2d9a83b99792db89e7a9.filez new file mode 100644 index 00000000000..703a02eea7f Binary files /dev/null and b/repo/objects/e9/5cbfa4d3fb3a1ad2474d21bc612d13ca3e8baadb6d2d9a83b99792db89e7a9.filez differ diff --git a/repo/objects/e9/5e044442ca9ff92de90c1b8b3c22cea7931b9f0be4a91d7846dc30a1e6a25c.dirtree b/repo/objects/e9/5e044442ca9ff92de90c1b8b3c22cea7931b9f0be4a91d7846dc30a1e6a25c.dirtree new file mode 100644 index 00000000000..fa446cc3819 Binary files /dev/null and b/repo/objects/e9/5e044442ca9ff92de90c1b8b3c22cea7931b9f0be4a91d7846dc30a1e6a25c.dirtree differ diff --git a/repo/objects/e9/932cb248a9952151c3cce9716f9302280a8a32dc5a181727991f72013c3398.filez b/repo/objects/e9/932cb248a9952151c3cce9716f9302280a8a32dc5a181727991f72013c3398.filez new file mode 100644 index 00000000000..0ee1c8bd98a Binary files /dev/null and b/repo/objects/e9/932cb248a9952151c3cce9716f9302280a8a32dc5a181727991f72013c3398.filez differ diff --git a/repo/objects/e9/ac0656fa1a07c7c1da8e9e8bb48abdf7331704be886cf7fc3faf5a07361057.filez b/repo/objects/e9/ac0656fa1a07c7c1da8e9e8bb48abdf7331704be886cf7fc3faf5a07361057.filez new file mode 100644 index 00000000000..882cc6a5f4f Binary files /dev/null and b/repo/objects/e9/ac0656fa1a07c7c1da8e9e8bb48abdf7331704be886cf7fc3faf5a07361057.filez differ diff --git a/repo/objects/e9/b18e397fc0246b683423447e3e7925c1a5c9262646184f82afd2a0f8d2f00d.filez b/repo/objects/e9/b18e397fc0246b683423447e3e7925c1a5c9262646184f82afd2a0f8d2f00d.filez new file mode 100644 index 00000000000..535013b6851 Binary files /dev/null and b/repo/objects/e9/b18e397fc0246b683423447e3e7925c1a5c9262646184f82afd2a0f8d2f00d.filez differ diff --git a/repo/objects/e9/c18b98dad07890c5acb4a87c96129199349eea4888c440844fdc3c0b555bf8.filez b/repo/objects/e9/c18b98dad07890c5acb4a87c96129199349eea4888c440844fdc3c0b555bf8.filez new file mode 100644 index 00000000000..271ba812034 Binary files /dev/null and b/repo/objects/e9/c18b98dad07890c5acb4a87c96129199349eea4888c440844fdc3c0b555bf8.filez differ diff --git a/repo/objects/e9/d8a82d0fbf5bb9426ef0ba0ea513609f5d9dd52da6f9b1ef05cca3406f947b.filez b/repo/objects/e9/d8a82d0fbf5bb9426ef0ba0ea513609f5d9dd52da6f9b1ef05cca3406f947b.filez new file mode 100644 index 00000000000..e3264318b21 Binary files /dev/null and b/repo/objects/e9/d8a82d0fbf5bb9426ef0ba0ea513609f5d9dd52da6f9b1ef05cca3406f947b.filez differ diff --git a/repo/objects/e9/fd07dfe606af54558ac8b5dab1c8528c6f9ca67f5784c1db0d553235e98ecd.filez b/repo/objects/e9/fd07dfe606af54558ac8b5dab1c8528c6f9ca67f5784c1db0d553235e98ecd.filez new file mode 100644 index 00000000000..08f479cbddb Binary files /dev/null and b/repo/objects/e9/fd07dfe606af54558ac8b5dab1c8528c6f9ca67f5784c1db0d553235e98ecd.filez differ diff --git a/repo/objects/ea/03929694c297804957d83e7091c8676b07ee070112327fc1fc2d990f32fc28.dirtree b/repo/objects/ea/03929694c297804957d83e7091c8676b07ee070112327fc1fc2d990f32fc28.dirtree new file mode 100644 index 00000000000..2d5e531b349 Binary files /dev/null and b/repo/objects/ea/03929694c297804957d83e7091c8676b07ee070112327fc1fc2d990f32fc28.dirtree differ diff --git a/repo/objects/ea/1b59b1a76b9b4f8c743c7f68b43bbd08c78e9c03c66f61bee1bf40df3007ad.filez b/repo/objects/ea/1b59b1a76b9b4f8c743c7f68b43bbd08c78e9c03c66f61bee1bf40df3007ad.filez new file mode 100644 index 00000000000..134b8b29cdb Binary files /dev/null and b/repo/objects/ea/1b59b1a76b9b4f8c743c7f68b43bbd08c78e9c03c66f61bee1bf40df3007ad.filez differ diff --git a/repo/objects/ea/6a96b9b4611d2dcb5e3da549e4491aa7b1e3acfcf3d09e9c735bf0f2f998e9.dirtree b/repo/objects/ea/6a96b9b4611d2dcb5e3da549e4491aa7b1e3acfcf3d09e9c735bf0f2f998e9.dirtree new file mode 100644 index 00000000000..e287dc0753f Binary files /dev/null and b/repo/objects/ea/6a96b9b4611d2dcb5e3da549e4491aa7b1e3acfcf3d09e9c735bf0f2f998e9.dirtree differ diff --git a/repo/objects/ea/6ec72c9e004cf29278e56b5563748f8584b158e5c3a8980790431f0c27a569.filez b/repo/objects/ea/6ec72c9e004cf29278e56b5563748f8584b158e5c3a8980790431f0c27a569.filez new file mode 100644 index 00000000000..1a0fcd236be Binary files /dev/null and b/repo/objects/ea/6ec72c9e004cf29278e56b5563748f8584b158e5c3a8980790431f0c27a569.filez differ diff --git a/repo/objects/ea/78047497f26c52bc7435e3cae1d52197a4cb22ad990dd68c91ffdb172c0339.dirtree b/repo/objects/ea/78047497f26c52bc7435e3cae1d52197a4cb22ad990dd68c91ffdb172c0339.dirtree new file mode 100644 index 00000000000..46def6f21db Binary files /dev/null and b/repo/objects/ea/78047497f26c52bc7435e3cae1d52197a4cb22ad990dd68c91ffdb172c0339.dirtree differ diff --git a/repo/objects/ea/ae749297dd2711c85c31fabf8d3997d325bb7411c410862bb9e84d0f0432b8.filez b/repo/objects/ea/ae749297dd2711c85c31fabf8d3997d325bb7411c410862bb9e84d0f0432b8.filez new file mode 100644 index 00000000000..fc2d32af4ef Binary files /dev/null and b/repo/objects/ea/ae749297dd2711c85c31fabf8d3997d325bb7411c410862bb9e84d0f0432b8.filez differ diff --git a/repo/objects/ea/bd26a92817ed7c8c8e9df2f010bc0aeb521d8b17bb624cc7442ba3754f4d57.filez b/repo/objects/ea/bd26a92817ed7c8c8e9df2f010bc0aeb521d8b17bb624cc7442ba3754f4d57.filez new file mode 100644 index 00000000000..96eca62085e Binary files /dev/null and b/repo/objects/ea/bd26a92817ed7c8c8e9df2f010bc0aeb521d8b17bb624cc7442ba3754f4d57.filez differ diff --git a/repo/objects/ea/c267c97d1923fa2eb935b010fa23ab35065ae02c1bdb290d8a97c37e9f5257.dirtree b/repo/objects/ea/c267c97d1923fa2eb935b010fa23ab35065ae02c1bdb290d8a97c37e9f5257.dirtree new file mode 100644 index 00000000000..c727608e327 Binary files /dev/null and b/repo/objects/ea/c267c97d1923fa2eb935b010fa23ab35065ae02c1bdb290d8a97c37e9f5257.dirtree differ diff --git a/repo/objects/ea/ceeac5db9d0efb2d06f9f9d43c656388f8c909f2ae4d75cede241dbadfca73.filez b/repo/objects/ea/ceeac5db9d0efb2d06f9f9d43c656388f8c909f2ae4d75cede241dbadfca73.filez new file mode 100644 index 00000000000..0a0d9bd72f3 Binary files /dev/null and b/repo/objects/ea/ceeac5db9d0efb2d06f9f9d43c656388f8c909f2ae4d75cede241dbadfca73.filez differ diff --git a/repo/objects/ea/d9d3c6fb455ddaca198a307d68402a76a2eac08cfd676da8835fa6ef61552d.filez b/repo/objects/ea/d9d3c6fb455ddaca198a307d68402a76a2eac08cfd676da8835fa6ef61552d.filez new file mode 100644 index 00000000000..94c211b90f9 Binary files /dev/null and b/repo/objects/ea/d9d3c6fb455ddaca198a307d68402a76a2eac08cfd676da8835fa6ef61552d.filez differ diff --git a/repo/objects/ea/e1bcb3add43f5914e41c3e275c7d544efe8b77443dab016e83d22a9bde3cc0.filez b/repo/objects/ea/e1bcb3add43f5914e41c3e275c7d544efe8b77443dab016e83d22a9bde3cc0.filez new file mode 100644 index 00000000000..774a9a8fa20 Binary files /dev/null and b/repo/objects/ea/e1bcb3add43f5914e41c3e275c7d544efe8b77443dab016e83d22a9bde3cc0.filez differ diff --git a/repo/objects/ea/eae7d50dbfab830a466ee5007af6ed1be237ab5a4fac6b2c29cac2e5194b78.filez b/repo/objects/ea/eae7d50dbfab830a466ee5007af6ed1be237ab5a4fac6b2c29cac2e5194b78.filez new file mode 100644 index 00000000000..4962930706b Binary files /dev/null and b/repo/objects/ea/eae7d50dbfab830a466ee5007af6ed1be237ab5a4fac6b2c29cac2e5194b78.filez differ diff --git a/repo/objects/eb/1140062642a297c98b67e2d6a84d602e711e805839446f3c66223e9426f1ec.filez b/repo/objects/eb/1140062642a297c98b67e2d6a84d602e711e805839446f3c66223e9426f1ec.filez new file mode 100644 index 00000000000..42a653c5f09 Binary files /dev/null and b/repo/objects/eb/1140062642a297c98b67e2d6a84d602e711e805839446f3c66223e9426f1ec.filez differ diff --git a/repo/objects/eb/290295e5e4d287f6e28461206a5a46cfb09d4c2d7aaee063190b0b79def6b5.filez b/repo/objects/eb/290295e5e4d287f6e28461206a5a46cfb09d4c2d7aaee063190b0b79def6b5.filez new file mode 100644 index 00000000000..db1e6294883 Binary files /dev/null and b/repo/objects/eb/290295e5e4d287f6e28461206a5a46cfb09d4c2d7aaee063190b0b79def6b5.filez differ diff --git a/repo/objects/eb/564b639ce44043ab4294adf415c381cf832408bbc33459e16f5358e30dfec2.filez b/repo/objects/eb/564b639ce44043ab4294adf415c381cf832408bbc33459e16f5358e30dfec2.filez new file mode 100644 index 00000000000..9822584e4d9 Binary files /dev/null and b/repo/objects/eb/564b639ce44043ab4294adf415c381cf832408bbc33459e16f5358e30dfec2.filez differ diff --git a/repo/objects/eb/7393d91ad1affa73f2e7acf42ddf2cc2845f154d354d4a954c0765b71f0978.filez b/repo/objects/eb/7393d91ad1affa73f2e7acf42ddf2cc2845f154d354d4a954c0765b71f0978.filez new file mode 100644 index 00000000000..474ee133536 Binary files /dev/null and b/repo/objects/eb/7393d91ad1affa73f2e7acf42ddf2cc2845f154d354d4a954c0765b71f0978.filez differ diff --git a/repo/objects/eb/b2487183ac69451b39a3a576b96af356f3ba4ea21752100b8266f2f5af8fc4.filez b/repo/objects/eb/b2487183ac69451b39a3a576b96af356f3ba4ea21752100b8266f2f5af8fc4.filez new file mode 100644 index 00000000000..913ea9e67ce Binary files /dev/null and b/repo/objects/eb/b2487183ac69451b39a3a576b96af356f3ba4ea21752100b8266f2f5af8fc4.filez differ diff --git a/repo/objects/eb/c7dc1369ff46f0efc7a84948b893cb7a9b91e7674ba2c75199c86c29ac9155.filez b/repo/objects/eb/c7dc1369ff46f0efc7a84948b893cb7a9b91e7674ba2c75199c86c29ac9155.filez new file mode 100644 index 00000000000..be86bcd16c3 Binary files /dev/null and b/repo/objects/eb/c7dc1369ff46f0efc7a84948b893cb7a9b91e7674ba2c75199c86c29ac9155.filez differ diff --git a/repo/objects/eb/d4d35b41041e435371d75dcef923034d32e7806f08efc4597cd4abfa82fb8f.dirtree b/repo/objects/eb/d4d35b41041e435371d75dcef923034d32e7806f08efc4597cd4abfa82fb8f.dirtree new file mode 100644 index 00000000000..598f9d59731 Binary files /dev/null and b/repo/objects/eb/d4d35b41041e435371d75dcef923034d32e7806f08efc4597cd4abfa82fb8f.dirtree differ diff --git a/repo/objects/eb/db7481b80eb4f3fb00347309acec2f32b9e738f1e7f41de136819586ef5f21.filez b/repo/objects/eb/db7481b80eb4f3fb00347309acec2f32b9e738f1e7f41de136819586ef5f21.filez new file mode 100644 index 00000000000..2fa625833f8 Binary files /dev/null and b/repo/objects/eb/db7481b80eb4f3fb00347309acec2f32b9e738f1e7f41de136819586ef5f21.filez differ diff --git a/repo/objects/eb/e457260d8670089c8f926ea19a94ab88550c17cbf779b1a88634d369ba149c.filez b/repo/objects/eb/e457260d8670089c8f926ea19a94ab88550c17cbf779b1a88634d369ba149c.filez new file mode 100644 index 00000000000..9431c9667a2 Binary files /dev/null and b/repo/objects/eb/e457260d8670089c8f926ea19a94ab88550c17cbf779b1a88634d369ba149c.filez differ diff --git a/repo/objects/eb/e61257a19571d9911c57e45d8ea894e9a8171679261a3b4828fa60ccfb01ee.filez b/repo/objects/eb/e61257a19571d9911c57e45d8ea894e9a8171679261a3b4828fa60ccfb01ee.filez new file mode 100644 index 00000000000..d3ad4393756 Binary files /dev/null and b/repo/objects/eb/e61257a19571d9911c57e45d8ea894e9a8171679261a3b4828fa60ccfb01ee.filez differ diff --git a/repo/objects/eb/e821bebde43958fb3feb5f910bc9c8a474218d1ce4a3956ad19663d5794923.dirtree b/repo/objects/eb/e821bebde43958fb3feb5f910bc9c8a474218d1ce4a3956ad19663d5794923.dirtree new file mode 100644 index 00000000000..2bdb9af1e09 Binary files /dev/null and b/repo/objects/eb/e821bebde43958fb3feb5f910bc9c8a474218d1ce4a3956ad19663d5794923.dirtree differ diff --git a/repo/objects/eb/f3303941b4f43778458ac6d9416fdd7ab66e2e49515f8f224ee7b79edd40d6.filez b/repo/objects/eb/f3303941b4f43778458ac6d9416fdd7ab66e2e49515f8f224ee7b79edd40d6.filez new file mode 100644 index 00000000000..855abd1674c Binary files /dev/null and b/repo/objects/eb/f3303941b4f43778458ac6d9416fdd7ab66e2e49515f8f224ee7b79edd40d6.filez differ diff --git a/repo/objects/eb/f5b585bc1fe25407e3067d1c950b7cb23020d4294bbd1e2b86ca3d6b4d7d76.filez b/repo/objects/eb/f5b585bc1fe25407e3067d1c950b7cb23020d4294bbd1e2b86ca3d6b4d7d76.filez new file mode 100644 index 00000000000..315a82e2372 Binary files /dev/null and b/repo/objects/eb/f5b585bc1fe25407e3067d1c950b7cb23020d4294bbd1e2b86ca3d6b4d7d76.filez differ diff --git a/repo/objects/eb/f71f35bcd8500502eaab8b87d5c41ee4d4dbe983dee9a7c398399d0a5d8c06.filez b/repo/objects/eb/f71f35bcd8500502eaab8b87d5c41ee4d4dbe983dee9a7c398399d0a5d8c06.filez new file mode 100644 index 00000000000..51280a00602 Binary files /dev/null and b/repo/objects/eb/f71f35bcd8500502eaab8b87d5c41ee4d4dbe983dee9a7c398399d0a5d8c06.filez differ diff --git a/repo/objects/ec/3167256187dcc61e1254e2fed5bcae42bab35e26f9a309a618a0f31f9ca4df.filez b/repo/objects/ec/3167256187dcc61e1254e2fed5bcae42bab35e26f9a309a618a0f31f9ca4df.filez new file mode 100644 index 00000000000..feabc0dfe4c Binary files /dev/null and b/repo/objects/ec/3167256187dcc61e1254e2fed5bcae42bab35e26f9a309a618a0f31f9ca4df.filez differ diff --git a/repo/objects/ec/3bdc913c7d6f5735204d29da6274dc1002b86afb0837fb1d06273791ff79fd.filez b/repo/objects/ec/3bdc913c7d6f5735204d29da6274dc1002b86afb0837fb1d06273791ff79fd.filez new file mode 100644 index 00000000000..bd6b683e23d Binary files /dev/null and b/repo/objects/ec/3bdc913c7d6f5735204d29da6274dc1002b86afb0837fb1d06273791ff79fd.filez differ diff --git a/repo/objects/ec/3fbbd3c08ba5e93e5c4b75affcd14750cee8d8a49a31f39b7c20b0e7fea4bd.filez b/repo/objects/ec/3fbbd3c08ba5e93e5c4b75affcd14750cee8d8a49a31f39b7c20b0e7fea4bd.filez new file mode 100644 index 00000000000..b1da56dec6c Binary files /dev/null and b/repo/objects/ec/3fbbd3c08ba5e93e5c4b75affcd14750cee8d8a49a31f39b7c20b0e7fea4bd.filez differ diff --git a/repo/objects/ec/a3a5490146d1f45bae3bd4c07dba831fd6993430d27c444a4034c4410dd492.filez b/repo/objects/ec/a3a5490146d1f45bae3bd4c07dba831fd6993430d27c444a4034c4410dd492.filez new file mode 100644 index 00000000000..f926dccde9b Binary files /dev/null and b/repo/objects/ec/a3a5490146d1f45bae3bd4c07dba831fd6993430d27c444a4034c4410dd492.filez differ diff --git a/repo/objects/ec/ea36d6e13389c4183a499ffae3617aa90e694625873b99f7a8c57c804e7d29.dirtree b/repo/objects/ec/ea36d6e13389c4183a499ffae3617aa90e694625873b99f7a8c57c804e7d29.dirtree new file mode 100644 index 00000000000..ae8c68fc8cf Binary files /dev/null and b/repo/objects/ec/ea36d6e13389c4183a499ffae3617aa90e694625873b99f7a8c57c804e7d29.dirtree differ diff --git a/repo/objects/ed/11916668a049b3fc0e1287b0b07fa7c970513a31c0af7eeb157dbc5c3e70a9.filez b/repo/objects/ed/11916668a049b3fc0e1287b0b07fa7c970513a31c0af7eeb157dbc5c3e70a9.filez new file mode 100644 index 00000000000..79e0ca01594 Binary files /dev/null and b/repo/objects/ed/11916668a049b3fc0e1287b0b07fa7c970513a31c0af7eeb157dbc5c3e70a9.filez differ diff --git a/repo/objects/ed/1a7143c3c73f0588727daddc23498afff14a0626df3b8ad4c833423719691a.dirtree b/repo/objects/ed/1a7143c3c73f0588727daddc23498afff14a0626df3b8ad4c833423719691a.dirtree new file mode 100644 index 00000000000..c87400b831f Binary files /dev/null and b/repo/objects/ed/1a7143c3c73f0588727daddc23498afff14a0626df3b8ad4c833423719691a.dirtree differ diff --git a/repo/objects/ed/a7e1cbc63b19ea9791220b185e9be0d5c8c05e37ada5762fc143dfc7e08336.filez b/repo/objects/ed/a7e1cbc63b19ea9791220b185e9be0d5c8c05e37ada5762fc143dfc7e08336.filez new file mode 100644 index 00000000000..fc199db2779 Binary files /dev/null and b/repo/objects/ed/a7e1cbc63b19ea9791220b185e9be0d5c8c05e37ada5762fc143dfc7e08336.filez differ diff --git a/repo/objects/ed/b77bed6740c50af71b3376a1eb5c48b1a23bdd63ddbd0ad2b8249fb83d2054.filez b/repo/objects/ed/b77bed6740c50af71b3376a1eb5c48b1a23bdd63ddbd0ad2b8249fb83d2054.filez new file mode 100644 index 00000000000..1ab467d195f Binary files /dev/null and b/repo/objects/ed/b77bed6740c50af71b3376a1eb5c48b1a23bdd63ddbd0ad2b8249fb83d2054.filez differ diff --git a/repo/objects/ed/c693385b8058f09c1af5cf0d4b2c2b690ae5f59e17d93d357dd34fddeb6d13.filez b/repo/objects/ed/c693385b8058f09c1af5cf0d4b2c2b690ae5f59e17d93d357dd34fddeb6d13.filez new file mode 100644 index 00000000000..8dc6f5328d9 Binary files /dev/null and b/repo/objects/ed/c693385b8058f09c1af5cf0d4b2c2b690ae5f59e17d93d357dd34fddeb6d13.filez differ diff --git a/repo/objects/ed/e4a3eb26e02af9c8b409f4fc7a7e3e3843aafc4bf195506c6490bdedf0dc70.filez b/repo/objects/ed/e4a3eb26e02af9c8b409f4fc7a7e3e3843aafc4bf195506c6490bdedf0dc70.filez new file mode 100644 index 00000000000..9ad4dfdefee Binary files /dev/null and b/repo/objects/ed/e4a3eb26e02af9c8b409f4fc7a7e3e3843aafc4bf195506c6490bdedf0dc70.filez differ diff --git a/repo/objects/ed/edd1308157775ece3a2757fa3ddcfa3b2bf778ec52694a81d663a6e56fcd5e.filez b/repo/objects/ed/edd1308157775ece3a2757fa3ddcfa3b2bf778ec52694a81d663a6e56fcd5e.filez new file mode 100644 index 00000000000..6b79a662a7c Binary files /dev/null and b/repo/objects/ed/edd1308157775ece3a2757fa3ddcfa3b2bf778ec52694a81d663a6e56fcd5e.filez differ diff --git a/repo/objects/ed/f63719e0b18a9801e10d2e95f99831f6c83977d17d63ad4ec7fda99da37bb4.filez b/repo/objects/ed/f63719e0b18a9801e10d2e95f99831f6c83977d17d63ad4ec7fda99da37bb4.filez new file mode 100644 index 00000000000..4a97121c56f Binary files /dev/null and b/repo/objects/ed/f63719e0b18a9801e10d2e95f99831f6c83977d17d63ad4ec7fda99da37bb4.filez differ diff --git a/repo/objects/ee/1e12b14a76af0ea98729a53bbaf44e20c969dac2b80686f9059d3bbb1c4fd9.filez b/repo/objects/ee/1e12b14a76af0ea98729a53bbaf44e20c969dac2b80686f9059d3bbb1c4fd9.filez new file mode 100644 index 00000000000..24593338940 Binary files /dev/null and b/repo/objects/ee/1e12b14a76af0ea98729a53bbaf44e20c969dac2b80686f9059d3bbb1c4fd9.filez differ diff --git a/repo/objects/ee/25b335b60f834727d6ca934df4362a0054b0131c039aa30fcd580da0b814c5.filez b/repo/objects/ee/25b335b60f834727d6ca934df4362a0054b0131c039aa30fcd580da0b814c5.filez new file mode 100644 index 00000000000..c38042902bc Binary files /dev/null and b/repo/objects/ee/25b335b60f834727d6ca934df4362a0054b0131c039aa30fcd580da0b814c5.filez differ diff --git a/repo/objects/ee/51d378ad83186cc93bc9f52a32b30dda1691ead40aca40de8cc82204c3c0c8.filez b/repo/objects/ee/51d378ad83186cc93bc9f52a32b30dda1691ead40aca40de8cc82204c3c0c8.filez new file mode 100644 index 00000000000..bb0cc4e1ae3 Binary files /dev/null and b/repo/objects/ee/51d378ad83186cc93bc9f52a32b30dda1691ead40aca40de8cc82204c3c0c8.filez differ diff --git a/repo/objects/ee/8581083f32921b349a69e5327e2705cae12416bd2703b0daa62b66871c6642.dirtree b/repo/objects/ee/8581083f32921b349a69e5327e2705cae12416bd2703b0daa62b66871c6642.dirtree new file mode 100644 index 00000000000..5f6acbc720d Binary files /dev/null and b/repo/objects/ee/8581083f32921b349a69e5327e2705cae12416bd2703b0daa62b66871c6642.dirtree differ diff --git a/repo/objects/ef/a280feb076624e887bb1cfeacd71092dbecdfb3538736f8984cb93ff6de06a.filez b/repo/objects/ef/a280feb076624e887bb1cfeacd71092dbecdfb3538736f8984cb93ff6de06a.filez new file mode 100644 index 00000000000..9fbf5fbe06f Binary files /dev/null and b/repo/objects/ef/a280feb076624e887bb1cfeacd71092dbecdfb3538736f8984cb93ff6de06a.filez differ diff --git a/repo/objects/ef/c34e7a06aacb25c27439facb08a985c402f98cb9ba4d316fe647e6aeedfb39.dirtree b/repo/objects/ef/c34e7a06aacb25c27439facb08a985c402f98cb9ba4d316fe647e6aeedfb39.dirtree new file mode 100644 index 00000000000..30646ed9e0a Binary files /dev/null and b/repo/objects/ef/c34e7a06aacb25c27439facb08a985c402f98cb9ba4d316fe647e6aeedfb39.dirtree differ diff --git a/repo/objects/ef/f359a7cbf73eb2eb63b08a1fd29f628007151c2c1416fc63986eaa9c49fbd7.filez b/repo/objects/ef/f359a7cbf73eb2eb63b08a1fd29f628007151c2c1416fc63986eaa9c49fbd7.filez new file mode 100644 index 00000000000..0f0c64c68d3 Binary files /dev/null and b/repo/objects/ef/f359a7cbf73eb2eb63b08a1fd29f628007151c2c1416fc63986eaa9c49fbd7.filez differ diff --git a/repo/objects/f0/161e87fd70b2d7e7d6fce1a54007cb0e5e16ffa9db656c639e828bd24d1565.dirtree b/repo/objects/f0/161e87fd70b2d7e7d6fce1a54007cb0e5e16ffa9db656c639e828bd24d1565.dirtree new file mode 100644 index 00000000000..c60968f4efe Binary files /dev/null and b/repo/objects/f0/161e87fd70b2d7e7d6fce1a54007cb0e5e16ffa9db656c639e828bd24d1565.dirtree differ diff --git a/repo/objects/f0/3404ac1aa168c1f80f5f62fdaab84bf56ca9ac6f74402de0414c232d60368c.filez b/repo/objects/f0/3404ac1aa168c1f80f5f62fdaab84bf56ca9ac6f74402de0414c232d60368c.filez new file mode 100644 index 00000000000..728a0d93fd2 Binary files /dev/null and b/repo/objects/f0/3404ac1aa168c1f80f5f62fdaab84bf56ca9ac6f74402de0414c232d60368c.filez differ diff --git a/repo/objects/f0/4527ed8a1f5e004949caedc7be76777d895d339dd114f91d32473c1a017f91.filez b/repo/objects/f0/4527ed8a1f5e004949caedc7be76777d895d339dd114f91d32473c1a017f91.filez new file mode 100644 index 00000000000..0b956707462 Binary files /dev/null and b/repo/objects/f0/4527ed8a1f5e004949caedc7be76777d895d339dd114f91d32473c1a017f91.filez differ diff --git a/repo/objects/f0/5b546da61fd330f9bc11f4c60a725fe244495bf9efbfbfbc8481bfd4c8c9e5.filez b/repo/objects/f0/5b546da61fd330f9bc11f4c60a725fe244495bf9efbfbfbc8481bfd4c8c9e5.filez new file mode 100644 index 00000000000..1926b0a0489 Binary files /dev/null and b/repo/objects/f0/5b546da61fd330f9bc11f4c60a725fe244495bf9efbfbfbc8481bfd4c8c9e5.filez differ diff --git a/repo/objects/f0/839b74ecdcdf7bd1b3a5c0d0d4a76b177f7d0e59e9e7ac6a01caf803fa37a3.filez b/repo/objects/f0/839b74ecdcdf7bd1b3a5c0d0d4a76b177f7d0e59e9e7ac6a01caf803fa37a3.filez new file mode 100644 index 00000000000..74901348c4e Binary files /dev/null and b/repo/objects/f0/839b74ecdcdf7bd1b3a5c0d0d4a76b177f7d0e59e9e7ac6a01caf803fa37a3.filez differ diff --git a/repo/objects/f0/8bc94973e98c0e9353cea7b67a7ab42f69603cd1153cba4ea59917bc45fc1b.filez b/repo/objects/f0/8bc94973e98c0e9353cea7b67a7ab42f69603cd1153cba4ea59917bc45fc1b.filez new file mode 100644 index 00000000000..b152c812e1d Binary files /dev/null and b/repo/objects/f0/8bc94973e98c0e9353cea7b67a7ab42f69603cd1153cba4ea59917bc45fc1b.filez differ diff --git a/repo/objects/f0/9876579e8a53252c9bf26fb87292b938853eb3ba8f839ac0d617aa7e2b2ba3.filez b/repo/objects/f0/9876579e8a53252c9bf26fb87292b938853eb3ba8f839ac0d617aa7e2b2ba3.filez new file mode 100644 index 00000000000..656569a99c1 Binary files /dev/null and b/repo/objects/f0/9876579e8a53252c9bf26fb87292b938853eb3ba8f839ac0d617aa7e2b2ba3.filez differ diff --git a/repo/objects/f0/9dddbd4a101200f5bbbd68947c2d95a1b900f42f49461035741736f40889c9.filez b/repo/objects/f0/9dddbd4a101200f5bbbd68947c2d95a1b900f42f49461035741736f40889c9.filez new file mode 100644 index 00000000000..b3dd7ef670c Binary files /dev/null and b/repo/objects/f0/9dddbd4a101200f5bbbd68947c2d95a1b900f42f49461035741736f40889c9.filez differ diff --git a/repo/objects/f0/a60636fb6b4e655c88a4b890de2101915d7c8d1d29d12a9446156d34d40c0a.filez b/repo/objects/f0/a60636fb6b4e655c88a4b890de2101915d7c8d1d29d12a9446156d34d40c0a.filez new file mode 100644 index 00000000000..35ffbbc5fcb Binary files /dev/null and b/repo/objects/f0/a60636fb6b4e655c88a4b890de2101915d7c8d1d29d12a9446156d34d40c0a.filez differ diff --git a/repo/objects/f0/b93db67024251f7f6cd837653124717d5b5851fc520306905102152d3555dd.filez b/repo/objects/f0/b93db67024251f7f6cd837653124717d5b5851fc520306905102152d3555dd.filez new file mode 100644 index 00000000000..ea5f82a7d16 Binary files /dev/null and b/repo/objects/f0/b93db67024251f7f6cd837653124717d5b5851fc520306905102152d3555dd.filez differ diff --git a/repo/objects/f0/c5593affc10ce7dd1daec9762f6bef55c1b3ddfb995778b9bb874abd7f70d1.filez b/repo/objects/f0/c5593affc10ce7dd1daec9762f6bef55c1b3ddfb995778b9bb874abd7f70d1.filez new file mode 100644 index 00000000000..82bfb16cfd5 Binary files /dev/null and b/repo/objects/f0/c5593affc10ce7dd1daec9762f6bef55c1b3ddfb995778b9bb874abd7f70d1.filez differ diff --git a/repo/objects/f0/d71a9ee089d12464cd33ca4df7f8922a7cc459255c2b995b7270fb1ee04aee.filez b/repo/objects/f0/d71a9ee089d12464cd33ca4df7f8922a7cc459255c2b995b7270fb1ee04aee.filez new file mode 100644 index 00000000000..a8ddecfacf4 Binary files /dev/null and b/repo/objects/f0/d71a9ee089d12464cd33ca4df7f8922a7cc459255c2b995b7270fb1ee04aee.filez differ diff --git a/repo/objects/f0/da68a9b9dc31538b0a91c8bf76452ac8879cceec046f6ab52b2a4479902052.filez b/repo/objects/f0/da68a9b9dc31538b0a91c8bf76452ac8879cceec046f6ab52b2a4479902052.filez new file mode 100644 index 00000000000..889718b0641 Binary files /dev/null and b/repo/objects/f0/da68a9b9dc31538b0a91c8bf76452ac8879cceec046f6ab52b2a4479902052.filez differ diff --git a/repo/objects/f0/e704068fd2c977e05396e8d551346501a7a1294507243ad21c95807fff4983.filez b/repo/objects/f0/e704068fd2c977e05396e8d551346501a7a1294507243ad21c95807fff4983.filez new file mode 100644 index 00000000000..9174dcae5d8 Binary files /dev/null and b/repo/objects/f0/e704068fd2c977e05396e8d551346501a7a1294507243ad21c95807fff4983.filez differ diff --git a/repo/objects/f0/f1c2b50e3c27ec9ed5a6613476946914acb897c90262038522928e0a0d0ba4.dirtree b/repo/objects/f0/f1c2b50e3c27ec9ed5a6613476946914acb897c90262038522928e0a0d0ba4.dirtree new file mode 100644 index 00000000000..58e4eae316a Binary files /dev/null and b/repo/objects/f0/f1c2b50e3c27ec9ed5a6613476946914acb897c90262038522928e0a0d0ba4.dirtree differ diff --git a/repo/objects/f1/34431e7b319f10f72624c8860c9b47e20e118b6ce26ea77156ae7b327f08b7.filez b/repo/objects/f1/34431e7b319f10f72624c8860c9b47e20e118b6ce26ea77156ae7b327f08b7.filez new file mode 100644 index 00000000000..5c2f4841933 Binary files /dev/null and b/repo/objects/f1/34431e7b319f10f72624c8860c9b47e20e118b6ce26ea77156ae7b327f08b7.filez differ diff --git a/repo/objects/f1/51208a0276afe8c89a70a2b35482b2b6215279b917b62c0db5b14eda191b00.filez b/repo/objects/f1/51208a0276afe8c89a70a2b35482b2b6215279b917b62c0db5b14eda191b00.filez new file mode 100644 index 00000000000..d4b947fe147 Binary files /dev/null and b/repo/objects/f1/51208a0276afe8c89a70a2b35482b2b6215279b917b62c0db5b14eda191b00.filez differ diff --git a/repo/objects/f1/790087c4dc4fdd036a3b0b4c30e9c20f2683b41dd7429155b563c26162b6d2.filez b/repo/objects/f1/790087c4dc4fdd036a3b0b4c30e9c20f2683b41dd7429155b563c26162b6d2.filez new file mode 100644 index 00000000000..4e46a304758 Binary files /dev/null and b/repo/objects/f1/790087c4dc4fdd036a3b0b4c30e9c20f2683b41dd7429155b563c26162b6d2.filez differ diff --git a/repo/objects/f1/8d05145c87f3504d20fd90a88a20f5d8bcd79f77815fec9ea937265ba74df5.filez b/repo/objects/f1/8d05145c87f3504d20fd90a88a20f5d8bcd79f77815fec9ea937265ba74df5.filez new file mode 100644 index 00000000000..efc49b9c08e Binary files /dev/null and b/repo/objects/f1/8d05145c87f3504d20fd90a88a20f5d8bcd79f77815fec9ea937265ba74df5.filez differ diff --git a/repo/objects/f1/a63b9cd91c7e5e19816acc9fdc4963727821c5dad4651080a4397a230f501b.filez b/repo/objects/f1/a63b9cd91c7e5e19816acc9fdc4963727821c5dad4651080a4397a230f501b.filez new file mode 100644 index 00000000000..10b016fa7ef Binary files /dev/null and b/repo/objects/f1/a63b9cd91c7e5e19816acc9fdc4963727821c5dad4651080a4397a230f501b.filez differ diff --git a/repo/objects/f1/b48a10f32f2459ea7c632b0d95c6d1c7ced0148807d053dbeb784d747aa7cb.dirtree b/repo/objects/f1/b48a10f32f2459ea7c632b0d95c6d1c7ced0148807d053dbeb784d747aa7cb.dirtree new file mode 100644 index 00000000000..3f8562edac3 Binary files /dev/null and b/repo/objects/f1/b48a10f32f2459ea7c632b0d95c6d1c7ced0148807d053dbeb784d747aa7cb.dirtree differ diff --git a/repo/objects/f1/ca70e821efea696e65158238c2053097f04a0c51dc922aa97906ba62faa4a0.filez b/repo/objects/f1/ca70e821efea696e65158238c2053097f04a0c51dc922aa97906ba62faa4a0.filez new file mode 100644 index 00000000000..37b95b01c3d Binary files /dev/null and b/repo/objects/f1/ca70e821efea696e65158238c2053097f04a0c51dc922aa97906ba62faa4a0.filez differ diff --git a/repo/objects/f1/cb3b0f87d78b7a51cc1cec0440b59274aa542441aaf44f69d37b951f433a4c.filez b/repo/objects/f1/cb3b0f87d78b7a51cc1cec0440b59274aa542441aaf44f69d37b951f433a4c.filez new file mode 100644 index 00000000000..dec2806633d Binary files /dev/null and b/repo/objects/f1/cb3b0f87d78b7a51cc1cec0440b59274aa542441aaf44f69d37b951f433a4c.filez differ diff --git a/repo/objects/f1/f7696281a67d31ff24f15b354d662d18b7f361c87703ad8eaa95f82ad3aa18.dirtree b/repo/objects/f1/f7696281a67d31ff24f15b354d662d18b7f361c87703ad8eaa95f82ad3aa18.dirtree new file mode 100644 index 00000000000..178577aad68 Binary files /dev/null and b/repo/objects/f1/f7696281a67d31ff24f15b354d662d18b7f361c87703ad8eaa95f82ad3aa18.dirtree differ diff --git a/repo/objects/f1/fe59a80c33e3015c88267e7bccd28f831c36dc4183a0c0265b3f9e731abf7f.filez b/repo/objects/f1/fe59a80c33e3015c88267e7bccd28f831c36dc4183a0c0265b3f9e731abf7f.filez new file mode 100644 index 00000000000..bf4198d2423 Binary files /dev/null and b/repo/objects/f1/fe59a80c33e3015c88267e7bccd28f831c36dc4183a0c0265b3f9e731abf7f.filez differ diff --git a/repo/objects/f2/0e6359639d9c2aebeaca765c2a97170987069371a31e5f2dd196547bd87b4b.filez b/repo/objects/f2/0e6359639d9c2aebeaca765c2a97170987069371a31e5f2dd196547bd87b4b.filez new file mode 100644 index 00000000000..cf0e6ea1ee0 Binary files /dev/null and b/repo/objects/f2/0e6359639d9c2aebeaca765c2a97170987069371a31e5f2dd196547bd87b4b.filez differ diff --git a/repo/objects/f2/116bb0aa5c7fcd25def5a38316633d27a67ad044e291414e5d23094ed4d497.filez b/repo/objects/f2/116bb0aa5c7fcd25def5a38316633d27a67ad044e291414e5d23094ed4d497.filez new file mode 100644 index 00000000000..bbc4cccbb98 Binary files /dev/null and b/repo/objects/f2/116bb0aa5c7fcd25def5a38316633d27a67ad044e291414e5d23094ed4d497.filez differ diff --git a/repo/objects/f2/25ec6246cffe34caedeba1270dc7b0bf572d6ada12062ea9aac13553ab75fb.filez b/repo/objects/f2/25ec6246cffe34caedeba1270dc7b0bf572d6ada12062ea9aac13553ab75fb.filez new file mode 100644 index 00000000000..4ff1b1afe1f Binary files /dev/null and b/repo/objects/f2/25ec6246cffe34caedeba1270dc7b0bf572d6ada12062ea9aac13553ab75fb.filez differ diff --git a/repo/objects/f2/432eb3d03ae821f066095048b17f1b5a087585b6be54ff53b0c2477b7cfe97.filez b/repo/objects/f2/432eb3d03ae821f066095048b17f1b5a087585b6be54ff53b0c2477b7cfe97.filez new file mode 100644 index 00000000000..9c68c401e42 Binary files /dev/null and b/repo/objects/f2/432eb3d03ae821f066095048b17f1b5a087585b6be54ff53b0c2477b7cfe97.filez differ diff --git a/repo/objects/f2/5307de39513b3a3e0aa9149fb0d0d0d9b31ab201c98b15003686787dbd2975.filez b/repo/objects/f2/5307de39513b3a3e0aa9149fb0d0d0d9b31ab201c98b15003686787dbd2975.filez new file mode 100644 index 00000000000..ec8c410d57b Binary files /dev/null and b/repo/objects/f2/5307de39513b3a3e0aa9149fb0d0d0d9b31ab201c98b15003686787dbd2975.filez differ diff --git a/repo/objects/f2/68e04ad711cc3c769176d7f01f965f71938c7f7cab6de1b65504210a140a4d.filez b/repo/objects/f2/68e04ad711cc3c769176d7f01f965f71938c7f7cab6de1b65504210a140a4d.filez new file mode 100644 index 00000000000..450e057fc80 Binary files /dev/null and b/repo/objects/f2/68e04ad711cc3c769176d7f01f965f71938c7f7cab6de1b65504210a140a4d.filez differ diff --git a/repo/objects/f2/900d007be1356c853bc7c2a90e30613f36edc2a3fb83f1f30cb7d0faf95038.filez b/repo/objects/f2/900d007be1356c853bc7c2a90e30613f36edc2a3fb83f1f30cb7d0faf95038.filez new file mode 100644 index 00000000000..be085b9668f Binary files /dev/null and b/repo/objects/f2/900d007be1356c853bc7c2a90e30613f36edc2a3fb83f1f30cb7d0faf95038.filez differ diff --git a/repo/objects/f2/907df00a6f9842bdf4b44d5a74ed66ef995c748da28220289211594bc6e772.filez b/repo/objects/f2/907df00a6f9842bdf4b44d5a74ed66ef995c748da28220289211594bc6e772.filez new file mode 100644 index 00000000000..0f20ba893b7 Binary files /dev/null and b/repo/objects/f2/907df00a6f9842bdf4b44d5a74ed66ef995c748da28220289211594bc6e772.filez differ diff --git a/repo/objects/f2/95f656cf53f9c267176a523856733b2bd8813c1aaf62c46cab354985fca9e3.filez b/repo/objects/f2/95f656cf53f9c267176a523856733b2bd8813c1aaf62c46cab354985fca9e3.filez new file mode 100644 index 00000000000..41003301952 Binary files /dev/null and b/repo/objects/f2/95f656cf53f9c267176a523856733b2bd8813c1aaf62c46cab354985fca9e3.filez differ diff --git a/repo/objects/f2/a94a53fa2aa0ee15288f25a6a549383cb534b00dc4f8be1bf7ead05d278b8f.filez b/repo/objects/f2/a94a53fa2aa0ee15288f25a6a549383cb534b00dc4f8be1bf7ead05d278b8f.filez new file mode 100644 index 00000000000..5317bce5b00 Binary files /dev/null and b/repo/objects/f2/a94a53fa2aa0ee15288f25a6a549383cb534b00dc4f8be1bf7ead05d278b8f.filez differ diff --git a/repo/objects/f2/cd4948d1a8cd6f45d82d27f7bd541dd7b37c6800485fe8461a22756e284957.filez b/repo/objects/f2/cd4948d1a8cd6f45d82d27f7bd541dd7b37c6800485fe8461a22756e284957.filez new file mode 100644 index 00000000000..9803d13ab42 Binary files /dev/null and b/repo/objects/f2/cd4948d1a8cd6f45d82d27f7bd541dd7b37c6800485fe8461a22756e284957.filez differ diff --git a/repo/objects/f2/cead74f4b9876033a86ae4f60c80365b4ad5eccc74bc912026259e33ef5a83.dirtree b/repo/objects/f2/cead74f4b9876033a86ae4f60c80365b4ad5eccc74bc912026259e33ef5a83.dirtree new file mode 100644 index 00000000000..0ddd9ac709d Binary files /dev/null and b/repo/objects/f2/cead74f4b9876033a86ae4f60c80365b4ad5eccc74bc912026259e33ef5a83.dirtree differ diff --git a/repo/objects/f2/d4354ab0ab17bdad3bb9cb54b3afe1b4742a8004c778cfe6c91e7106db57e8.filez b/repo/objects/f2/d4354ab0ab17bdad3bb9cb54b3afe1b4742a8004c778cfe6c91e7106db57e8.filez new file mode 100644 index 00000000000..930ebcaa2e1 Binary files /dev/null and b/repo/objects/f2/d4354ab0ab17bdad3bb9cb54b3afe1b4742a8004c778cfe6c91e7106db57e8.filez differ diff --git a/repo/objects/f2/ddd89af615bb3d0ff3060126060c27d732893726368fd196bcad14fcb1f5d6.filez b/repo/objects/f2/ddd89af615bb3d0ff3060126060c27d732893726368fd196bcad14fcb1f5d6.filez new file mode 100644 index 00000000000..01917ce1f23 Binary files /dev/null and b/repo/objects/f2/ddd89af615bb3d0ff3060126060c27d732893726368fd196bcad14fcb1f5d6.filez differ diff --git a/repo/objects/f2/e2c974f1e771991a3ac217ebd8549852d0d84aaf2f0e36d8b23fc28f4a996f.filez b/repo/objects/f2/e2c974f1e771991a3ac217ebd8549852d0d84aaf2f0e36d8b23fc28f4a996f.filez new file mode 100644 index 00000000000..73ca11bd8f4 Binary files /dev/null and b/repo/objects/f2/e2c974f1e771991a3ac217ebd8549852d0d84aaf2f0e36d8b23fc28f4a996f.filez differ diff --git a/repo/objects/f2/e8502364e0e87de9b8ef37d09be17a74f71ba1e66f820d638773e1c4e92773.filez b/repo/objects/f2/e8502364e0e87de9b8ef37d09be17a74f71ba1e66f820d638773e1c4e92773.filez new file mode 100644 index 00000000000..2a9a5cdb460 Binary files /dev/null and b/repo/objects/f2/e8502364e0e87de9b8ef37d09be17a74f71ba1e66f820d638773e1c4e92773.filez differ diff --git a/repo/objects/f3/1862a1bcdca0d07c76744b1d86cdf053f99ed42874262da553ee52daedb6e4.filez b/repo/objects/f3/1862a1bcdca0d07c76744b1d86cdf053f99ed42874262da553ee52daedb6e4.filez new file mode 100644 index 00000000000..a410bade5d7 Binary files /dev/null and b/repo/objects/f3/1862a1bcdca0d07c76744b1d86cdf053f99ed42874262da553ee52daedb6e4.filez differ diff --git a/repo/objects/f3/2d864e525f4a96849ce040259cf49c666569728c2e6ba44d34dc8962040026.filez b/repo/objects/f3/2d864e525f4a96849ce040259cf49c666569728c2e6ba44d34dc8962040026.filez new file mode 100644 index 00000000000..6f9d89b43c9 Binary files /dev/null and b/repo/objects/f3/2d864e525f4a96849ce040259cf49c666569728c2e6ba44d34dc8962040026.filez differ diff --git a/repo/objects/f3/50bdf4e36227338ad50ca243bf9f07d2b55458d3ede31d366db8b51f6eb9cc.dirtree b/repo/objects/f3/50bdf4e36227338ad50ca243bf9f07d2b55458d3ede31d366db8b51f6eb9cc.dirtree new file mode 100644 index 00000000000..5cb219e4ba6 Binary files /dev/null and b/repo/objects/f3/50bdf4e36227338ad50ca243bf9f07d2b55458d3ede31d366db8b51f6eb9cc.dirtree differ diff --git a/repo/objects/f3/65376df5cb6ed4ad3b0fd31444510fa42f62cc72f48d15477715318dc27203.dirtree b/repo/objects/f3/65376df5cb6ed4ad3b0fd31444510fa42f62cc72f48d15477715318dc27203.dirtree new file mode 100644 index 00000000000..34e6dfe0fd6 Binary files /dev/null and b/repo/objects/f3/65376df5cb6ed4ad3b0fd31444510fa42f62cc72f48d15477715318dc27203.dirtree differ diff --git a/repo/objects/f3/8d75543eb711789a8a3e013d081c8fe27a6965bbfb1189c44cb5ac84a07a55.filez b/repo/objects/f3/8d75543eb711789a8a3e013d081c8fe27a6965bbfb1189c44cb5ac84a07a55.filez new file mode 100644 index 00000000000..6ba16312c79 Binary files /dev/null and b/repo/objects/f3/8d75543eb711789a8a3e013d081c8fe27a6965bbfb1189c44cb5ac84a07a55.filez differ diff --git a/repo/objects/f3/a61f23cc23db9555bfcc33fd4a1dc206c4c4d233f371a8b089676e9daa3228.dirtree b/repo/objects/f3/a61f23cc23db9555bfcc33fd4a1dc206c4c4d233f371a8b089676e9daa3228.dirtree new file mode 100644 index 00000000000..12064d808d5 Binary files /dev/null and b/repo/objects/f3/a61f23cc23db9555bfcc33fd4a1dc206c4c4d233f371a8b089676e9daa3228.dirtree differ diff --git a/repo/objects/f3/d15ee4d91e6c1c94ae99aa521173c4aa46e6ec33f433aae53232ecba8a3b6c.filez b/repo/objects/f3/d15ee4d91e6c1c94ae99aa521173c4aa46e6ec33f433aae53232ecba8a3b6c.filez new file mode 100644 index 00000000000..ca014184b60 Binary files /dev/null and b/repo/objects/f3/d15ee4d91e6c1c94ae99aa521173c4aa46e6ec33f433aae53232ecba8a3b6c.filez differ diff --git a/repo/objects/f3/fedd3bb07df03db083519fd0456ada3ea561f76821b797d3a3bae09f4fac0b.filez b/repo/objects/f3/fedd3bb07df03db083519fd0456ada3ea561f76821b797d3a3bae09f4fac0b.filez new file mode 100644 index 00000000000..e8a75daa58c Binary files /dev/null and b/repo/objects/f3/fedd3bb07df03db083519fd0456ada3ea561f76821b797d3a3bae09f4fac0b.filez differ diff --git a/repo/objects/f4/037fa14aa389c2059fa91bf8b2695b43ba67b528c471c6083d48f5387847b0.dirtree b/repo/objects/f4/037fa14aa389c2059fa91bf8b2695b43ba67b528c471c6083d48f5387847b0.dirtree new file mode 100644 index 00000000000..aa1426c406a Binary files /dev/null and b/repo/objects/f4/037fa14aa389c2059fa91bf8b2695b43ba67b528c471c6083d48f5387847b0.dirtree differ diff --git a/repo/objects/f4/1ddff15b92a71404570db5c0954ab93514b86caf683833b4c2f75a7e8f036b.filez b/repo/objects/f4/1ddff15b92a71404570db5c0954ab93514b86caf683833b4c2f75a7e8f036b.filez new file mode 100644 index 00000000000..4aa87366dc1 Binary files /dev/null and b/repo/objects/f4/1ddff15b92a71404570db5c0954ab93514b86caf683833b4c2f75a7e8f036b.filez differ diff --git a/repo/objects/f4/41d66cab46086069b8a7068f54169f11cf61a2b356da672643be9c5b216c33.dirtree b/repo/objects/f4/41d66cab46086069b8a7068f54169f11cf61a2b356da672643be9c5b216c33.dirtree new file mode 100644 index 00000000000..bd6bbf4b3f3 Binary files /dev/null and b/repo/objects/f4/41d66cab46086069b8a7068f54169f11cf61a2b356da672643be9c5b216c33.dirtree differ diff --git a/repo/objects/f4/756ea68c834c99b417e6144904cbd36fb8be717745c4e7cf645c74f3a6b130.filez b/repo/objects/f4/756ea68c834c99b417e6144904cbd36fb8be717745c4e7cf645c74f3a6b130.filez new file mode 100644 index 00000000000..c4c81ae4a4b Binary files /dev/null and b/repo/objects/f4/756ea68c834c99b417e6144904cbd36fb8be717745c4e7cf645c74f3a6b130.filez differ diff --git a/repo/objects/f4/803ee596474037157d4accc9d7b5f80316f70cb8cbcbb6727629a6096a377c.filez b/repo/objects/f4/803ee596474037157d4accc9d7b5f80316f70cb8cbcbb6727629a6096a377c.filez new file mode 100644 index 00000000000..2b5e79d60a2 Binary files /dev/null and b/repo/objects/f4/803ee596474037157d4accc9d7b5f80316f70cb8cbcbb6727629a6096a377c.filez differ diff --git a/repo/objects/f4/ab190887be14deddf31f46c3841008f416efa8d0cae0a55ac829785eb1cd6e.filez b/repo/objects/f4/ab190887be14deddf31f46c3841008f416efa8d0cae0a55ac829785eb1cd6e.filez new file mode 100644 index 00000000000..a800a8d85b4 Binary files /dev/null and b/repo/objects/f4/ab190887be14deddf31f46c3841008f416efa8d0cae0a55ac829785eb1cd6e.filez differ diff --git a/repo/objects/f4/abbb352c12bf996e6a2049d143f9e95e3cf3c538d927cbf41c914d34cf9fbe.filez b/repo/objects/f4/abbb352c12bf996e6a2049d143f9e95e3cf3c538d927cbf41c914d34cf9fbe.filez new file mode 100644 index 00000000000..c396841e33e Binary files /dev/null and b/repo/objects/f4/abbb352c12bf996e6a2049d143f9e95e3cf3c538d927cbf41c914d34cf9fbe.filez differ diff --git a/repo/objects/f4/d74fd2c8f8c257a373f4f25238050da72d1ecb162b0fb2f5afe83a0f11148a.filez b/repo/objects/f4/d74fd2c8f8c257a373f4f25238050da72d1ecb162b0fb2f5afe83a0f11148a.filez new file mode 100644 index 00000000000..8cf7a45d4fe Binary files /dev/null and b/repo/objects/f4/d74fd2c8f8c257a373f4f25238050da72d1ecb162b0fb2f5afe83a0f11148a.filez differ diff --git a/repo/objects/f5/2301edeabc2acfb2f6e0ee9c35a1fd7763840127fdf623c9217bd3d6a04aa8.dirtree b/repo/objects/f5/2301edeabc2acfb2f6e0ee9c35a1fd7763840127fdf623c9217bd3d6a04aa8.dirtree new file mode 100644 index 00000000000..5c686f7daa9 Binary files /dev/null and b/repo/objects/f5/2301edeabc2acfb2f6e0ee9c35a1fd7763840127fdf623c9217bd3d6a04aa8.dirtree differ diff --git a/repo/objects/f5/5fc4b6021d64a6beb1c03696b7869da95dc4e24892611172f0f98d32c3a472.filez b/repo/objects/f5/5fc4b6021d64a6beb1c03696b7869da95dc4e24892611172f0f98d32c3a472.filez new file mode 100644 index 00000000000..d348c9a6157 Binary files /dev/null and b/repo/objects/f5/5fc4b6021d64a6beb1c03696b7869da95dc4e24892611172f0f98d32c3a472.filez differ diff --git a/repo/objects/f5/9fe2a4e9f90cf0b5cf5c0c8f8bcae8de5c28d835ddcd4d20445f54f3dd350c.filez b/repo/objects/f5/9fe2a4e9f90cf0b5cf5c0c8f8bcae8de5c28d835ddcd4d20445f54f3dd350c.filez new file mode 100644 index 00000000000..30a33fd64b7 Binary files /dev/null and b/repo/objects/f5/9fe2a4e9f90cf0b5cf5c0c8f8bcae8de5c28d835ddcd4d20445f54f3dd350c.filez differ diff --git a/repo/objects/f5/b5e63bdf19030ba54576f760f2f81edd14bbf1db7dc843ec18ee59aeee82a4.filez b/repo/objects/f5/b5e63bdf19030ba54576f760f2f81edd14bbf1db7dc843ec18ee59aeee82a4.filez new file mode 100644 index 00000000000..4e576dca92f Binary files /dev/null and b/repo/objects/f5/b5e63bdf19030ba54576f760f2f81edd14bbf1db7dc843ec18ee59aeee82a4.filez differ diff --git a/repo/objects/f5/bb4ffc092aeb23759ba0948b2ad4150dc98398133e30134beaf39517c4de4c.filez b/repo/objects/f5/bb4ffc092aeb23759ba0948b2ad4150dc98398133e30134beaf39517c4de4c.filez new file mode 100644 index 00000000000..6dc8d8d2f9c Binary files /dev/null and b/repo/objects/f5/bb4ffc092aeb23759ba0948b2ad4150dc98398133e30134beaf39517c4de4c.filez differ diff --git a/repo/objects/f5/dabf35a4ec27748b437f42a1e2536683094ca111093c68ddb254cbd5659514.filez b/repo/objects/f5/dabf35a4ec27748b437f42a1e2536683094ca111093c68ddb254cbd5659514.filez new file mode 100644 index 00000000000..657427341da Binary files /dev/null and b/repo/objects/f5/dabf35a4ec27748b437f42a1e2536683094ca111093c68ddb254cbd5659514.filez differ diff --git a/repo/objects/f6/0538d117cc2327d02766b936c72cc85b61fdbb1485956b0beba1ae8c0bbec6.dirtree b/repo/objects/f6/0538d117cc2327d02766b936c72cc85b61fdbb1485956b0beba1ae8c0bbec6.dirtree new file mode 100644 index 00000000000..67e6dc2cd48 Binary files /dev/null and b/repo/objects/f6/0538d117cc2327d02766b936c72cc85b61fdbb1485956b0beba1ae8c0bbec6.dirtree differ diff --git a/repo/objects/f6/05f80620c780320f974f3190b85fb7cb1f51dac899d09e54b85975f09c94e0.filez b/repo/objects/f6/05f80620c780320f974f3190b85fb7cb1f51dac899d09e54b85975f09c94e0.filez new file mode 100644 index 00000000000..958364087f0 Binary files /dev/null and b/repo/objects/f6/05f80620c780320f974f3190b85fb7cb1f51dac899d09e54b85975f09c94e0.filez differ diff --git a/repo/objects/f6/076dae7d7dccfaa2f7faa81ba150ad0a0444b0f9b509ea45079ae2d8f22d26.filez b/repo/objects/f6/076dae7d7dccfaa2f7faa81ba150ad0a0444b0f9b509ea45079ae2d8f22d26.filez new file mode 100644 index 00000000000..3a92fd9fa74 Binary files /dev/null and b/repo/objects/f6/076dae7d7dccfaa2f7faa81ba150ad0a0444b0f9b509ea45079ae2d8f22d26.filez differ diff --git a/repo/objects/f6/2fbc552aa5fbd3c0c9945fe344dd24f89aa61eb90b4fe0028ef194e4808258.filez b/repo/objects/f6/2fbc552aa5fbd3c0c9945fe344dd24f89aa61eb90b4fe0028ef194e4808258.filez new file mode 100644 index 00000000000..c2a97b74dab Binary files /dev/null and b/repo/objects/f6/2fbc552aa5fbd3c0c9945fe344dd24f89aa61eb90b4fe0028ef194e4808258.filez differ diff --git a/repo/objects/f6/341572d2e93a69f4d81172d10aeb35cfa6f7e162dac9a1fbd8cb0214e5cc62.dirtree b/repo/objects/f6/341572d2e93a69f4d81172d10aeb35cfa6f7e162dac9a1fbd8cb0214e5cc62.dirtree new file mode 100644 index 00000000000..14534e8077d Binary files /dev/null and b/repo/objects/f6/341572d2e93a69f4d81172d10aeb35cfa6f7e162dac9a1fbd8cb0214e5cc62.dirtree differ diff --git a/repo/objects/f6/5b9d7dc501f00a47fd95978d69e7c57563859d5aebf3f8576ddfcf4ae6255e.dirtree b/repo/objects/f6/5b9d7dc501f00a47fd95978d69e7c57563859d5aebf3f8576ddfcf4ae6255e.dirtree new file mode 100644 index 00000000000..0df4d1b8fe2 Binary files /dev/null and b/repo/objects/f6/5b9d7dc501f00a47fd95978d69e7c57563859d5aebf3f8576ddfcf4ae6255e.dirtree differ diff --git a/repo/objects/f6/8a8a0cc23dc931e0dff312e765d17d55a9d1beb5a91e231d492878857a38a9.filez b/repo/objects/f6/8a8a0cc23dc931e0dff312e765d17d55a9d1beb5a91e231d492878857a38a9.filez new file mode 100644 index 00000000000..567f47dd4cb Binary files /dev/null and b/repo/objects/f6/8a8a0cc23dc931e0dff312e765d17d55a9d1beb5a91e231d492878857a38a9.filez differ diff --git a/repo/objects/f6/99debd54732d84ed80d6e9056b9969dc57f5ca807accb1562b0ea5c403f549.filez b/repo/objects/f6/99debd54732d84ed80d6e9056b9969dc57f5ca807accb1562b0ea5c403f549.filez new file mode 100644 index 00000000000..085e15adb00 Binary files /dev/null and b/repo/objects/f6/99debd54732d84ed80d6e9056b9969dc57f5ca807accb1562b0ea5c403f549.filez differ diff --git a/repo/objects/f6/9faf36f1d96d570c1ebc87c630ce73e3846933a04b6eed9584ea2b5862b759.filez b/repo/objects/f6/9faf36f1d96d570c1ebc87c630ce73e3846933a04b6eed9584ea2b5862b759.filez new file mode 100644 index 00000000000..8dd436b7faa Binary files /dev/null and b/repo/objects/f6/9faf36f1d96d570c1ebc87c630ce73e3846933a04b6eed9584ea2b5862b759.filez differ diff --git a/repo/objects/f6/a3946738e25462f3718b5ad2248558ef49eef4eb4b243d6bcda427c6c9f6cf.filez b/repo/objects/f6/a3946738e25462f3718b5ad2248558ef49eef4eb4b243d6bcda427c6c9f6cf.filez new file mode 100644 index 00000000000..79e4f1152f7 Binary files /dev/null and b/repo/objects/f6/a3946738e25462f3718b5ad2248558ef49eef4eb4b243d6bcda427c6c9f6cf.filez differ diff --git a/repo/objects/f6/cff4dabdcab533fcd8b37a6c6a0b32d074cdfe51fb5e1527197544eb1b3cf4.filez b/repo/objects/f6/cff4dabdcab533fcd8b37a6c6a0b32d074cdfe51fb5e1527197544eb1b3cf4.filez new file mode 100644 index 00000000000..0f065daa601 Binary files /dev/null and b/repo/objects/f6/cff4dabdcab533fcd8b37a6c6a0b32d074cdfe51fb5e1527197544eb1b3cf4.filez differ diff --git a/repo/objects/f6/f78bf9dab3de46337cd2b7563a0ca7df4c0182238ebf0f046a0880cd1b1955.filez b/repo/objects/f6/f78bf9dab3de46337cd2b7563a0ca7df4c0182238ebf0f046a0880cd1b1955.filez new file mode 100644 index 00000000000..7ef9c28ee90 Binary files /dev/null and b/repo/objects/f6/f78bf9dab3de46337cd2b7563a0ca7df4c0182238ebf0f046a0880cd1b1955.filez differ diff --git a/repo/objects/f7/35bd1a1a96365ed4e24678286df728ca05fd2354000d7dfb19ce14bc85ed0a.dirtree b/repo/objects/f7/35bd1a1a96365ed4e24678286df728ca05fd2354000d7dfb19ce14bc85ed0a.dirtree new file mode 100644 index 00000000000..e8eadc3875b Binary files /dev/null and b/repo/objects/f7/35bd1a1a96365ed4e24678286df728ca05fd2354000d7dfb19ce14bc85ed0a.dirtree differ diff --git a/repo/objects/f7/4e2f8cd4d694409fa6be35b10821b5000482824599b4545cdc57c1a11dc7e4.filez b/repo/objects/f7/4e2f8cd4d694409fa6be35b10821b5000482824599b4545cdc57c1a11dc7e4.filez new file mode 100644 index 00000000000..9a1424856a2 Binary files /dev/null and b/repo/objects/f7/4e2f8cd4d694409fa6be35b10821b5000482824599b4545cdc57c1a11dc7e4.filez differ diff --git a/repo/objects/f7/771230455dda84bee8f788b604bd2f1118cd3044a0906fbc70b1f76254f430.filez b/repo/objects/f7/771230455dda84bee8f788b604bd2f1118cd3044a0906fbc70b1f76254f430.filez new file mode 100644 index 00000000000..9f1196f2eec Binary files /dev/null and b/repo/objects/f7/771230455dda84bee8f788b604bd2f1118cd3044a0906fbc70b1f76254f430.filez differ diff --git a/repo/objects/f7/7f3375ae39fa26db4c8cc3fe97a809d9d48929f2ab72fa9745d5e39f256fc5.filez b/repo/objects/f7/7f3375ae39fa26db4c8cc3fe97a809d9d48929f2ab72fa9745d5e39f256fc5.filez new file mode 100644 index 00000000000..3a7eae0e0e8 Binary files /dev/null and b/repo/objects/f7/7f3375ae39fa26db4c8cc3fe97a809d9d48929f2ab72fa9745d5e39f256fc5.filez differ diff --git a/repo/objects/f7/b8bb1da931c171f686b354ebf6e45c9bbdb48537476c9a475f9269cf42d622.filez b/repo/objects/f7/b8bb1da931c171f686b354ebf6e45c9bbdb48537476c9a475f9269cf42d622.filez new file mode 100644 index 00000000000..d3dd7506d4c Binary files /dev/null and b/repo/objects/f7/b8bb1da931c171f686b354ebf6e45c9bbdb48537476c9a475f9269cf42d622.filez differ diff --git a/repo/objects/f7/c73ac13752a1a4d44baa17c4a3c97c33433afdfe2059486eb8aeb03b7d96b8.filez b/repo/objects/f7/c73ac13752a1a4d44baa17c4a3c97c33433afdfe2059486eb8aeb03b7d96b8.filez new file mode 100644 index 00000000000..14a4b5ac642 Binary files /dev/null and b/repo/objects/f7/c73ac13752a1a4d44baa17c4a3c97c33433afdfe2059486eb8aeb03b7d96b8.filez differ diff --git a/repo/objects/f7/da0187746e63615ce13b0bbb9d38d03c0d73bdaec5eca9519e64153bbd38db.filez b/repo/objects/f7/da0187746e63615ce13b0bbb9d38d03c0d73bdaec5eca9519e64153bbd38db.filez new file mode 100644 index 00000000000..472c5f8ef11 Binary files /dev/null and b/repo/objects/f7/da0187746e63615ce13b0bbb9d38d03c0d73bdaec5eca9519e64153bbd38db.filez differ diff --git a/repo/objects/f7/dc05542d972a0584b0ec2337b875a96c4e7c3aa6e519c35042a66aa38e001e.filez b/repo/objects/f7/dc05542d972a0584b0ec2337b875a96c4e7c3aa6e519c35042a66aa38e001e.filez new file mode 100644 index 00000000000..68c34ba127e Binary files /dev/null and b/repo/objects/f7/dc05542d972a0584b0ec2337b875a96c4e7c3aa6e519c35042a66aa38e001e.filez differ diff --git a/repo/objects/f7/f3d211e41387a681f255d7ceddde41a143c49509111f754d95cfba73092705.filez b/repo/objects/f7/f3d211e41387a681f255d7ceddde41a143c49509111f754d95cfba73092705.filez new file mode 100644 index 00000000000..334e8052933 Binary files /dev/null and b/repo/objects/f7/f3d211e41387a681f255d7ceddde41a143c49509111f754d95cfba73092705.filez differ diff --git a/repo/objects/f7/fcbecccee90c5619693ed7da58f50f6ecc1bec235fa1fd9033ef5522be315c.filez b/repo/objects/f7/fcbecccee90c5619693ed7da58f50f6ecc1bec235fa1fd9033ef5522be315c.filez new file mode 100644 index 00000000000..621ba74fd91 Binary files /dev/null and b/repo/objects/f7/fcbecccee90c5619693ed7da58f50f6ecc1bec235fa1fd9033ef5522be315c.filez differ diff --git a/repo/objects/f7/fea4f4b71ea256e17ec45a44556e4b3b5b58b735c71a6babc197eb028cf062.filez b/repo/objects/f7/fea4f4b71ea256e17ec45a44556e4b3b5b58b735c71a6babc197eb028cf062.filez new file mode 100644 index 00000000000..cfe42a2398e Binary files /dev/null and b/repo/objects/f7/fea4f4b71ea256e17ec45a44556e4b3b5b58b735c71a6babc197eb028cf062.filez differ diff --git a/repo/objects/f8/03aea488846611adb39e4dc3781bce7f5b15ad860ecc4df33f2421f9644af8.dirtree b/repo/objects/f8/03aea488846611adb39e4dc3781bce7f5b15ad860ecc4df33f2421f9644af8.dirtree new file mode 100644 index 00000000000..1c5f735afb6 Binary files /dev/null and b/repo/objects/f8/03aea488846611adb39e4dc3781bce7f5b15ad860ecc4df33f2421f9644af8.dirtree differ diff --git a/repo/objects/f8/0cade47095eba86825f3f2f39e297298113a96e841528f1a70f318b2009a70.filez b/repo/objects/f8/0cade47095eba86825f3f2f39e297298113a96e841528f1a70f318b2009a70.filez new file mode 100644 index 00000000000..7585fdfad98 Binary files /dev/null and b/repo/objects/f8/0cade47095eba86825f3f2f39e297298113a96e841528f1a70f318b2009a70.filez differ diff --git a/repo/objects/f8/0f1aff09c4cda9be1ec1f12d611ac571003d96344d2a918ef2aecd6d9e1303.filez b/repo/objects/f8/0f1aff09c4cda9be1ec1f12d611ac571003d96344d2a918ef2aecd6d9e1303.filez new file mode 100644 index 00000000000..43a64503874 Binary files /dev/null and b/repo/objects/f8/0f1aff09c4cda9be1ec1f12d611ac571003d96344d2a918ef2aecd6d9e1303.filez differ diff --git a/repo/objects/f8/250a1993004b76d3d9a3e9d287cc84243d2ead1edfe6e6c8fe26b7082705ed.filez b/repo/objects/f8/250a1993004b76d3d9a3e9d287cc84243d2ead1edfe6e6c8fe26b7082705ed.filez new file mode 100644 index 00000000000..33dee98fb62 Binary files /dev/null and b/repo/objects/f8/250a1993004b76d3d9a3e9d287cc84243d2ead1edfe6e6c8fe26b7082705ed.filez differ diff --git a/repo/objects/f8/6da3f2e58adee218e768f2b3a0d78279e4508138762f0782184e15436811d4.filez b/repo/objects/f8/6da3f2e58adee218e768f2b3a0d78279e4508138762f0782184e15436811d4.filez new file mode 100644 index 00000000000..52b5cdc48ce Binary files /dev/null and b/repo/objects/f8/6da3f2e58adee218e768f2b3a0d78279e4508138762f0782184e15436811d4.filez differ diff --git a/repo/objects/f8/8aca8f7f37ec3f0873fa941f9d02893a6e39e150c33b4290ab82f795fb47ff.filez b/repo/objects/f8/8aca8f7f37ec3f0873fa941f9d02893a6e39e150c33b4290ab82f795fb47ff.filez new file mode 100644 index 00000000000..ae74c0bd0a3 Binary files /dev/null and b/repo/objects/f8/8aca8f7f37ec3f0873fa941f9d02893a6e39e150c33b4290ab82f795fb47ff.filez differ diff --git a/repo/objects/f8/9eab73064a604af65910c3947f8fa7a39a1ef21959cccf966e3b40dd2e9570.filez b/repo/objects/f8/9eab73064a604af65910c3947f8fa7a39a1ef21959cccf966e3b40dd2e9570.filez new file mode 100644 index 00000000000..77d0b3acac7 Binary files /dev/null and b/repo/objects/f8/9eab73064a604af65910c3947f8fa7a39a1ef21959cccf966e3b40dd2e9570.filez differ diff --git a/repo/objects/f8/a42d0997bdb2d322386274a1acfd2121329b17c5c8abf42ee91d62e0f221fd.filez b/repo/objects/f8/a42d0997bdb2d322386274a1acfd2121329b17c5c8abf42ee91d62e0f221fd.filez new file mode 100644 index 00000000000..e5b15565eb4 Binary files /dev/null and b/repo/objects/f8/a42d0997bdb2d322386274a1acfd2121329b17c5c8abf42ee91d62e0f221fd.filez differ diff --git a/repo/objects/f8/a53d12238bca9864a3fb50b9dc67a3d37bce13fd049e2ef3ec655b94999da0.dirtree b/repo/objects/f8/a53d12238bca9864a3fb50b9dc67a3d37bce13fd049e2ef3ec655b94999da0.dirtree new file mode 100644 index 00000000000..dce1003ce61 Binary files /dev/null and b/repo/objects/f8/a53d12238bca9864a3fb50b9dc67a3d37bce13fd049e2ef3ec655b94999da0.dirtree differ diff --git a/repo/objects/f8/ba37ecd99024ad9b3982db1f6e3ff88706fe5b3a2b4851eeb23d76312a202e.filez b/repo/objects/f8/ba37ecd99024ad9b3982db1f6e3ff88706fe5b3a2b4851eeb23d76312a202e.filez new file mode 100644 index 00000000000..e1a5c50249f Binary files /dev/null and b/repo/objects/f8/ba37ecd99024ad9b3982db1f6e3ff88706fe5b3a2b4851eeb23d76312a202e.filez differ diff --git a/repo/objects/f8/e65f9e2f89dfef860e9aff0b5ad6f43b59c2442d2df1adaf27ade8319d3947.filez b/repo/objects/f8/e65f9e2f89dfef860e9aff0b5ad6f43b59c2442d2df1adaf27ade8319d3947.filez new file mode 100644 index 00000000000..55294ccfe54 Binary files /dev/null and b/repo/objects/f8/e65f9e2f89dfef860e9aff0b5ad6f43b59c2442d2df1adaf27ade8319d3947.filez differ diff --git a/repo/objects/f9/00e4503a023cf54c5748e7400f0fcf5391007d9d8f0c6e2250e2a86a176dd9.filez b/repo/objects/f9/00e4503a023cf54c5748e7400f0fcf5391007d9d8f0c6e2250e2a86a176dd9.filez new file mode 100644 index 00000000000..a9c292b03d6 Binary files /dev/null and b/repo/objects/f9/00e4503a023cf54c5748e7400f0fcf5391007d9d8f0c6e2250e2a86a176dd9.filez differ diff --git a/repo/objects/f9/13efbd99f6f89116fc22ed70a80b44f81d598c62fdebc4abe2c483bbf604d6.filez b/repo/objects/f9/13efbd99f6f89116fc22ed70a80b44f81d598c62fdebc4abe2c483bbf604d6.filez new file mode 100644 index 00000000000..eb23cdbbf0a Binary files /dev/null and b/repo/objects/f9/13efbd99f6f89116fc22ed70a80b44f81d598c62fdebc4abe2c483bbf604d6.filez differ diff --git a/repo/objects/f9/4320dd69cacebc27eb951c568c234d989fdacda611657a384afab92f6f1511.dirtree b/repo/objects/f9/4320dd69cacebc27eb951c568c234d989fdacda611657a384afab92f6f1511.dirtree new file mode 100644 index 00000000000..5b3e76213a8 Binary files /dev/null and b/repo/objects/f9/4320dd69cacebc27eb951c568c234d989fdacda611657a384afab92f6f1511.dirtree differ diff --git a/repo/objects/f9/6eb4cdbb72b166c6259198ffa2c9166ef75c147666e6882d6c5de67699106c.filez b/repo/objects/f9/6eb4cdbb72b166c6259198ffa2c9166ef75c147666e6882d6c5de67699106c.filez new file mode 100644 index 00000000000..ba5a9ac9c56 Binary files /dev/null and b/repo/objects/f9/6eb4cdbb72b166c6259198ffa2c9166ef75c147666e6882d6c5de67699106c.filez differ diff --git a/repo/objects/f9/7f5f895af6e9c290f6644b0378fa036c2fe873dfd3105c644b4ff912e72b19.filez b/repo/objects/f9/7f5f895af6e9c290f6644b0378fa036c2fe873dfd3105c644b4ff912e72b19.filez new file mode 100644 index 00000000000..4e2522ab6b5 Binary files /dev/null and b/repo/objects/f9/7f5f895af6e9c290f6644b0378fa036c2fe873dfd3105c644b4ff912e72b19.filez differ diff --git a/repo/objects/f9/8b2af9139d766ae8934b8094dcb38dd05f16b8afff348a4c048f97a4b7e49f.filez b/repo/objects/f9/8b2af9139d766ae8934b8094dcb38dd05f16b8afff348a4c048f97a4b7e49f.filez new file mode 100644 index 00000000000..28441e27c13 Binary files /dev/null and b/repo/objects/f9/8b2af9139d766ae8934b8094dcb38dd05f16b8afff348a4c048f97a4b7e49f.filez differ diff --git a/repo/objects/f9/c654beeaf9326e8cef2b53ac2a715c3853456e7668c2af16c55d934a1229bf.filez b/repo/objects/f9/c654beeaf9326e8cef2b53ac2a715c3853456e7668c2af16c55d934a1229bf.filez new file mode 100644 index 00000000000..f39c002e2ad Binary files /dev/null and b/repo/objects/f9/c654beeaf9326e8cef2b53ac2a715c3853456e7668c2af16c55d934a1229bf.filez differ diff --git a/repo/objects/f9/e8612965a07fd8cd2925af46ecb7e7b51dc230c6f8727cd849a76ac992b244.dirtree b/repo/objects/f9/e8612965a07fd8cd2925af46ecb7e7b51dc230c6f8727cd849a76ac992b244.dirtree new file mode 100644 index 00000000000..2e15aae84eb Binary files /dev/null and b/repo/objects/f9/e8612965a07fd8cd2925af46ecb7e7b51dc230c6f8727cd849a76ac992b244.dirtree differ diff --git a/repo/objects/f9/f6b4bd76bdb70d990b254348054810f867529afd1aabcd33bd6e2796bb6167.filez b/repo/objects/f9/f6b4bd76bdb70d990b254348054810f867529afd1aabcd33bd6e2796bb6167.filez new file mode 100644 index 00000000000..c4e091b073a Binary files /dev/null and b/repo/objects/f9/f6b4bd76bdb70d990b254348054810f867529afd1aabcd33bd6e2796bb6167.filez differ diff --git a/repo/objects/f9/fcfeb82e0789dc54ebdef047d8496685977c6879b1794eb04f664018b44f47.filez b/repo/objects/f9/fcfeb82e0789dc54ebdef047d8496685977c6879b1794eb04f664018b44f47.filez new file mode 100644 index 00000000000..10e923fbf72 Binary files /dev/null and b/repo/objects/f9/fcfeb82e0789dc54ebdef047d8496685977c6879b1794eb04f664018b44f47.filez differ diff --git a/repo/objects/fa/20cb7c797d98a43cb0dae385478b742046bf33fa5c09969e54723dd48a54b6.filez b/repo/objects/fa/20cb7c797d98a43cb0dae385478b742046bf33fa5c09969e54723dd48a54b6.filez new file mode 100644 index 00000000000..1f2a98b4fc7 Binary files /dev/null and b/repo/objects/fa/20cb7c797d98a43cb0dae385478b742046bf33fa5c09969e54723dd48a54b6.filez differ diff --git a/repo/objects/fa/20db5d45aeaee18310d17d0466414a3959e4aa12a1962e643f898b3458813d.filez b/repo/objects/fa/20db5d45aeaee18310d17d0466414a3959e4aa12a1962e643f898b3458813d.filez new file mode 100644 index 00000000000..c92ef2a98a6 Binary files /dev/null and b/repo/objects/fa/20db5d45aeaee18310d17d0466414a3959e4aa12a1962e643f898b3458813d.filez differ diff --git a/repo/objects/fa/2172633a0fe9e491fafdf1e45f0dea948600fbc8003c92eba1b5ce5ee10899.filez b/repo/objects/fa/2172633a0fe9e491fafdf1e45f0dea948600fbc8003c92eba1b5ce5ee10899.filez new file mode 100644 index 00000000000..4cd7c8069d3 Binary files /dev/null and b/repo/objects/fa/2172633a0fe9e491fafdf1e45f0dea948600fbc8003c92eba1b5ce5ee10899.filez differ diff --git a/repo/objects/fa/3e0c00ff97ce955ce10dd2fe314d07fdb3f4e081a167bfc90db836d20f6161.filez b/repo/objects/fa/3e0c00ff97ce955ce10dd2fe314d07fdb3f4e081a167bfc90db836d20f6161.filez new file mode 100644 index 00000000000..b77f7490478 Binary files /dev/null and b/repo/objects/fa/3e0c00ff97ce955ce10dd2fe314d07fdb3f4e081a167bfc90db836d20f6161.filez differ diff --git a/repo/objects/fa/60e8405dcb4d28a961a39e5a216351e159bab504cb39747bcd1739258e99f0.filez b/repo/objects/fa/60e8405dcb4d28a961a39e5a216351e159bab504cb39747bcd1739258e99f0.filez new file mode 100644 index 00000000000..429ea2f9d38 Binary files /dev/null and b/repo/objects/fa/60e8405dcb4d28a961a39e5a216351e159bab504cb39747bcd1739258e99f0.filez differ diff --git a/repo/objects/fa/f6bc13fa4a71d33a3087b5e891099fb5a4e9e3763d03dbba488219b26c5d8a.filez b/repo/objects/fa/f6bc13fa4a71d33a3087b5e891099fb5a4e9e3763d03dbba488219b26c5d8a.filez new file mode 100644 index 00000000000..6533f9ed1e7 Binary files /dev/null and b/repo/objects/fa/f6bc13fa4a71d33a3087b5e891099fb5a4e9e3763d03dbba488219b26c5d8a.filez differ diff --git a/repo/objects/fb/0770e31a29770c3ef770be01daff2d54af90a73dfb2d290f00c788b0c86c7d.filez b/repo/objects/fb/0770e31a29770c3ef770be01daff2d54af90a73dfb2d290f00c788b0c86c7d.filez new file mode 100644 index 00000000000..b0b946ad0ea Binary files /dev/null and b/repo/objects/fb/0770e31a29770c3ef770be01daff2d54af90a73dfb2d290f00c788b0c86c7d.filez differ diff --git a/repo/objects/fb/0a6b37bad22d0828585876af57c8953315a804797e472dce9ac1993d90c5e2.filez b/repo/objects/fb/0a6b37bad22d0828585876af57c8953315a804797e472dce9ac1993d90c5e2.filez new file mode 100644 index 00000000000..246a132f46e Binary files /dev/null and b/repo/objects/fb/0a6b37bad22d0828585876af57c8953315a804797e472dce9ac1993d90c5e2.filez differ diff --git a/repo/objects/fb/1a8ede47ea7cbb6f7c1bf5845e3882ba83954e8ce46606db3ae6378fafc4e6.filez b/repo/objects/fb/1a8ede47ea7cbb6f7c1bf5845e3882ba83954e8ce46606db3ae6378fafc4e6.filez new file mode 100644 index 00000000000..6fb12be7607 Binary files /dev/null and b/repo/objects/fb/1a8ede47ea7cbb6f7c1bf5845e3882ba83954e8ce46606db3ae6378fafc4e6.filez differ diff --git a/repo/objects/fb/33379604031a58d1cec78da61a4f466bbcf751bd2730df24b7263742d73ad6.filez b/repo/objects/fb/33379604031a58d1cec78da61a4f466bbcf751bd2730df24b7263742d73ad6.filez new file mode 100644 index 00000000000..88872234f16 Binary files /dev/null and b/repo/objects/fb/33379604031a58d1cec78da61a4f466bbcf751bd2730df24b7263742d73ad6.filez differ diff --git a/repo/objects/fb/65c7668ec48a667fc767382398cde4e00cc58f4caa273480155e2a897c0442.filez b/repo/objects/fb/65c7668ec48a667fc767382398cde4e00cc58f4caa273480155e2a897c0442.filez new file mode 100644 index 00000000000..d15e28fd884 Binary files /dev/null and b/repo/objects/fb/65c7668ec48a667fc767382398cde4e00cc58f4caa273480155e2a897c0442.filez differ diff --git a/repo/objects/fb/7dde3fcc3201ab4fe10cdf458b190f8e0385952b9ee15544ad940dccf75422.filez b/repo/objects/fb/7dde3fcc3201ab4fe10cdf458b190f8e0385952b9ee15544ad940dccf75422.filez new file mode 100644 index 00000000000..fa62c768dd3 Binary files /dev/null and b/repo/objects/fb/7dde3fcc3201ab4fe10cdf458b190f8e0385952b9ee15544ad940dccf75422.filez differ diff --git a/repo/objects/fb/8ef38c69b18246df95d0a01350c92dae30829c7a1316a45593c54224caab7f.filez b/repo/objects/fb/8ef38c69b18246df95d0a01350c92dae30829c7a1316a45593c54224caab7f.filez new file mode 100644 index 00000000000..5757f30c144 Binary files /dev/null and b/repo/objects/fb/8ef38c69b18246df95d0a01350c92dae30829c7a1316a45593c54224caab7f.filez differ diff --git a/repo/objects/fb/8ff05af1508f2dfded5b26c238222735c4e7fc17ca30fdc83d1e93cb894d6e.filez b/repo/objects/fb/8ff05af1508f2dfded5b26c238222735c4e7fc17ca30fdc83d1e93cb894d6e.filez new file mode 100644 index 00000000000..771af2561bb Binary files /dev/null and b/repo/objects/fb/8ff05af1508f2dfded5b26c238222735c4e7fc17ca30fdc83d1e93cb894d6e.filez differ diff --git a/repo/objects/fb/a632405de02a8361538688ca35f4a04fc87677146f30094d3047e0741a3b3e.filez b/repo/objects/fb/a632405de02a8361538688ca35f4a04fc87677146f30094d3047e0741a3b3e.filez new file mode 100644 index 00000000000..c3da6678e76 Binary files /dev/null and b/repo/objects/fb/a632405de02a8361538688ca35f4a04fc87677146f30094d3047e0741a3b3e.filez differ diff --git a/repo/objects/fb/b9597f70b01412a46f9a228a4698867f35079bb28e751093959e871257eb3a.dirtree b/repo/objects/fb/b9597f70b01412a46f9a228a4698867f35079bb28e751093959e871257eb3a.dirtree new file mode 100644 index 00000000000..6b6d4053392 Binary files /dev/null and b/repo/objects/fb/b9597f70b01412a46f9a228a4698867f35079bb28e751093959e871257eb3a.dirtree differ diff --git a/repo/objects/fb/c019f31f4ba7de2723855683a943631be2cbc718d5e8303e5b31d6c6d01182.filez b/repo/objects/fb/c019f31f4ba7de2723855683a943631be2cbc718d5e8303e5b31d6c6d01182.filez new file mode 100644 index 00000000000..0fe5a5b66e3 Binary files /dev/null and b/repo/objects/fb/c019f31f4ba7de2723855683a943631be2cbc718d5e8303e5b31d6c6d01182.filez differ diff --git a/repo/objects/fb/ccaed563b4540f7342860c63e9502f1234f01c9e6707bba9c742f485508564.dirtree b/repo/objects/fb/ccaed563b4540f7342860c63e9502f1234f01c9e6707bba9c742f485508564.dirtree new file mode 100644 index 00000000000..a8a1bc6bca8 Binary files /dev/null and b/repo/objects/fb/ccaed563b4540f7342860c63e9502f1234f01c9e6707bba9c742f485508564.dirtree differ diff --git a/repo/objects/fb/f9e59e6c0bade4872fa6566176a83daefaadf384b4e7d5a103ae8ed9fb6aae.filez b/repo/objects/fb/f9e59e6c0bade4872fa6566176a83daefaadf384b4e7d5a103ae8ed9fb6aae.filez new file mode 100644 index 00000000000..fca999e08c1 Binary files /dev/null and b/repo/objects/fb/f9e59e6c0bade4872fa6566176a83daefaadf384b4e7d5a103ae8ed9fb6aae.filez differ diff --git a/repo/objects/fc/259b34726ff092338a201e633f80aa1d1a509b47ff1fdd0b9ad0c06fc69b1a.filez b/repo/objects/fc/259b34726ff092338a201e633f80aa1d1a509b47ff1fdd0b9ad0c06fc69b1a.filez new file mode 100644 index 00000000000..41cf4486f79 Binary files /dev/null and b/repo/objects/fc/259b34726ff092338a201e633f80aa1d1a509b47ff1fdd0b9ad0c06fc69b1a.filez differ diff --git a/repo/objects/fc/2e0a673fb1e9ef26c5103c363d121a34dcaf149978cd1878829b2f62505676.filez b/repo/objects/fc/2e0a673fb1e9ef26c5103c363d121a34dcaf149978cd1878829b2f62505676.filez new file mode 100644 index 00000000000..736d089d1ac Binary files /dev/null and b/repo/objects/fc/2e0a673fb1e9ef26c5103c363d121a34dcaf149978cd1878829b2f62505676.filez differ diff --git a/repo/objects/fc/3083a81f8c6fea96cc26be1cb089662433c70b9232f5ec3742b7f0a80c2982.dirtree b/repo/objects/fc/3083a81f8c6fea96cc26be1cb089662433c70b9232f5ec3742b7f0a80c2982.dirtree new file mode 100644 index 00000000000..2c4be6b82a6 Binary files /dev/null and b/repo/objects/fc/3083a81f8c6fea96cc26be1cb089662433c70b9232f5ec3742b7f0a80c2982.dirtree differ diff --git a/repo/objects/fc/666d5268d7a73842b709b77fcf3c0f0c23639ecf280f246f7195e6a0557c16.filez b/repo/objects/fc/666d5268d7a73842b709b77fcf3c0f0c23639ecf280f246f7195e6a0557c16.filez new file mode 100644 index 00000000000..a63b30fdddd Binary files /dev/null and b/repo/objects/fc/666d5268d7a73842b709b77fcf3c0f0c23639ecf280f246f7195e6a0557c16.filez differ diff --git a/repo/objects/fc/97f268ec1b9768dd3558072042e25c4eb95701ab3cbf4e0a9a4eaacf7f7935.filez b/repo/objects/fc/97f268ec1b9768dd3558072042e25c4eb95701ab3cbf4e0a9a4eaacf7f7935.filez new file mode 100644 index 00000000000..09d60a8d2e4 Binary files /dev/null and b/repo/objects/fc/97f268ec1b9768dd3558072042e25c4eb95701ab3cbf4e0a9a4eaacf7f7935.filez differ diff --git a/repo/objects/fc/e62b7290a7e63a38b59db2c6d23faa0bc2744dd9f4717085e0169c1c285713.dirtree b/repo/objects/fc/e62b7290a7e63a38b59db2c6d23faa0bc2744dd9f4717085e0169c1c285713.dirtree new file mode 100644 index 00000000000..aa8723226f4 Binary files /dev/null and b/repo/objects/fc/e62b7290a7e63a38b59db2c6d23faa0bc2744dd9f4717085e0169c1c285713.dirtree differ diff --git a/repo/objects/fc/e630aad18076a640a452a0351712b81f524757c45ed3e08a1a59c008b3b774.filez b/repo/objects/fc/e630aad18076a640a452a0351712b81f524757c45ed3e08a1a59c008b3b774.filez new file mode 100644 index 00000000000..32670f5ddae Binary files /dev/null and b/repo/objects/fc/e630aad18076a640a452a0351712b81f524757c45ed3e08a1a59c008b3b774.filez differ diff --git a/repo/objects/fc/f29f4c0ba3f8f12a1fdbcd37616b0a07585be08948edba95faaea01df40821.filez b/repo/objects/fc/f29f4c0ba3f8f12a1fdbcd37616b0a07585be08948edba95faaea01df40821.filez new file mode 100644 index 00000000000..a3a560a4074 Binary files /dev/null and b/repo/objects/fc/f29f4c0ba3f8f12a1fdbcd37616b0a07585be08948edba95faaea01df40821.filez differ diff --git a/repo/objects/fd/06ce94c7d337d8120a4f278043f468a0523825bed47027389bcf07269c0ac5.filez b/repo/objects/fd/06ce94c7d337d8120a4f278043f468a0523825bed47027389bcf07269c0ac5.filez new file mode 100644 index 00000000000..cf445f18161 Binary files /dev/null and b/repo/objects/fd/06ce94c7d337d8120a4f278043f468a0523825bed47027389bcf07269c0ac5.filez differ diff --git a/repo/objects/fd/29efc3b2be0cc0f99bfd977aee53975ca5fd404a44cfcd09349e53d2ec1920.filez b/repo/objects/fd/29efc3b2be0cc0f99bfd977aee53975ca5fd404a44cfcd09349e53d2ec1920.filez new file mode 100644 index 00000000000..a8d91e254fb Binary files /dev/null and b/repo/objects/fd/29efc3b2be0cc0f99bfd977aee53975ca5fd404a44cfcd09349e53d2ec1920.filez differ diff --git a/repo/objects/fd/2cbe9b93dca3186aff0401f0f01921fe8808a7a9e36149d067c8abce91ced0.filez b/repo/objects/fd/2cbe9b93dca3186aff0401f0f01921fe8808a7a9e36149d067c8abce91ced0.filez new file mode 100644 index 00000000000..0d14dfcdd4f Binary files /dev/null and b/repo/objects/fd/2cbe9b93dca3186aff0401f0f01921fe8808a7a9e36149d067c8abce91ced0.filez differ diff --git a/repo/objects/fd/2e4d29dc1456f381e4b00f5e024f2338aacfefc8e4a3dc13c53dcef64f03ad.filez b/repo/objects/fd/2e4d29dc1456f381e4b00f5e024f2338aacfefc8e4a3dc13c53dcef64f03ad.filez new file mode 100644 index 00000000000..e768137469d Binary files /dev/null and b/repo/objects/fd/2e4d29dc1456f381e4b00f5e024f2338aacfefc8e4a3dc13c53dcef64f03ad.filez differ diff --git a/repo/objects/fd/34520d9e5fe81d5dbab36888d3c2c156725d39addf1ac2eff8cf6c041cc16c.filez b/repo/objects/fd/34520d9e5fe81d5dbab36888d3c2c156725d39addf1ac2eff8cf6c041cc16c.filez new file mode 100644 index 00000000000..635b137092e Binary files /dev/null and b/repo/objects/fd/34520d9e5fe81d5dbab36888d3c2c156725d39addf1ac2eff8cf6c041cc16c.filez differ diff --git a/repo/objects/fd/3d7f710049c1b4176597f4d98c89f20ee1cfa8348571722f467c868417d684.filez b/repo/objects/fd/3d7f710049c1b4176597f4d98c89f20ee1cfa8348571722f467c868417d684.filez new file mode 100644 index 00000000000..cb270029f6f Binary files /dev/null and b/repo/objects/fd/3d7f710049c1b4176597f4d98c89f20ee1cfa8348571722f467c868417d684.filez differ diff --git a/repo/objects/fd/650ded3f0043e68678e7b12e1aef4960b5f56cc7d70b67ab5f08d639eb30f4.filez b/repo/objects/fd/650ded3f0043e68678e7b12e1aef4960b5f56cc7d70b67ab5f08d639eb30f4.filez new file mode 100644 index 00000000000..2cd6934a7da Binary files /dev/null and b/repo/objects/fd/650ded3f0043e68678e7b12e1aef4960b5f56cc7d70b67ab5f08d639eb30f4.filez differ diff --git a/repo/objects/fd/8680f5c936246e6be0d76dadd3b93678bbd30e719cd7974159e37942a431aa.filez b/repo/objects/fd/8680f5c936246e6be0d76dadd3b93678bbd30e719cd7974159e37942a431aa.filez new file mode 100644 index 00000000000..588cac52e0f Binary files /dev/null and b/repo/objects/fd/8680f5c936246e6be0d76dadd3b93678bbd30e719cd7974159e37942a431aa.filez differ diff --git a/repo/objects/fd/a08e100590c93b6b9395f42acc36fb0d6391d359418f8e94ec043aada9fcaf.dirtree b/repo/objects/fd/a08e100590c93b6b9395f42acc36fb0d6391d359418f8e94ec043aada9fcaf.dirtree new file mode 100644 index 00000000000..ea587865fff Binary files /dev/null and b/repo/objects/fd/a08e100590c93b6b9395f42acc36fb0d6391d359418f8e94ec043aada9fcaf.dirtree differ diff --git a/repo/objects/fd/d3f270787e964b8aa2958966b921e99541957bd4098755e2e084fb0e182679.dirtree b/repo/objects/fd/d3f270787e964b8aa2958966b921e99541957bd4098755e2e084fb0e182679.dirtree new file mode 100644 index 00000000000..58f6da83088 Binary files /dev/null and b/repo/objects/fd/d3f270787e964b8aa2958966b921e99541957bd4098755e2e084fb0e182679.dirtree differ diff --git a/repo/objects/fd/fbf89376f776de13718619eab8452a63ae0f2617f1a2c39ebb181fdd092b2b.filez b/repo/objects/fd/fbf89376f776de13718619eab8452a63ae0f2617f1a2c39ebb181fdd092b2b.filez new file mode 100644 index 00000000000..16aad794579 Binary files /dev/null and b/repo/objects/fd/fbf89376f776de13718619eab8452a63ae0f2617f1a2c39ebb181fdd092b2b.filez differ diff --git a/repo/objects/fe/0128a450863891c5c3abe3da915eaf463be22f3b90909134e04675662932e2.filez b/repo/objects/fe/0128a450863891c5c3abe3da915eaf463be22f3b90909134e04675662932e2.filez new file mode 100644 index 00000000000..5c1de0b2025 Binary files /dev/null and b/repo/objects/fe/0128a450863891c5c3abe3da915eaf463be22f3b90909134e04675662932e2.filez differ diff --git a/repo/objects/fe/1355f35507f928fa09fd93e633453bd048f5ab9bb61ceca0e4c1f534321761.dirtree b/repo/objects/fe/1355f35507f928fa09fd93e633453bd048f5ab9bb61ceca0e4c1f534321761.dirtree new file mode 100644 index 00000000000..acfd90f421d Binary files /dev/null and b/repo/objects/fe/1355f35507f928fa09fd93e633453bd048f5ab9bb61ceca0e4c1f534321761.dirtree differ diff --git a/repo/objects/fe/1d497d6e688e3734c887601efc0d373d2bb5ec986c8b19f252c8dffa0a06ee.filez b/repo/objects/fe/1d497d6e688e3734c887601efc0d373d2bb5ec986c8b19f252c8dffa0a06ee.filez new file mode 100644 index 00000000000..844692cbefb Binary files /dev/null and b/repo/objects/fe/1d497d6e688e3734c887601efc0d373d2bb5ec986c8b19f252c8dffa0a06ee.filez differ diff --git a/repo/objects/fe/35b6fd2b8cb6cc49af2a9d3ba5351689bc9e0e57a558765d7afcc0d7c23552.filez b/repo/objects/fe/35b6fd2b8cb6cc49af2a9d3ba5351689bc9e0e57a558765d7afcc0d7c23552.filez new file mode 100644 index 00000000000..c4a2d0aaaa7 Binary files /dev/null and b/repo/objects/fe/35b6fd2b8cb6cc49af2a9d3ba5351689bc9e0e57a558765d7afcc0d7c23552.filez differ diff --git a/repo/objects/fe/3e3bfbe867d4f876520b1b27da303c8a4767b66da21d98ef25a34e1f68c5f6.filez b/repo/objects/fe/3e3bfbe867d4f876520b1b27da303c8a4767b66da21d98ef25a34e1f68c5f6.filez new file mode 100644 index 00000000000..b118d2e70f4 Binary files /dev/null and b/repo/objects/fe/3e3bfbe867d4f876520b1b27da303c8a4767b66da21d98ef25a34e1f68c5f6.filez differ diff --git a/repo/objects/fe/41ea1c44b716cabe40d471128ae3fbdd1b46aa0ff65ac1c8c7fade468f58bc.dirtree b/repo/objects/fe/41ea1c44b716cabe40d471128ae3fbdd1b46aa0ff65ac1c8c7fade468f58bc.dirtree new file mode 100644 index 00000000000..c133dceb7c2 Binary files /dev/null and b/repo/objects/fe/41ea1c44b716cabe40d471128ae3fbdd1b46aa0ff65ac1c8c7fade468f58bc.dirtree differ diff --git a/repo/objects/fe/5cb95bca44ce8afda7eb9d0943fac2e304127731a60df4e2b11e1a3416d424.filez b/repo/objects/fe/5cb95bca44ce8afda7eb9d0943fac2e304127731a60df4e2b11e1a3416d424.filez new file mode 100644 index 00000000000..a97a3224c89 Binary files /dev/null and b/repo/objects/fe/5cb95bca44ce8afda7eb9d0943fac2e304127731a60df4e2b11e1a3416d424.filez differ diff --git a/repo/objects/fe/699e72fb248e009d3b59a64dc28f672c0306bd6456b3995e7e234272336bb9.filez b/repo/objects/fe/699e72fb248e009d3b59a64dc28f672c0306bd6456b3995e7e234272336bb9.filez new file mode 100644 index 00000000000..086d5d1a6ba Binary files /dev/null and b/repo/objects/fe/699e72fb248e009d3b59a64dc28f672c0306bd6456b3995e7e234272336bb9.filez differ diff --git a/repo/objects/fe/7664f442c806f2f18b334e62c989959930a93d8a30a81ac042c608d4ff7789.dirtree b/repo/objects/fe/7664f442c806f2f18b334e62c989959930a93d8a30a81ac042c608d4ff7789.dirtree new file mode 100644 index 00000000000..1cba6fbc0e5 Binary files /dev/null and b/repo/objects/fe/7664f442c806f2f18b334e62c989959930a93d8a30a81ac042c608d4ff7789.dirtree differ diff --git a/repo/objects/fe/789184ec6ac31393b3b0dc058831f7ff5bd8955b1f2941c2ba4a51fadb5bdc.filez b/repo/objects/fe/789184ec6ac31393b3b0dc058831f7ff5bd8955b1f2941c2ba4a51fadb5bdc.filez new file mode 100644 index 00000000000..77da821e60e Binary files /dev/null and b/repo/objects/fe/789184ec6ac31393b3b0dc058831f7ff5bd8955b1f2941c2ba4a51fadb5bdc.filez differ diff --git a/repo/objects/fe/7c7e08217f0f3d6f9876d98d36f629d4ce814b0f67146a6c9fb8e4ee72ff91.filez b/repo/objects/fe/7c7e08217f0f3d6f9876d98d36f629d4ce814b0f67146a6c9fb8e4ee72ff91.filez new file mode 100644 index 00000000000..629dadc0c38 Binary files /dev/null and b/repo/objects/fe/7c7e08217f0f3d6f9876d98d36f629d4ce814b0f67146a6c9fb8e4ee72ff91.filez differ diff --git a/repo/objects/fe/7e3f885e3afef0948098f6d8efa505ee164b7fe548760ec34d8c02d17da7a6.filez b/repo/objects/fe/7e3f885e3afef0948098f6d8efa505ee164b7fe548760ec34d8c02d17da7a6.filez new file mode 100644 index 00000000000..f0c06aa25e4 Binary files /dev/null and b/repo/objects/fe/7e3f885e3afef0948098f6d8efa505ee164b7fe548760ec34d8c02d17da7a6.filez differ diff --git a/repo/objects/fe/80b4f91979e5400e3725a61492e53b886a3badb63c10f071f348427f0102e6.filez b/repo/objects/fe/80b4f91979e5400e3725a61492e53b886a3badb63c10f071f348427f0102e6.filez new file mode 100644 index 00000000000..59d5ec1abb1 Binary files /dev/null and b/repo/objects/fe/80b4f91979e5400e3725a61492e53b886a3badb63c10f071f348427f0102e6.filez differ diff --git a/repo/objects/fe/bec4d61315d19ee3e01ee700a0f409a22bf4bc361518aa1eff1101709fda84.filez b/repo/objects/fe/bec4d61315d19ee3e01ee700a0f409a22bf4bc361518aa1eff1101709fda84.filez new file mode 100644 index 00000000000..f6b76771f6f Binary files /dev/null and b/repo/objects/fe/bec4d61315d19ee3e01ee700a0f409a22bf4bc361518aa1eff1101709fda84.filez differ diff --git a/repo/objects/fe/cc5e655e8e8d1d0594deb2fb826498b0ab9214f131f3123fdda21223716d6e.dirtree b/repo/objects/fe/cc5e655e8e8d1d0594deb2fb826498b0ab9214f131f3123fdda21223716d6e.dirtree new file mode 100644 index 00000000000..383a34fb082 Binary files /dev/null and b/repo/objects/fe/cc5e655e8e8d1d0594deb2fb826498b0ab9214f131f3123fdda21223716d6e.dirtree differ diff --git a/repo/objects/ff/17044a0e5ca3dd72c893329da0f638d5379fbc1054d8936a05f16818350865.filez b/repo/objects/ff/17044a0e5ca3dd72c893329da0f638d5379fbc1054d8936a05f16818350865.filez new file mode 100644 index 00000000000..296ff896353 Binary files /dev/null and b/repo/objects/ff/17044a0e5ca3dd72c893329da0f638d5379fbc1054d8936a05f16818350865.filez differ diff --git a/repo/objects/ff/1bf39438de09698b277a1626551de77526ad2224ce230a58f62ba00b2c9c16.filez b/repo/objects/ff/1bf39438de09698b277a1626551de77526ad2224ce230a58f62ba00b2c9c16.filez new file mode 100644 index 00000000000..e39b1d3d3db Binary files /dev/null and b/repo/objects/ff/1bf39438de09698b277a1626551de77526ad2224ce230a58f62ba00b2c9c16.filez differ diff --git a/repo/objects/ff/3c209ef83523c9c78f0a9b5c7604423d02dfb3555c4312845749613ace25aa.filez b/repo/objects/ff/3c209ef83523c9c78f0a9b5c7604423d02dfb3555c4312845749613ace25aa.filez new file mode 100644 index 00000000000..c8b977bf817 Binary files /dev/null and b/repo/objects/ff/3c209ef83523c9c78f0a9b5c7604423d02dfb3555c4312845749613ace25aa.filez differ diff --git a/repo/objects/ff/459a85adbf8a8dde059c082c5cdf5b9942c4cd4099f8b6d696ff6741133ab2.filez b/repo/objects/ff/459a85adbf8a8dde059c082c5cdf5b9942c4cd4099f8b6d696ff6741133ab2.filez new file mode 100644 index 00000000000..01611f3a6ea Binary files /dev/null and b/repo/objects/ff/459a85adbf8a8dde059c082c5cdf5b9942c4cd4099f8b6d696ff6741133ab2.filez differ diff --git a/repo/objects/ff/6c54fbb1f5b3c65d8a1a2519407e9703ba2b0e1f641434b67f6ec8d9437309.filez b/repo/objects/ff/6c54fbb1f5b3c65d8a1a2519407e9703ba2b0e1f641434b67f6ec8d9437309.filez new file mode 100644 index 00000000000..acfcef73e9e Binary files /dev/null and b/repo/objects/ff/6c54fbb1f5b3c65d8a1a2519407e9703ba2b0e1f641434b67f6ec8d9437309.filez differ diff --git a/repo/objects/ff/701dc7fb4518a90ae09c8b79fce8162a269b81a0c99c9c5d436994a3516558.dirtree b/repo/objects/ff/701dc7fb4518a90ae09c8b79fce8162a269b81a0c99c9c5d436994a3516558.dirtree new file mode 100644 index 00000000000..97c7bef719f Binary files /dev/null and b/repo/objects/ff/701dc7fb4518a90ae09c8b79fce8162a269b81a0c99c9c5d436994a3516558.dirtree differ diff --git a/repo/objects/ff/70b380818ce87ae7d5ffda3d177a4e3f652d43ab709d2873b06d0f21c2652f.filez b/repo/objects/ff/70b380818ce87ae7d5ffda3d177a4e3f652d43ab709d2873b06d0f21c2652f.filez new file mode 100644 index 00000000000..ee1367643e8 Binary files /dev/null and b/repo/objects/ff/70b380818ce87ae7d5ffda3d177a4e3f652d43ab709d2873b06d0f21c2652f.filez differ diff --git a/repo/objects/ff/7b3137bd32e26e5297d077a38b88bb9985e41b5892dd332f72292d5f65d1cd.filez b/repo/objects/ff/7b3137bd32e26e5297d077a38b88bb9985e41b5892dd332f72292d5f65d1cd.filez new file mode 100644 index 00000000000..74a8ce3ac74 Binary files /dev/null and b/repo/objects/ff/7b3137bd32e26e5297d077a38b88bb9985e41b5892dd332f72292d5f65d1cd.filez differ diff --git a/repo/objects/ff/999d661b5bfb98de8f93757065d0a786b59ce5a7eac41e047b70858430ad96.filez b/repo/objects/ff/999d661b5bfb98de8f93757065d0a786b59ce5a7eac41e047b70858430ad96.filez new file mode 100644 index 00000000000..c1dd311f000 Binary files /dev/null and b/repo/objects/ff/999d661b5bfb98de8f93757065d0a786b59ce5a7eac41e047b70858430ad96.filez differ diff --git a/repo/objects/ff/a2cdd122cb1a21fdb9c9202badf0fb8ae8e8479944a8a15c69f7e99181b95d.dirtree b/repo/objects/ff/a2cdd122cb1a21fdb9c9202badf0fb8ae8e8479944a8a15c69f7e99181b95d.dirtree new file mode 100644 index 00000000000..1e577152f9f Binary files /dev/null and b/repo/objects/ff/a2cdd122cb1a21fdb9c9202badf0fb8ae8e8479944a8a15c69f7e99181b95d.dirtree differ diff --git a/repo/objects/ff/a50509c4a2516a9dd6ccbe62aea859a9c18a72849535a1b206a29086f94186.filez b/repo/objects/ff/a50509c4a2516a9dd6ccbe62aea859a9c18a72849535a1b206a29086f94186.filez new file mode 100644 index 00000000000..eb34321af27 Binary files /dev/null and b/repo/objects/ff/a50509c4a2516a9dd6ccbe62aea859a9c18a72849535a1b206a29086f94186.filez differ diff --git a/repo/objects/ff/c9a38038d76ed36d6e5c61871e156dc592af482166470cc38631a0e37e46c0.dirtree b/repo/objects/ff/c9a38038d76ed36d6e5c61871e156dc592af482166470cc38631a0e37e46c0.dirtree new file mode 100644 index 00000000000..e38cf427530 Binary files /dev/null and b/repo/objects/ff/c9a38038d76ed36d6e5c61871e156dc592af482166470cc38631a0e37e46c0.dirtree differ diff --git a/repo/refs/heads/app/ca.andyholmes.Valent/aarch64/master b/repo/refs/heads/app/ca.andyholmes.Valent/aarch64/master new file mode 100644 index 00000000000..ea6a62906f4 --- /dev/null +++ b/repo/refs/heads/app/ca.andyholmes.Valent/aarch64/master @@ -0,0 +1 @@ +15a0478d133ef4e106342cddc33c08af4d4ee177dfbb3a44968ff97ec378ff9e diff --git a/repo/refs/heads/app/ca.andyholmes.Valent/x86_64/master b/repo/refs/heads/app/ca.andyholmes.Valent/x86_64/master new file mode 100644 index 00000000000..008766edb30 --- /dev/null +++ b/repo/refs/heads/app/ca.andyholmes.Valent/x86_64/master @@ -0,0 +1 @@ +ae911274aa1a39aabae794f64711e6a4b8ed2f079fc6d136d58f15cc987de036 diff --git a/repo/refs/heads/appstream/aarch64 b/repo/refs/heads/appstream/aarch64 new file mode 100644 index 00000000000..ccd3f08c14d --- /dev/null +++ b/repo/refs/heads/appstream/aarch64 @@ -0,0 +1 @@ +9865bbf763ec262e9ed6eb8571792f4766d0e4ecdf1eac42079cc6068f97c406 diff --git a/repo/refs/heads/appstream/x86_64 b/repo/refs/heads/appstream/x86_64 new file mode 100644 index 00000000000..49433fac581 --- /dev/null +++ b/repo/refs/heads/appstream/x86_64 @@ -0,0 +1 @@ +e27d6f4ad4a656459c159e226cb724daf3b31eafcc7a870c93e9b9ea212d13d2 diff --git a/repo/refs/heads/appstream2/aarch64 b/repo/refs/heads/appstream2/aarch64 new file mode 100644 index 00000000000..33cb3cabea6 --- /dev/null +++ b/repo/refs/heads/appstream2/aarch64 @@ -0,0 +1 @@ +3b4277dae421c1adf7159cee58aeefb7ee83d210f6237513b1794dcd415056d9 diff --git a/repo/refs/heads/appstream2/x86_64 b/repo/refs/heads/appstream2/x86_64 new file mode 100644 index 00000000000..8e047bedd27 --- /dev/null +++ b/repo/refs/heads/appstream2/x86_64 @@ -0,0 +1 @@ +85bbfd1440359dbba220955e4b32200b9c524509e50a9f020789a370855560ca diff --git a/repo/refs/heads/runtime/ca.andyholmes.Valent.Debug/aarch64/master b/repo/refs/heads/runtime/ca.andyholmes.Valent.Debug/aarch64/master new file mode 100644 index 00000000000..714db4c88c2 --- /dev/null +++ b/repo/refs/heads/runtime/ca.andyholmes.Valent.Debug/aarch64/master @@ -0,0 +1 @@ +c399bb4b5d728e87b172f0c04a93dae8e50a5719a14203b66e27b0f3a0432028 diff --git a/repo/refs/heads/runtime/ca.andyholmes.Valent.Debug/x86_64/master b/repo/refs/heads/runtime/ca.andyholmes.Valent.Debug/x86_64/master new file mode 100644 index 00000000000..2c6e29e1e18 --- /dev/null +++ b/repo/refs/heads/runtime/ca.andyholmes.Valent.Debug/x86_64/master @@ -0,0 +1 @@ +02e52cd3b996c5f1eab3efe99cb1e6dcb036dfcc00bab83d81b18022f32874a5 diff --git a/repo/refs/heads/runtime/ca.andyholmes.Valent.Locale/aarch64/master b/repo/refs/heads/runtime/ca.andyholmes.Valent.Locale/aarch64/master new file mode 100644 index 00000000000..77866033413 --- /dev/null +++ b/repo/refs/heads/runtime/ca.andyholmes.Valent.Locale/aarch64/master @@ -0,0 +1 @@ +8e09878d18cc95d901b98e4f6b3371155b85666648eb7ba9f432e9bb8cc2daaf diff --git a/repo/refs/heads/runtime/ca.andyholmes.Valent.Locale/x86_64/master b/repo/refs/heads/runtime/ca.andyholmes.Valent.Locale/x86_64/master new file mode 100644 index 00000000000..2db1c96fdcf --- /dev/null +++ b/repo/refs/heads/runtime/ca.andyholmes.Valent.Locale/x86_64/master @@ -0,0 +1 @@ +2ffdd06f81a28af15a9f0e4f801d4ae9cc50e159cbccdd52fd6b2fc779afa3a1 diff --git a/repo/summaries/15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.gz b/repo/summaries/15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.gz new file mode 100644 index 00000000000..0a5dd389b0e Binary files /dev/null and b/repo/summaries/15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.gz differ diff --git a/repo/summaries/1e070e689cf2f09f9736d62af5d1f9332f55fcb055ccbc7a0e1381561465c5e6.idx.sig b/repo/summaries/1e070e689cf2f09f9736d62af5d1f9332f55fcb055ccbc7a0e1381561465c5e6.idx.sig new file mode 100644 index 00000000000..f6434d27fc8 Binary files /dev/null and b/repo/summaries/1e070e689cf2f09f9736d62af5d1f9332f55fcb055ccbc7a0e1381561465c5e6.idx.sig differ diff --git a/repo/summaries/26d4348d791a12ae7b6e70f7c1e58b313a56951932c21d73798d49eb35bbb486.idx.sig b/repo/summaries/26d4348d791a12ae7b6e70f7c1e58b313a56951932c21d73798d49eb35bbb486.idx.sig new file mode 100644 index 00000000000..74891f3c0b9 Binary files /dev/null and b/repo/summaries/26d4348d791a12ae7b6e70f7c1e58b313a56951932c21d73798d49eb35bbb486.idx.sig differ diff --git a/repo/summaries/2775cc92493f9a8ff26252814db45d6a08a0089a11c8c5c3226aad4f4e9b68f0-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta b/repo/summaries/2775cc92493f9a8ff26252814db45d6a08a0089a11c8c5c3226aad4f4e9b68f0-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta new file mode 100644 index 00000000000..80a2a021aa0 Binary files /dev/null and b/repo/summaries/2775cc92493f9a8ff26252814db45d6a08a0089a11c8c5c3226aad4f4e9b68f0-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta differ diff --git a/repo/summaries/2775cc92493f9a8ff26252814db45d6a08a0089a11c8c5c3226aad4f4e9b68f0.gz b/repo/summaries/2775cc92493f9a8ff26252814db45d6a08a0089a11c8c5c3226aad4f4e9b68f0.gz new file mode 100644 index 00000000000..e4a36c4ceb9 Binary files /dev/null and b/repo/summaries/2775cc92493f9a8ff26252814db45d6a08a0089a11c8c5c3226aad4f4e9b68f0.gz differ diff --git a/repo/summaries/414ee3cc0046de1c9a88053f4d3cc370598c6ba781453a3cb00ccc26b1b7b0a2-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta b/repo/summaries/414ee3cc0046de1c9a88053f4d3cc370598c6ba781453a3cb00ccc26b1b7b0a2-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta new file mode 100644 index 00000000000..92be1e6cff9 Binary files /dev/null and b/repo/summaries/414ee3cc0046de1c9a88053f4d3cc370598c6ba781453a3cb00ccc26b1b7b0a2-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta differ diff --git a/repo/summaries/414ee3cc0046de1c9a88053f4d3cc370598c6ba781453a3cb00ccc26b1b7b0a2.gz b/repo/summaries/414ee3cc0046de1c9a88053f4d3cc370598c6ba781453a3cb00ccc26b1b7b0a2.gz new file mode 100644 index 00000000000..93388e118d0 Binary files /dev/null and b/repo/summaries/414ee3cc0046de1c9a88053f4d3cc370598c6ba781453a3cb00ccc26b1b7b0a2.gz differ diff --git a/repo/summaries/6952a37b206019d58fd868cf4774c594a977a878a52a038e3992075c11046bd9-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta b/repo/summaries/6952a37b206019d58fd868cf4774c594a977a878a52a038e3992075c11046bd9-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta new file mode 100644 index 00000000000..6c8422e77f3 Binary files /dev/null and b/repo/summaries/6952a37b206019d58fd868cf4774c594a977a878a52a038e3992075c11046bd9-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta differ diff --git a/repo/summaries/6952a37b206019d58fd868cf4774c594a977a878a52a038e3992075c11046bd9.gz b/repo/summaries/6952a37b206019d58fd868cf4774c594a977a878a52a038e3992075c11046bd9.gz new file mode 100644 index 00000000000..2e2dbb237a9 Binary files /dev/null and b/repo/summaries/6952a37b206019d58fd868cf4774c594a977a878a52a038e3992075c11046bd9.gz differ diff --git a/repo/summaries/8688e69cbd15ad3f85c3c3d52f7ea0f456be30a11f46179673b376ce3300fdfa-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta b/repo/summaries/8688e69cbd15ad3f85c3c3d52f7ea0f456be30a11f46179673b376ce3300fdfa-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta new file mode 100644 index 00000000000..37a3d86b3c4 Binary files /dev/null and b/repo/summaries/8688e69cbd15ad3f85c3c3d52f7ea0f456be30a11f46179673b376ce3300fdfa-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta differ diff --git a/repo/summaries/8688e69cbd15ad3f85c3c3d52f7ea0f456be30a11f46179673b376ce3300fdfa.gz b/repo/summaries/8688e69cbd15ad3f85c3c3d52f7ea0f456be30a11f46179673b376ce3300fdfa.gz new file mode 100644 index 00000000000..1f56ed0ab50 Binary files /dev/null and b/repo/summaries/8688e69cbd15ad3f85c3c3d52f7ea0f456be30a11f46179673b376ce3300fdfa.gz differ diff --git a/repo/summaries/ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.gz b/repo/summaries/ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.gz new file mode 100644 index 00000000000..917f363d2fb Binary files /dev/null and b/repo/summaries/ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.gz differ diff --git a/repo/summaries/acb39dde96a9afce0ce9fcbd84c1b16eac9c6a2b3ffc9bdb2c7434ffadb237b9-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta b/repo/summaries/acb39dde96a9afce0ce9fcbd84c1b16eac9c6a2b3ffc9bdb2c7434ffadb237b9-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta new file mode 100644 index 00000000000..05057185172 Binary files /dev/null and b/repo/summaries/acb39dde96a9afce0ce9fcbd84c1b16eac9c6a2b3ffc9bdb2c7434ffadb237b9-ac89f9e13d29beb59ec75fbe38e3e4fdd5abe25ea4c8ed2de4bcf83d180a0dfa.delta differ diff --git a/repo/summaries/acb39dde96a9afce0ce9fcbd84c1b16eac9c6a2b3ffc9bdb2c7434ffadb237b9.gz b/repo/summaries/acb39dde96a9afce0ce9fcbd84c1b16eac9c6a2b3ffc9bdb2c7434ffadb237b9.gz new file mode 100644 index 00000000000..e0aed464cf2 Binary files /dev/null and b/repo/summaries/acb39dde96a9afce0ce9fcbd84c1b16eac9c6a2b3ffc9bdb2c7434ffadb237b9.gz differ diff --git a/repo/summaries/f35cc85eb7dc4d44eb754e113e7fb017c7b760d69bf8909f521cfe0adace6b41-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta b/repo/summaries/f35cc85eb7dc4d44eb754e113e7fb017c7b760d69bf8909f521cfe0adace6b41-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta new file mode 100644 index 00000000000..c551ffc1423 Binary files /dev/null and b/repo/summaries/f35cc85eb7dc4d44eb754e113e7fb017c7b760d69bf8909f521cfe0adace6b41-15e274647064bf084855deff5d53a0d5167dd66d655fbd320efdd65662176c32.delta differ diff --git a/repo/summaries/f35cc85eb7dc4d44eb754e113e7fb017c7b760d69bf8909f521cfe0adace6b41.gz b/repo/summaries/f35cc85eb7dc4d44eb754e113e7fb017c7b760d69bf8909f521cfe0adace6b41.gz new file mode 100644 index 00000000000..666775b70b8 Binary files /dev/null and b/repo/summaries/f35cc85eb7dc4d44eb754e113e7fb017c7b760d69bf8909f521cfe0adace6b41.gz differ diff --git a/repo/summary b/repo/summary new file mode 100644 index 00000000000..1270531dd7e Binary files /dev/null and b/repo/summary differ diff --git a/repo/summary.idx b/repo/summary.idx new file mode 100644 index 00000000000..87e81b5253d Binary files /dev/null and b/repo/summary.idx differ diff --git a/repo/summary.idx.sig b/repo/summary.idx.sig new file mode 100644 index 00000000000..f6434d27fc8 Binary files /dev/null and b/repo/summary.idx.sig differ diff --git a/repo/summary.sig b/repo/summary.sig new file mode 100644 index 00000000000..e59cc33059e Binary files /dev/null and b/repo/summary.sig differ diff --git a/style.css b/style.css new file mode 100644 index 00000000000..fbf997b6b71 --- /dev/null +++ b/style.css @@ -0,0 +1,248 @@ +/* SPDX-License-Identifier: CC0-1.0 */ +/* SPDX-FileCopyrightText: No rights reserved */ + +@import url(https://www.andyholmes.ca/assets/css/base.css); + +/* + * General + */ +a { + color: currentColor; +} + +.content { + width: 85%; + margin: 0 auto; + max-width: 900px; +} + + +/* + * Header + */ +header { + padding: 2rem 0; + text-align: center; +} + +header h1 { + display: flex; + gap: 0.5rem; + justify-content: center; + + margin: 0; + padding-right: 2rem; + + font-size: 1.5rem; + font-weight: bold; +} + +header h1 svg { + fill: currentColor; + height: auto; + width: 1em; +} + + +/* + * Description + */ +#description { + padding: 0 0 2rem; + text-align: center; +} + +#description h2 { + font-size: 2.5rem; + font-weight: normal; + margin: 0 0 2rem; +} + +#description p { + max-width: 30em; +} + + +/* + * Downloads + */ +#downloads { + padding: 2rem 0; + text-align: center; +} + +#downloads h2 { + font-size: 1.75rem; + font-weight: normal; + margin: 0 0 2rem; +} + +#downloads ul { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1rem; + padding: 0; +} + +#downloads li { + display: block; + padding: 1em; +} + +#downloads li > svg { + display: block; + fill: currentColor; + width: 96px; + height: auto; + margin: 0 auto 1rem; +} + +#downloads li > a { + display: block; + transition: all 250ms ease-in-out; + + color: var(--dark5); + background-color: var(--light5); + + font-weight: bold; + font-size: 1.125rem; + text-align: center; + text-decoration: none; + + border-radius: 2em; + padding: 0.5em; +} + +#downloads li > a:focus, +#downloads li > a:hover { + color: var(--dark5); + background-color: var(--light4); +} + + +/* + * Resources: Users & Development + */ +#resources { + padding: 1rem 0; + text-align: center; +} + +#resources h2 { + font-size: 1rem; + font-weight: bold; + margin: 0 0 1rem; +} + +#resources > div { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + justify-items: center; +} + +#resources ul { + margin: 0; + padding: 0; +} + +#resources ul > li { + display: block; + transition: all 200ms ease-in-out; + border-radius: 2rem; +} + +#resources ul > li:focus, +#resources ul > li:hover { + background-color: var(--dark2); +} + +#resources ul > li a { + display: flex; + flex-direction: row; + gap: 0.5em; + justify-content: start; + align-items: center; + + font-weight: normal; + font-size: 1rem; + text-align: left; + text-decoration: none; + + padding: 0.5em 1em; +} + +#resources ul svg { + display: block; + fill: currentColor; + width: 1em; + height: auto; +} + + +/* + * Footer + */ +footer { + background-color: var(--dark4); + color: white; + padding: 2rem 0; + font-size: 80%; + text-align: center; +} + +footer a { + text-decoration: none; +} + +footer a:hover { + text-decoration: underline; +} + + +/* + * + */ +@media (min-width: 700px) { + html, body { + font-size: 18px; + } +} + + +/* + * Dark/Light Theme + */ +@media (prefers-color-scheme: dark) { + #downloads li > a { + color: var(--dark5); + background-color: var(--light5); + } + #downloads li > a:focus, + #downloads li > a:hover { + color: var(--dark5); + background-color: var(--light4); + } + + #resources ul > li:focus, + #resources ul > li:hover { + background-color: var(--dark2); + } +} + +@media (prefers-color-scheme: light) { + #downloads li > a { + color: var(--light3); + background-color: var(--dark3); + } + #downloads li > a:focus, + #downloads li > a:hover { + color: var(--light3); + background-color: var(--dark4); + } + + #resources ul > li:focus, + #resources ul > li:hover { + background-color: var(--light2); + } +} + diff --git a/valent.flatpakref b/valent.flatpakref new file mode 100644 index 00000000000..983f1b7ca2a --- /dev/null +++ b/valent.flatpakref @@ -0,0 +1,10 @@ +[Flatpak Ref] +Version=1 +Title=Valent +Description=Connect, control and sync devices +Homepage=https://valent.andyholmes.ca +Icon=https://valent.andyholmes.ca/logo.svg +Name=ca.andyholmes.Valent +Url=https://valent.andyholmes.ca/repo +RuntimeRepo=https://flathub.org/repo/flathub.flatpakrepo +GPGKey=mDMEY04elRYJKwYBBAHaRw8BAQdA7hBJnun4JZdGAdDAD5yG5jmDZ1k12+tp/onXqGlFJ5q0FHZhbGVudEBhbmR5aG9sbWVzLmNhiJkEExYKAEEWIQQCV6IIIL0FrcCMqoDBwuN+qS2rgwUCY04elQIbAwUJA8JnAAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDBwuN+qS2rg3a0AQC5C//D55hE1chX6PDrusPzIp1gMGggEWPqKC7Fomt8HQEA2l8QjZ2yHCMMtSVmEfT1/DyiOZTja9n+vDdwem8UTw+4OARjTh6VEgorBgEEAZdVAQUBAQdA1R5kEjJzvv8w0XpRHbqp8Ek+GODfXRMaGw4NVrRQb0QDAQgHiHgEGBYKACAWIQQCV6IIIL0FrcCMqoDBwuN+qS2rgwUCY04elQIbDAAKCRDBwuN+qS2rg1WMAQDqhXPZ7IrSCDBzbLfdSnCmLsSPRd1OIgE2Bpa52jQvWwD/Q0eZgcOEOhag/zm/ypXFzxtpi5CPh06abwWWeZ+mmQQ= diff --git a/valent.flatpakrepo b/valent.flatpakrepo new file mode 100644 index 00000000000..f23f61bdce6 --- /dev/null +++ b/valent.flatpakrepo @@ -0,0 +1,8 @@ +[Flatpak Repo] +Title=Valent +Url=https://valent.andyholmes.ca/repo/ +Homepage=https://valent.andyholmes.ca/ +Comment=Connect, control and sync devices +Description=Nightly repository for Valent +Icon=https://valent.andyholmes.ca/documentation/logo.svg +GPGKey=mDMEY04elRYJKwYBBAHaRw8BAQdA7hBJnun4JZdGAdDAD5yG5jmDZ1k12+tp/onXqGlFJ5q0FHZhbGVudEBhbmR5aG9sbWVzLmNhiJkEExYKAEEWIQQCV6IIIL0FrcCMqoDBwuN+qS2rgwUCY04elQIbAwUJA8JnAAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDBwuN+qS2rg3a0AQC5C//D55hE1chX6PDrusPzIp1gMGggEWPqKC7Fomt8HQEA2l8QjZ2yHCMMtSVmEfT1/DyiOZTja9n+vDdwem8UTw+4OARjTh6VEgorBgEEAZdVAQUBAQdA1R5kEjJzvv8w0XpRHbqp8Ek+GODfXRMaGw4NVrRQb0QDAQgHiHgEGBYKACAWIQQCV6IIIL0FrcCMqoDBwuN+qS2rgwUCY04elQIbDAAKCRDBwuN+qS2rg1WMAQDqhXPZ7IrSCDBzbLfdSnCmLsSPRd1OIgE2Bpa52jQvWwD/Q0eZgcOEOhag/zm/ypXFzxtpi5CPh06abwWWeZ+mmQQ=